【问题标题】:WinSock2 on Windows XP and ICMPv6Windows XP 和 ICMPv6 上的 WinSock2
【发布时间】:2011-03-02 08:56:52
【问题描述】:

我正在尝试使用 WinSock2 以编程方式发送 ICMPv6 回显请求 (ping6)。 ICMPv6 checksumcalculated 基于将要发送的整个 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


【解决方案1】:

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

【讨论】:

  • 我可以通过命令提示符ping6同一台主机没有问题。我不明白为什么 WinSock API 应该在 Windows XP 上使用校验和卸载,而其他一切都没有。这仍然是一种可能,因为我怀疑我的网络硬件是否已经支持 ICMPv6 校验和计算。有什么方法可以查明是否正在使用校验和卸载?
  • 您可以检查网络适配器的高级设置(在设备管理器中)。或者看看下面的链接(如果你对注册表友好的话)hefetz.net/blog/2009/11/25/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多