正文
前言
-
当实现具备实时性需求时,我们一般会选择
长连接
的通信方式
-
而在实现长连接方式时,存在很多性能问题,如 长连接保活
-
今天,我将
手把手教大家实现自适应的心跳保活机制
,从而能高效维持长连接
目录
1. 长连接 介绍
1.1 简介
1.2 作用
通过
长时间保持双方连接
,从而:
-
提高通信速度
-
确保实时性
-
避免短时间内重复连接所造成的信道资源 & 网络资源的浪费
1.3 长连接 与 短连接的区别
2. 长连接断开的原因
下面,我将对每种原因进行分析
原因1:进程被杀死
当进程被杀死后,长连接也会随之断开
原因2:NAT 超时(重点关注)
-
NAT超时现象如下
-
各运营商 & 地区的 NAT超时时间如下
-
特别注意:排除其他外因(网络切换、
NAT
超时、人为原因),
TCP
长连接在双方都不断开连接的情况上,本质上是不会自动中断的
-
即,不需要心跳包来维持
-
验证:让2台电脑连上同1个
Wifi
(其中1台做服务器, 另1台做客户端连接服务器(无设置
KeepAlive
);只要电脑、路由器不断网断电,那么,2台电脑的长连接是不会自动中断的。
原因3:网络状态发生变化
当移动客户端网络状态发生变化时(如移动网络 & Wifi切换、断开、重连),也会使长连接断开
原因4:其他不可抗因素
如网络状态差、`DHCP`的租期到期等等,都会使得长连接发生 偶然的断开
DHCP
的租期到期:对于
Android
系统,
DHCP
到了租期后不会主动续约 & 继续使用过期IP,,从而导致长连接 断开
3. 高效维持长连接的解决方案
-
在了解长连接断开原因后,针对对应原因,此处给出
高效维持长连接的解决方案
其实,说得简单点:
高效维持长连接的关键在于
-
保活:处于连接状态时尽量不要断
-
断线重连:断了之后继续重连回来
解决方案1:进程保活
整体概括如下:
解决方案2:心跳保活机制
这是本文的重点,下节开始会详细解析
解决方案3:断线重连机制
4. 心跳保活机制简介
-
注:很多人容易混淆 心跳机制 & 轮询机制,此处给出二者区别
5. 主流心跳机制分析 & 对比
对国、内外主流的移动
IM
产品(
WhatsApp
、
Line
、微信)进行了心跳机制的简单分析 & 对比,具体请看下图
6. 心跳机制方案 总体设计
下面,将根据市面上主流的心跳机制,设计 一套心跳机制方案
6.1 基本流程
6.2 设计要点
-
对于心跳机制方案设计的主要考虑因素 =
保证消息的实时性 & 耗费设备的资源(网络流量、电量、CPU等等)
-
从上图可以看出,对于心跳机制方案设计的要点在于
-
心跳包的规格(内容 & 大小)
-
心跳发送的间隔时间
-
断线重连机制 (核心 = 如何 判断长连接的有效性)
在下面的方案设计中,将针对这3个问题给出详细的解决方案。
7. 心跳机制方案 详细设计
7.1 心跳包的规格
为了减少流量 & 提高发送效率,需要精简心跳包的设计
7.1.1 设计原则
主要从心跳包的内容 & 大小入手,设计原则具体如下
7.1.2 设计方案
心跳包 = 1个
携带少量信息
&
大小在10字节内
的信息包
7.2 心跳发送的间隔时间
为了 防止
NAT
超时 & 减少设备资源的消耗(网络流量、电量、CPU等等),
心跳发送的间隔时间
是 整个 心跳机制方案设计的重点。
7.2.1 设计原则
心跳发送间隔时间的设计原则如下
7.2.2 设计方案
a. 最直接 & 常用方案
下面,我将详细讲解 自适应心跳间隔时间 的设计方案
b. 自适应心跳间隔时间 设计方案
1.如何自适应计算心跳间隔 从而使得心跳间隔 接近 当前
NAT
超时时间?
答:不断增加心跳间隔时间进行心跳应答测试,直到心跳失败5次后,即可找出最接近 当前
NAT
超时时间的心跳间隔时间。具体请看下图:
注:只有当心跳间隔 接近
NAT
超时时间 时,
才能最大化平衡 长连接不中断 & 设备资源消耗最低的问题
。
2.如何检测 当前网络环境的
NAT
超时时间 发生了变化 ?
答:当前发送心跳包成功 的最大间隔时间(即最接近NAT超时时间的心跳间隔) 发送失败5次后,则判断当前网络环境的
NAT
超时时间 发生了变化。具体请看下图:
注:在检测到
NAT
超时时间 发生变化后,重新自适应计算心跳间隔 从而使得心跳间隔 接近
NAT
超时时间
-
总结:统筹2个核心问题,总结出自适应心跳间隔时间 设计方案为下图
7.3 断线重连机制
该机制的核心在于,
如何 判断长连接的有效性
即,什么情况下视为 长连接 断线?
7.3.1 设计原则
-
判断长连接是否有效的准则 =
服务器是否返回心跳应答
-
此处需要 分清:长连接
存活 & 有效
状态的区别:
7.3.2 设计方案
7.3.3 网上流传的方案
在网上流传着一些用于判断长连接是否有效的方案,具体介绍如下
至此,关于心跳保活机制已经讲解完毕。
7.4 总结
-
流程设计
其中,标识 “灰色” 的判断流程参考上文描述
8. 优化 & 完善