【问题标题】:TCP checksum error for fragmented packets碎片数据包的 TCP 校验和错误
【发布时间】:2017-04-05 14:01:07
【问题描述】:

我正在开发一个使用 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 校验和对于分段数据包可能不正确吗?

【问题讨论】:

    标签: tcp ip checksum ip-fragmentation


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2014-04-09
      • 2010-10-02
      • 2019-01-30
      • 2020-08-02
      • 1970-01-01
      • 2020-06-06
      • 2015-01-30
      • 1970-01-01
      • 2020-10-01
      相关资源
      最近更新 更多