丢包分析工具 - iperf
一、背景
由于我们的服务既支持 tcp 链接也支持 udp 链接,所以想测试下我们服务在 tcp 链接和 udp 链接的抗弱网能力。
所以我们使用 chaos-mesh 工具,模拟网络故障 - 丢包(Loss)。但在测试过程中发现一个奇怪的现象,当设置 75% 丢包后,tcp 链接就会断开,但使用 udp 链接时设置 100% 丢包,还是可以正常通信。
所以怀疑 chaos-mesh 的丢包没有限制 udp 协议?(最后发现是设置错了服务器😄)
开始想用 nc 来测试一下,但 nc 只能测试是否打开了 udp 端口,不能测试 udp 的丢包率。没办法只能使用 iperf 来测试了。
二、iperf 是一个网络性能测试工具,可以用来:
- 测试 tcp/udp 链接的 带宽、延迟抖动 和 丢包率
- 测试 tcp/udp 的连通性(比如测试防火墙是否开放了 8080 端口)
三、测试 udp 链接的丢包率
例如,要测试 udp 的丢包率。可以按如下步骤测试
1、登陆 服务器,并启动 iperf 服务端
iperf -p 80 -s -u -i 1
参数说明:
- -p : 端口号
- -s : 表示服务端
- -u : 表示 udp 协议
- -i : 检测的时间间隔(单位,秒)
2、在客户端,启动 iperf 客户端
iperf -c 127.0.0.1 -p 80 -u -b 10M -t 10 -i 1 -P 1
参数说明:
- -c : 服务端的 ip 地址
- -p : 端口号
- -u : 标示udp协议
- -b : 每一次发送的数据大小
- -t : 总的发送时间(单位,秒)
- -i : 发送数据的时间间隔 (单位,秒)
- -P : 表示线程个数,不指定则默认单线程
3、运行结果如下图
注意:
- 由于只是想测试 udp 的丢包率,所以 -p 参数指定的 80 端口,只要你的机器上没有占用随便一个即可
- 由于只是想测试 udp 的丢包率,所以不必非要在 服务器 启动 iperf 服务端,随便你在哪里运行都行。
- 但要注意如果你在服务器设置的入站丢包,那 iperf 服务端一定要在服务器上运行
四、测试 tcp 链接的带宽
测试 tcp 跟 udp 没啥区别,就是去掉 -u 参数
1、登陆 服务器,并启动 iperf 服务端
iperf -p 80 -s -i 1
2、在客户端,启动 iperf 客户端
iperf -c 127.0.0.1 -p 80 -b 10M -t 10 -i 1 -P 1
3、运行结果如下图
注意:
- 用 iperf 只能测试 tcp 的带宽,不能测试丢包率。因为 tcp 会帮你重传来保证 tcp 链接的可靠
- 但可以看到带宽的下降。如果你在测试之前启动 chaos-mesh 工具,并设置一定丢包后,只能看到带宽下降而不会看到丢包率
五、测试 tcp/udp 的连通性
例如,要测试是否开放了服务器 A 的 udp 13000 端口。
1、登陆 服务器 A
2、将现有使用 udp 13000 端口
3、在服务器 A 中启动 iperf 服务端,命令如下
iperf -p 13000 -s -u -i 1
4、找一台机房外部的电脑(比如需要在家访问服务器),启动 iperf 客户端,命令如下
iperf -c 127.0.0.1 -p 13000 -u -b 10M -t 10 -i 1 -P 1
5、这样如果能看到丢包测试结果,也就证明网络是通的。如下图
无论在服务端还是客户端看到如红框内容都代表 udp 13000 是通的,没有被防火墙拦截。