代码之家  ›  专栏  ›  技术社区  ›  Rob Gray

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

  •  84
  • Rob Gray  · 技术社区  · 15 年前

    我原以为TCP/IP连接是开放的,但我读过很多博客/网站说,在这些应用程序之间进行心跳是非常标准的做法。

    我知道组件A心跳组件B的部分原因,因此如果组件B出现通信问题(链路中断或组件B未运行),它可以通知支持人员。还有其他原因需要心跳吗?例如,确保经常有东西“在管道中”保持其打开?

    组件A当前每20秒对组件B进行一次心跳,如果在120秒内没有从组件B接收到任何信息,则关闭连接。然后,在假设组件B在链路断开的情况下会定期尝试重新连接的情况下,恢复侦听连接。这是成功的。

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

    15 回复  |  直到 15 年前
        1
  •  58
  •   Gerald Combs    15 年前

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

        2
  •  57
  •   Community Dan Abramov    3 年前

    连接 应该 不管怎样,都保持开放,但是的,通常会看到协议实现心跳以帮助检测死连接,IRC和 PING 例如,命令。

        3
  •  25
  •   Eero Aaltonen    12 年前

    如果您的组件:

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

    那么你就不需要心跳了。

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

        4
  •  12
  •   Brian Agnew    15 年前

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

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

        5
  •  9
  •   Andrew Keith    14 年前

    如果您使用windows,请小心TCP保持活动状态。默认情况下,它是禁用的,除非您使用windows注册表或通过setsockopt全局打开它。

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

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

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

        6
  •  4
  •   ChrisW    15 年前

    心跳是保持TCP/IP连接活动所必需的吗?

    它们对于检测连接何时中断非常有用。

        7
  •  4
  •   Duck    15 年前

    TCP将使连接保持活动状态。应用程序心跳用于应用程序级别的考虑事项,如故障切换、负载平衡或提醒管理员潜在问题。

        8
  •  3
  •   Vivek Sharma    15 年前

    心跳是告诉服务器您还活着的一种很好的方式,我的意思是,如果服务器使用DoS攻击预防系统,它(服务器)可能会在其在活动中检测到特定时间段后删除为该特定连接分配的所有资源。
    他们没有执行任何心跳机制的授权。

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

        9
  •  2
  •   Unknown    15 年前

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

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

    因此,我强烈建议您保持“心跳”来检测坏连接并保持它们打开。

        10
  •  2
  •   Mayday    14 年前

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

    最后,我和前面的演讲者一起总结:心跳是一个很好的方式来判断一个连接是否仍然活跃和活跃。。。

        11
  •  1
  •   Kekoa    15 年前

    当试图设置超时时,您所称的心跳非常有用。您的插座可能看起来是打开的,但另一端的人可能患有BSOD。检测失效客户端/服务器的最简单方法之一是设置超时,并确保每隔一段时间收到一条消息。

    有些人称之为NOOPs(无操作)。

    但是不,它们不是保持连接的必要条件,只是有助于了解状态。

        12
  •  1
  •   D. Patrick    15 年前

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

        13
  •  1
  •   Dark Star1    15 年前

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

        14
  •  0
  •   anon anon    15 年前

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

        15
  •  0
  •   Pekka    3 年前

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

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

    如果没有keepalive,则只有在下次尝试传输时才会检测到通信丢失错误。

    有三种可能的保持活动级别:

    1. 套接字级别使用操作系统设置或 SO_KEEPALIVE 选项这是透明的,将及时检测通信错误或损坏的合作伙伴系统。
    2. 发送和接收用于轮询合作伙伴的活动响应的应用程序级保持活动消息。
    3. 一方定期发送心跳消息。

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

    最后两个选项导致应用程序通信,并可以提供更多信息。例如,如果主机应用程序已暂停且不会响应,则前两个备选方案无法检测到此故障模式。第四个选项是隐式的。发送方最终将收到一个错误,接收方应该期望周期性消息作为正常会话的指示。

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

    除非必须检测连接故障,否则在必要时简单地重新连接通常更容易。选择取决于应用程序级协议和来自需求的端到端消息保证。

        16
  •  -2
  •   ist_lion    15 年前

    许多协议实现了心跳或健康状态类型的东西,就像劳埃德说的那样。只是为了让你知道连接仍然是开放的,如果你可能错过了什么