UDP数据包大小和数据包丢失问题

7

我正在编写一个程序,使用基于UDP的停止和等待协议在局域网和广域网上传输数据包。最近,我测试了我的程序并发现更大的数据包(接近64k字节)的丢包率更高。直觉上这是有道理的,但实际上是什么原因呢?

3个回答

8
超过携带它们的网络MTU大小的UDP数据包将自动分割成多个数据包,并由接收方重新组合。如果这些多个子数据包中的任何一个被丢弃,那么接收方也会丢弃其余的数据包。

例如,如果您发送一个63k UDP数据包,并且通过以太网发送,它将被分解为47个更小的“片段”数据包(因为以太网的MTU为1500字节,但其中一些用于UDP头等,因此UDP数据包中可用的用户数据空间小于那个值)。只有当所有47个或更多的数据包成功到达时,接收方才会“看到”该UDP数据包。如果其中一个片段数据包丢失,整个操作将失败。

你不能发送一个64k数据包。最大的UDP有效负载是65507字节。 - user207421
4
好的,如果我们要挑毛病的话,一个携带65507字节负载的UDP数据包长度为65535字节(包括头部)--比64KiB少一个字节。但出于准确性考虑,我会把我的例子改为63k。 - Jeremy Friesner
1
这样做的影响是,少量的数据包丢失可能会显著影响性能。例如,如果您有2%的数据包丢失,平均而言您将丢失50%的数据包,从而导致吞吐量显着下降。请参见:https://dev59.com/L3fZa4cB1Zd3GeqPQltI#19057666 - AaronLS

0

嗯,数据网络远非可靠;包经常会丢失。过载的路由器、满的缓冲区和损坏的数据包是一些原因。由于UDP没有流量控制功能,所以如果接收端过载,它不能减速。

正如Jeremy所解释的那样,负载越大,它就会被分成更多的包,因此失去其中一些的机会会更大。

UDP在以下情况下使用:在这种情况下,偶尔丢失一个数据包不会影响任何事情,或者你需要某些东西及时到达或者根本不到达。(VOIP,流媒体视频等)


0

这都与IP分片和重组有关。如果数据包大于MTU,则需要在最终主机上进行分片和重组,还有可能在路径上再次分片,这会增加延迟。有时,如果某个网络元素配置了第4层过滤,则它会进行重组(而不是最终主机),应用规则,然后再次分片并转发。这就是需要性能的应用程序总是尝试发送大小为<=(MTU-ETHHDR-IPHDR)的数据的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接