谈谈长连接和心跳保活机制

2020-06-02 15:30:41 浏览数 (1)

1.长连接介绍

通信双方进行TCP链接后进行通信,结束后不主动关闭链接 优点:通信速度快,免去了DNS解析时间,以及三次握手四次分手的时间,避免短时间内重复连接所造成的信道资源 & 网络资源的浪费

2.长连接断开的原因

  • 长连接所在进程被杀死
  • NAT超时
  • 网络状态发生变化,如移动网络 & Wifi切换、断开、重连
  • 其他不可抗因素(网络状态差、DHCP的租期等等 )
代码语言:javascript复制
NAT简介
IP可以分为公网ip和私网IP,公司,学校,政府机构等场所一般都是私网IP,所有的私网IP通过公网ip连接互联网。只有公网ip是能够连接互联网的,私网IP一般只用作局域网
那么怎么连上网的呢,我们通过私网ip然后把我们的需求和要发送的数据发给路由器,然后路由器对接网络,再把数据发送给Internet.然后internet发送数据到我们学校的路由,然后路由在通过我的私网ip发送给我,这就是我们真实上网的流程。私网Ip和公网Ip的转换这个问题,其实利用到了nat转换技术
NAT对我们来说最大的贡献就是帮助我们节省了大量的ip资源
但是也有缺陷,NAT最大的弊端在于破坏了IP端到端通信的能力。因为一个会话建立后会在NAT设备上建立一个网管映射表,在会话静默的这段时间,NAT网关会进行老化操作。

3.高效维持长连接方案

  • 进程保活(防止进程被杀死)
  • 心跳保活(阻止NAT老化)
  • 断线重连(断网以后重新连接网络)
3.1 进程保活

进程保活.jpg

3.2 心跳保活

第4节会说明

3.3 断线重连

需要检测网络状态&监听网络变化,可以考虑BroadcastReceiver

4.心跳保活

4.1 定义

每隔一段时间想对方发送自定义信息(心跳包),以确保连接存活且有效的通信机制 注意,它和和轮询机制区别:一次轮询相当于一次TCP连接和断开

4.2 心跳机制的方案和设计

心跳流程.jpg

4.3 设计要点
  • 心跳包的规格(内容 & 大小)
  • 心跳发送的间隔时间
  • 断线重连机制
4.3 (1)心跳包的规格

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

4.3 (2)心跳发送的间隔时间

不能过长,NAT超时也没检测出来。不能过短,资源浪费和信令风暴

代码语言:javascript复制
信令风暴:
由于网络收到的终端信令请求超过了网络各项信令资源的处理能力,引发网络拥塞以至于产生雪崩效应,导致网络不可用,我们称之为“信令风暴”。

最常用方案是每隔x分钟发送心跳包1次,缺陷在于网络环境不同未必都适用。所以采用自适应心跳间隔

自适应心跳间隔时间.jpg

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

  • (1)如何自适应计算心跳间隔 从而使得心跳间隔 接近 当前NAT 超时时间 不断增加心跳间隔时间进行心跳应答测试,直到心跳失败5次后,即可找出最接近 当前NAT 超时时间的心跳间隔时间
  • (2)如何检测 当前网络环境的NAT 超时时间 发生了变化 当前发送心跳包成功 的最大间隔时间(即最接近NAT超时时间的心跳间隔) 发送失败5次后
4.3 (3)断线重连机制

判断长连接是否有效的准则 = 服务器是否返回心跳应答 此处需要分清:长连接存活 & 有效状态的区别: 存活:长连接的网络链路存在,但是数据不一定能响应 有效:存活且能响应数据 基本思路:若连续5次发送心跳后,服务器都无心跳应答,则视为长连接无效

参考:https://blog.csdn.net/carson_ho/article/details/79522975

0 人点赞