我正在尝试生成一系列数据包以模拟TCP 3路握手程序,我的第一步是捕获真正的连接数据包,并尝试从同一台机器重新发送相同的数据包,但它没有起初工作。
最后我发现用tcpdump捕获的数据包并不是我的计算机发出的数据包,TCP的校验和字段发生了变化,这让我想到即使TCP校验和不正确也可以建立tcp连接。
所以我的问题是如何计算校验和字段?它是由tcpdump还是硬件修改的?为什么会改变?这是tcpdump的错误吗?或者是因为省略了计算。
以下是我从主机和虚拟机器上捕获的屏幕截图,你可以看到在不同的机器上捕获的相同数据包除了TCP校验和之外都是相同的。
并且小窗口是我的虚拟机,我使用命令“ssh 10.82.25.138”从主机生成这些数据包
答案 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。