我已经使用python写了一个tcp
客户端并且已经扭曲,它连接到服务器并以简单的基于字符串的协议进行通信(由服务器制造商定义)。 TCP / IP连接应该保持不变,并在发生故障时重新连接。
当发生某种网络错误时(我假设在服务器端或沿途的某个节点上),客户端需要很长时间才能实现并启动新连接,远远超过几分钟
有没有办法加快速度?某种内置的TCP / IP保持活动功能可以更快地检测到断开连接?
我可以自己实现一个保持活动机制,并寻找超时,不确定这是否是这种情况下的最佳实践。你怎么看?此外,将reactor.connectTCP()
和reactor.run()
与ClientFactory
一起使用时,强制重新连接的最佳方法是什么?
答案 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可以通过以下方式工作:
请参阅:https://en.wikipedia.org/wiki/Keepalive#TCP_keepalive和http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html
因此,尽管TCP keepalive最终会获得您死掉的连接,但要花很长时间才能插入。