Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 我需要心跳来保持TCP连接打开吗?_Sockets_Tcp - Fatal编程技术网

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

Sockets 我需要心跳来保持TCP连接打开吗?,sockets,tcp,Sockets,Tcp,我有两个组件可以通过TCP/IP进行通信。组件A充当服务器/侦听器,组件B充当客户端。双方应尽快沟通。任何时候都只能有一个连接(尽管这个问题不在讨论之列)。我公司的一位高级开发人员说,我需要在两个组件之间使用应用程序级心跳,以确保连接保持打开状态 我原以为TCP/IP连接是开放的,但我读过很多博客/网站说,在这些应用程序之间进行心跳是非常标准的做法 我知道组件A心跳组件B的部分原因,因此如果组件B出现通信问题(链路中断或组件B未运行),它可以通知支持人员。还有其他原因需要心跳吗?例如,确保经常有

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

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

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

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


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

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

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

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


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

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

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


它们可用于检测连接何时中断。

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


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

许多协议实现了心跳或类似Lloyd所说的健康状态类型。只是为了让您知道连接仍然处于打开状态,如果您可能错过了任何内容,我想说,如果您没有心跳,那么您的TCP/IP连接是否处于打开状态无关紧要。

心跳对于TCP协议来说不是必需的。它的实现是为了检测另一端是否以非标准方式终止了连接(即未通过拆卸过程)。

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

正如许多其他人所指出的,如果将TCP连接留给自己的设备,它将保持正常。但是,如果在连接的中间有一个设备跟踪它的状态(例如防火墙),为了保持状态表条目不过期,您可能需要KePiaLee。即使在无线或互联网连接出现故障后,我的插座仍然保持打开状态

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


因此,我强烈建议您保持一个“心跳”来检测坏连接并使其保持打开状态。

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


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

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

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


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

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

最后,我明白了