wireshark捕捉ip数据遇到的问题Header checksum: 0x0000



wireshark捕捉ip数据遇到的问题Header checksum: 0x0000 [incorrect, should be...(maybe caused by “ip)

调程序时需要分析实验板与计算机之间的数据传输,用到网络抓包软件。使用wireshark抓取UDP报时总是出现Header checksum: 0x0000 [incorrect, should be...(maybe caused by “ip),想了半天找不出到底哪里出了问题。实验板给计算机发的包没有这个问题,计算机返回的包出现这种错误,估计问题可能处在计算机上。

Google+百度了半天总算找到了有用的帖子,问题宣告解决,下面直接把别人的贴过来:

Wireshark捕获的outgoing TCP包的IP header checksum error问题

标题其实描述得不是很到位,所以重述一遍问题:

使用Wireshark/Ethereal等抓包工具在本机抓包,会发现发出的TCP包被标记为IP头校验错误。
在Wireshark for win上的表现,往往是header checksum == 0x0000。
该问题在xp、win7均可能存在 。

这个问题困扰我好久,怀疑过是wireshark的bug,但是想想也不可能,也怀疑过是windows的问题,不过从实际的上层应用的表现来看,似乎这个问题又没有引发任何影响。之前也使用ip header checksum error 关键词在Google搜索过,相关帖子还是有的,不过都没有建设性的答案。今天人品爆发,竟然搜到了答案,赶快记录下来:

http://www.netexpert.cn/viewthread.php?tid=4850
该文章是05年的,汗一个,那时我还在泡妞和逃课。

这里总结一下原因和解决方案:

网卡驱动的高级配置中,一般有两项叫做Rx Checksum Offload和Tx Checksum Offload
以win7为例,可以看下图所示:


其中的“IPv4硬件校验和”即对应了这两个选项,它的可选项有“Rx & Tx 开启、Rx开启、Tx开启和关闭”四个。
默认的配置往往是 Rx & Tx 开启。它表示网卡会帮应用进行计算ip头的checksum字段,这样一来,操作系统的ip协议栈无须进行额外的checksum运算,它只需封装好ip数据报后甩给网卡即可。甩给网卡的原始ip报文的checksum字段值,原则上是无意义的,即随机的,但是根据windows上的表现来看,这个值一直是固定0x0000。

猜测一下Wireshark的抓包原理,大概是利用Pcap提供的某种机制,把发给网卡的数据给截获了一份,这样一来,如果操作系统协议栈中出来的ip包的checksum尚未被正确设置,Wireshark完全不知道该数据还会被网卡进行修正,于是它就报错了。

至此,如何使得Wireshark不再抱怨ip头校验错误,答案已经显而易见了,直接选择关闭“IPv4硬件校验和”选项即可(选择“Rx开启”应该也是可行的,这样就相当于关闭了Tx的硬件校验和功能。但是我没有试验过)。

//======================================

按照上面的方法改了之后果然就没有问题了,顶一个。

Header checksum: 0x0000 [incorrect, should be...(maybe caused by “ip checksum off load?”)]

原文:http://blog.sina.com.cn/s/blog_65db99840100kmzp.html

wireshark抓自己发出去的包的时候碰到这个问题,以为是程序的问题,可是接收方却说收到的包一点问题都没有。奇怪了,到网上一搜,长见识了。

http://forums.whirlpool.net.au/forum-replies-archive.cfm/1265837.html

a lot of modern network cards use TCP/IP checksum offloading, in which case Windows doesn't bother generating a checksum for each outbound packet and the network card adds them just before transmission.

This reduces the amount of work that the computer's CPU has to do, but the problem is that Wireshark can only intercept packets at the OS level, and hence thinks the checksums are invalid (when in fact the problem is that they haven't been added yet).

大意就是操作系统偷懒,把计算校验和的工作扔给了网卡,网卡在包发出去才加上校验和,wireshark在OS层抓包的时候,包的校验和还没被添加,是0x0000,于是认为header checksum incorrect。

想让OS自己加校验和,怎么办呢?

http://support.microsoft.com/kb/904946

要变通解决此问题,关闭将卸载网络适配器上的校验和。若要这样做,请按照下列步骤操作:

1.     单击 开始、单击 运行,键入 regedit,然后单击 确定

2.     找到并单击以下注册表子项: 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

3.     在右窗格中确保DisableTaskOffload 注册表项存在。如果此项不存在,请按照下列步骤以将项添加操作: 

a.       在 编辑 菜单上指向 新建,然后单击 DWORD 值

b.       键入 DisableTaskOffload,然后按ENTER 键。

4.     单击 DisableTaskOffload

5.     在 编辑 菜单上单击 修改

6.     在 数值数据 框中键入 1,然后按ENTER 键。

7.     退出注册表编辑器。

可是,我在win7下改了也没用,莫非要重启机器?不懂ing

 

果然,重启后正常了

你可能感兴趣的:(通讯)