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

时间:2009-05-14 21:44:17

标签: sockets tcp

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

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

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

组件A当前每隔20秒检测一次组件B,如果在120​​秒内没有从组件B收到任何内容,则关闭连接。然后,假设如果链路断开,组件B将定期尝试重新连接,则它继续侦听连接。这成功了。

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

16 个答案:

答案 0 :(得分:50)

连接 应该保持打开状态,但是通常会看到协议实现心跳以帮助检测死连接,例如使用PING命令检测IRC。

答案 1 :(得分:47)

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

答案 2 :(得分:21)

如果您的组件:

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

然后你不需要心跳。

如果这些假设中的任何一个都是假的(我在看着你,GPRS!),那么心跳变得非常必要。

答案 3 :(得分:10)

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

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

答案 4 :(得分:9)

如果您使用Windows,请谨慎对待TCP Keep-alive。默认情况下,除非您使用Windows注册表或通过setsockopt全局启用它,否则将禁用它。

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

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

如果不希望2小时保持活着,你可能需要实现自己的心跳并在Windows上禁用TCP keep-alive。

答案 5 :(得分:3)

  

保持TCP / IP连接存活所需的心跳是什么?

它们可用于检测连接何时死亡。

答案 6 :(得分:3)

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

但是如果你正在设计一个应用程序,它的主要标准是响应性,那就很好了。您不希望在连接设置,DNS查找和路径发现上浪费时间。只是始终保持连接,继续发送心跳,应用程序知道连接是活动的,并且不需要连接设置。只需简单的发送和接收。

答案 7 :(得分:2)

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

答案 8 :(得分:2)

基本上,TCP连接会创建存储在路由中的交换机中的链路状态。为了检测断开的连接(例如当一个对方崩溃时(没有发送正确的断开连接)),这些状态必须在一段时间不活动后被驱逐。当发生这种情况时,您的TCP连接已关闭。 虽然我无法确切地知道这些超时有多长,但它们似乎依赖于设备制造商和/或互联网提供商。我记得我的闲置SSH终端会话很快(不到15分钟的空闲时间)被我以前的1& 1互联网服务提供商关闭了,而他们在使用Kabel-BW提供的连接时保持开放几个小时......

最后,我与前面的发言者一起总结:心跳是一种好方法,可以判断一个连接是否还活着并且踢... ...

答案 9 :(得分:1)

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

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

但不,他们没有必要保持连接活着,只有助于知道状态是什么。

答案 10 :(得分:1)

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

答案 11 :(得分:1)

Heartbeat不是TCP协议的必需品。它的实现是检测其他人是否以非标准方式终止了连接(即没有通过拆除过程)。

答案 12 :(得分:1)

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

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

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

TCP 不需要保持活动消息来保持会话打开。该协议旨在用于每隔几周就可以激活而不会出现问题的终端和打印机。

其他答案识别的透明网络级元素肯定会造成令人难以置信的破坏,当它们行为不端和丢失会话或以其他方式干扰流量时,会杀死整个工厂。这总是不正确的,不应要求应用程序或操作系统开发人员采取任何措施。

如果没有保持连接,只有在下一次尝试传输时才会检测到通信错误丢失。

保持活动的三个可能级别:

  1. 套接字级别使用操作系统设置或 SO_KEEPALIVE 选项保持活动状态。这是透明的,可以及时检测通信错误或损坏的合作伙伴系统。
  2. 从应用程序发送零长度帧通常会提供类似的结果。这将强制使用 TCP PUSH 和 ACK 段对来检测丢失的会话。
  3. 发送和接收应用级保持活动消息以轮询合作伙伴以获得主动响应。
  4. 一方定期发送心跳消息。

前两个不会导致通过通道传输的应用程序级信息发生变化,尽管它们必然会触发空段的传输。

最后两个选项导致应用程序通信并可以提供更多信息。例如,如果主机应用程序已停止并且不会响应,则前两种选择无法检测到这种故障模式。第四个选项隐式起作用。发送方最终会收到一个错误,接收方应该期待定期消息作为健康会话的指示。

如果使用更高级别的协议 - 例如 RPC 或 REST,则返回良性内容的 Ping() 函数可能会有所帮助。

除非必须检测连接失败,否则在必要时重新连接通常更容易。选择取决于应用级协议和端到端消息保证。

答案 15 :(得分:-2)

许多协议实现了心跳或健康状态类型的事情,如劳埃德说。只是因为你知道连接仍然是开放的,如果你可能错过任何东西

相关问题