我正在开发一个使用 Linux TUN 接口的服务器/客户端套接字应用程序。
服务器直接从 TUN 接口获取数据包并将它们传递给客户端,客户端将接收到的数据包直接放入 TUN 接口。
<Server_TUN---><---Server---><---Clients---><---Client_TUN--->
有时,来自 Server_TUN 的数据包需要在 IP 层进行分段,然后才能传输到客户端。
所以在服务器上,我从 TUN 读取一个数据包,开始在 IP 层对其进行分段,然后通过套接字将它们发送给客户端。
实现分片逻辑时,解决方案效果不佳。
在 Client_TUN 上启动 Wireshark 后,我注意到所有传入的碎片数据包都出现 TCP 校验和错误。
在给定的屏幕截图中,号称 154 的帧在 155 中重新组装。
但声称 TCP 校验和不正确!
在服务器端,我保持 tcp 数据完整,对于给定的示例,当您在 Wireshark 中看到相反的情况时,我拆分了一个包含 1452 字节(包括 IP 标头)和 30 字节(包括 IP 标头)的数据包
我还检查了服务器上的 TCP 校验和值,它恰好是 0x935e,虽然我不认为校验和卸载对传入的数据包很重要,但我在客户端检查了卸载并且它关闭了。
$ sudo ethtool -k tun0 | grep ": on"
scatter-gather: on
tx-scatter-gather: on
tx-scatter-gather-fraglist: on
generic-segmentation-offload: on
generic-receive-offload: on
tx-vlan-offload: on
tx-vlan-stag-hw-insert: on
尽管如此,由于该解决方案现在不起作用,我认为它不是由卸载效应引起的。
您知道为什么 TCP 校验和对于分段数据包可能不正确吗?