重新组装在目的地失败

假设我有Host1&2以不同的速度连接到路由器。

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

Host1使用nc命令向Host2发送10MB的UDP数据,但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日志看到。 你可以请指导我避免碎片以及如何处理这种情况。

编辑:
从路由器的angular度来看,这是一种压力情景。 我不应该改变源/目的地方面的任何东西。

这里的关键问题不是分片,而是当队列填满时在路由器上发生丢包。 然后一些碎片被丢弃,你看到重新组装失败。

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

您可以使用socat来设置您的数据包的大小(使用UDPfunction,因为它只是将缓冲区中的数据转储到一个数据包中),并将其设置为使碎片不会发生并观察上面预测的结果。

一般来说,以上是纯UDP的一种性质,只能通过在UDP之上实现一定的stream量控制协议才能避免。