linux tcp检验和不正确的是,解决抓到的报文校验和错误问题

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

在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

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

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值