我已设置了一个测试网络,其中 2 台 Linux PC 用作路由器,2 台 Linux PC 用作普通客户端。2 台路由器相互连接,每个客户端连接到一个路由器。从客户端到其中一个路由器的路径上,MTU 为 1500,但两个路由器之间的 MTU 为 1200。此外,我仅使用 IPv6。
如果我现在尝试发送大于 1200 字节的数据包,我预计会从路由器收到 ICMPv6“数据包太大”错误,然后客户端应该对数据包进行分段并尝试重新发送。然而,这并没有发生。如果我查看 wireshark,我可以看到客户端收到 ICMPv6 错误,但是客户端不会尝试将数据包作为分段重新发送。
造成这种行为的原因是什么?
答案1
IPv6 不支持分片。
使用 IPv4,路由器在将数据包从一个链路转发到另一个具有较小 MTU 的链路时可能会对数据包进行分段(除非自由度已设置)。
对于 IPv6,端点需要使用路径 MTU 发现实际上他们自己找出答案,然后在他们之间使用这个 MTU...
编辑在@Patrick Mevzek 的高度赞赏的评论之后:
...或者采用 1280 字节的 IPv6 保证 MTU(无论是否在主机上对数据包进行分段)。