在使用TC测试的发现手动进行丢包延迟抖动等场景的组合以及TC命令的切换效率很低,写了一个脚本可以提升效率,也可以根据自己的需求进行脚本更改!
使用方法:
1)运行sh脚本
2)输入TC想要限制的网卡名和服务器IP地址即可
使用效果:
丢包率和延迟组合,缓存无限
延迟和抖动组合,缓存无限
丢包率与延迟组合
#!/bin/sh#验证网络接口函数
validate_interface() {# 网卡名称只能包含字母、数字和连字符pattern="^[a-zA-Z0-9-]+$"if [[ $1 =~ $pattern ]]; thenreturn 0elsereturn 1fi
}#验证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 ]]; thenreturn 0elsereturn 1fi
}# 提示用户输入网络接口名称和服务器的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"; thenecho "网络接口名称不合法,请重新输入。"exit 1
fi# 验证服务器IP地址
if ! validate_ip_address "$server_ip"; thenecho "服务器IP地址不合法,请重新输入。"exit 1
fi#丢包率
loss_percentages=("1" "5" "10" "15" "20")
#延迟
delay_parameters=("0" "50" "100" "200")#丢包率与延迟组合,limit缓存无限
for loss_percentage in "${loss_percentages[@]}"; dofor 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.txtsleep 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 ]; thenecho "丢包率 $loss_percentage% - 延迟 ${delay_parameter}ms - 带宽:$bandwidth" >> bandwidth_results.txtelseecho "丢包率 $loss_percentage% - 延迟 ${delay_parameter}ms - 带宽:$bandwidth" > bandwidth_results.txtfi#如果TC配置存在,删除TC的配置if tc qdisc show dev "$interface_name" | grep -q "netem"; thentc qdisc del dev "$interface_name" rootfidone
doneecho "循环执行完毕,结果已保存到 bandwidth_results.txt 文件中!"
延迟与抖动组合
#!/bin/sh#验证网络接口函数
validate_interface() {# 网卡名称只能包含字母、数字和连字符pattern="^[a-zA-Z0-9-]+$"if [[ $1 =~ $pattern ]]; thenreturn 0elsereturn 1fi
}#验证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 ]]; thenreturn 0elsereturn 1fi
}# 提示用户输入网络接口名称和服务器的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"; thenecho "网络接口名称不合法,请重新输入。"exit 1
fi# 验证服务器IP地址
if ! validate_ip_address "$server_ip"; thenecho "服务器IP地址不合法,请重新输入。"exit 1
fi#延迟
delay_parameters=("25" "50" "100")
#抖动
jitter_parameters=("25" "50" "100")#延迟和抖动组合,limit缓存无限
for delay_parameter in "${delay_parameters[@]}"; dofor jitter_parameter in "${jitter_parameters[@]}"; do# 设置延迟和抖动tc qdisc add dev "$interface_name" root netem delay "${delay_parameter}ms" "${jitter_parameter}ms" limit 100000000sleep 1# 执行iperf命令,并将结果保存到临时文件中iperf -c "$server_ip" -t 5 > iperf_output.txtsleep 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" ]; thenecho "延迟 ${delay_parameter}ms - 抖动 ${jitter_parameter}ms - 带宽值为空"fielse# iperf_result为空echo "延迟 ${delay_parameter}ms - 抖动 ${jitter_parameter}ms - iperf_result为空" fi# 保存带宽值到txt文件,文件存在就追加,不存在就创建if [ -e bandwidth_results.txt ]; thenecho "延迟 ${delay_parameter}ms - 抖动 ${jitter_parameter}ms - 带宽:$bandwidth" >> bandwidth_results.txtelseecho "延迟 ${delay_parameter}ms - 抖动 ${jitter_parameter}ms - 带宽:$bandwidth" > bandwidth_results.txtfi#如果TC配置存在,删除TC的配置if tc qdisc show dev "$interface_name" | grep -q "netem"; thentc qdisc del dev "$interface_name" rootfidone
doneecho "循环执行完毕,结果已保存到 bandwidth_results.txt 文件中。"