Python twisted-检测断开连接需要30分钟以上

Python twisted-检测断开连接需要30分钟以上,python,twisted,Python,Twisted,我已经使用python和twisted编写了一个tcp客户端,它连接到服务器并以一个简单的基于字符串的协议(由服务器制造商定义)进行通信。TCP/IP连接应保持不变,并在出现故障时重新连接 当发生某种网络错误时(我假设是在服务器端或沿途的某个节点上),客户机需要很长时间才能意识到这一点并启动一个新的连接,远远超过几分钟 有没有办法加快速度?某种内置的TCP/IP保持活动功能可以更快地检测到断开 我可以自己实现一个keep-alive机制,并寻找超时,但不确定这是否是这种情况下的最佳实践。你怎么认

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

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

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


我可以自己实现一个keep-alive机制,并寻找超时,但不确定这是否是这种情况下的最佳实践。你怎么认为?另外,当使用
ClientFactory
使用
reactor.connectTCP()
reactor.run()
时,强制重新连接的最佳方法是什么?

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

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

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

此keepalive的确切语义取决于平台和配置。这是完全可能的,这是已经启用,是什么检测到您的连接丢失。30分钟是该机制发现连接丢失的合理时间。

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

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

  • 2小时后发送一个keepalive探针
  • 如果失败,每75秒发送另一个探测器
  • 连续9次失败后,将连接标记为关闭。这将由服务器接收,并将触发其现有的任何清理机制
  • 见:和


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

    仍然需要一些时间进行验证,但使用setTcpKeepAlive(True)时,连接的维护时间似乎要长得多。