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)。然后丢弃伪标头。差异体现在哪里?
因为,校验和是由 NIC 计算的,而不是由操作系统计算的。
您链接到的维基页面确实解释了这一点:
如果您在最近的以太网 NIC 上进行捕获,您可能会看到许多此类“校验和错误”。这是因为 TCP 校验和卸载经常在这些 NIC 上实现,因此,对于机器传输的数据包。在 NIC 硬件发出数据包之前,不会计算校验和,这是在您的捕获工具从网络堆栈中截获数据包很久之后。
TCP 段位于计算机 RAM 中。它包含 TCP 段所需的所有字段。
当使用 TCP 校验和卸载时,传输分段时会发生以下情况:
操作系统将 TCP 段中的每个字段填充到内存中,校验和除外。校验和字段不是由操作系统计算的,它包含该内存位置之前存在的任何数据。
现在,像 Wireshark 这样的数据包捕获工具可以捕获该内存位置的内容,其中包含一个没有计算校验和的 TCP 段。
当操作系统将数据段发送到 NIC 时,NIC 硬件会执行校验和计算,并将计算出的校验和放入特定的 TCP 数据段字段。操作系统或捕获工具永远不会看到此校验和。
这就是 Wireshark 报告这些错误的原因。