我正在为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的套接字发送数据包并通知我,而不是将其分段。
你能解释一下你想做什么吗?当你说“默认情况下,IPv6数据包被发送方分割”时,数据包大小是多少?什么是链路MTU?你使用的是什么套接字选项? –
你使用什么类型的套接字发送数据?听起来你正在使用IPv6 Raw套接字来获取MTU,然后使用SOCK_STREAM传输实际数据。这将不起作用,因为SOCK_STREAM套接字将为您执行碎片。 – Jeff