文章转自本人公众号:机械猿,本人之前在四川某汽轮机从事结构强度设计,目前在阿里巴巴淘宝事业部担任高级开发工程师,有机械工程同行想转行IT,或者有想入职BAT的可以找我内推~

絮叨

之前讨论过TCP连接相关的问题:

手机上的APP是如何与服务器通信的

对于国民生态级APP,像淘宝天猫支付宝等,支撑大量扫码、AR、视频直播和实时聊天等业务,背后的服务器集群数十万计(算上国外POP点),必须要考虑网络质量的稳定性和消息到达的时效性。移动通信模块涉及的终端技术点很多,本文先从长连接讲起,将大型APP的通信原理和通信质量保障一点点理清。

一般APP主进程退出之后还会留一个push进程来接收服务端的推送消息,在安卓机上用过QQ微信或者支付宝的应该都有印象,明明把APP进程杀掉了,系统推送的消息还是能收到。一般大型APP都是自建http/tcp长连通道,小型app可以直接使用阿里云定制的推送功能。像即时聊天类APP如微信的消息收发非常及时,背后功劳就是这套长连接系统。不得不说,微信的消息推送质量基本高达98%,略高于阿里系的淘宝和支付宝。

长连接

之前面试阿里的时候,面试官问过一个问题:TCP的keepalive和http的keep-alive长连接有什么区别?两者的侧重点不太相同。客户端与服务端通信流程为:客户端dns请求获取服务端ip地址,之后经过tcp三次握手建立连接,tls握手交换对称密钥(这里如果中间证书过大的话还要中断握手先下载证书),然后才是http的数据通信。如果是短连接,数据传输完后服务端就会主动关闭连接,下次再发数据时又要经过上一次繁杂的握手流程。而http1.1里面的keep-alive字段就是为了告知双方继续保持这条连接,免去握手流程。而TCP的keepalive机制是启动一个定时器,如果双方两小时没有任何数据收发传输(两人都不说话),那么服务端会向客户端发送一个一字节探测报文,如果客户端没有回应,连续10次探测之后发送reset报文断开这条连接。

通知推送

安卓和iOS手机都能收到APP的推送消息,但是实现机制不一样。iOS是依靠系统内部的常驻推送进程与苹果自己的APNS服务器通信,转发淘宝服务器发出的通知。

而安卓不一样,是各家自己单独维护或者租用一条推送链路。安卓版APP一般除了执行数据运算的主进程之外,还会维持一条push进程用于长连接,主要是发送心跳包和接收自家服务推送,这也是安卓机内存越来越不够用的原因之一。

       杀进程,一般是清除APP的主进程,push进程因为占用内存相对比较小,被系统杀掉的可能性不太高,在后台继续运行;有些软件在push进程被杀掉后还可以通过AlarmReceiver及时拉起进程。

目前几大主流手机厂家华米OV联合BAT和google推出了统一推送联盟,向iOS看齐,各大APP统一使用一条推送通道,好处主要有以下几点:

1、APP不需要特意保活,减少了手机内存占用和耗电量;

2、可以对推送消息统一进行权限管理和控制,减少垃圾消息;

3、减少APP厂商开发适配难度(想象一下用C++开发完Android版本马上用object-c开发iOS版本的蛋疼场景)。

阿里系APP借鉴http协议自己实现了一套长连接机制,主要用于应对大量网络请求及信令包的传输,减少耗时,其次服务端可以主动使用push通道推送数据到客户端。这种情况如果采用客户端轮询机制实现的话会消耗服务器大量带宽,也会造成运营商信令风暴。长连接大体部署如下图:

注1:由于运营商NAT表老化,基本二十分钟(中国电信保活时间最长,为20分钟)后NAT表就会更新,这个时候服务端已经联系不上客户端了。后面会讲到客户端发送心跳包保活连接,主要也是这个原因。

注2:淘宝为什么不把服务端的IP直接写到程序里,而是要通过dns花费1rtt耗时通过运营商请求呢?主要是为了服务器集群容灾,其次是就近接入。

连接保活

为了解决上面说到的NAT超时导致连接断开的问题,通常的操作是客户端以略小于NAT超时的间隔发送心跳包。但是采用固定心跳方法,会增加手机功耗,消耗大量信令资源,而且不同WiFi信号下NAT超时通常较长如20min,如果继续采用5min心跳一次则浪费资源。因此淘宝采用智能心跳策略,动态逐渐递增探测到NAT时间后,探测思路借鉴了TCP探测拥塞窗口的思路。当APP处于后台时,为减少电量消耗及频繁唤醒系统,在前台熄屏或者刚进入后台时递增探测最长心跳时间,在后台稳定态(一般为10min)时采用最大心跳作为固定值。

此外,Android系统为减少系统频繁唤醒,提供了定时器对齐机制,即把一定时间段内的多个定时器中断唤醒合并成一个中断,这个思路也被很多嵌入式操作系统如freertos采纳,作为一个低功耗卖点。

假连接现象

当然长连接也不是一直保持着,移动网络跟有线网络相比环境复杂太多,移动通信需要考虑的点也很多,下面几种情况就会出现tcp假连接现象,也就是本地的socket资源还在,但是网络已经无法使用了。

1、切网

在电梯、地下室等弱网情况下,从有WiFi的地方走到4G网络覆盖的区域,虽然WiFi已经断开,但是手机进程里之前WiFi的信息还未清除,如果采用原来的IP通信肯定会失败。

2、后台清理进程

