twisted - 丢失连接的检测需要超过 30 分钟
twisted - detection of lost connection takes more than 30 minutes
我使用 python 编写了一个 tcp
客户端并进行了修改,它连接到服务器并以基于简单字符串的协议(由服务器制造商定义)进行通信。 TCP/IP 连接应该持续存在,并在失败时重新连接。
当出现某种网络错误时(我假设是在服务器端或沿途的某个节点上),客户端需要很长时间才能意识到这一点并启动一个新连接,这比一个几分钟。
有没有办法加快速度?某种内置的 TCP/IP 保持活动状态的功能可以更快地检测到断开连接?
我可以自己实现一个保持活动机制,并寻找超时,但不确定在这种情况下这是最佳做法。你怎么看?另外,当 reactor.connectTCP()
和 reactor.run()
与 ClientFactory
一起使用时,强制重新连接的最佳方法是什么?
TCP-based 协议的应用级别 keep-alives 是个好主意。你可能应该实现这个。这使您可以完全和精确地控制您希望从应用程序中获得的超时语义。
TCP本身就有keepalive机制。您可以通过协议中的 ITCPTransport
方法调用启用此功能。例如:
class YourProtocol(Protocol):
def connectionMade(self):
self.transport.setTcpKeepAlive(True)
此保活的确切语义取决于平台和配置。这完全有可能已经启用并且正在检测您的连接丢失。三十分钟对于这种机制来说是一个相当合理的时间来注意到丢失的连接。
如 Jean-Paul Calderone 所述,您可以实施应用程序级别的保活或使用 TCP 保活机制。应用程序级别的保活是首选方法,因为它可以为您提供更细粒度的控制。
TCP keepalive 机制存在于 OS 级别,默认值依赖于 OS,但可以配置。例如,默认的 linux TCP keepalive 以下列方式工作:
- 2 小时后发送保活探测。
- 如果失败,则每 75 秒发送一次探测。
- 连续9次失败后,将连接标记为关闭。这将由服务器拾取并触发它现有的任何清理机制。
参见:https://en.wikipedia.org/wiki/Keepalive#TCP_keepalive and http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html
因此,虽然 TCP keepalive 最终会获得您的死连接,但需要相当长的时间才能启动。
我使用 python 编写了一个 tcp
客户端并进行了修改,它连接到服务器并以基于简单字符串的协议(由服务器制造商定义)进行通信。 TCP/IP 连接应该持续存在,并在失败时重新连接。
当出现某种网络错误时(我假设是在服务器端或沿途的某个节点上),客户端需要很长时间才能意识到这一点并启动一个新连接,这比一个几分钟。
有没有办法加快速度?某种内置的 TCP/IP 保持活动状态的功能可以更快地检测到断开连接?
我可以自己实现一个保持活动机制,并寻找超时,但不确定在这种情况下这是最佳做法。你怎么看?另外,当 reactor.connectTCP()
和 reactor.run()
与 ClientFactory
一起使用时,强制重新连接的最佳方法是什么?
TCP-based 协议的应用级别 keep-alives 是个好主意。你可能应该实现这个。这使您可以完全和精确地控制您希望从应用程序中获得的超时语义。
TCP本身就有keepalive机制。您可以通过协议中的 ITCPTransport
方法调用启用此功能。例如:
class YourProtocol(Protocol):
def connectionMade(self):
self.transport.setTcpKeepAlive(True)
此保活的确切语义取决于平台和配置。这完全有可能已经启用并且正在检测您的连接丢失。三十分钟对于这种机制来说是一个相当合理的时间来注意到丢失的连接。
如 Jean-Paul Calderone 所述,您可以实施应用程序级别的保活或使用 TCP 保活机制。应用程序级别的保活是首选方法,因为它可以为您提供更细粒度的控制。
TCP keepalive 机制存在于 OS 级别,默认值依赖于 OS,但可以配置。例如,默认的 linux TCP keepalive 以下列方式工作:
- 2 小时后发送保活探测。
- 如果失败,则每 75 秒发送一次探测。
- 连续9次失败后,将连接标记为关闭。这将由服务器拾取并触发它现有的任何清理机制。
参见:https://en.wikipedia.org/wiki/Keepalive#TCP_keepalive and http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html
因此,虽然 TCP keepalive 最终会获得您的死连接,但需要相当长的时间才能启动。