TCP 卸载网卡如何导致 TCP 校验和无效?

TCP 卸载网卡如何导致 TCP 校验和无效?

导出的 tcpdump pcap 在另一台机器上使用 wireshark 进行调查时显示大量无效的 TCP 校验和消息。这是使用 TCP 卸载功能时已知且有据可查的现象:https://wiki.wireshark.org/TCP_Checksum_Verification

唯一不清楚的是为什么校验和不正确?

TCP 校验和是利用伪报头对整个 TCP 段进行计算的,在校验和计算过程中使用全零的临时校验和值(http://www.tcpipguide.com/free/t_TCPChecksumCalculationandtheTCPPseudoHeader-2.htm#Figure_218)。然后丢弃伪报头。差异在哪里呢?

答案1

TCP 段位于计算机 RAM 中。它包含 TCP 段所需的所有字段。

当使用 TCP 校验和卸载时,传输段时会发生以下情况:

操作系统会填写内存中 TCP 段的每个字段,但校验和除外。校验和字段不是由操作系统计算的,它包含之前在该内存位置存在的任何数据。

现在,像 Wireshark 这样的数据包捕获工具可以捕获此内存位置的内容,其中包含没有计算校验和的 TCP 段。

当操作系统将数据段发送到 NIC 时,NIC 硬件会执行校验和计算,并将计算出的校验和放入特定的 TCP 数据段字段。操作系统或捕获工具永远不会看到此校验和。

这就是 Wireshark 报告这些错误的原因。

答案2

因为校验和是由 NIC 计算的,而不是由操作系统计算的。

您链接到的 wiki 页面确实解释了这一点:

如果您在最近的以太网 NIC 上进行捕获,您可能会看到许多此类“校验和错误”。这是因为这些 NIC 上经常实施 TCP 校验和卸载,因此对于机器传输的数据包也是如此。直到 NIC 硬件将数据包发送出去后,您的捕获工具从网络堆栈截获数据包很久之后,才会计算校验和。

相关内容