当我们使用tcpdump捕获我们发出的数据包时,如何计算TCP的校验和

jas*_*foo 1 linux nic checksum tcp tcpdump

我试图生成一系列数据包来模拟TCP 3路握手程序,我的第一步是捕获真正的连接数据包,并尝试从同一台机器重新发送相同的数据包,但它不起作用首先.

最后我发现用tcpdump捕获的数据包并不是我的计算机发出的数据包,TCP的校验和字段发生了变化,这让我想到即使TCP校验和不正确也可以建立tcp连接.

所以我的问题是如何计算校验和字段?它是由tcpdump还是硬件修改的?为什么会改变?这是tcpdump的错误吗?或者是因为省略了计算.

以下是我从主机和虚拟机器上捕获的屏幕截图,你可以看到在不同的机器上捕获的相同数据包除了TCP校验和之外都是相同的.

并且小窗口是我的虚拟机,我使用命令"ssh 10.82.25.138"从主机生成这些数据包

在此输入图像描述

Fat*_*ror 7

您所看到的可能是校验和卸载的结果.引用wireshark wiki(http://wiki.wireshark.org/CaptureSetup/Offloading):

大多数现代操作系统都支持某种形式的网络卸载,其中一些网络处理发生在NIC而不是CPU上.通常这是一件好事.它可以释放系统其余部分的资源,并让它处理更多连接.如果您尝试捕获流量,则可能导致错误错误以及奇怪甚至丢失的流量.

在支持校验和卸载的系统上,在网络上传输之前,会在NIC上计算IP,TCP和UDP校验和.在Wireshark中,这些显示为标记为黑色的传出数据包,带有红色文本和注释[不正确,应该是xxxx(可能由"TCP校验和卸载"引起?)].

Wireshark在将数据包发送到网络适配器之前捕获数据包.它不会看到正确的校验和,因为它尚未计算.更糟糕的是,大多数操作系统都不打扰初始化这些数据,所以你可能看不到你不应该看到的大块内存.

虽然这是针对wireshark的,但同样的原则也适用.在您的主机中,您看到错误的校验和,因为它尚未填写.它在客户端看起来是正确的,因为在它被发送到"电线"之前它填写.尝试在处理此流量的接口上禁用校验和卸载,例如:

ethtool -K eth0 rx off tx off
Run Code Online (Sandbox Code Playgroud)

如果它是eth0.