我一直想知道如何使用Linux作为操作系统,通过低MTU基础设施(路径MTU低于接口MTU)发送碎片IPv6 UDP数据包 .

udp(7) 手册页说:

默认情况下,Linux UDP执行路径MTU(最大传输单元)
发现 . 这意味着内核将跟踪MTU到a
特定目标IP地址,并在UDP数据包时返回EMSGSIZE
写超过它 . 发生这种情况时,应用程序应该减少
包大小 . 路径MTU发现也可以使用
IP_MTU_DISCOVER套接字选项或
/ proc / sys / net / ipv4 / ip_no_pmtu_disc文件;有关详细信息,请参阅ip(7) . 什么时候
关闭,UDP将分段超出的UDP传输UDP数据包
接口MTU . 但是,建议不要禁用它
性能和可靠性的原因 .

我认为这意味着如果我使用IPv6,我有以下选择:

  • 路径MTU发现 . 需要分段的所有数据包都无法使用 EMSGSIZE 发送 .

  • 路径MTU发现关闭 . 使用接口MTU完成分段,而不是路径MTU .

但是,我正在寻找的是使用路径MTU发现,但不是使用 EMSGSIZE 失败,数据包将在 endpoints 处被分段 . 所以我正在寻找第三种选择:

  • 路径MTU发现,使用路径MTU完成碎片 .

记住IPv6与IPv4的不同之处:IPv6中的路由器不会对数据包进行分段 . 只有 endpoints 主机可以分组数据包 .

如果接口MTU很大但路径MTU很小,是否可以使用路径MTU发现使用Linux碎片IPv6 UDP数据包来确定碎片点?

如果不可能,这很容易打破IPv4到IPv6转换中的许多应用程序,就像应用程序想要交换大型UDP数据报一样,IPv6无法工作(路由器可能不会分段数据包)而IPv4会(路由器可能会分组数据包,所以如果 endpoints 使用接口MTU进行分段,那么这不是一个致命的问题,只比使用路径MTU效率稍低一些 .