【发布时间】:2011-03-02 08:56:52
【问题描述】:
我正在尝试使用 WinSock2 以编程方式发送 ICMPv6 回显请求 (ping6)。 ICMPv6 checksum 是 calculated 基于将要发送的整个 IPv6 数据包。出于这个原因 - 据我了解 - 操作系统(内核?)应该在发送数据包时计算它并将其写入 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 校验和,或者是否有任何其他技巧?
【问题讨论】:
-
我认为你发现了一个错误。我也没有看到socket option。如果 Windows
ping实现在进行路由查找后手动填写校验和,我不会感到惊讶。 -
您说您看到默认设置了校验和(零) - 您是通过发送主机上的嗅探器还是接收主机上的嗅探器看到的?如果在接收主机上看到 - 这绝对不是
checksum offloading问题
标签: windows-xp ipv6 winsock2 icmp