分享

checksum:incorrect;checksum:validation disabl...

 饕餮一号 2010-11-22
2010-11-13 12:18

名词解释:
    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。证明我们的修改得到了正确的结果。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多