名词解释:
checksum意思是“校验和”
incorrect意思是“不正确”
validation意思是“确认”
disabled意思是“禁用”
故障现状:
WireShark分析数据包,网卡没有dropped,正常的数据包居然出现了checksum incorrect。(传输中本身有问题出现的
checksum incorrect本文中不做说明)
分析原因:
正常情况下,系统的TCP/IP协议栈计算TCP包的校验和。然而从网卡属性配置中,我们发现居然在高级选项里可以设置Checksum
Offload是否对Rx或Tx有效,也可以设置为对两者都有效。
对于Tx,设置Checksum Offload有效之后,Windows的传输层将随机填充TCP校验和,因此在本机上抓取的数据包是Bad
CheckSum。然后,网卡会自动计算正确的校验码然后发送,因此对方收到的仍然是正确的TCP包。
对于Rx,设置Checksum Offload有效之后,网卡在接收数据时,会填充一个NDIS_TCP_IP_CHECKSUM_PACKET_INFO 结构并设置标
志位;如果由于某种原因失败,则不设置标志位,由Windows里的TCP/IP协议栈来完成数据校验。
CheckSum Offload实际上是将传输层的一部分工作交给了硬件完成,以节约系统的CPU资源。微软的测试表明它可以最多节约
30%的CPU资源。IBM里AIX的文档则指出:对于PCI接口的千兆网卡来说还不如让400Mhz以上的CPU来计算校验和,而PCI-X的千兆网卡
启用此项后可以达到线路速度,从而节约CPU资源。
简单的总结下,就是WireShark抓到的数据包提示Checksum错误,仅仅是因为它截获到的是操作系统胡乱填充的checksum,而千
兆网卡在开启Checksum Offload之后,会把这些计算的工作交给网卡去做,网卡最后还是会计算出正确的checksum并且发出去的。
解决方法:
Windows下,如果网卡支持checksum offload,则可以再设备管理器->网络适配器属性->高级 里面通过设置checksum offload
为disabled即可。
Linux下,可以通过ethtool来关闭checksum offload,具体方法如下:
#ethtool -K eth0 tx off rx off
修改结果:
正常数据包显示checksum correct,在TCP中显示的是checksum:validation disabled。证明我们的修改得到了正确的结果。