0

我正在为 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 中观察到这种行为),但我需要套接字拒绝发送数据包并通知我,而不是将其分段。

4

2 回答 2

3

您不需要自己执行此操作。MTU 发现应该自动发生。这样做的副作用是,路径上的所有设备都必须允许 ICMP V6 数据包通过。

于 2012-11-20T15:53:26.720 回答
-2

默认情况下,发送方将 IPv6 数据包分段

不会。默认情况下,TCP 数据包会被发送方和中间路由器分段。

,我不知道如何关闭此行为。

无法将其关闭。您当然可以尝试,但唯一的结果将是无法交付。如果路由器需要对数据包进行分段并且您不允许它,它将改为丢弃它。但是,发送主机也需要分段,以适应路径 MTU,您无法停止。如果您正确编写接收器,即期望它正在读取字节流而不是离散消息,那么数据包是否在传输过程中被分段应该对您没有影响。

于 2012-11-15T04:38:06.427 回答