我正在为 IPv4 和 v6 编写 PMTUD 应用程序。我在 Ubuntu 12.04 上这样做,但我想让它尽可能独立于操作系统,这就是我偶然发现问题的地方。
默认情况下,IPv6 数据包会被发送方分段,我不知道如何关闭此行为。我找到了一些套接字选项,例如 IPV6_MTU_DISCOVER 和 IPV6_DONTFRAG,但我在 linux/in6.h 下找到了这些选项,这无济于事,因为我使用的是 netinet 标头系列,而且它们都不是在 netinet/in.h 下 - 尽管 IPV6_MTU_DISCOVER 应该是有据此。我错过了什么吗?
编辑:让我澄清一下。我有一个套接字(AF_INET6,SOCK_RAW,IPPROTO_ICMPV6),我希望通过它发送一个这样大小的 ICMPv6 数据包,我会收到一个回复,告诉我它太大了,从那个回复中我会得到路径 MTU。但是,要真正获得整个路径的 MTU,我还必须考虑传出设备的 MTU。
我正在使用 miredo 来隧道 IPv6,它具有一组最小大小的 MTU,例如 1280。发送大于 1280 的数据包将导致所述数据包的碎片(我在 Wireshark 中观察到这种行为),但我需要套接字拒绝发送数据包并通知我,而不是将其分段。