【问题标题】:Dropping of connections with tcp_tw_recycle使用 tcp_tw_recycle 删除连接
【发布时间】:2012-02-12 05:07:17
【问题描述】:

问题总结

我们有一个设置,其中很多(每秒 800 到 2400 个传入连接到 linux 机器,并且我们在客户端和服务器之间有一个 NAT 设备。 所以系统中还有很多 TIME_WAIT 套接字。 为了克服这个问题,我们将 tcp_tw_recycle 设置为 1,但这会导致连接中断。 浏览网络后,我们确实找到了为什么会发生 tcp_tw_recycle 和 NAT 设备丢帧的参考资料。

分辨率尝试

然后我们尝试将 tcp_tw_reuse 设置为 1,它工作正常,没有任何问题,使用相同的设置和配置。

但是文档说当通过 TCP 状态感知节点(例如防火墙、NAT 设备或负载平衡器)的连接可能会看到丢帧时,不应使用 tcp_tw_recycle 和 tcp_tw_reuse。连接越多,您看到此问题的可能性就越大。

查询

1) tcp_tw_reuse 可以用于这种场景吗? 2)如果不是,linux代码的哪一部分阻止了tcp_tw_reuse被用于这种情况? 3)一般tcp_tw_recycle和tcp_tw_reuse有什么区别?

【问题讨论】:

    标签: linux tcp-ip


    【解决方案1】:

    默认情况下,当tcp_tw_reusetcp_tw_recycle 都被禁用时,内核将确保处于TIME_WAIT 状态的套接字将保持在该状态足够长的时间——足够长的时间以确保数据包属于未来的连接不会被误认为是旧连接的延迟包。

    启用tcp_tw_reuse 后,TIME_WAIT 状态的套接字可以在过期之前使用,内核将尝试确保没有关于 TCP 序列号的冲突。如果您启用tcp_timestamps(又名 PAWS,用于防止包装序列号),它将确保不会发生这些冲突。但是,您需要在 两端 上启用 TCP 时间戳(至少,这是我的理解)。有关血腥细节,请参阅definition of tcp_twsk_unique

    当您启用tcp_tw_recycle 时,内核变得更加激进,并且将对远程主机使用的时间戳做出假设。它将跟踪每个在TIME_WAIT 状态下连接的远程主机使用的最后一个时间戳),如果时间戳正确增加,则允许重新使用套接字。但是,如果主机使用的时间戳发生变化(即及时回溯),SYN 数据包将被静默丢弃,连接将无法建立(您将看到类似于“连接超时”的错误)。如果您想深入研究内核代码,definition of tcp_timewait_state_process 可能是一个很好的起点。

    现在,时间戳永远不会回到过去;除非:

    • 主机重新启动(但是,当它重新启动时,TIME_WAIT 套接字可能已经过期,所以这不是问题);
    • IP 地址很快被其他东西重用(TIME_WAIT 连接会保留一点,但其他连接可能会被TCP RST 攻击,这将释放一些空间);
    • 网络地址转换(或 smarty-pants 防火墙)参与了连接。

    在后一种情况下,您可以在同一个 IP 地址后面拥有多个主机,因此,不同的时间戳序列(或者,所述时间戳在防火墙的每个连接处是随机的)。在这种情况下,一些主机将随机无法连接,因为它们被映射到服务器的TIME_WAIT 存储桶具有较新时间戳的端口。这就是为什么文档告诉您“NAT 设备或负载平衡器可能会因为设置而开始丢帧”。

    有些人建议单独保留tcp_tw_recycle,但启用tcp_tw_reuse 并降低tcp_fin_timeout。我同意:-)

    【讨论】:

    • 底部链接损坏
    • 非常感谢。我正好遇到了这种情况——NAT后面的主机会随机无法连接,禁用net.ipv4.timestamps就一切正常(两台机器上都启用了tcp_tw_recycle和tcp_tw_reuse)。
    • 我相信,它应该是tcp_fin_timeout 而不是tcp_timewait_len。但也许它在内核版本中发生了变化?
    • tcp_tw_recycle 自 Linux 4.12 起已被删除。这是因为 Linux 现在随机化每个连接的时间戳,并且它们不会单调增加。如果您在使用 tcp_tw_recycle 的机器上使用 Linux 4.12 并且打开了 TCP 时间戳,您将看到连接断开。您当然可以像 echo 0 > /proc/sys/net/ipv4/tcp_timestamps 那样禁用它(暂时使用 sysctl.conf 进行永久更改)。 4.12 移除 tcp_tw_recycle 详情:git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多