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 程序测试你的机器

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值