通常,有两种发送心跳数据包的方法:
方法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秒。
心跳检测步骤:
客户端以固定的时间间隔向服务器发送检测数据包
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.如果客户端的超时计时器 过期,它仍然没有收到响应包,服务器已关闭