一文读懂即时通信应用中的网络心跳包机制: 作用、原理、实现思路等
引言
一般来说,没有真正动手做过网络通信应用的开发者,很难想象即使通讯应用中的心跳机制的作用。但不可否认,作为即时通讯应用,心跳机制是其网络通信技术底层中非常重要的一环,有没有心跳机制、心跳机制的算法实现好坏,都将直接影响即时通讯应用在应用层的表现–比如:实时性、断网自愈能力、弱网体验等等。
总之,要想真正理解即时通讯应用底层的开发,心跳机制必须掌握
为什么需要心跳机制?
考虑以下几种典型的即使通讯网络层问题情形:
情景一:
一个客户端连接服务器以后, 如果长期没有和服务器有数据来往, 可能会被防火墙程序关闭连接, 有时候我们并不想要被关闭连接. 例如, 对于一个即时通讯软件来说, 如果服务器没有消息时, 我们确实不会和服务器有任何数据交换, 但是如果连接被关闭了, 有新消息来时, 我们再也没法接收到了, 这就违背了”即时通讯”的设计要求.
情景二:
通常情况下, 服务器与某个客户端一般不是位于同一个网络, 其之间可能通过数个路由器和交换机, 如果其中某个必经路由器或者交换器出现了故障, 并且一段时间内没有回复, 导致这之间的链路不再顺畅, 而此时服务器与客户端之间也没有数据进行交换, 由于TCP连接是状态机, 对于这种情况, 无论是客户端或者服务器都无法感知与对方的连接是否正常, 这类连接我们一般称之为”死链”
针对上述问题情形, 即时通讯应用通过的解决思路:
针对情形一:
此应用场景要求必须保持客户端与服务器之间的连接正常, 就是我们通常所说的”保活”, 如上所述, 当服务器与客户端一定是按内没有有效业务数据来往时, 我们只需要给对端发送心跳包即可实现保活.
针对情形二:
要解决死链问题, 只要我们此时任意一端给对端发送一个数据包即可检查链路是否正常, 这类数据包我们也称之为”心跳包”, 这种操作我们称之为”心跳检测”. 顾名思义, 如果一个人没有心跳了, 可能已经死亡了; 一个连接长时间没有正常数据来往, 也没有心跳包来往, 就可以认为这个连接已经不存在, 为了节约服务器连接资源, 我们可以通过关闭socket, 回收连接资源.
总之, 心跳检测机制一般有两个作用:
- 保活
- 检测死链