【问题标题】:TCP Checksum Calculation Changing - tcp offloading is disabledTCP 校验和计算更改 - 禁用 tcp 卸载
【发布时间】:2013-05-09 01:15:45
【问题描述】:

我正在使用 netfilter 处理 TCP 数据包,因此我必须重新计算按预期工作的 TCP 和 IP 校验和。

Wireshark 报告校验和在离开服务器时是正确的(这也与客户端认为的正确),但是当它们到达客户端时,校验和总是被替换为 0xAA6A。

在后路由钩子中,我正在计算 TCP 校验和,如下所示...在操作地址/端口之后。

 tcp_header->check = 0;
 tcp_header->check = tcp_v4_check(tcp_len,
   ip_header->saddr,
   ip_header->daddr,
   csum_partial((char *)tcp_header, tcp_len, 0));

IP校验和使用

 ip_send_check(ip_header);

服务器没有为 RX 或 TX 启用 TCP 卸载,甚至不支持它,尝试启用或禁用时出现不受支持的错误。

Offload parameters for eth0:
rx-checksumming: off
tx-checksumming: off
scatter-gather: off
tcp-segmentation-offload: off
udp-fragmentation-offload: off
generic-segmentation-offload: off
generic-receive-offload: on
large-receive-offload: off
rx-vlan-offload: off
tx-vlan-offload: off
ntuple-filters: off
receive-hashing: off

另一个我不确定的相关点......我还在服务器上的预路由挂钩中操作数据包/端口,它们被传输层接受并且无论如何肯定会到达我的应用程序我似乎对 TCP 校验和进行了处理,我假设如果在更改 IP 地址/和端口后 TCP 校验和没有更新,它们将被丢弃。

这种行为有什么明显的原因还是我误解了网络堆栈的一部分?

更新:

将 ip_summed 设置为 CHECKSUM_NONE 会在校验和离开我的代码后停止重新计算。我不确定的是为什么它被重新计算为不正确的固定值?如果我不设置,则设置为 CHECKSUM_PARTIAL。

【问题讨论】:

    标签: c linux tcp checksum netfilter


    【解决方案1】:

    如果另一侧的值始终相同,我看到 2 个主要可能性:1)您稍后在此代码之后覆盖校验和 2)tcp_len 错误 您还应该检查 NETIF_F_V4_CSUM 是否在 sockbuff dev->features 中设置,因为在这种情况下内核会做一些不同的事情

    【讨论】:

    • 校验和至少没有在我的代码中被覆盖,并且 tcp_len 应该是正确的,因为我实际上得到了正确的校验和,直到它离开 netfilter 后路由钩子(也被 Wireshark 看到)。我将看看 NETIF_F_V4_CSUM。将 skb->ip_summed 设置为 CHECKSUM_NONE 似乎可行,理想情况下它只是一个临时修复,因为卸载将是有益的。我假设卸载使用数据包中的 IP 地址作为 TCP 伪标头?
    • 设置为 CHECKSUM_NONE 之前的值是多少?当您说“它有效”时,设置为 NONE 后,您在校验和的线路上看到了什么? (或者你看到的是 0)除了发送端的校验和之外,在 linux vanilla 中卸载并没有多大作用,但无论如何你的补丁都需要工作。
    • 当我将 ip_summed 设置为 CHECKSUM_NONE 时,TCP 校验和在离开我的 netfilter 钩子时是正确的(和以前一样),并且在它到达客户端时也是正确的(以前不是这样)。我会用更多信息更新这个问题。
    • 我无法自己尝试,但我认为通过将 ip_summed 设置为 CHECKSUM_NONE,您基本上要求 TCP 代码重做校验和。您是否尝试在检查中设置虚假值并将 ip_summed 保留为 CHECKSUM_NONE?如果我是正确的,它应该也能正常工作。这就是为什么我在您的代码更改之前问您 ip_summed 的值是多少。我相信您在代码中执行的部分校验和只有在 CHECKSUM_PARTIAL 时才有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 2019-01-30
    • 2015-01-30
    相关资源
    最近更新 更多