我是否需要心跳以保持TCP连接打开?


94

我有两个通过TCP / IP进行通信的组件。组件A充当服务器/侦听器,而组件B充当客户端。两者应尽快沟通。任何时候都只能有一个连接(尽管此问题除外)。我公司的一位高级开发人员表示,我需要在两个组件之间使用应用程序级心跳,以确保连接保持打开状态。

我以为使用TCP / IP可以保持连接打开,但是我读过许多博客/站点,这是在这些应用程序之间进行心跳检测的非常标准的做法。

我知道组件A心跳组件B的部分原因是,它可以在组件B存在通信问题(链接断开或组件B未运行)时通知支持。是否由于其他原因需要心跳?如要确保经常有“管道中的东西”保持打开状态?

当前,组件A每20秒对组件B进行一次心跳检测,如果在120​​秒内没有收到来自组件B的任何反馈,则关闭连接。然后假定组件B在链路断开的情况下会定期尝试重新连接,它会继续侦听连接。这可以成功工作。

重申我的问题:是否必须保持心跳才能保持TCP / IP连接的活动?


1
这种行为是否也取决于实现?这是TCP标准中指定的内容,还是留作实现细节?希望其他人也可以回答。
dss539,2009年

1
我要说的是实现细节,因为并非所有基于TCP / IP的协议都实现,所以完全由您自己决定。
劳埃德

5
是-不监守TCP / IP -但由于其他硬件或你的连接可以通过例如去如防火墙和家庭“路由器”,其下降的倾向不活动的TCP连接,相关软件:stackoverflow.com/questions/3907537/...
markmnl

Answers:


54

无论如何,连接都应保持打开状态,但是是的,通常会看到协议实现了心跳以帮助检测无效连接,例如使用PING命令进行IRC 。


34
保持连接的另一个常见原因是o通过nat网关保持连接打开。尽管TCP本身不需要keepalive进行操作,但对于nat网关,在给定的超时后“丢弃” tcp连接是很常见的。

4
什么是正常超时?秒,分钟,小时?
MiniGod 2012年

@Lloyd我“认为” MiniGod的意思是,“ 正常的超时时间有多长?” (以秒,分钟,小时,…给出的答案)
jeromej 2014年

@JeromeJ谁知道,已经过去了几年;)
Lloyd

同样,如果您的连接正在通过代理,则可以认为如果连接过时,连接将被丢弃。在这种情况下,我认为保持活动状态不会有所帮助,因为tcp的这一方面不会传播到应用程序。
基塔2015年

49

正如许多其他人指出的那样,如果将TCP连接留给自己的设备,它将保持连接状态。但是,如果您在连接中间有一个跟踪其状态的设备(例如防火墙),则可能需要保持活动状态才能使状态表条目不过期。


TCP连接会永远存活吗?
user7817808

22

如果您的组件是:

  • 在常规的有线网络中
  • 它们之间没有防火墙或NAT路由器
  • 他们都不崩溃

那么您就不需要心跳了。

如果这些假设中的任何一个都不成立(我正在看您,GPRS!),那么心跳就变得非常必要。


1
不过,这通常是联网。考虑一下Peter Deutsch的分布式计算谬论;我们知道网络本质上是不可靠的,因此应将其视为应用程序中几乎某个故障点。在这种情况下,无论是否使用常规的有线网络,都假定您在某个时候会遇到故障,并设计应用程序来处理这种情况。
史蒂文·巴赫蒂亚里

11

您不需要自己发送心跳。无论使用情况如何,TCP连接都将保持打开状态。

请注意,TCP实现了可选的keepalive机制,该机制可用于及时标识已关闭的连接,而不是要求您稍后发送数据,然后才发现连接已关闭。


1
应该如何在linux上工作?它实际上起作用吗?我可以将超时时间安排在2小时以内吗?例如30秒?
伊泰·莱文

为此,应用程序需要支持keepalive。仅在Linux中启用它是不够的。
Mike Vella

9

如果您使用的是Windows,请谨慎使用TCP Keep-alive。默认情况下,它是禁用的,除非您使用Windows注册表或通过setsockopt全局将其打开。

默认的保持活动间隔为2小时。

http://msdn.microsoft.com/en-us/library/ms819735.aspx

如果不希望2小时保持活动状态,则可能需要实现自己的心跳并在Windows上禁用TCP保持活动状态。


3

为了保持TCP / IP连接的活动,是否需要心跳?

它们对于检测何时断开连接很有用。


3

TCP将使连接保持活动状态。应用程序心跳用于应用程序级别的考虑,例如故障转移,负载平衡或向管理员警告潜在的问题。


3

心跳是告诉服务器您还活着的好方法,这意味着,如果服务器使用的是DoS攻击防御系统,则它(服务器)在检测到连接后可能会删除该特定连接的所有已分配资源。在指定时间段内处于非活动状态。
他们无权实施任何心跳机制。

但是如果您要设计一个主要标准是响应性的应用程序,那么它就很好。您不会希望在连接设置,DNS查找和路径发现上浪费时间。只是一直保持连接状态,不断发送心跳,应用程序知道连接处于活动状态,因此不需要连接设置。只是简单的发送和接收。


2

在发送关闭数据包之前,TCP / IP作为协议被指定为未关闭。即使无线或互联网连接不畅,我的插座仍保持打开状态。

但是,这都非常依赖于实现。最有可能出现“超时”,这意味着在考虑连接为“死”之前等待响应的最长时间。有时这是基于应用程序本身,有时是基于NAT路由器。

因此,我强烈建议您保持“心跳”状态以检测不良连接并使其保持打开状态。


2

基本上,TCP连接会创建沿路由存储在交换机中的链接状态。为了检测断开的连接(例如当对方崩溃(未发送适当的断开连接)时),必须在一段时间不活动之后将这些状态逐出。发生这种情况时,您的TCP连接已关闭。尽管我无法确切地说出这些超时时间,但它们似乎取决于设备生产商和/或互联网提供商。我记得我以前的1&1互联网提供商迅速关闭了闲置的SSH终端会话(少于15分钟的空闲时间),而在使用Kabel-BW提供的连接时,它们保持开放了几个小时...

最后,我总结一下以前的演讲者:心跳是判断连接是否仍然活跃并不断踢的好方法。


1

尝试设置超时时,您所说的心跳很有用。您的插座可能看起来是开放的,但另一端的人可能正在遭受蓝屏死机困扰。检测失效的客户端/服务器最简单的方法之一就是设置超时时间,并确保每隔一段时间就会收到一条消息。

有人称它们为NOOP(无操作)。

但是,不,它们不是保持连接活动所必需的,仅有助于了解状态。


1

我想说的是,如果您没有心跳,则TCP / IP连接是否打开也没关系。


1

对于TCP协议,心跳不是必需的。它的实现是在这里检测对方是否以非标准方式终止了连接(即未经历拆除过程)。


0

连接将保持打开状态-无需实现心跳,并且大多数使用套接字的应用程序都不需要这样做。


-2

劳埃德(Lloyd)说过,许多协议都实现了心跳或健康状态类型。以便您知道连接仍处于打开状态,并且如果您错过了任何内容

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.