我正在为IPv4和v6编写一个PMTUD应用程序。我在Ubuntu 12.04上这样做,但我想让它尽可能地独立于操作系统,这就是我偶然发现问题的地方。
默认情况下,发送方会将IPv6数据包分段,我不知道如何关闭此行为。我找到了一些套接字选项,如IPV6_MTU_DISCOVER和IPV6_DONTFRAG,但我在linux/in6.h下找到了它们,这对我没有帮助,因为我使用的是netinet头文件系列,这两个选项都不在netinet/in.h下--尽管根据this,IPV6_MTU_DISCOVER应该在那里。我是不是遗漏了什么?
编辑:那么让我来澄清一下。我有一个套接字(AF_INET6,SOCK_RAW,IPPROTO_ICMPV6),我希望通过它发送一个大小的ICMPv6包,这样我就会收到一个回复,告诉我它太大了,并且从这个回复中我将得到路径MTU。然而,为了真正获得整个路径上的MTU,我还必须考虑传出设备的MTU。
我正在使用miredo来传输IPv6,它有一个最小大小的设置,例如1280。发送大于1280的数据包将导致所述数据包的碎片(这是我在Wireshark中观察到的行为),但我需要套接字拒绝发送数据包并通知我,而不是碎片。
发布于 2012-11-20 23:53:27
您不需要自己执行此操作。MTU发现应该自动发生。这样做的副作用是,路径上的所有设备都必须允许ICMP V6数据包通过。
发布于 2012-11-15 12:38:06
默认情况下,发送方会将
IPv6数据包分段
不是的。默认情况下,发送方和中间路由器会将TCP数据包分段。
,我不知道如何关闭这种行为。
您不能将其关闭。您当然可以尝试,但唯一的结果将是无法交付。如果路由器需要对数据包进行分段,而您不允许这样做,那么路由器就会将其丢弃。然而,发送主机也需要分段,以适应路径MTU,而您无法阻止它。如果你正确地编写了接收器,即假设它读取的是字节流而不是离散的消息,那么数据包在传输过程中是否被分片对你来说应该是没有区别的。
https://stackoverflow.com/questions/13379290
复制相似问题