我需要保持打开TCP连接的心跳吗?

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

我认为连接保持TCP / IP打开状态,但我已经阅读了许多博客/网站,说这是非常标准的做法,在这些应用程序之间心跳。

我知道部分原因组件A心跳组件B是如果组件B发生通信问题(链路断开或组件B未运行),它可以通知支持。 心跳是否需要其他原因? 如确保经常有东西“在pipe道中”保持开放?

组件A当前每隔20秒检测一次组件B,如果在120​​秒内没有收到任何组件B返回的信息,则closures连接。 然后,如果连接断开,组件B将会定期尝试重新连接,然后继续监听连接。 这工作成功。

重申一下我的问题:保持TCP / IP连接是否需要心跳?

连接应该保持打开状态,无论如何,为了帮助检测死连接,例如使用PING命令,IRC通常会实现一个心跳检测。

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

如果你的组件:

  • 在传统的有线networking中
  • 它们之间没有防火墙或NAT路由器
  • 他们都没有崩溃

那么你不需要有心跳。

如果任何这些假设是错误的(我在看你,GPRS!),心跳就变得非常快。

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

请注意,TCP实现了一个可选的保活机制,它可以用来及时识别一个closures的连接,而不是要求你稍后发送数据,然后才发现连接已经closures。

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

缺省保活时间间隔为2小时。

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

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

保持TCP / IP连接是否需要心跳?

它们对于检测连接何时死亡非常有用。

心跳是一个很好的方式告诉服务器,你还活着,我的意思是,如果服务器使用DoS攻击防范系统,它(服务器)可能会删除所有分配的资源,特定的连接,检测后在特定时期内进行活动。
他们没有执行任何心跳机制的任务。

但是,如果您正在devise一个主要标准是响应能力的应用程序,那么它就很好。 您不想浪费时间在连接设置,DNS查找和path发现上。 一直保持连接,不断发送心跳,应用程序知道连接是活动的,并且不需要连接设置。 只是简单的发送和接收。

TCP将保持连接活着。 应用程序检测信号用于应用程序级别考虑,如故障转移,负载平衡或警告pipe理员潜在的问题。

基本上TCP连接创build存储在交换机中的链路状态。 为了检测断开的连接(例如当一个对象崩溃时(没有发送适当的断开连接)),这些状态必须在一段时间不活动后被驱逐。 发生这种情况时,您的TCP连接已closures。 虽然我不能确切地说明这些超时时间有多长,但它们似乎取决于设备制造商和/或互联网提供商。 我记得我闲置的SSHterminal会话很快(不到15分钟的空闲时间)由我以前的1&1互联网提供商closures,而他们保持打开几个小时时,使用Kabel BW提供的连接…

最后,我以前面的发言者总结道:心跳是一种很好的方法,可以判断一个连接是否还活着,踢</s> …

尝试设置超时时,所谓的心跳是非常有用的。 您的套接字可能会显示打开,但另一端的人可能会遭受蓝屏。 检测不存在的客户端/服务器的最简单方法之一是设置一个超时,并确保每隔一段时间收到一条消息。

有些人称他们为NOOP(不行)。

但是,不,他们没有必要保持联系活着,只有帮助了解状态是什么。

我会说,如果你没有心跳,你的TCP / IP连接是否打开并不重要。

心跳不是TCP协议的必要条件。 它的实现是检测其他人是否以非标准的方式(即没有经过拆卸过程)终止连接。

作为协议的TCP / IP被指定为在发送closures数据包之前未被closures。 即使在无线或互联网连接有问题之后,我的套接字仍保持打开状态。

但是,这完全依赖于实现。 最有可能会有一个“超时”,这意味着在考虑到连接“死亡”之前等待响应的最长时间。 有时这是基于应用程序本身,有时在NAT路由器上。

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

连接将保持打开 – 不需要实现心跳,大多数使用套接字的应用程序不会这样做。

许多协议实现心跳或Lloyd说的健康状况types的东西。 只要你知道连接仍然是开放的,如果你可能错过了任何东西