如果push进程被切入后台,那么安卓系统会在内存不足的情况下采用LRU算法清掉最久未使用的进程,push进程随时可能被杀掉。

3、NAT表老化

上文已经说明。

4、DHCP租期到期

Android系统在处理dhcp到期续约时在某些机型上会出现bug,这个时候本地IP地址无效,只能重新建立tcp连接。

周末有空探讨一下VPN对APP无线网络性能的影响。

最后厚着脸皮放一下自己的公众号:机械猿,有机械工程同行想转行IT,或者有想入职BAT的可以找我内推~

APP是怎么推送消息的--以淘宝app为例相关推荐

  1. iOS 当APP接收到推送消息时,对推送消息进行处理

    结合最近做的项目来总结一下,在我们接收到推送通知后我们将要怎么处理这条推送消息,也为以后再做相关推送的时候能够更快处理. 首先要说明两个概念:本地通知和远程推送.本地通知是由本地应用触发的,接收会比较 ...

  2. 如何发布日历提醒推送消息服务器,iOS开发 -- 通过app向手机自带的日历中添加事件提醒...

    在如今实际开发中,我们会有一种需求---通过自己的app往系统自带的日历中添加提醒事件. 一: 首先上最后效果图: WechatIMG7.jpeg 下图是关于添加事件的详情 WechatIMG8.jp ...

  3. 推送消息到手机APP

    推送消息到手机APP(使用个推的JAVA SDK)  使用个推平台:JAVA服务端链接 http://docs.getui.com/server/java/start/  下载测试APP Demo用例 ...

  4. 公众号向特定用户主动推送消息_SAP系统和微信集成的系列教程之三:微信用户关注公众号之后,自动在SAP C4C系统创建客户主数据...

    这是Jerry 2020年的第84篇文章,也是汪子熙公众号总共第266篇原创文章. 本系列的英文版Jerry写作于2017年,这个教程总共包含十篇文章,发表在SAP社区上: https://blogs ...

  5. Android之集成极光推送消息

    极光推送是为 App 提供第三方推送服务的平台之一,它提供四种消息形式: 通知 自定义消息 富媒体 本地通知 1.通知 Push Notification,即指在手机的通知栏(状态栏)上会显示的一条通 ...

  6. 关于iOS自定义推送消息铃声

    近期接触到一个项目,要求app在后台的时候,当app接收到推送消息时能播放一段音乐,正常的的推送消息逻辑只有当用户点击消息栏才能触发相关的方法,此时我就想到用自定义推送铃声的方法来解决这个问题. 推送 ...

  7. Android 推送消息开放接口 OpenPush

    Android 推送消息开放接口 OpenPush 我们知道, 在中国不能使用 google 的服务. 在中国销售的手机甚至没有安装 google 的服务.所以, 原本由 google gcm 提供的 ...

  8. 使用Appium爬取淘宝App数据

    0x01.介绍说明 1.简介 Appium是一个自动化测试开源工具.通过WebDriver协议驱动IOS.Android.Windows Phone平台上的原生应用.混合应用和web应用. 2.App ...

  9. XPosed+Charles抓包淘宝App

    阿里系大多使用了MTOP来加签请求,所以需要通过hook的方式关掉这个加签.我这里使用的是xposed.也可以使用Frida @Overridepublic void handleLoadPackag ...

最新文章

  1. ArUco与AprilTag简介
  2. 第一章 为什么使用单元测试
  3. 批处理命令学习笔记——Start命令
  4. linux oracle脚本编写,Linux 脚本编写基础(一)--语法
  5. 在C++里,有两种方法创建对象:
  6. 基于C#的TCP/IP协议应用(一)
  7. 最常用的设计模式---适配器模式(C++实现)
  8. matlaba绘制gps星空图_网络图横道图绘制软件 5.0免锁版告别纯手工绘制,修改工作量大!...
  9. 告毕业生书——七剑送你下天山
  10. android 9.0华为荣耀,华为9款旗舰尝鲜Android 9.0 还不快去升
  11. php版谁是卧底,机器人陪你玩“谁是卧底quot;游戏
  12. 【IDEA】idea es 报错 Cause: invalid type code: 2D
  13. 指针系统学习5-对使用字符指针变量和字符数组的讨论
  14. 【Word】利用域代码快速实现公式按章节自动编号
  15. python随机生成字符串_python 怎样随机生成中文字符?
  16. 【前端】日期正则表达式(转发)
  17. Word创建层级目录
  18. Tomcat 8.5 HTTP 报文只返回200 不返回 OK
  19. 记深信服2018秋季校园招聘--技术服务工程师
  20. cms概述 。比较shopex和ecshop区别 。smarty模板引擎的入门

热门文章

  1. 海狮号水下机器人_海狮(SeaLion)小型水下遥控机器人(ROV)
  2. 车企们重金押注世界杯,值不值?
  3. 湿气重的人多吃这5种食材,排毒祛湿,让你越来越瘦!
  4. Postman一直在登录界面转圈
  5. 【C++ 之 C++ 操作 json 文件(C++读写json文件)及jsoncpp配置详解】
  6. Java基础之在窗口中绘图——绘制圆弧和椭圆(Sketcher 3 drawing arcs and ellipses)
  7. Chainer 使复杂神经网络变的简单
  8. 使用ZBrush、Maya、Arnold创建一个巫师学徒
  9. 如何通过VMware Workstation12安装MacOS虚拟机(及各种报错的解决方案)
  10. 【MM32F5270开发板试用】RT-Thread SPI 驱动适配指南