This script will change network condition randomly over time to simulate a jittering network.
#!/bin/bash
# Network interface (can be changed if needed)
INTERFACE="ens3"
# States
STATE_1="delay 20ms loss 0%"
STATE_2="delay 50ms loss 1%"
STATE_3="delay 100ms loss 5%"
STATE_4="delay 200ms loss 10%"
# State names (for display purposes)
STATE_NAME_1="Good network"
STATE_NAME_2="Moderate network"
STATE_NAME_3="Poor network"
STATE_NAME_4="Very bad network"
# Initial state
current_state=1
# Markov state transition probabilities (you can adjust these values)
declare -A transition_probs=(
[1]="0.5 0.3 0.15 0.05"
[2]="0.2 0.5 0.2 0.1"
[3]="0.1 0.2 0.5 0.2"
[4]="0.05 0.15 0.3 0.5"
)
# Function to restore normal network conditions
cleanup() {
echo "Restoring normal network conditions..."
sudo tc qdisc del dev $INTERFACE root
exit 0
}
# Set up a trap to call cleanup on script interruption (Ctrl+C)
trap cleanup SIGINT
# Create qdisc on interface if it doesn't exist
if ! tc qdisc show dev $INTERFACE | grep -q "root"; then
sudo tc qdisc add dev $INTERFACE root netem
else
sudo tc qdisc replace dev $INTERFACE root netem
fi
# Apply initial state (state 1)
tc qdisc change dev $INTERFACE root netem ${STATE_1}
echo "Initial State: $STATE_NAME_1"
# Simulate 4-state Markov process for network conditions
while true; do
# Sleep for a random time to simulate different durations in each state
sleep $((RANDOM % 5 + 1)) # Sleep between 1 and 5 seconds
# Choose next state based on probabilities
r=$(awk -v seed=$RANDOM 'BEGIN {srand(seed); print rand()}')
# Transition logic based on probabilities
if (( $(echo "$r < 0.2" | bc -l) )); then
next_state=1
elif (( $(echo "$r < 0.5" | bc -l) )); then
next_state=2
elif (( $(echo "$r < 0.75" | bc -l) )); then
next_state=3
else
next_state=4
fi
# Apply the new state
case $next_state in
1)
tc qdisc change dev $INTERFACE root netem ${STATE_1}
echo "State changed to: $STATE_NAME_1"
;;
2)
tc qdisc change dev $INTERFACE root netem ${STATE_2}
echo "State changed to: $STATE_NAME_2"
;;
3)
tc qdisc change dev $INTERFACE root netem ${STATE_3}
echo "State changed to: $STATE_NAME_3"
;;
4)
tc qdisc change dev $INTERFACE root netem ${STATE_4}
echo "State changed to: $STATE_NAME_4"
;;
esac
current_state=$next_state
done
最后一次更新于2024-12-25
0 comment