2012-11-14 20 views
0

我正在为IPv4和v6编写一个PMTUD应用程序。我在Ubuntu 12.04上做了这个,但是我想尽可能使它与操作系统无关,这就是我偶然发现问题的地方。使用BSD套接字的IPv6碎片化

默认情况下,IPv6数据包被发送方分割,我不知道如何关闭此行为。我发现了一些套接字选项,比如IPV6_MTU_DISCOVER和IPV6_DONTFRAG,但是我在linux/in6.h下找到了这些选项,这对我使用netinet标头族没有帮助,它们都不在netinet/in.h下 - 尽管IPV6_MTU_DISCOVER应该是根据this。我错过了什么吗?

编辑:让我澄清一点。 我有一个socket(AF_INET6,SOCK_RAW,IPPROTO_ICMPV6),我希望发送一个这样大小的ICMPv6数据包,我会收到一个回复​​,告诉我它太大了,从那个回复我将得到路径MTU。 但是,要真正获得沿整个路径的MTU,我还必须考虑传出设备的MTU。

我使用miredo来隧道IPv6,其具有最小尺寸的设定MTU,例如, 1280.发送一个大于1280的数据包将导致所述数据包碎片化(这一行为我在Wireshark中观察到),但我需要使用REFUSE的套接字发送数据包并通知我,而不是将其分段。

+0

你能解释一下你想做什么吗?当你说“默认情况下,IPv6数据包被发送方分割”时,数据包大小是多少?什么是链路MTU?你使用的是什么套接字选项? –

+0

你使用什么类型的套接字发送数据?听起来你正在使用IPv6 Raw套接字来获取MTU,然后使用SOCK_STREAM传输实际数据。这将不起作用,因为SOCK_STREAM套接字将为您执行碎片。 – Jeff

回答

-2

IPv6数据包得到由默认

号TCP数据包获得默认由发送者和中间路由器分段分段由发送者。

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

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

+0

更新了问题,也许我解释得很糟糕。未送达是期望的结果 - 我需要发送主机放弃数据包,并告诉我这样做,而不是分段以适应MTU。如果我没有弄错的话,那是PMTUD的重点。 – user742925

+0

编号路由器只对第3层起作用,因此在传统IPv4上或在现代IPv6上,从不在TCP上。这是完全可能的(并且对于调试应用程序来说是完全合理的)通过为IPv4指定不分段来自己做到这一点。无论如何,IPv6永远不会被中间路由器碎片化。 –

3

你不需要自己做这个。 MTU发现应该会自动发生。作为这个的副作用,路径上的所有设备都必须允许ICMP V6数据包通过。