1

我正在尝试ping6使用 WinSock2 以编程方式发送 ICMPv6 回显请求()。ICMPv6 校验和是根据将要发送的整个 IPv6 数据包计算的。出于这个原因 - 据我了解 - 操作系统(内核?)应该在发送数据包时计算它并将其写入 ICMPv6 标头。

这在 SUSE Linux Enterprise Server 11 上运行良好,但是,Windows XP 似乎没有这样做。它将校验和保留为我默认设置的值(零,我使用 Wireshark 进行了分析),因此接收端将丢弃它而不回复。

IPv6 在这台 WinXP 机器上正确设置。在 Wireshark 的帮助下,我什至发现它可以正确响应来自 SUSE Linux 服务器的 ICMPv6 ping,使用相同的代码发送。所以不可能是Windows XP 不支持ICMPv6。但是,我想知道Windows XP下的WinSock2是否可以。

WinSock2 API 确实提供了IPPROTO_ICMPV6我为其创建原始套接字的协议。是否需要设置任何特殊的套接字选项才能自动计算 ICMPv6 校验和,或者是否有任何其他技巧?

4

1 回答 1

0

您描述的行为的最可能原因是checksum offloading。这意味着,校验和计算可能会委托给网络硬件,因此嗅探的数据包不包含正确的校验和值。请参阅http://www.wireshark.org/docs/wsug_html_chunked/ChAdvChecksums.htmlhttp://en.wikipedia.org/wiki/Transmission_Control_Protocol#Checksum_offload

于 2011-03-10T20:46:19.457 回答