1.长连接介绍
通信双方进行TCP链接后进行通信,结束后不主动关闭链接
优点:通信速度快,免去了DNS解析时间,以及三次握手四次分手的时间,避免短时间内重复连接所造成的信道资源 & 网络资源的浪费
2.长连接断开的原因
- 长连接所在进程被杀死
- NAT超时
- 网络状态发生变化,如移动网络 & Wifi切换、断开、重连
- 其他不可抗因素(网络状态差、DHCP的租期等等 )
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 进程保活
进程保活.jpg3.2 心跳保活
第4节会说明
3.3 断线重连
需要检测网络状态&监听网络变化,可以考虑BroadcastReceiver
4.心跳保活
4.1 定义
每隔一段时间想对方发送自定义信息(心跳包),以确保连接存活且有效的通信机制
注意,它和和轮询机制区别:一次轮询相当于一次TCP连接和断开
4.2 心跳机制的方案和设计
心跳流程.jpg4.3 设计要点
- 心跳包的规格(内容 & 大小)
- 心跳发送的间隔时间
- 断线重连机制
4.3 (1)心跳包的规格
心跳包 = 1个携带少量信息 & 大小在10字节内的信息包
4.3 (2)心跳发送的间隔时间
不能过长,NAT超时也没检测出来。不能过短,资源浪费和信令风暴
信令风暴:
由于网络收到的终端信令请求超过了网络各项信令资源的处理能力,引发网络拥塞以至于产生雪崩效应,导致网络不可用,我们称之为“信令风暴”。
最常用方案是每隔x分钟发送心跳包1次,缺陷在于网络环境不同未必都适用。所以采用自适应心跳间隔
自适应心跳间隔时间.jpg
该方案需要解决的有2个核心问题
- (1)如何自适应计算心跳间隔 从而使得心跳间隔 接近 当前NAT 超时时间
不断增加心跳间隔时间进行心跳应答测试,直到心跳失败5次后,即可找出最接近 当前NAT 超时时间的心跳间隔时间 - (2)如何检测 当前网络环境的NAT 超时时间 发生了变化
当前发送心跳包成功 的最大间隔时间(即最接近NAT超时时间的心跳间隔) 发送失败5次后
4.3 (3)断线重连机制
判断长连接是否有效的准则 = 服务器是否返回心跳应答
此处需要分清:长连接存活 & 有效状态的区别:
存活:长连接的网络链路存在,但是数据不一定能响应
有效:存活且能响应数据
基本思路:若连续5次发送心跳后,服务器都无心跳应答,则视为长连接无效
网友评论