互联网推送服务原理:长连接+心跳机制(MQTT协议)

标签: 互联网 服务 原理 | 发表时间:2015-12-14 07:47 | 作者:chicony
分享到:
出处:http://www.iteye.com

互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了,所以才会出现像MQTT这种轻量级低消耗的协议来维护长连接,那么要如何维护长连接呢:

 

 

       在写之前,我们首先了解一下为什么android维护长连接需要心跳机制,首先我们知道,维护任何一个长连接都需要心跳机制,客户端发送一个心跳给服务器,服务器给客户端一个心跳应答,这样就形成客户端服务器的一次完整的握手,这个握手是让双方都知道他们之间的连接是没有断开,客户端是在线的。如果超过一个时间的阈值,客户端没有收到服务器的应答,或者服务器没有收到客户端的心跳,那么对客户端来说则断开与服务器的连接重新建立一个连接,对服务器来说只要断开这个连接即可。那么在智能手机上的长连接心跳和在Internet上的长连接心跳有什么不同的目的呢?原因就在于智能手机使用的是移动无线网络,那么我们在讲长连接之前我们首先要了解无线移动网络的特点。

1.无线移动网络的特点:

        当一台智能手机连上移动网络时,其实并没有真正连接上Internet,运营商分配给手机的IP其实是运营商的内网IP,手机终端要连接上Internet还必须通过运营商的网关进行IP地址的转换,这个网关简称为NAT(NetWork Address Translation),简单来说就是手机终端连接Internet 其实就是移动内网IP,端口,外网IP之间相互映射。相当于在手机终端在移动无线网络这堵墙上打个洞与外面的Internet相连。原理图如下:(来源网络)

 

        GGSN(GateWay GPRS Support Note 网关GPRS支持节点)模块就实现了NAT功能,由于大部分的移动无线网络运营商为了减少网关NAT映射表的负荷,如

果一个链路有一段时间没有通信时就会删除其对应表,造成链路中断,正是这种刻意缩短空闲连接的释放超时,原本是想节省信道资源的作用,没想到让互联网

的应用不得以远高于正常频率发送心跳来维护推送的长连接。这也是为什么会有之前的信令风暴,微信摇收费的传言,因为这类的应用发送心跳的频率是很短的,

既造成了信道资源的浪费,也造成了手机电量的快速消耗。

2.android系统的推送和IOS的推送有什么区别:

        首先我们必须知道,所有的推送功能必须有一个客户端和服务器的长连接,因为推送是由服务器主动向客户端发送消息,如果客户端和服务器之间不存在一个长连接那么服务器是无法来主动连接客户端的。因而推送功能都是基于长连接的基础是上的。

        IOS长连接是由系统来维护的,也就是说苹果的IOS系统在系统级别维护了一个客户端和苹果服务器的长链接,IOS上的所有应用上的推送都是先将消息推送到苹果的服务器然后将苹果服务器通过这个系统级别的长链接推送到手机终端上,这样的的几个好处为:1.在手机终端始终只要维护一个长连接即可,而且由于

这个长链接是系统级别的不会出现被杀死而无法推送的情况。2.省电,不会出现每个应用都各自维护一个自己的长连接。3.安全,只有在苹果注册的开发者才能够进行推送,等等。

       android的长连接是由每个应用各自维护的,但是google也推出了和苹果技术架构相似的推送框架,C2DM,云端推送功能,但是由于google的服务器不在中国境内,其他的原因你懂的。所以导致这个推送无法使用,android的开发者不得不自己去维护一个长链接,于是每个应用如果都24小时在线,那么都得各自维

护一个长连接,这种电量和流量的消耗是可想而知的。虽然国内也出现了各种推送平台,但是都无法达到只维护一个长连接这种消耗的级别。

3.推送的实现方式:

一:客户端不断的查询服务器,检索新内容,也就是所谓的pull 或者轮询方式

二:客户端和服务器之间维持一个TCP/IP长连接,服务器向客户端push

三:服务器又新内容时,发送一条类似短信的信令给客户端,客户端收到后从服务器中下载新内容,也就是SMS的推送方式

苹果的推送系统和googleC2DM推送系统其实都是在系统级别维护一个TCP/IP长连接,都是基于第二种的方式进行推送的。第三种方式由于运营商没有免费开放

这种信令导致了这种推送在成本上是无法接受的,虽然这种推送的方式非常的稳定,高效和及时。

如果想了解android中各种推送方式请参考这个链接: Android实现推送方式解决方案 这篇博客已经介绍的非常好了。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [互联网 服务 原理] 推荐:

互联网推送服务原理:长连接+心跳机制(MQTT协议)

- - 移动开发 - ITeye博客
互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了,所以才会出现像MQTT这种轻量级低消耗的协议来维护长连接,那么要如何维护长连接呢:.        在写之前,我们首先了解一下为什么android维护长连接需要心跳机制,首先我们知道,维护任何一个长连接都需要心跳机制,客户端发送一个心跳给服务器,服务器给客户端一个心跳应答,这样就形成客户端服务器的一次完整的握手,这个握手是让双方都知道他们之间的连接是没有断开,客户端是在线的.

