Appearance
Appearance
大多数现代操作系统都支持某种形式的网络卸载,即部分网络处理在 NIC 上完成,而不是由 CPU 完成。通常这是一件好事。它可以释放系统其他部分的资源,并让系统处理更多连接。如果你正在尝试捕获流量,它可能会导致错误的报错以及奇怪甚至缺失的流量。
卸载
校验和卸载
Linux
Windows
分段卸载
TCP Chimney
另请参阅
在支持校验和卸载的系统上,IP、TCP 和 UDP 校验和会在数据包即将在线路上传输之前由 NIC 计算。在 Wireshark 中,这些数据包会显示为出站数据包,标为黑色、带红色文本,并带有注释 [incorrect, should be xxxx (maybe caused by "TCP checksum offload"?)]。
Wireshark 会在数据包发送到网络适配器之前捕获它们。它看不到正确的校验和,因为校验和此时尚未计算。更糟的是,大多数 OS 并不会费心初始化这些数据,所以你看到的很可能是不该看到的一小段内存内容。
Wireshark 1.2 及以上版本的新安装默认禁用 IP、TCP 和 UDP 校验和验证。如有需要,你可以在这些 dissector 中分别手动禁用校验和验证。
TCP 和 UDP 校验和会同时基于 payload 以及 IPv4 或 IPv6 头部中选定的元素来计算,这些元素称为 pseudo header。Linux 和 Windows 在卸载校验和时,会计算 pseudo header 的贡献值并将其放入 checksum 字段。Wireshark 4.2 及以上版本可以检测这种 partial checksums,并将其标记为 partial checksums,而不是标记为无效。
如果你遇到网络问题,并在尝试用 Wireshark 排查时发现这些校验和错误,那么你的网卡可能启用了 TCP checksum offload,并且由于某种原因数据包没有被适配器修正(NAT、bridge 或 route redirection 正在把数据包发送到另一个接口)。在这种情况下,如果可能,你可能需要检查并禁用该适配器的 checksum offload。
可以使用 ethtool 命令启用和禁用 checksum offloading。
检查:
ethtool --show-offload ethX禁用:
ethtool --offload ethX rx off tx off或者,对于某些 3Com 网卡(参见 3c59x vortex 文档):
rmmod 3c59x ; modprobe 3c59x hw_checksums=0在 Windows 中,进入 Control Panel->Network and Internet Connections->Network Connections,右键单击要更改的连接并选择“Properties”。按下“Configure...”按钮,选择“Advanced”选项卡以查看或修改“Offload Transmit TCP Checksum”和“Offload Receive TCP Checksum”的值。
有些网卡可以重新组装流量。这会在 Wireshark 中表现为大于预期的数据包,例如在 MTU 为 1500 字节的网络上出现 2900 字节的数据包。你可以使用上一节中描述的方法,在 Linux 和 Windows 上检查并更改卸载行为。
这篇文章对应该怎么做有很好的解释。
Chimney offloading 让 NIC 处理已建立 TCP 连接的处理工作。在 Windows 上,被卸载的连接会绕过 WinPcap,这意味着你将无法捕获 TCP 会话。
netsh int ip set chimney disabledWireshark User's Guide 中的 Checksums
Wikipedia 上的 TCP Offload Engine 文章
KB 912222,The Microsoft Windows Server 2003 Scalable Networking Pack Release
KB 951037,Information about the TCP Chimney Offload, Receive Side Scaling, and Network Direct Memory Access features in Windows Server 2008