作者:不会游泳的鱼 | 来源:互联网 | 2023-05-22 12:26
据我所知,当发送ip消息时,be和我的数据包目的地之间的网络路径中的每一跳都将检查下一跳的MTU是否大于我发送的数据包的大小.如果是这样,则数据包将被分段,并且两个数据包将分别发送到下一跳,仅在目的地重新组装(或者,在某些情况下,在遇到的第一个NAT路由器处).据我所知,这件事情可能非常糟糕,但我并不理解为什么.
我知道如果连接往往会丢弃很多数据包,丢失一个片段意味着我必须重新发送整个数据包(这实际上是我自己想出的唯一的事情)
是否有可能不会被分割,我的数据包将被丢弃?
如何识别数据包片段?我可以100%确定它们会被正确重新组装吗?例如,如果我将两个相同长度的ip数据包几乎同时发送到同一个目的地,那么两个片段的可能性有多大,如AAA,BBB重新组装成ABA,BAB?
原则上,如果数据包没有被丢弃并且片段被正确地重新组装,实际上使用数据包分段似乎是一个好主意,可以节省本地带宽并避免发送越来越多的头而不仅仅是一个大数据包.
谢谢
1> Hugh White..:
IP碎片可能会导致几个问题:
1)应用层损失增加
如前所述,如果删除单个片段,则整个第4层数据包将丢失.因此,对于具有小的随机分组丢失率的网络,应用层丢失率增加了大约等于每个第4层分组的分段数的因子.
2)并非所有网络都处理分段数据包
某些系统(如Google的计算引擎)不会重新组合碎片数据包.
3)碎片可能导致重新排序
当路由器将流量拆分为并行路径时,它们可能会尝试将来自同一流的数据包保留在单个路径上.因为只有第一个片段具有像UDP/TCP端口号这样的第4层信息,所以后续片段可以沿不同的路径路由,延迟第4层数据包的组装并导致重新排序.
4)碎片可能导致难以调试的混乱行为
例如,如果从一个源向运行Linux的目标发送两个UDP流A和B,则目标可能会丢弃其中一个流的数据包.这是因为默认情况下,如果从同一源接收到超过64个其他片段,则Linux会"超时"片段队列.如果流A具有比流B高得多的数据速率,则来自流A的64个片段可以到达来自流B的片段之间,导致B片段被丢弃.
因此,虽然IP碎片可以通过最小化用户标头来减少开销,但它可能会导致比它的价值更多的麻烦.