wireshark/tcpdump 抓到的包, 总会显示本机发送的 TCP包(和/或 IP包)校验和错误。这是由于现在网卡硬件会自动填充校验和以减轻CPU负荷,所以操作系统在TCP包的校验和中随便填充一个数字,留给网卡硬件去填充。而wireshark抓包是属于系统层,所以抓到的往外发发的TCP包校验值总是错的。
下面是intel官方对网卡驱动参数的解释:
IPv4 校验和分载 允许适配器验证接收到信息包(Rx) 上的 TCP/IP 校验和,并计算被传输的信息包 (Tx) 上的校验和 。IPv4 校验和分载在安装了 Windows* 设备管理器英特尔® PROSet 的情况下在 TCP/IP 分载选项 属性下配置。启用此功能可以提高 TCP/IP 传输性能,并降低 CPU 使用量。禁用分载时,操作系统将计算并验证 TCP/IP 校验和。TCP 校验和分载传输 (IPv4) 和 TCP 校验和分载传输 (IPv6) 使适配器能计算 (Tx) 或验证 (Rx) 数据包的 TCP 校验和。TCP 校验和分载在安装了 Windows* 设备管理器英特尔® PROSet 的情况下在 TCP/IP 分载选项 属性下配置。此功能可提高性能,并降低 CPU 使用量。启用分载时,适配器进行计算或校验操作系统的校验和。
解决办法:
1)如果对抓包,要求很高,可以对禁用掉硬件自动计算校验和。让操作系统去计算即可。
windows下:
linux下:
查看
[root@localhost src]# ethtool -k eth0
Offload parameters for eth0:Cannot get device udp large send offload settings: Operation not supportedrx-checksumming: ontx-checksumming: onscatter-gather: ontcp segmentation offload: onudp fragmentation offload: offgeneric segmentation offload: offgeneric-receive-offload: off
关闭
[root@localhost src]# ethtool -K eth0 tx off rx off
2)抓到包后使用工具 tcprewrite 重新计算 TCP/IP 包校验和
tcprewrite -C -i input.pcap -o output.pcap