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

时间:2013-03-21 03:10:32

标签: linux tcp checksum tcpdump nic

我正在尝试生成一系列数据包以模拟TCP 3路握手程序,我的第一步是捕获真正的连接数据包,并尝试从同一台机器重新发送相同的数据包,但它没有起初工作。

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

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

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

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

enter image description here

1 个答案:

答案 0 :(得分:7)

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

  

大多数现代操作系统都支持某种形式的网络卸载,   其中一些网络处理发生在NIC而不是CPU上。   通常这是一件好事。它可以释放剩下的资源   系统,让它处理更多的连接。如果你想要   捕获流量它可能导致错误的错误和奇怪甚至   缺少交通。

     

在支持校验和卸载,IP,TCP和UDP的系统上   校验和是在NIC传输之前在NIC上计算的   电线。在Wireshark中,这些显示为标记为黑色的传出数据包   用红色文字和笔记[不正确,应该是xxxx(可能是由   “TCP校验和卸载”?)]。

     

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

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

ethtool -K eth0 rx off tx off

如果是eth0。