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

Rob*_*ray 91 sockets tcp

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

我认为连接保持开放与TCP/IP,但我读过许多博客/网站,说这些应用程序之间的心跳是非常标准的做法.

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

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

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

Llo*_*oyd 53

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

  • Keepalive的另一个常见原因是o通过nat网关保持连接打开.虽然TCP本身不需要keepalive来运行,但nat网关在给定的超时后"丢弃"tcp连接是很常见的. (33认同)
  • 什么是正常超时?秒,分钟,小时? (2认同)
  • 通常是秒. (2认同)

Ger*_*mbs 48

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


Eer*_*nen 21

如果您的组件:

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

那你就不需要心跳了.

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


Bri*_*new 10

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

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


And*_*ith 9

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

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

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

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