本文我们对 UDP 的可靠性进行测试。

1.程序路径

如果你已经 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 字节。


63-不可靠的 UDP 协议_unp


图1 服务器平均接收约 1800 个数据包,丢包率 10%


  • 发送 1 万个数据报,每次 1400 字节


63-不可靠的 UDP 协议_udp_02


图2 服务器平均接收约 2800 个数据包,丢包率 72%


  • 发送 10 万个数据报,每次 1400 字节


63-不可靠的 UDP 协议_udp_03


图3 服务器平均接收约 9500 个数据包,丢包率 90.5%


4. 结果分析

从第 3 节的结果我们看到,发送数据包的数量越多,丢包率越高,客户端发送了 10 万个包,丢包率已经达到了 90.5% 左右了!!!这证明了 UDP 协议是相当相当的不可靠!

5. 服务器接收缓冲区的影响

客户端发送 2000 个包,每次 4096 字节。这里测试了接收方不同大小缓冲区时的情况。


63-不可靠的 UDP 协议_网络编程_04


图4 接收缓冲区大小并没有从根本上降低丢包率


分别测试了缓冲区大小为 500,5k, 50k, 500k, 1m 的情况,可以发现,随着缓冲区大小的提升,丢包率改善甚微。

因此,改变接收缓冲区,不能从根本上解决问题!我们需要其它手段。这些问题,以后我们会继续研究。

6. 总结

  • 知道 UDP 协议的不可靠性

练习:使用 st 程序测试你的机器