TCP卸载网卡怎么导致TCP校验和无效?

Min*_*ius 0 tcp tcpdump tcp-offload-engine

一个 tcpdump pcap 导出并在另一台带有 wireshark 的机器上被调查显示出很多无效的 TCP 校验和消息。这是使用 TCP 卸载功能时已知并记录在案的现象:https : //wiki.wireshark.org/TCP_Checksum_Verification

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

TCP 校验和是在伪标头的帮助下在整个 TCP 段上计算的,并在校验和计算过程中使用全零的临时校验和值 ( http://www.tcpipguide.com/free/t_TCPChecksumCalculationandtheTCPPseudoHeader-2.htm#图_218)。然后丢弃伪标头。差异体现在哪里?

Mic*_*ton 7

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

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

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

  • 这里的关键是,这发生在*由执行捕获的机器*传输的数据包,而不是*由执行捕获的机器*接收的数据包。这些数据包不会*进入* NIC,它们是*由* NIC传输的。对于不进行校验和卸载的网卡,主机必须计算校验和并将其放入TCP头中,然后再将其交给网卡进行传输;对于*确实*的网卡,主机不会费心计算校验和,它只处理未校验和的数据包,网卡计算校验和,将其放入标头中,然后传输数据包...... (2认同)
  • ...而且,由于 NIC 不接收自己传输的数据包,为了“捕获”这些数据包,主机网络软件堆栈将它们的副本交给捕获机制。如果 NIC 正在执行校验和卸载,则交给捕获机制的副本*没有*具有有效的校验和,因为主机没有计算校验和并将其放入数据包中。由 NIC *do* 传输的数据包具有有效的校验和,但这不是传输数据包的主机在捕获中看到的。 (2认同)

Ter*_*nen 5

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

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

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

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

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

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