![tcpdump:即使禁用卸载后,从客户端到本地主机接口的 cksum 仍然无效](https://linux22.com/image/763328/tcpdump%EF%BC%9A%E5%8D%B3%E4%BD%BF%E7%A6%81%E7%94%A8%E5%8D%B8%E8%BD%BD%E5%90%8E%EF%BC%8C%E4%BB%8E%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%88%B0%E6%9C%AC%E5%9C%B0%E4%B8%BB%E6%9C%BA%E6%8E%A5%E5%8F%A3%E7%9A%84%20cksum%20%E4%BB%8D%E7%84%B6%E6%97%A0%E6%95%88.png)
我遇到了一个奇怪的问题。在 Linux 中,我打开了两个窗口。一个运行 tcpdump,另一个运行 curl。我使用 curl 尝试连接到本地主机,但 tcpdump 记录了无效校验和错误。这是来自 tcpdump 窗口的日志:
bash-4.2# tcpdump -evvvt -i lo
tcpdump: listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes
00:00:00:00:00:00 (oui Ethernet) > 00:00:00:00:00:00 (oui Ethernet), ethertype
IPv4 (0x0800), length 74: (tos 0x0, ttl 64, id 18215, offset 0, flags [DF],
proto TCP (6), length 60)
localhost.37550 > localhost.http: Flags [S], cksum 0xfe30 (incorrect -> 0x5d4b),
seq 112438199, win 32792, options [mss 16396,sackOK,TS val 4648080 ecr 0,nop,wscale 9], length 0
00:00:00:00:00:00 (oui Ethernet) > 00:00:00:00:00:00 (oui Ethernet), ethertype
IPv4 (0x0800), length 54: (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 40)
localhost.http > localhost.37550: Flags [R.], cksum 0x6c64 (correct), seq 0, ack 112438200, win 0, length 0
而且 curl 窗口没有任何有趣的内容。如果我使用最大详细程度,我得到的只是连接到 127.0.0.1。然后它立即终止并显示无法连接到主机。
然后我使用 ethtool -k 查看我可以调整哪些参数来禁用卸载,因为许多人声称我的问题是由于卸载造成的。以下是我可以进行调整后的参数:
Offload parameters for lo:
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp-segmentation-offload: off
udp-fragmentation-offload: off
generic-segmentation-offload: off
generic-receive-offload: off
large-receive-offload: off
rx-vlan-offload: off
tx-vlan-offload: off
ntuple-filters: off
receive-hashing: off
我尝试关闭所有设置,但无法关闭的设置出现以下错误:
bash-4.2# ethtool -K lo rx off
Cannot set device rx csum settings: Operation not supported
bash-4.2# ethtool -K lo tx off
Cannot set device tx csum settings: Operation not supported
bash-4.2# ethtool -K lo sg off
Cannot set device scatter-gather settings: Operation not supported
设备lo是本地主机接口。
我该如何修复这个问题,以便当我使用 tcpdump 或任何其他 tcp 数据包工具时,我不会从成功使用 TCP 连接到其他 IP 地址的实用程序那里得到校验和错误?