1

作者:王军鹏
野狗iOS资深工程师,国内第一批iOS开发者,曾在人人担任高级工程师。多年逆向工程开发经验,对iOS系统底层有深入了解。

野狗官博:https://blog.wilddog.com/
野狗官网:https://www.wilddog.com/
公众订阅号:wilddogbaas

informationunload

随着3G和4G网络的普及,用户使用APP的场景更多地集中在移动网络下。同时也带来了手机电量消耗更快和网络延迟更高的问题。想开发出用户体验更好的应用,就需要对移动网络有更深入的了解。本系列文章分为上下两篇,分别介绍如何开发出更省电和网络延迟更低的移动应用程序。本篇文章主要介绍移动网络的一些基本工作原理以及降低手机耗电的优化方案。

初窥2G,3G,4G网络

说起移动网络我们不得不提香农定理。香农定理是所有通信制式最基本的原理,它描述了有限带宽、有随机热噪声信道的最大传输速率与信道带宽、信号噪声功率比之间的关系。其用公式可表示为:

C = B lb(1+S/N)

其中:C是信道支持的最大速度或者叫信道容量;B是信道的带宽;S是平均信号功率;N是平均噪声功率;S/N即信噪比。

移动网络技术的发展也无法跳出这个公式。从最初的1G网络技术到现在的4G网络技术,都是在利用这个公式提高速度。要么让频段资源得到充分的利用,要么提高整体带宽。但是无论如何改进,频段资源都是有限的。在拥挤的城市或者人扎堆的地方,很容易分配不到无线资源。即使分配到资源,也会因为使用人数过多而导致速度变慢。所以不得不制定出更优秀的策略来提高资源的有效利用。这就是我们下面要讲的无线资源控制(RRC)。

无线资源控制 (RRC)

什么是无线资源控制协议呢?我们先来看看手机发送一条信息的通信过程。

欲通信,先同步。手机在空闲状态下是无法通信的,当有通信需求时,手机会自动搜索信号,直到它搜到一个“信号非常强的全0序列”,就完成了锁定某个频道的过程。锁定频道之后,手机接下来就需要和通信系统校准时间,这就是同步过程。

欲接入,先申请。取得了频率和时间上的同步后,手机向控制平台发送通信请求,控制平台收到请求后,会找到空闲的时隙资源(时分多址技术中术语)分配给手机,并将手机切换到Active状态,这样手机就可以通信了。通信完成后,过一段时间,控制平台又会回收手机占用的通信资源,进入低耗能模式或者空闲模式。整个这一通信过程就是RRC所做的事情。

移动网络耗电的原因

前面提到了控制平台下不同模式的切换,下面是它的具体工作原理:手机在不传输数据的情况下一般处于空闲状态(Idle),当有发送数据需求时必须向控制平台发送申请。只有将手机切换到Active状态,也就是高耗能模式下才能进行通信。这一切换过程在4G网络下需要花费100ms的时间。通信完成后,手机不会一直处于高耗能模式下等待数据传输,它会切换到低耗能模式(Short sleep)。如果手机处于低耗能模式时接到数据发送请求,那么它又会切换到高耗能模式来发送数据。在频繁的数据请求中,它会在低耗能模式和高耗能模式不断的切换,而在不发送数据时,在10s后会再次进入空闲模式下。它会周期性的切换模式来确保资源的有效利用。

为什么存在耗能模式切换呢?因为无线资源是相对短缺的资源,在没有数据请求时就要对无线资源进行回收。

未命名

移动网络只有在处于DCH(高耗能模式)和 FACH(低耗能模式)下才会消耗手机电量。从上图可以看出,一次耗能模式切换大概需要花费10s,而且不管你传输的数据大小,它都会触发一次耗电周期,消耗10s的电量。

假如一个手机有5Wh(18000 J)总电量,手机完成一次从空闲模式切换到高耗能模式,再到低耗能模式,再到空闲模式的循环大概需要10J能量。如果每分钟切换一次,那么一个小时需要消耗60*10J = 600J电量,也就相当于总电量的3%。如果一个APP在后台每分钟发送一个请求,那么手机处于待机状态下一天就耗掉了3%* 24 = 72%的电。这就是为什么智能手机即使在待机状态下耗电量也非常大的原因。

如何省电

下面是我们根据上面提到的原因给出的五个可行的优化方案:

合并请求

在移动通信中,无论传输数据大小,每次数据传输都会触发一次大约10s的耗电。合并请求不仅能减少 DNS请求时间、服务器压力和HTTP请求,而且能够大大减少移动网络下手机电量的消耗。

预取数据

和合并请求原理一样,预取数据能让手机快速切换到空闲模式,并且在这个状态下保持更长的时间,以达到省电的目的。

避免轮询

轮询是指不管服务器端有没有更新,客户端都定时的发送请求进行查询。轮询可能会返回更新的信息,也可能会返回空的信息。轮询不仅增加了服务负担,而且会使手机长期处于高耗能模式,在几小时内就耗尽电池。

重连机制优化

一般重连机制都有几个重要参数:心跳时间间隔、重连超时时间及重连次数。其中心跳包每天会将手机从空闲模式唤醒近300次,一般的Android手机每天有超过15-20%的电量被消耗在发送过度频繁的心跳上。另外如果手机连不上服务器而不断的重试,在几小时内就会耗光电池。所以心跳时间不宜过短,据测试微信心跳时间为300s,可以作为一个参考。同样也不能永无休止的重连,重连几次还连不上,可以直接把问题抛给用户,由用户决定是否继续重连。

数据缓存

最省电的方式就是不使用移动网络,数据缓存能够大大减少网络请求的次数,达到省电的效果。

以上就是降低手机电量消耗的优化方案。在下一篇文章中,我们会详细分析移动网络延迟较高的原因,并给出降低网络延迟的方案,敬请期待。


野狗
2.3k 声望116 粉丝

野狗|安全可靠的实时通信云