我一直在编写一个程序,它在 UDP 之上使用停止和等待协议通过 LAN 和 WAN 发送数据包。我最近一直在测试我的程序,并注意到较大数据包(接近 64k 字节)的数据包丢失率更高。直觉上这是有道理的,但真正的原因是什么?
3 回答
大于承载它们的网络的MTU 大小的 UDP 数据包将自动拆分为多个数据包,然后由接收方重新组合。如果这些多个子数据包中的任何一个被丢弃,那么接收器也将丢弃其余的子数据包。
因此,例如,如果您发送一个 63k UDP 数据包,并且它通过以太网,它将被分解成 47+ 个更小的“片段”数据包(因为以太网的 MTU 是 1500 字节,但其中一些用于 UDP 标头等,因此 UDP 数据包中可用的用户数据空间量小于此值)。如果所有 47 个以上的片段数据包都可以通过,接收器将只会“看到”该 UDP 数据包。如果这些片段包中只有一个被丢弃,则整个操作将失败。
好吧,数据网络远非可靠;数据包一直被丢弃。过载的路由器、完整的缓冲区和损坏的数据包是其中一些原因。由于 UDP 没有流量控制功能,因此在接收端过载等情况下,它不会减速。
正如 Jeremy 解释的那样,有效载荷越大,它将被分割成的数据包越多,因此丢失其中一些数据包的可能性就越大。
UDP 用于此处丢弃的数据包不会影响任何事情或您需要及时到达那里或根本不需要的情况。(VOIP、流媒体视频等)
这都是关于 IP 碎片和碎片整理的。超过 MTU 的数据包会被碎片化,并且必须在最终主机上进行碎片整理,碎片也有可能在路径上再次碎片化,这又会增加延迟。有时,如果某些 N/W 元素被配置为第 4 层过滤,那么它会整理碎片(不是最终主机)应用规则,然后再次进行碎片整理和转发。这就是需要性能的应用程序总是尝试发送大小 <= (MTU-ETHHDR-IPHDR) 的数据的原因