我正在尝试使用WinSock2以编程方式发送ICMPv6回应请求(ping6
)。基于将发送的整个IPv6数据包,ICMPv6 checksum为calculated。出于这个原因 - 从我的理解 - 操作系统(内核?)应该计算它并在发送数据包时将其写入ICMPv6标头。
这在SUSE Linux Enterprise Server 11上运行良好,但Windows XP似乎没有这样做。它将校验和保留为我默认设置的值(零,我使用Wireshark对其进行了分析),因此接收端将丢弃它而不回复。
在此WinXP计算机上正确设置了IPv6。在Wireshark的帮助下,我甚至发现它对来自SUSE Linux服务器的ICMPv6 ping响应正确,使用相同的代码发送。所以它不能是Windows XP不支持ICMPv6。但是,我想知道Windows XP下的WinSock2是否存在。
WinSock2 API确实提供了我为其创建原始套接字的IPPROTO_ICMPV6
协议。是否需要为ICMPv6校验和设置任何特殊的套接字选项才能自动计算,还是有其他技巧?
答案 0 :(得分:0)
您描述的行为的最可能原因是checksum offloading
。这意味着,校验和计算可能会委派给网络硬件,因此嗅探数据包不包含正确的校验和值。请参阅http://www.wireshark.org/docs/wsug_html_chunked/ChAdvChecksums.html或http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Checksum_offload