碎片数据包的TCP校验和错误

时间:2016-11-22 02:00:19

标签: tcp ip checksum ip-fragmentation

我正在使用Linux TUN接口的服务器/客户端套接字应用程序。

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

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

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

所以在服务器上我从TUN读取一个数据包,开始在IP层中对其进行分段,然后通过套接字将它们发送给客户端。

实施碎片逻辑后,解决方案效果不佳。

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

wireshark capture

在给定的屏幕截图中,声称帧号154在155中重新组装。

但TCP校验和声称不正确!

在服务器端,我保持tcp数据完好无损,对于给定的示例,当你看到Wireshark中的反向时,我已经拆分了一个包含1452字节(包括IP头)和30字节(包括IP头)的数据包

我还检查了服务器上的TCP校验和值,它的确是0x935e,虽然我不认为Checksum卸载对传入的数据包很重要,但我检查了客户端的卸载情况并且它已经关闭。

$ 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校验和对于碎片数据包可能不正确?

1 个答案:

答案 0 :(得分:0)

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