一个移动互联网应用地图服务架构

- Ian - 出家如初,成佛有余
    在移动互联网中,各种与位置相关的服务都严重依赖于地图服务,地图服务质量的好坏很大程度决定了所提供服务的高低. 尽管有Google Map等免费或收费的地图服务可供使用,但没有那一家地图服务提供商能够完整提供移动互联网应用所必须的各种地图服务及数据,尤其是针对那些垂直行业应用.     在中国特色的制度下,除了技术因素外,值得注意的是由于地图牌照发放问题带来的政策上的不确定性对架构实现的冲击和挑战.

以互联网产品为核心的服务设计

- - 百度商业用户体验部
当前互联网产品的发展日新月异,从业者在不断地深挖产品的方方面面,这些工作足以使产品的质量非常优秀,但为什么有时却得不到广大用户的认可呢. 从服务设计的角度来分析,我们也许可以得到答案. 进行产品设计时,一般要考虑四个因素:用户、情景、过程、对象(即产品本身). 在服务设计的思路里,产品可以是有形的,也可以是无形的——与用户发生交互的每个环节都是产品的一部分.

移动互联网创业公司的服务器选择

- - 五四陈科学院-坚信科学,分享技术
以下内容由 [五四陈科学院]提供. 小公司,三五个人,扯开嗓子开干的情况下,不妨参考一下过去我们淌过的坑. 在中国,网络成本是比较贵的(包括托管费用). 分析你的目标用户,如果用户是特别集中在南方或者是北方,这能省些钱,多线机房还是很贵的. 同时,移动互联网,特别是中国特色的情况下,各种运营商挂js,各种基站网络不通,如果所在的机房在搜索引擎上一条记录都没有的话,那会很惨,基本上你的用户在手机上是很难过去的.

互联网工作者必备的工具服务

- - 互联网技术和架构
人和人之间的效率差距往往体现在选择什么样的工具;以及经验的差异上. 工具需要选择能提高效率很多倍的高效工具. 经验的增长需要长时间不断积累,需要有不断获取优质领先信息的渠道. 以下是一些工具和信息渠道的推荐. 由于众所周知的原因,每个国内搞 互联网技术的人几乎都需要一台 VPS. 现如今,VPS 不像 5 年前那么贵了,而 VPS 的用途也不像以前单单用做架设个人网站或者个人博客.

ifttt:让整个互联网成为每个人的自动服务机器

- blueslan - 月光博客
  if … then … else 是基本上所有编程语言的最基本语句,当(if)参数满足规定条件时(then)触发特定函数(else)触发另一函数,通俗理解这一语句就是程序里的道道关卡,这些关卡将一个个小的代码片段衔接成运行有序的庞大程序,从而完成复杂的计算. 所有的软件、网站、移动应用的背后都是如此.

ifttt: 让整个互联网成为每个人的自动服务机器

- DayuLu - 互联网的那点事
if … then … else 是基本上所有编程语言的最基本语句,当(if)参数满足规定条件时(then)触发特定函数(else)触发另一函数,通俗理解这一语句就是程序里的道道关卡,这些关卡将一个个小的代码片段衔接成运行有序的庞大程序,从而完成复杂的计算. 所有的软件、网站、移动应用的背后都是如此.

极客攻略:让互联网为你服务--- ifttt 极客指南

- IwfWcf - GeekPark 捕风捉影
上个月的某天,我在Google Reader里曾经看到过一个名字奇特的互联网应用ifttt,号称能够将互联网上的各个独立的服务通过某些触发条件串联起来,形成某种自动化的任务. 这让我立刻想起了Mac OS上的Automator,以及Android上的Tasker. 本质上,它们三者其实属于同一类应用,利用第三方程序提供的接口实现在不同条件下,各种原本复杂任务的自动化.

ifttt: 让整个互联网成为每个人的自动服务机器

- jimmy54 - cnBeta.COM
if … then … else 是基本上所有编程语言的最基本语句,当(if)参数满足规定条件时(then)触发特定函数(else)触发另一函数,通俗理解这一语句就是程序里的道道关卡,这些关卡将一个个小的代码片段衔接成运行有序的庞大程序,从而完成复杂的计算. 所有的软件、网站、移动应用的背后都是如此.

ifttt:让整个互联网成为每个人的自动服务机器

- 小熊维尼 - 所有文章 - UCD大社区
if … then … else 是基本上所有编程语言的最基本语句,当(if)参数满足规定条件时(then)触发特定函数(else)触发另一函数,通俗理解这一语句就是程序里的道道关卡,这些关卡将一个个小的代码片段衔接成运行有序的庞大程序,从而完成复杂的计算. 所有的软件、网站、移动应用的背后都是如此.