什么会导致无法为 UDP 数据报计算 IP 标头校验和?

Posted

技术标签:

【中文标题】什么会导致无法为 UDP 数据报计算 IP 标头校验和?【英文标题】:What can cause IP header checksums to not be calculated for UDP datagrams? 【发布时间】:2012-07-11 03:31:21 【问题描述】:

我试图从 Windows XP 上的 UdpClient 向设备发送 UDP 数据报,但它没有响应。当我在 Wireshark 中查看该流量时,我发现我的出站数据包很糟糕,因为它们的所有 IP 标头校验和都是 0x0000。

这台机器有两个网卡,所以我开始使用另一个网卡并开始遇到同样的问题。

我可以很好地用两个网卡 ping 我的设备,所以我认为我的 C# 代码一定有什么问题,但我不确定是什么。使用 UdpClient 在 Windows XP 上的 .NET 4 中您会做错什么吗?

【问题讨论】:

【参考方案1】:

您看到一个空校验和,因为 Windows 正在执行校验和计算的硬件卸载。它将由网络接口​​卡 (NIC) 的处理器执行。使用数据包嗅探器捕获数据包将在数据包被您的 NIC 处理之前显示该数据包。您可以从设备管理器下的设备属性页面关闭卸载:

在任何情况下,UDP 协议defines the checksum as optional,零是校验和的有效值。这是为了让处理能力较低的设备跳过校验和计算。校验和通常由处理数据包的第一个网络节点(例如路由器)填写。即使它仍然为零,您的设备仍应接受有效的数据包。

编辑:我刚刚意识到您在谈论 IP 标头,而不是 UPD 标头。这适用于两者,除了 IP 标头校验和不是可选的(并且将由您的 NIC 计算)。

【讨论】:

我想我会选择有图片的答案。 如果我禁用 TCP Checksum OffloadUDP Checksum Offload,Wireshark 会显示校验和验证失败。仅在上图中的Advanced 选项卡中禁用IPv4 Checksum Offload 后,它对我有用。我使用的是 Windows 10 版本 18363.1139。【参考方案2】:

看起来像驱动程序问题。尝试在驱动程序属性中关闭校验和卸载。

或者,如果您在同一台机器上运行 Wireshark,则可能是校验和卸载工作正常,而 Wireshark 未报告校验和,因为它是在 Wireshark 看到数据包后计算的。

要确认在单独的框中运行 wireshark 以确认校验和为零或不为零。

如果校验和仍然正常,那么很可能是防火墙问题。确保您在本地计算机上有允许返回流量的防火墙规则。

【讨论】:

@john,谢谢,哪一个是正确的 - 防火墙或驱动程序问题?

以上是关于什么会导致无法为 UDP 数据报计算 IP 标头校验和?的主要内容,如果未能解决你的问题,请参考以下文章

UDP数据报的最小长度是多少 UDP数据报的

UDP是啥?

在一个线程中定期发送许多 UDP 数据报有时会导致微包突发

UDP协议是啥

什么会导致 UDP 数据包在发送到 localhost 时被丢弃?

计算机网络-传输层UDP协议