1

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

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

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

以下是我从我的主机和虚拟机上截取的截图,你可以看到在不同的机器上截取的同一个数据包除了 TCP 校验和之外都是一样的。

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

在此处输入图像描述

4

1 回答 1

8

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

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

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

Wireshark 在将数据包发送到网络适配器之前捕获它们。它不会看到正确的校验和,因为它还没有被计算出来。更糟糕的是,大多数操作系统都不会费心初始化这些数据,因此您可能会看到不应该的小块内存。

虽然这适用于wireshark,但同样的原则也适用。在您的主机中,您会看到错误的校验和,因为它还没有被填写。它在客户机上看起来是正确的,因为在它通过“线路”发送之前它已填充。尝试在处理此流量的接口上禁用校验和卸载,例如:

ethtool -K eth0 rx off tx off

如果是 eth0。

于 2013-03-21T03:39:24.703 回答