在使用TC测试的发现手动进行丢包延迟抖动等场景的组合以及TC命令的切换效率很低,写了一个脚本可以提升效率,也可以根据自己的需求进行脚本更改!
使用方法:
1)运行sh脚本
2)输入TC想要限制的网卡名和服务器IP地址即可
使用效果:
丢包率和延迟组合,缓存无限
延迟和抖动组合,缓存无限
丢包率与延迟组合
#!/bin/sh
#验证网络接口函数
validate_interface() {
# 网卡名称只能包含字母、数字和连字符
pattern="^[a-zA-Z0-9-]+$"
if [[ $1 =~ $pattern ]]; then
return 0
else
return 1
fi
}
#验证IP地址函数
validate_ip_address() {
# IP地址的格式为X.X.X.X,其中X为0-255之间的数字
pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}$"
if [[ $1 =~ $pattern ]]; then
return 0
else
return 1
fi
}
# 提示用户输入网络接口名称和服务器的IP地址 (例如: eth0 192.168.xx.xx):
echo "请输入网络接口名称和服务器的IP地址 (例如: eth0 192.168.xx.xx):"
read input
# 从输入中提取网络接口名称和服务器的IP地址
interface_name=$(echo "$input" | awk '{print $1}')
server_ip=$(echo "$input" | awk '{print $2}')
# 验证网络接口名称
if ! validate_interface "$interface_name"; then
echo "网络接口名称不合法,请重新输入。"
exit 1
fi
# 验证服务器IP地址
if ! validate_ip_address "$server_ip"; then
echo "服务器IP地址不合法,请重新输入。"
exit 1
fi
#丢包率
loss_percentages=("1" "5" "10" "15" "20")
#延迟
delay_parameters=("0" "50" "100" "200")
#丢包率与延迟组合,limit缓存无限
for loss_percentage in "${loss_percentages[@]}"; do
for delay_parameter in "${delay_parameters[@]}"; do
# 设置丢包率和延迟
tc qdisc add dev "$interface_name" root netem loss "$loss_percentage%" delay "${delay_parameter}ms" limit 100000000
sleep 1
# 执行iperf命令,并将结果保存到临时文件中
iperf -c "$server_ip" -t 5 > iperf_output.txt
sleep 5
# 从临时文件中读取iperf结果
iperf_result=$(cat iperf_output.txt)
if [ -n "$iperf_result" ]; then
# iperf_result不为空
# 提取带宽值,正则表达式匹配整数或浮点数
bandwidth=$(echo "$iperf_result" | grep -oE '([0-9]+(\.[0-9]+)?\s+\w+/sec)' | head -n 1)
else
# iperf_result为空
echo "丢包率 $loss_percentage% - 延迟 ${delay_parameter}ms - iperf_result为空"
fi
# 保存带宽值到txt文件,文件存在就追加,不存在就创建
if [ -e bandwidth_results.txt ]; then
echo "丢包率 $loss_percentage% - 延迟 ${delay_parameter}ms - 带宽:$bandwidth" >> bandwidth_results.txt
else
echo "丢包率 $loss_percentage% - 延迟 ${delay_parameter}ms - 带宽:$bandwidth" > bandwidth_results.txt
fi
#如果TC配置存在,删除TC的配置
if tc qdisc show dev "$interface_name" | grep -q "netem"; then
tc qdisc del dev "$interface_name" root
fi
done
done
echo "循环执行完毕,结果已保存到 bandwidth_results.txt 文件中!"
延迟与抖动组合
#!/bin/sh
#验证网络接口函数
validate_interface() {
# 网卡名称只能包含字母、数字和连字符
pattern="^[a-zA-Z0-9-]+$"
if [[ $1 =~ $pattern ]]; then
return 0
else
return 1
fi
}
#验证IP地址函数
validate_ip_address() {
# IP地址的格式为X.X.X.X,其中X为0-255之间的数字
pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}$"
if [[ $1 =~ $pattern ]]; then
return 0
else
return 1
fi
}
# 提示用户输入网络接口名称和服务器的IP地址 (例如: eth0 192.168.xx.xx):
echo "请输入网络接口名称和服务器的IP地址 (例如: eth0 192.168.xx.xx):"
read input
# 从输入中提取网络接口名称和服务器的IP地址
interface_name=$(echo "$input" | awk '{print $1}')
server_ip=$(echo "$input" | awk '{print $2}')
# 验证网络接口名称
if ! validate_interface "$interface_name"; then
echo "网络接口名称不合法,请重新输入。"
exit 1
fi
# 验证服务器IP地址
if ! validate_ip_address "$server_ip"; then
echo "服务器IP地址不合法,请重新输入。"
exit 1
fi
#延迟
delay_parameters=("25" "50" "100")
#抖动
jitter_parameters=("25" "50" "100")
#延迟和抖动组合,limit缓存无限
for delay_parameter in "${delay_parameters[@]}"; do
for jitter_parameter in "${jitter_parameters[@]}"; do
# 设置延迟和抖动
tc qdisc add dev "$interface_name" root netem delay "${delay_parameter}ms" "${jitter_parameter}ms" limit 100000000
sleep 1
# 执行iperf命令,并将结果保存到临时文件中
iperf -c "$server_ip" -t 5 > iperf_output.txt
sleep 5
# 从临时文件中读取iperf结果
iperf_result=$(cat iperf_output.txt)
# iperf_result不为空
if [ -n "$iperf_result" ]; then
# 提取带宽值,正则表达式匹配整数和浮点数均可
bandwidth=$(echo "$iperf_result" | grep -oE '([0-9]+(\.[0-9]+)?\s+\w+/sec)' | head -n 1)
# 若带宽为空
if [ -z "$bandwidth" ]; then
echo "延迟 ${delay_parameter}ms - 抖动 ${jitter_parameter}ms - 带宽值为空"
fi
else
# iperf_result为空
echo "延迟 ${delay_parameter}ms - 抖动 ${jitter_parameter}ms - iperf_result为空"
fi
# 保存带宽值到txt文件,文件存在就追加,不存在就创建
if [ -e bandwidth_results.txt ]; then
echo "延迟 ${delay_parameter}ms - 抖动 ${jitter_parameter}ms - 带宽:$bandwidth" >> bandwidth_results.txt
else
echo "延迟 ${delay_parameter}ms - 抖动 ${jitter_parameter}ms - 带宽:$bandwidth" > bandwidth_results.txt
fi
#如果TC配置存在,删除TC的配置
if tc qdisc show dev "$interface_name" | grep -q "netem"; then
tc qdisc del dev "$interface_name" root
fi
done
done
echo "循环执行完毕,结果已保存到 bandwidth_results.txt 文件中。"