软件开发之在socket编程的TCP连接中实现心跳机制

发布时间:2020-08-13 17:33:03

通常,有两种发送心跳数据包的方法:

方法1:由应用程序层本身实现的心跳数据包 应用程序发送心跳数据包以检查连接是否正常。 常规方法是:服务器处于Timer事件中,定期向客户端发送可识别的简短数据包,然后启动一个低级线程,在该线程中不断检测到客户端的反馈。 如果在一定时间内未收到客户的反馈,则认为客户离线。 同样,如果客户端在一定时间内未收到服务器的心跳数据包,则认为连接已丢失。  

方法2:TCP的KeepAlive机制

由于一台服务器可能连接到多个客户端,因此用户在应用程序层实现了心跳包,这将导致更多代码,这有点 复杂,但是使用TCP / IP协议层的内置KeepAlive函数实现心跳功能要简单得多。 无论是服务器还是客户端,一方打开KeepAlive功能后,都会在指定的时间内自动向另一方发送心跳包,另一方在收到心跳包后会自动回复 我仍然在线的聚会。

由于KeepAlive功能需要消耗额外的带宽和流量,因此默认情况下,TCP协议层不会启用KeepAlive功能。 尽管这很琐碎,但在基于流量的环境中却增加了成本。 此外,如果KeepAlive设置不合理,则可能是由于短期网络波动导致无法正常运行的TCP连接断开而引起的。 默认的KeepAlive超时需要7,200,000 MilliSeconds,即2小时,检测次数是5次。 对于许多服务器端应用程序,2小时的空闲时间太长。 因此,我们需要手动启用KeepAlive功能并设置合理的KeepAlive超时参数。 

心跳数据包机制: 之所以将心跳数据包称为心跳数据包,是因为它像心跳一样定期发送,以告知服务器客户端仍在运行。 实际上,这是保持长时间的连接。 至于该数据包的内容,没有特殊规定,但通常是很小的数据包或仅包含标头的空数据包。   在TCP机制中,有一个心跳包机制,它是TCP选项:SO_KEEPALIVE。 系统默认设置为2小时的心跳频率。 但是它无法检查计算机是否已关闭电源,网络电缆是否已拔出以及防火墙是否损坏。 而且逻辑层可能不那么容易处理断开连接。 通常,如果仅用于保持活动状态就可以。  

心跳包通常是通过在逻辑层发送空的回显包来实现的。 在下一个计时器中,空包以一定间隔发送到客户端,然后客户端将相同的空包反馈回去。 如果服务器在一定时间内没有收到客户端发送的反馈信息包,则只会确认Said被丢弃。   实际上,要确定断开连接,您只需要发送或接收。 如果结果为零,则断开连接。 但是,在长时间连接下,很长时间可能没有数据交换。 从理论上讲,此连接始终处于连接状态,但实际上,很难知道中间节点是否发生故障。 更糟糕的是,某些节点(防火墙)将在一定时间内自动断开没有数据交互的连接。

这时,我们需要心跳包来保持长连接并保持活动状态。   知道断开连接后,服务器逻辑可能需要做一些事情,例如断开连接后的数据清理,重新连接...当然,在软件开发过程中,逻辑层自然需要根据 实际需求。 做吧 通常,心跳包主要用于长连接的保持活动和断开连接处理。 在一般应用中,判断时间为30-40秒。 如果要求确实很高,则当客户端数量不大时,可以将其设置为大约15-20秒。  

心跳检测步骤:

  1. 客户端以固定的时间间隔向服务器发送检测数据包

2.客户端发送数据包时,它将启动超时计时器

3。 服务器接收当到达检测数据包时,它应以数据包 响应。

4.如果客户端从服务器收到响应数据包,则服务器正常,删除超时计时器 。

5.如果客户端的超时计时器 过期,它仍然没有收到响应包,服务器已关闭通常,有两种发送心跳数据包的方法:

