63-不可靠的 UDP 协议

本文我们对 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 程序测试你的机器

说明:本文转自blog.csdn.net,用于学习交流分享,仅代表原文作者观点。如有疑问,请联系我们删除~