热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

web应用推送通知是如何实现的?手机耗电技术是怎么回事?详解推送技术架构

   我们的手机app经常主动给我们推送消息,比如更新通知,热点事件,微信的来信提醒。在日常应用司空见惯的功能是如何实现的呢?    上图中浏览器和服务器建立的是TCP请求,TCP

     我们的手机app经常主动给我们推送消息,比如更新通知,热点事件,微信的来信提醒。在日常应用司空见惯的功能是如何实现的呢?

       上图中浏览器和服务器建立的是TCP请求,TCP是全双工协议,所以建立请求之后双方可以任意交换数据,但是我们的消息推送是由服务器主动推送消息到客户端,看起来好像也是建立了tcp连接,实际上这里需要注意一个方向的问题,http请求的发起方一定是浏览器,而不是我们的web服务器,可能很多人会思考,那如果浏览器建立连接后不断开那不是可以实现服务器推送消息吗?这样肯定是不可行的,如果每个连接都保持不断,那么很快web服务的线程就会耗尽。

       那么我们继续思考,有这样一种方案:假如让客户端每隔一段时间就向服务器询问—有新的消息吗?轮询制可以实现,但是耗费客户端的线程,这种方式仅仅试用于消息是定时更新:比如炒股软件,每15分钟更新一次;比如心跳机制,每隔5秒检测服务端是否还存活;

      第二种方案:建立Http长轮询,比如基于Ajax请求(Http)就有区分短连接和长连接,由浏览器建立连接后,采用轮询机制加上间隔时间(setInterval)就可以实现定时向浏览器发送请求,如果有新的消息,就会立即发给客户端,这样似乎也是可以解决浏览器给服务器发送消息的(假推送);而事实上很多网页版的即时通讯也确实采用的是这种方式:如网页版微信、QQ,网页版的FaceBook IM;但这个还是开头提到的问题,对服务器的要求很高,后台需要对服务器的运行进行维护。

       介绍下Http协议的细节:

              1、Http的长链接实质是建立在TCP协议上的长连接与短连接;

              2、每个http连接建立后,通信结束并不会立马断开,从http 1.1开始,默认使用长连接,在请求头中会有这样的参数Connection:keep-alive 表示就是长连接

           3、keep-alive不会永久保持,在不同的服务器软件中时间不一样,如apcahe的tomcat,Nginx;Nginx的默认连接保持时间是75s,实现长连接要客户端和服务端都支持长连接

             4、http连接在传输层使用的Tcp协议,在网络层使用ip协议,可以保证顺序和可靠的连接特性(假如连接过程中发生丢包,服务器会重发)

      第三种方案:现在Html5推出了websocket,websocket建立的不是Http的TCP/IP连接(IP+port形式),而是类似 http连接形式以ws://wss:// 开头的有状态协议(刚好跟http的无状态相反),意思建立连接的客户端和服务器之间保持活跃状态,并可以相互通信,直到有一方主动停止;

       插播一段websocket的使用场景:

         1、即时web应用程序:比如交易网站中实时更新的价格信息,就可以使用websocket连续推送到客户端;

         2、游戏应用中需要实时刷新客户的游戏状态和数据;

         3、聊天应用中建立一对一的实时消息传输;

      websocket虽然是有状态的协议连接,但是依然需要客户端先主动向服务端建立连接,一旦客户端发生了关机重启,比如微博,如果你没有打开微博,服务端也就没法推送新的消息;回想下12年智能手机刚刚兴起时,如果你同时打开多个移动app在后台运行,此时手机会变得奇卡无比;原因就在于很多应用app都在后台保持着一个用于消息推送的websoket连接,这种应用数量少时看起来没啥影响,但是数量一多,对手机的耗电和流量影响非常大;

      现如今移动应用发展迅速,基本很少采用上述需要长连接的技术来实现服务端向客户端推送消息了,而是采用一种 “邮箱模式”;好比在移动app的门口安装一个邮箱,服务器通过“”“邮局”将信件塞到邮箱中;比如google就为Android应用提供一种google订阅服务,移动app只要通过api订阅google的邮箱服务,而服务器只需要将消息推送到google的云端,由google将消息通过订阅服务传递给app,google就充当了邮局和邮递员的角色,这种技术确实解决了app端耗电耗流量的问题,但是我们设想下,移动设备不只有Android系统呀,还有IOS设备,所以需要为两个操作系统开发两套订阅服务的代码,这也是此前很多公司app的通行做法;

    以上的情况还仅试用于国外可以访问google和apple服务的情况,国内由于防火墙的原因,app厂商们是没法接入这两家公司的订阅服务的;于是国内的各大手机厂商,如小米,华为等手机厂商需要针对自己的手机应用开发订阅服务,而app厂商就需要为每个手机厂商定制一个订阅的系统,这很显然是不现实的;

     如今国内比较流行的做法是在更高层面上做消息推送,你只需要订阅他们提供的接口,他们就能为你实现向Android ios不同的应用设备,或者是浏览器网页应用进行消息推送,比如极光推送,Baidu推送;

 