方法1:由应用程序层本身实现的心跳数据包 应用程序发送心跳数据包以检查连接是否正常。

常规方法是:服务器处于Timer事件中,定期向客户端发送可识别的简短数据包,然后启动一个低级线程,在该线程中不断检测到客户端的反馈。 如果在一定时间内未收到客户的反馈,则认为客户离线。 同样,如果客户端在一定时间内未收到服务器的心跳数据包,则认为连接已丢失。  

方法2:TCP的KeepAlive机制


由于一台服务器可能连接到多个客户端,因此用户在应用程序层实现了心跳包,这将导致更多代码,这有点 复杂,但是使用TCP / IP协议层的内置KeepAlive函数实现心跳功能要简单得多。 无论是服务器还是客户端,一方打开KeepAlive功能后,都会在指定的时间内自动向另一方发送心跳包,另一方在收到心跳包后会自动回复 我仍然在线的聚会。 由于KeepAlive功能需要消耗额外的带宽和流量,因此默认情况下,TCP协议层不会启用KeepAlive功能。 尽管这很琐碎,但在基于流量的环境中却增加了成本。 此外,如果KeepAlive设置不合理,则可能是由于短期网络波动导致无法正常运行的TCP连接断开而引起的。 默认的KeepAlive超时需要7,200,000 MilliSeconds,即2小时,检测次数是5次。 对于许多服务器端应用程序,2小时的空闲时间太长。 因此,我们需要手动启用KeepAlive功能并设置合理的KeepAlive超时参数。 

心跳数据包机制: 之所以将心跳数据包称为心跳数据包,是因为它像心跳一样定期发送,以告知服务器客户端仍在运行。 实际上,这是保持长时间的连接。 至于该数据包的内容,没有特殊规定,但通常是很小的数据包或仅包含标头的空数据包。   在TCP机制中,有一个心跳包机制,它是TCP选项:SO_KEEPALIVE。 系统默认设置为2小时的心跳频率。 但是它无法检查计算机是否已关闭电源,网络电缆是否已拔出以及防火墙是否损坏。 而且逻辑层可能不那么容易处理断开连接。 通常,如果仅用于保持活动状态就可以。  

心跳包通常是通过在逻辑层发送空的回显包来实现的。 在下一个计时器中,空包以一定间隔发送到客户端,然后客户端将相同的空包反馈回去。 如果服务器在一定时间内没有收到客户端发送的反馈信息包,则只会确认Said被丢弃。   实际上,要确定断开连接,您只需要发送或接收。 如果结果为零,则断开连接。 但是,在长时间连接下,很长时间可能没有数据交换。 从理论上讲,此连接始终处于连接状态,但实际上,很难知道中间节点是否发生故障。 更糟糕的是,某些节点(防火墙)将在一定时间内自动断开没有数据交互的连接。 这时,我们需要心跳包来保持长连接并保持活动状态。  

知道断开连接后,服务器逻辑可能需要做一些事情,例如断开连接后的数据清理,重新连接...当然,在软件开发过程中,逻辑层自然需要根据 实际需求。 做吧 通常,心跳包主要用于长连接的保持活动和断开连接处理。 在一般应用中,判断时间为30-40秒。 如果要求确实很高,则当客户端数量不大时,可以将其设置为大约15-20秒。  

心跳检测步骤: 1.客户端以固定的时间间隔向服务器发送检测数据包 2.客户端发送数据包时,它将启动超时计时器 3。 服务器接收当到达检测数据包时,它应以数据包 响应。4.如果客户端从服务器收到响应数据包,则服务器正常,删除超时计时器 。5.如果客户端的超时计时器 过期,它仍然没有收到响应包,服务器已关闭


服务热线:4006068008 0531-85860101 15589999555邮箱:zlxk@zlxk.com地址:山东省济南市高新区鑫盛大厦2号楼24层

Copyright 2023,ALL Rights Reserved zlxk.com | | (c) Copyright 2024版权所有 鲁ICP备20032954号-1网站地图