我正在使用Linux TUN接口的服务器/客户端套接字应用程序。分片数据包的TCP校验和错误
服务器直接从TUN接口获取的数据包,并将其传递给客户,客户直接在TUN接口把接收到的数据包。
<Server_TUN---><---Server---><---Clients---><---Client_TUN--->
有时来自Server_TUN的数据包在传输到客户端之前需要在IP层进行分段。
因此,在服务器上,我从TUN读取一个数据包,在IP层开始分段并通过套接字将它们发送给客户端。
当实施分段逻辑时,解决方案无法正常工作。
在Client_TUN上启动Wireshark后,我注意到所有传入的碎片数据包都收到TCP Checksum错误。
在给定的屏幕截图,帧数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校验可以为分段的数据包是不正确的?