我一直在写一个程序,它在UDP之上使用停止和等待协议,通过LAN和WAN发送数据包。我最近一直在测试我的程序,并注意到更大的数据包(接近64k字节)的丢包率更高。直觉上这是有道理的,但真正的原因是什么呢?
发布于 2012-04-28 02:46:20
大于承载它们的网络的MTU size的UDP包将被自动拆分成多个包,然后由接收方重新组装。如果这些多个子包中的任何一个被丢弃,那么接收器也将丢弃其余的子包。
因此,举个例子,如果你发送一个63kUDP包,它通过以太网,它将被分解成更小的“片段”包(因为以太网的最大传输单位是1500字节,但其中一些用于UDP报头,等等,所以在UDP包中可用的47+ -data-space的数量比这个小)。如果那些分段分组的所有47+都通过of,则接收器将仅“看到”该UDP分组。如果这些片段数据包中只有一个被丢弃,整个操作就会失败。
发布于 2012-04-29 06:24:19
嗯,数据网络远不可靠;数据包总是会被丢弃。路由器过载、缓冲区满和数据包损坏是其中的一些原因。由于UDP没有流控制功能,因此它不能在例如接收端过载的情况下减速。
正如Jeremy解释的那样,有效负载越大,它被拆分的数据包就越多,因此丢失其中一些数据包的可能性也更大。
UDP用于这里丢弃的数据包不会影响任何东西的情况,或者您需要某些东西才能及时到达或根本不影响的情况。(VOIP、流视频等)
发布于 2012-06-23 00:40:57
这一切都是关于IP碎片和碎片整理的。超过MTU的数据包将被分片,并且必须在最终主机上进行碎片整理,也有可能碎片在路径上再次被分片,这可能会再次增加延迟。有时,如果为第四层过滤配置了一些N/W元素,那么它会对碎片进行碎片整理(而不是最终的主机),应用规则,然后再次分段并转发。这就是为什么需要性能的应用程序总是尝试发送大小为<= (MTU-ETHHDR-IPHDR)的数据。
https://stackoverflow.com/questions/10355626
复制相似问题