参考1
参考2
参考3
参考4
参考5
推送:
服务器给客户端发送消息
开发者通过第三方推送服务提供商将信息直接下发给需要的设备,第三方推送服务提供商与设备建立一条长连接通道,并且将消息路由到APP中。
推送实现的方式
**(1)长连接: ** 客户端主动和服务器建立TCP长连接之后, 客户端定期向服务器发送心跳包, 有消息的时候, 服务器直接通过这个已经建立好的TCP连接通知客户端。
(2)轮询: 客户端定期询问服务器有没有新的消息, 这样服务器不用管客户端的地址是什么, 客户端来问, 直接告诉它就行.轮询间隔太长,实时性太差;轮询间隔太短,资源消耗大。
(3)SMS: 服务器在有新消息时给用户的手机号发一条特殊的短信, 客户端拦截短信后发现是正常短信就放行, 如果是特殊短信就连接服务器取消息。
心跳包
作用:其实主要是为了防止NAT超时。其次是探测连接是否断开。
心跳包和轮询的区别
心跳包和轮询看起来类似, 都是客户端主动联系服务器, 但是区别很大:
(1)轮询是为了获取数据, 而心跳是为了保活TCP连接。
(2)轮询得越频繁, 获取数据就越及时, 心跳的频繁与否和数据是否及时没有直接关系
(3)轮询比心跳能耗更高, 因为一次轮询需要经过TCP三次握手, 四次挥手, 单次心跳不需要建立和拆除TCP连接。
NAT耗时
国内移动无线网络运营商在链路上一段时间内没有数据通讯后, 会淘汰NAT表中的对应项, 造成链路中断。
心跳保活
心跳一般是指某端(绝大多数情况下是客户端)每隔一定时间向对端发送自定义指令,以判断双方是否存活,因其按照一定间隔发送,类似于心跳,故被称为心跳指令。
TCP的KeepAlive无法�替代应用层心跳保活机制的原因
(1)TCP KeepAlive 的机制其实并不适用于此。Keep Alive 机制开启后,TCP 层将在定时时间到后发送相应的 KeepAlive 探针以确定连接可用性。一般时间为 7200 s。失败后重试 10 次,每次超时时间 75 s。
(2) TCP KeepAlive 是用于检测连接的死活
心跳时间间隔选择:长连接,慢心跳。
(1)发送心跳包势必要先唤醒设备, 然后才能发送, 如果唤醒设备过于频繁, 或者直接导致设备无法休眠, 会大量消耗电量
(2)中移动2/3G下, NAT超时时间为5分钟, 中国电信3G则大于28分钟, 理想的情况下, 客户端应当以略小于NAT超时时间的间隔来发送心跳包。
影响长连接的寿命的因素
心跳维持长连接的弊端
1、高于正常频率发送心跳包来维持长连接,这样无疑会带来信令风暴
2、这类心跳包频率很短 造成信令资源的浪费
3、造成手机电量的耗费
信令风暴:网络受到终端信令的请求超过了网络各项信令处理的能力,引发拥塞甚至雪崩效应,导致网络不可用,我们称之为“信令风暴”