目的地重组失败

目的地重组失败

假设我有主机 1 和 2 连接到具有不同速度的路由器。

Host1  <--100 Mbps-->  Router  <--10 Mbps-->  Host2

Host1 使用以下方式发送 10MB 的 UDP 数据数控命令给Host2,但是Host2重组分片数据包失败,并发送ICMP(超出生存时间/分片重组时间)。

当两端都是 100 Mbps 时,我没有看到任何故障,也没有发生碎片。

我尝试通过以下方法避免碎片化

1. Enabling PMTU on destination, router 
        echo 0 > /proc/sys/net/ipv4/ip_no_pmtu_disc
2. Reducing MTU to 576 from 1500

但碎片仍然会发生。我可以通过 wireshark 日志看到。您能指导我如何避免碎片以及如何处理这种情况吗?

编辑:
从路由器角度来看,这是一种压力情况。我不应该在源/目标端进行任何更改。

答案1

这里的关键问题不是碎片,而是当路由器队列填满时发生的数据包丢失。然后一些碎片被丢弃,您会看到重组失败。

为了避免碎片化,您应该在发送端设置数据包大小,这样就不会发生碎片化,但即使您这样做,由于速度差异和路由器的缓冲区大小限制,您也可能会在同一情况下看到数据包丢失。

您可以使用socat它来使用 UDP 设置数据包大小(该功能netcat似乎没有,因为它只是将缓冲区中的所有数据转储到单个数据包中)并将其设置为不会发生碎片并观察上面预测的结果。

一般来说,上述情况是纯 UDP 的特性,只有通过在 UDP 上实现某些流控制协议才能避免这种情况。

相关内容