在使用WireShark等截取数据包时,往往会出现错误的CheckSum,这主要是因为网卡开启了CheckSum Offload(硬件校验和) 功能,系统将CheckSum的计算工作交由网卡去计算,在高速网络交换的情况下可以大大减轻CPU的工作负荷。
在windows系统中的Checksum Offload过程如下:
如果网卡支持,在高级选项里可以设置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资源。
5.23 Ethereal抓包时发现TCP校验和错误
Q:
在Windows平台上用Ethereal抓包时发现TCP校验和错误,但应用层的反应告诉我,这
个报文的TCP校验和没问题。
A: 2000-03
网卡配置->高级->Rx Checksum Offload/Tx Checksum Offload,很可能你的这两处
设置是Enable,将之调整成Disable即可,代价是网络性能降低。
一般由操作系统的TCP/IP协议栈完成TCP/UDP/IP校验和的计算工作,这两处设置成
Enable之后,协议栈不再进行校验和的计算,而是由网卡自己完成。如果在前述位置
没有发现Rx Checksum Offload/Tx Checksum Offload项,有两种可能,一种是网卡
本身不支持这种功能,另一种是网卡驱动未提供配置项,后一种情形居多。 下载本文