博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:750313950(嵌入式方向) QQ交流群:856398158(后端方向)
目录
- 心跳检测应用场景
- 死连接情况
- 保活
- 传递有效的业务数据
- 设计心跳包机制
- 一般心跳包设计
- 有代理心跳包设计
心跳检测应用场景
心跳检测一般有两个功能:保存和检测死连接。
死连接情况
服务器和客户端不在同一网络中,之间的数据将通过多个路由器和交换器。如果一台唯一的道路机器出现故障,并且在一段时间内没有恢复,则链路将不再畅通。此时,服务器和客户端之间没有数据交换。并且由于TCP连接是状态机,所以对于这种情况,通信两方是无法感知与对方的连接是否正常。如果客户因网络原因或崩溃等原因与服务端断开连接,但服务端不知道客户端断开连接,等待客户端发送数据占用系统资源,我们称之为死连接。 在这种情况下,只要我们在服务端向客户端发送数据包,我们就可以检测连接是否正常。这种数据包称为心跳包,这种操作称为心跳检测。如果连接长时间没有正常的数据交流,是否有心跳包交流,您可以认为连接不存在,此时应关闭socket回收连接资源。
保活
连接服务器后,如果客户端长时间没有与服务器进行数据交流,可能会被防火墙程序关闭,但有时我们希望保持连接。因为对于即时通信,当服务器没有消息时,就不会有数据交换,但如果连接关闭,新消息就不能接受。在这种情况下,我们只需要发送心跳包来保存它。
传递有效的业务数据
在实际应用中,有时需要定期或不定期或不定期更新一些数据,这些数据可以放在心跳包中,定期或不定期更新。 但是,当连接数较多时,为了减少网络带宽和流量,心跳包数据格式的设计应尽量减少。
设计心跳包机制
一般心跳包设计
心跳包实际上是一个预先设置格式的数据包,在程序中启动定时器定时发送。 但是,如果通信两端有频繁的业务数据,这些数据包本身就可以起到保存的作用,就没有必要浪费流量发送心跳包。 最好的方法是记录最近收发数据包的时间,并在每次收发数据时更新此时间。心跳检测计时器将此时间与当前系统时间进行比较。如果时间间隔大于允许的最大间隔,则发送心跳包。 简而言之,当与对端之间没有数据交流达到一定时间间隔时,只发送心跳包。 同时,检测心跳包的一方应在与对端没有数据的时间间隔内进行心跳检测。 一般来说,客户端主动将心跳包发送到服务端,服务端进行心跳检测,以确定是否断开连接。从客户端的角度来看,客户端需要主动与服务端保持正常的连接,以获得服务端的正常服务。当服务端收到客户端的心跳包时,应给客户端一个心跳响应。
有代理心跳包设计
在后端服务程序与客户端之间存在代理服务时,后端服务与代理服务之间存在长连接,代理服务与客户端之间存在长连接。 后端服务器的业务类型是订阅类型。一旦客户订阅了某一类型的主题,他们就很少或不再向服务器发送数据。服务器将向代理服务器发送订阅的数据,然后客户从代理服务器获取数据。
客户端与代理服务的连接断开,代理服务与后端服务的连接正常。此时,后端服务的下行数据将始终畅通,但此时客户端和代理服务可能已经断开一段时间。此时,后端服务将根据下行数据更新最后一次心跳时间,从而导致心跳检测误判后端程序与客户端的连接状态。因为我们在这里使用的方法仍然是检测后端服务更新心跳包的时间。 此时,只需更改机制:只有通过后端服务上行数据更新时间戳,如果超过一段时间后仍没有上行数据,客户端已断开(在此期间,服务端既没有收到客户端业务数据包,也没有收到客户端心跳数据包)