本文我们对 UDP 的可靠性进行测试。
1.程序路径
代码托管在 gitos 上,请使用下面的命令获取:
git clone https://git.oschina.net/ivan_allen/unp.git
如果你已经 clone 过这个代码了,请使用 git pull
更新一下。本节程序所使用的程序路径是 unp/program/echo_udp/unreliable
。
2. 测试程序 st
程序 st 全名为 statistics,意为统计。st 程序加上参数 -s 启动时就是 udp 服务器,单纯的接收数据报,并累计数据报的个数。在服务器模式下,按下 CTRL C 就可以统计上一次按下 CTRL C 到本次之间所收到的数据报个数。
st 客户端循环发送数据报给服务器,每次发送 writesize 个字节,一共发送 count 次。它通过选项 writesize 和 count 进行指定,比如
./st -h flower --writesize 4096 --count 2000
它表示向 flower 主机发送 2000 个数据报,每个大小为 4096.
默认情况下,writesize =1400, count = 2000.
st 程序的伪代码:
- 服务器
int total = 0; void server() { while(1) { recvfrom(sockfd, buf, 4096, /.../); total++; } } void handler_sigint() { printf("received %d datagrams\n", total); }
- 客户端
void client() { while(count--) { sendto(sockfd, buf, writesize, /.../); } }
具体代码详见 unp/program/echo_udp/unreliable/st.cc
。
3. 实验数据
- 发送 2000 次数据报,每次 1400 字节。
图1 服务器平均接收约 1800 个数据包,丢包率 10%
- 发送 1 万个数据报,每次 1400 字节
图2 服务器平均接收约 2800 个数据包,丢包率 72%
- 发送 10 万个数据报,每次 1400 字节
图3 服务器平均接收约 9500 个数据包,丢包率 90.5%
4. 结果分析
从第 3 节的结果我们看到,发送数据包的数量越多,丢包率越高,客户端发送了 10 万个包,丢包率已经达到了 90.5% 左右了!!!这证明了 UDP 协议是相当相当的不可靠!
5. 服务器接收缓冲区的影响
客户端发送 2000 个包,每次 4096 字节。这里测试了接收方不同大小缓冲区时的情况。
图4 接收缓冲区大小并没有从根本上降低丢包率
分别测试了缓冲区大小为 500,5k, 50k, 500k, 1m 的情况,可以发现,随着缓冲区大小的提升,丢包率改善甚微。
因此,改变接收缓冲区,不能从根本上解决问题!我们需要其它手段。这些问题,以后我们会继续研究。
6. 总结
- 知道 UDP 协议的不可靠性
练习:使用 st 程序测试你的机器