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