前言

  • 当实现具备实时性需求时,我们一般会选择长连接的通信方式
  • 而在实现长连接方式时,存在很多性能问题,如 长连接保活
  • 今天,我将 手把手教大家实现自适应的心跳保活机制,从而能高效维持长连接

目录


1. 长连接 介绍

1.1 简介

1.2 作用

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

  • 提高通信速度
  • 确保实时性
  • 避免短时间内重复连接所造成的信道资源 & 网络资源的浪费

1.3 长连接 与 短连接的区别


2. 长连接断开的原因

  • 从上节可知,在长连接的情况下,双方的所有通信 都建立在1条长连接上(1次TCP连接);所以,长连接 需要 持续保持双方连接 才可使得双方持续通信

  • 可是,长连接会存在断开的情况,而 断开原因 主要是:

    1. 长连接所在进程被杀死
    2. NAT超时
    3. 网络状态发生变化
    4. 其他不可抗因素(网络状态差、DHCP的租期等等 )

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

原因1:进程被杀死

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

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

  • NAT超时现象如下

  • 各运营商 & 地区的 NAT超时时间如下

  • 特别注意:排除其他外因(网络切换、NAT超时、人为原因),TCP长连接在双方都不断开连接的情况上,本质上是不会自动中断的
  1. 即,不需要心跳包来维持
  2. 验证:让2台电脑连上同1个Wifi(其中1台做服务器, 另1台做客户端连接服务器(无设置KeepAlive);只要电脑、路由器不断网断电,那么,2台电脑的长连接是不会自动中断的。

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

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

原因4:其他不可抗因素

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

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


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

  • 在了解长连接断开原因后,针对对应原因,此处给出 高效维持长连接的解决方案

  • 为此,若需有效维持长连接,则需要做到

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

  • 保活:处于连接状态时尽量不要断
  • 断线重连:断了之后继续重连回来

解决方案1:进程保活

整体概括如下: 

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

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

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

  • 原理 
    检测网络状态变化 & 判断连接的有效性
  • 具体实现 
    前者请参考文章:Android:检测网络状态&监听网络变化;后者主要存在于心跳保活机制,所以下面会在心跳保活机制中一起讲解。

4. 心跳保活机制简介

  • 心跳保活机制的整体介绍如下

  • 注:很多人容易混淆 心跳机制 & 轮询机制,此处给出二者区别


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

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


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

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

6.1 基本流程

6.2 设计要点

  • 对于心跳机制方案设计的主要考虑因素 = 保证消息的实时性 & 耗费设备的资源(网络流量、电量、CPU等等)
  • 从上图可以看出,对于心跳机制方案设计的要点在于 
    1. 心跳包的规格(内容 & 大小)
    2. 心跳发送的间隔时间
    3. 断线重连机制 (核心 = 如何 判断长连接的有效性)

在下面的方案设计中,将针对这3个问题给出详细的解决方案。


7. 心跳机制方案 详细设计

7.1 心跳包的规格

为了减少流量 & 提高发送效率,需要精简心跳包的设计

7.1.1 设计原则

主要从心跳包的内容 & 大小入手,设计原则具体如下

7.1.2 设计方案

心跳包 = 1个携带少量信息 & 大小在10字节内的信息包


7.2 心跳发送的间隔时间

为了 防止NAT超时 & 减少设备资源的消耗(网络流量、电量、CPU等等),心跳发送的间隔时间 是 整个 心跳机制方案设计的重点。

7.2.1 设计原则

心跳发送间隔时间的设计原则如下

7.2.2 设计方案

a. 最直接 & 常用方案
  • 一般,最直接 & 常用的心跳发送间隔时间设置方案 :每隔估计 x 分钟发送心跳包1次

    其中,x <5分钟即可。(综合主流移动IM产品,此处建议 x= 4分钟)

  • 但是,这种方案存在一些问题:

下面,我将详细讲解 自适应心跳间隔时间 的设计方案

b. 自适应心跳间隔时间 设计方案
  • 基本流程

  • 该方案需要解决的有2个核心问题:

1.如何自适应计算心跳间隔 从而使得心跳间隔 接近 当前NAT 超时时间?

答:不断增加心跳间隔时间进行心跳应答测试,直到心跳失败5次后,即可找出最接近 当前NAT 超时时间的心跳间隔时间。具体请看下图:

注:只有当心跳间隔 接近 NAT 超时时间 时,才能最大化平衡 长连接不中断 & 设备资源消耗最低的问题。

2.如何检测 当前网络环境的NAT 超时时间 发生了变化 ?

答:当前发送心跳包成功 的最大间隔时间(即最接近NAT超时时间的心跳间隔) 发送失败5次后,则判断当前网络环境的NAT 超时时间 发生了变化。具体请看下图:

注:在检测到 NAT 超时时间 发生变化后,重新自适应计算心跳间隔 从而使得心跳间隔 接近 NAT 超时时间

  • 总结:统筹2个核心问题,总结出自适应心跳间隔时间 设计方案为下图


7.3 断线重连机制

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

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

7.3.1 设计原则

  • 判断长连接是否有效的准则 = 服务器是否返回心跳应答
  • 此处需要 分清:长连接 存活 & 有效 状态的区别:

7.3.2 设计方案

  • 基本思路 
    若连续5次发送心跳后,服务器都无心跳应答,则视为长连接无效

    通过计数计算

  • 判断流程

7.3.3 网上流传的方案

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

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

7.4 总结

  • 设计方案

  • 流程设计

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


8. 优化 & 完善

  • 上面的方案依然会存在缺陷,从而导致 长连接断开

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

  • 下面,将优化 & 完善上述方案,从而保证 客户端与服务器依然保持着通信状态

  • 优化点

    1. 确保当前网络的有效性 & 稳定性再开始长连接
    2. 自适应计算心跳包间隔时间的时机

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

  • 问题描述

  • 解决方案

  • 加入到原有 心跳保活机制 主流程 

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

  • 问题描述

  • 方案设计

  • 加入到原有 心跳保活机制 主流程

8.3 总结


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

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

9.1 回答

  • 结论:无法替代
  • 原因:TCP KeepAlive机制 的作用 是检测连接的有无(死活),但无法检测连接是否有效。 

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

9.2 KeepAlive 机制概述

先来看看KeepAlive 机制 是什么

9.3 具体原因

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

9.4 特别注意

  1. KeepAlive 机制只是操作系统底层的一个被动机制,不应该被上层应用层使用

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

9.6 结论

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


10. 总结

  • 看完本文后,相信在高效维持长连接的需求下,你可以完美地解决了!(具体总结如下)

  • 下面我将继续对Android中的其他代码规范进行深入讲解 ,有兴趣可以继续关注Carson_Ho的安卓开发笔记

高效 保活长连接:手把手教你实现 自适应的心跳保活机制相关推荐

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

    前言 当实现具备实时性需求时,我们一般会选择长连接的通信方式 而在实现长连接方式时,存在很多性能问题,如 长连接保活 今天,我将 手把手教大家实现自适应的心跳保活机制,从而能高效维持长连接 目录 示意 ...

  2. 怎样设置计算机远程桌面,电脑如何设置远程连接,手把手教你如何远程

    说起远程桌面很多用户都认为是从WIN2000 SERVER才开始引入的,实际上我们可以在WIN98甚至是DOS中看到他的身影.远程桌面采用的是一种类似TELNET的技术,他是从TELNET协议发展而来 ...

  3. 怎么裁剪视频时长?手把手教你裁剪

    现在的网络非常方便,我们可以很轻松的在网上找到各种视频进行网课的学习.不过有些网课重点的内容可能不多而且又分散,我们很难做到高效的学习.其实我们可以通过视频裁剪,将需要的视频内容裁剪下来,这样子就方便 ...

  4. notion函数_高效工作必备,手把手教你玩转 Notion 模板(附下载)

    Notion 是一个笔记集大成者,堪称「来自未来的笔记软件」.它可以让你的笔记更加丰富多彩,图文.视频.音频并茂,同时还可以搭建知识库.做项目管理.做团队协作.做个人博客等等. 在上篇文章,A 君对 ...

  5. 如何高效维持网络长连接

    前言 当实现具备实时性需求时,我们一般会选择长连接的通信方式 而在实现长连接方式时,存在很多性能问题,如 长连接保活 今天,我将 手把手教大家实现自适应的心跳保活机制,从而能高效维持长连接 1. 长连 ...

  6. 长连接-心跳保活机制

    前言 当实现具备实时性需求时,我们一般会选择长连接的通信方式 而在实现长连接方式时,存在很多性能问题,如 长连接保活 今天,我将 手把手教大家实现自适应的心跳保活机制,从而能高效维持长连接 目录 1. ...

  7. 网络:tcp长连接与短连接

    当网络通信采用tcp协议时,在真正的读写操作之前,sever与client之间必须建立一个连接,当读写操作完成之后,对方不再需要这个连接时他们可以释放这个链接,连接的连接需要三次握手,释放需要四次握手 ...

  8. socket的长连接、短连接、半包、粘包与分包

    socket的半包,粘包与分包的问题和处理代码:http://blog.csdn.net/qq_16112417/article/details/50392463 知乎关于长连接和短连接:https: ...

  9. TCP长连接实践与挑战

    本文介绍了tcp长连接在实际工程中的实践过程,并总结了tcp连接保活遇到的挑战以及对应的解决方案. 作者:字节跳动终端技术 --- 陈圣坤 概述 众所周知,作为传输层通信协议,TCP是面向连接设计的, ...

最新文章

  1. Integer overflow, simple but not easy
  2. 白名单 权限认证方法
  3. mysql客户端查询_MySQL数据库之利用mysql客户端查询UCSC数据库
  4. LeetCode —— 深搜水题记录
  5. 2-用EasyNetQ连接RabbitMQ(黄亮翻译)
  6. python ---ConfigParser
  7. bzoj 1196: [HNOI2006]公路修建问题(贪心+最小生成树)
  8. AutoCAD2020左键单击长按套锁功能
  9. 联想小新触摸板驱动_联想小新潮触摸板驱动_联想小新潮5000电脑触摸板驱动下载 v1.57 稳定版-126g驱动网...
  10. 用计算机专业术语写寄语,教师给计算机专业学生寄语
  11. 第三方支付宝API应用流程
  12. 吴恩达 - 神经网络与深度学习 学习笔记
  13. 比较几种步进电机加减速控制方案
  14. 8266 的Python 固件 设置wifi AP 热点
  15. Android 学习之垂直切换的圆角 Banner 和垂直指示器
  16. 基于SpringBOOT的订餐系统
  17. asp.net 改变css,使用ASP.NET动态设置CSS值
  18. 厚涂简不简单?怎么入门厚涂
  19. python中安装wordcloud 出现cl.exe failed with exit status 2问题解决
  20. 微信分享朋友圈的标题和图片

热门文章

  1. 用算法描述对数几率回归,逻辑回归算法描述,参考答案
  2. 刷屏!黄晓明杨颖官宣离婚,两人已无商业关联
  3. 新款苹果手表来了!Apple Watch Series 7将于10月8日开售
  4. Android 12发布!小米11全系、Redmi K40 Pro宣布首批支持
  5. 北京严厉打击违规发布网络房源信息行为 18家机构被查处
  6. 真降价还是假环保?华为客服回应手机取消充电器:不清楚
  7. 最高法明确:未成年直播打赏可退还
  8. 微信悄悄更新:朋友圈不喜欢的评论可以删除了
  9. 微信品牌小程序开启公测 认证通过即享专属产品能力
  10. 微信喊你来找工作:上千家企业将提供超10万个就业岗位