解决抓到的报文校验和错误问题

在linux上使用tcpdump抓包,使用wireshark分析时发现发出的报文校验和都是错误的,可是仍然可以与目标建立链接,正常通信。这是为什么呢?

0x00 原因

在使用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协议栈来完成数据校验。

其实就是说,由于开启了硬件校验和功能,传输层并没有计算校验和,而是随机填了个数,所以你抓到的包校验和是错的,而这个错误的校验和在网卡发送出去前会被网卡改正过来,所以接收端收到的包是校验和正确的包,会发回反馈。

0x01 解决方法

知道原因后,就容易解决了,我用的是CentOS-7.0,所以以它为例,我们只需要关闭网卡的硬件校验和功能,就可以抓到校验和正确的报文了。

命令行下输入ehtool -k eth0,查看网卡校验和功能的开启状态。

9eec7bc0934e

checksum1

ethtool -K eth0 rx off tx off,关闭网卡校验和。

9eec7bc0934e

checksum2

重启网卡,sudo /etc/init.d/network restart

重启之后,再次查看网卡校验和功能开启状态,此时我们发现已经是off状态了。

9eec7bc0934e

checksum3

再次抓包,此时校验和正确。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