TCP连接寿命

时间:2020-03-06 14:59:14  来源:igfitidea点击:

我期望客户端/服务器TCP连接能持续多长时间?

我希望它保持永久连接,但是事情发生了,所以客户端将不得不重新连接。我在什么时候说代码有问题,而不是某些外部设备有问题?

解决方案

没什么关系,如果需要的话,我们应该将代码设计为自动重新连接。

真的没有办法说出来。 TCP没有固有的功能,不会导致连接在一定时间后断开。连接可靠的人可能需要数年的正常运行时间,而连接不同的人则必须每5分钟重新连接一次。没有办法说甚至猜测。

选择一个值。每小时一滴可能不错。 5分钟内出现十个意外的连接断开可能表明存在问题。

TCP连接通常将持续约两个小时而没有任何流量。任何一端都可以发送保持活动的数据包,我认为这只是最后收到的数据包上的ACK。通常可以针对每个套接字设置此属性,或者默认情况下可以针对每个TCP连接设置该属性。

应用程序级别的保持活动也是可能的。对于FTP,SMTP,POP或者IMAP之类的telnet样式协议,诸如发送return,换行符和返回命令提示符之类的东西。

我们将需要定期通过连接传输一些数据,以使其保持活动状态,许多操作系统或者防火墙将断开不活动的连接。

我同意赞·山猫(Zan Lynx)的观点。不能保证,但是假设没有连接或者带宽问题,则可以通过在其上发送数据来无限期地保持连接的活动。

通常,我选择了应用程序级别的"保持活动"方法,尽管这通常是因为它已包含在客户端规范中,所以我必须这样做。但是,只需每隔一两分钟发送一小段数据,我们就可以对它们进行某种确认。

是否将一次失败确认为连接失败取决于我们。通常,这是我过去所做的,尽管在某些情况下,我已经连续等待三个失败的响应以断开连接,因为连接另一端的应用对于响应"我们在那儿"非常不满意?"要求。

如果连接失败(即使在同一网络上的计算机也可能在某个时候失败),则只需尝试重新建立连接即可。如果该操作失败了一定次数,那么我们就遇到了问题。如果连接一段时间后连接仍然持续失败,那么我们有问题。在这两种情况下,很可能都是网络问题,而不是代码,或者机器上的TCP / IP堆栈有问题(众所周知:我在旧版本的QNX上遇到了与此有关的问题-只是随机倒下)。话虽这么说,我们可能会遇到软件问题,但要确定的唯一方法通常是添加调试器或者在其中进行一些登录。例如。如果我们始终可以成功连接,但是经过一段时间后,即使重新连接后,我们也停止获得ACK,则可能是服务器死锁,或者陷入了循环或者其他问题。

真正有用的是在各种负载条件下设置一系列长期运行的测试,从仅发送保持活动状态?/ ack请求和响应,到彻底破坏服务器。通常,这将使我们对软件组件有更多的信心,并且对于消除一些确实很奇怪的问题(虽然可能会导致事务发生的问题),这些问题不一定会引起连接问题,这确实很有用。例如,我曾经写过一个电信应用程序服务器,它提供诸如号码转换之类的服务,而我们只是让它一次运行几天。问题是,当周六整天到来时,它将拒绝所有传入的呼叫请求,这等于数以百万计的呼叫,而我们也不知道为什么。原来是由于某些日期转换代码中的单个错字仅在星期六引起了问题。

希望能有所帮助。

我认为这里最重要的想法是理论与实践。

最初的理论是,连接没有生命周期。如果我们有连接,即使没有流量,它也将永远保持打开状态,直到事件导致其关闭。

新理论是,大多数OS版本都打开了keep-alive计时器。这意味着只要另一端的系统对偶尔的TCP级别的交换做出响应,连接将永远持续下去。

实际上,许多连接都会随着时间的推移而终止,并具有各种条件和情况。

两个非常好的例子是:远程客户端使用DHCP,租约到期,并且IP地址更改。

另一个例子是防火墙,它似乎越来越智能,可以识别保持活动的流量与真实数据,并根据任何高级条件(尤其是空闲时间)关闭连接。

我们如何实现重新连接逻辑的方法在很大程度上取决于体系结构,工作环境和性能目标。