【问题标题】:twisted - detection of lost connection takes more than 30 minutes扭曲 - 检测丢失的连接需要 30 多分钟
【发布时间】:2018-03-23 22:53:28
【问题描述】:

我使用 python 和twisted 编写了一个tcp 客户端,它连接到服务器并以基于简单字符串的协议(由服务器制造商定义)进行通信。 TCP/IP 连接应该持续存在,并在失败时重新连接。

当发生某种网络错误时(我假设在服务器端或沿途的某个节点上),客户端需要很长时间才能意识到这一点并启动新连接,远远超过几分钟.

有没有办法加快速度?某种内置的 TCP/IP 保持活动功能可以更快地检测到断开连接?

我可以自己实现一个保持活动机制,并寻找超时,不确定在这种情况下这是最佳实践。你怎么看?另外,当reactor.connectTCP()reactor.run()ClientFactory 一起使用时,强制重新连接的最佳方法是什么?

【问题讨论】:

    标签: python twisted


    【解决方案1】:

    基于 TCP 的协议的应用程序级保持活动是一个好主意。您可能应该实现这一点。这使您可以完全而精确地控制您希望从应用程序中获得的超时语义。

    TCP 本身有一个保活机制。您可以通过协议中的ITCPTransport 方法调用来启用此功能。例如:

    class YourProtocol(Protocol):
        def connectionMade(self):
            self.transport.setTcpKeepAlive(True)
    

    此 keepalive 的确切语义取决于平台和配置。这完全有可能已经启用,并且正在检测您的连接丢失。 30 分钟对于这种机制来发现连接丢失来说是相当合理的时间。

    【讨论】:

    • 仍然需要一些时间来验证,但是使用 setTcpKeepAlive(True) 连接似乎可以维持更长的时间。
    【解决方案2】:

    正如 Jean-Paul Calderone 所述,您可以实现应用程序级别的 keepalive 或使用 TCP keepalive 机制。应用程序级别的 keepalive 是首选方法,因为它可以为您提供更细粒度的控制。

    TCP keepalive 机制存在于操作系统级别,默认值取决于操作系统,但可配置。例如,默认的 linux TCP keepalive 的工作方式如下:

    1. 2 小时后发送保活探测。
    2. 如果失败,请每 75 秒再发送一次探测。
    3. 连续 9 次失败后,将连接标记为关闭。这将由服务器获取,并触发其现有的任何清理机制。

    请参阅:https://en.wikipedia.org/wiki/Keepalive#TCP_keepalivehttp://tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html

    因此,虽然 TCP keepalive 最终会收获你的死连接,但它需要相当长的时间才能启动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 2017-09-23
      • 2015-07-02
      • 1970-01-01
      • 2011-05-19
      相关资源
      最近更新 更多