扭曲 - 检测丢失的连接需要超过30分钟

时间:2018-03-23 22:53:28

标签: python twisted

我已经使用python写了一个tcp客户端并且已经扭曲,它连接到服务器并以简单的基于字符串的协议进行通信(由服务器制造商定义)。 TCP / IP连接应该保持不变,并在发生故障时重新连接。

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

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

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

2 个答案:

答案 0 :(得分:1)

基于TCP的协议的应用程序级保持是一个好主意。你应该实现这个。这使您可以完全准确地控制应用程序所需的超时语义。

TCP本身具有keepalive机制。您可以使用协议中的ITCPTransport方法调用来启用此功能。例如:

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

此keepalive的确切语义取决于平台和配置。完全有可能这已经启用,并且是检测到您的连接丢失的原因。三十分钟是这个机制注意到连接丢失的合理时间。

答案 1 :(得分:0)

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

TCP keepalive机制位于操作系统级别,默认值取决于操作系统,但可以配置。例如,默认的Linux TCP keepalive可以通过以下方式工作:

  1. 2小时后,发送一个keepalive探针。
  2. 如果失败,则每75秒发送另一个探针。
  3. 连续9次失败后,将连接标记为已关闭。这将由服务器拾取,并将触发它已采用的任何清除机制。

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

因此,尽管TCP keepalive最终会获得您死掉的连接,但要花很长时间才能插入。