这几天用Wireshark(以前叫Ethereal)抓包时发现很多包都有checksum error,后来随便归纳了一下,做个记录。
通过计算checksum可以检验网络上传输的数据包(TCP/UDP)在传输中有没有出错,以前这个计算是有系统来做的,因此网络数据量大的时候就比较消耗CPU,现在很多网卡都可以自己计算这个值了,这样就减轻了CPU的负担,提高了网络性能。这样一来有时候某些抓到的数据包就会有checksum error,因为有的包还没经过网卡来处理,未计算checksum就被抓包工具截获了,这个时候就会显示checksum error,实际上这个就是假error了。但是这种情况只是在某些情况下会出现,如何判断到底是不是假error,从2个方面来验证:首先看你的网络功能是否正常,比如你http访问一个网站,抓包工具在抓本机的http包,如果你能正常的完全打开这个网站,并确定这个网站没有被浏览器缓存,但是抓包工具上显示的http包有checksum error,那就是假error。其次你可以在同一网络的其他节点上抓你自己机器上的数据包,这样假error就不会存在了,因为你在其他节点上抓的(非本机)数据包是一定经过了机器网卡处理的,就是说checksum已经计算过了,如果这个时候还有checksum error,那就是真有丢包了。
关掉网卡的自身的checksum计算也可以避免这个问题,但是这样网络性能会降低,因为所有的checksum计算都会丢给系统的CPU去做。
Windows平台下关掉checksum计算:设备管理器->网卡配置->高级,在这个对话框里面就可以设置RX checksum Offload/TX checksum offload。
UNIX/Linux平台下关掉checksum计算:/sbin/ethtool -K(大写) eth0(网卡名) rx off tx off。查看网卡该选项是否打开:/sbin/ethtool -k(小写) eth0(网卡名)。
阅读(3070) | 评论(0) | 转发(0) |