说到这里,我想回归到我们最初提出的问题,仅仅是因为服务器无法连接客户端而产生的推送问题,就需要各种客户端订阅服务以及各种编码实现,这似乎给我们开发系统变得异常复杂,唯一的原因就是服务端无法定位到一个唯一的客户端ip,意味着每台移动或者计算设备是没法在网络上仅仅通过一个ip就能够定位出来,这实际跟目前ip协议有关,IPV4协议由于容量的限制2^48个,所以现有的ipv4网络需要划分为公网和局域网,在公网(互联网)通过路由器ip地址来进行每个局域网位置的定位,具有唯一性,而对于每一个不同的局域网而言,内部ip可以相同,通过APR协议随机发送给其中一个,局域网之间的内部计算机ip也是可以相同的,所以没法实现单个计算机的定位,来进行服务端消息的推送,如果到时ipv6得到普及,到时每一个地球上的计算设备都能分配到唯一一个ip地址,到时上面的这种邮局模式就可以退出历史舞台,真正实现服务端和客户端随意通信的效果了。

写这篇博客参考了微软大佬Anduin Xue在youtube上的视频,有兴趣可以关注他

 

IT的开放给了每一位从业者一个充分获取的学习环境,希望各位看到这篇博客的小伙伴,一起加油!

 

 

 

 



推荐阅读
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 在配置Nginx的SSL证书后,虽然HTTPS访问能够正常工作,但HTTP请求却会遇到400错误。本文详细解析了这一问题,并提供了Nginx配置的具体示例。此外,还深入探讨了DNS服务器证书、SSL证书的申请与安装流程,以及域名注册、查询方法和CDN加速技术的应用,帮助读者全面了解相关技术细节。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 基于Web的Kafka管理工具Kafkamanager首次访问Web界面的详细配置指南(附图解)
    首次访问Kafkamanager Web界面时,需要对Kafka集群进行配置。这一过程相对简单,用户只需依次点击【Cluster】>【Add Cluster】,按照提示完成相关设置即可。本文将通过图文并茂的方式,详细介绍每一步的配置步骤,帮助用户快速上手Kafkamanager。 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 本文详细解析了 Yii2 框架中视图和布局的各种函数,并综述了它们在实际开发中的应用场景。通过深入探讨每个函数的功能和用法,为开发者提供了全面的参考,帮助他们在项目中更高效地利用这些工具。 ... [详细]
  • 在优化Nginx与PHP的高效配置过程中,许多教程提供的配置方法存在诸多问题或不良实践。本文将深入探讨这些常见错误,并详细介绍如何正确配置Nginx和PHP,以实现更高的性能和稳定性。我们将从Nginx配置文件的基本指令入手,逐步解析每个关键参数的最优设置,帮助读者理解其背后的原理和实际应用效果。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • PHP自学必备:从零开始的准备工作与工具选择 ... [详细]
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
  • 在腾讯云服务器上部署Nginx的详细指南中,首先需要确保安装必要的依赖包。如果这些依赖包已安装,可直接跳过此步骤。具体命令包括 `yum -y install gcc gcc-c++ wget net-tools pcre-devel zlib-devel`。接下来,本文将详细介绍如何下载、编译和配置Nginx,以确保其在腾讯云服务器上顺利运行。此外,还将提供一些优化建议,帮助用户提升Nginx的性能和安全性。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
author-avatar
你问什么只为她停留_538
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有