Android开发Android开发Android开发经验谈

如何高效维持网络长连接:手把手教你实现 自适应的心跳保活机制

2019-08-26  本文已影响725人  Carson带你学安卓

前言


目录

示意图

1. 长连接 介绍

1.1 简介

示意图

1.2 作用

通过 长时间保持双方连接,从而:

1.3 长连接 与 短连接的区别

示意图

2. 长连接断开的原因

下面,我将对每种原因进行分析

原因1:进程被杀死

当进程被杀死后,长连接也会随之断开

原因2:NAT 超时(重点关注)

示意图 示意图
  1. 即,不需要心跳包来维持
  2. 验证:让2台电脑连上同1个Wifi(其中1台做服务器, 另1台做客户端连接服务器(无设置KeepAlive);只要电脑、路由器不断网断电,那么,2台电脑的长连接是不会自动中断的。

原因3:网络状态发生变化

当移动客户端网络状态发生变化时(如移动网络 & Wifi切换、断开、重连),也会使长连接断开

原因4:其他不可抗因素

如网络状态差、DHCP的租期到期等等,都会使得长连接发生 偶然的断开

DHCP的租期到期:对于 Android系统, DHCP到了租期后不会主动续约 & 继续使用过期IP,,从而导致长连接 断开


3. 高效维持长连接的解决方案

示意图 示意图

其实,说得简单点:高效维持长连接的关键在于

解决方案1:进程保活

整体概括如下:


示意图

解决方案2:心跳保活机制

这是本文的重点,下节开始会详细解析

解决方案3:断线重连机制


4. 心跳保活机制简介

示意图 示意图

5. 主流心跳机制分析 & 对比

对国、内外主流的移动IM产品(WhatsAppLine、微信)进行了心跳机制的简单分析 & 对比,具体请看下图

示意图

6. 心跳机制方案 总体设计

下面,将根据市面上主流的心跳机制,设计 一套心跳机制方案

6.1 基本流程

示意图

6.2 设计要点

在下面的方案设计中,将针对这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 超时时间

示意图

7.3 断线重连机制

该机制的核心在于, 如何 判断长连接的有效性

即,什么情况下视为 长连接 断线?

7.3.1 设计原则

示意图

7.3.2 设计方案

通过计数计算

示意图

7.3.3 网上流传的方案

在网上流传着一些用于判断长连接是否有效的方案,具体介绍如下

示意图

至此,关于心跳保活机制已经讲解完毕。

7.4 总结

示意图

其中,标识 “灰色” 的判断流程参考上文描述

示意图

8. 优化 & 完善

如,长连接本身不可用(此时重连多少次也没用)

8.1 确保当前网络的有效性 & 稳定性再开始长连接

示意图 示意图

8.2 自适应计算心跳包间隔时间的时机

示意图 示意图 示意图

8.3 总结

示意图

9. 额外说明:TCP 协议自带 KeepAlive 的机制 是否 可替代心跳机制

很多人认为,TCP 协议自身就有KeepAlive机制,为何基于它的通讯链接,仍需 在应用层实现额外的心跳保活机制

9.1 回答

“连接有效”的定义 = 双方具备发送 & 接收消息的能力

9.2 KeepAlive 机制概述

先来看看KeepAlive 机制 是什么

示意图

9.3 具体原因

KeepAlive 的机制 不可 替代心跳机制 的具体原因如下:

示意图

9.4 特别注意

  1. KeepAlive 机制只是操作系统底层的一个被动机制,不应该被上层应用层使用
  2. 当系统关闭一个由KeepAlive 机制检查出来的死连接时,是不会主动通知上层应用的,只能通过调用相应IO操作的返回值中发现

9.6 结论

KeepAlive机制无法代替心跳机制,需要在应用层 自己实现心跳机制以检测长连接的有效性,从而高效维持长连接


10. 实现方式

RxJava简介如下

示意图

11. 总结

示意图

请点赞!因为你的鼓励是我写作的最大动力!

相关文章阅读
Android开发:最全面、最易懂的Android屏幕适配解决方案
Android事件分发机制详解:史上最全面、最易懂
Android开发:史上最全的Android消息推送解决方案
Android开发:最全面、最易懂的Webview详解
Android开发:JSON简介及最全面解析方法!
Android四大组件:Service服务史上最全面解析
Android四大组件:BroadcastReceiver史上最全面解析


欢迎关注Carson_Ho的简书!

不定期分享关于安卓开发的干货,追求短、平、快,但却不缺深度

上一篇 下一篇

猜你喜欢

热点阅读