2016-11-22 261 views
0

我正在使用Linux TUN接口的服务器/客户端套接字应用程序。分片数据包的TCP校验和错误

服务器直接从TUN接口获取的数据包,并将其传递给客户,客户直接在TUN接口把接收到的数据包。

<Server_TUN---><---Server---><---Clients---><---Client_TUN---> 

有时来自Server_TUN的数据包在传输到客户端之前需要在IP层进行分段。

因此,在服务器上,我从TUN读取一个数据包,在IP层开始分段并通过套接字将它们发送给客户端。

当实施分段逻辑时,解决方案无法正常工作。

在Client_TUN上启动Wireshark后,我注意到所有传入的碎片数据包都收到TCP Checksum错误。

wireshark capture

在给定的屏幕截图,帧数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校验可以为分段的数据包是不正确的?

回答

0

希望我找到了问题。这是我的错误。当我应对缓冲区时,一些tcp数据丢失了。我正在追踪索引和长度,但由于数据的变化,校验和值在客户端计算方式不同。