V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wilddog
V2EX  ›  分享发现

移动网络下的性能优化之网络篇

  •  
  •   wilddog · 2016-03-09 15:38:49 +08:00 · 1745 次点击
    这是一个创建于 2974 天前的主题,其中的信息可能已经有所发展或是发生改变。

    作者:王军鹏
    野狗 iOS 资深工程师,国内第一批 iOS 开发者,曾在人人担任高级工程师。多年逆向工程开发经验,对 iOS 系统底层有深入了解。
    野狗官博: https://blog.wilddog.com/
    野狗官网: https://www.wilddog.com/
    公众订阅号: wilddogbaas

    3571430174-56de4be32471d_articlex.png

    上篇文章我们分析了移动网络耗电较高的原因,并给出了相应的解决方案。本篇文章我们将分析移动网络延迟较高的原因,并给出相应的优化方案。

    移动网络延迟高的原因

    唤醒延迟
    在移动网络下,手机要接入网络,必须先向控制平台发送申请。只有当控制平台将手机切换到 Active 状态,手机才能进行通信,这一过程在 3G 网络下消耗的时间一般在 500-2500ms 之间,我们称之为唤醒延迟。这是一个造成移动网络延迟的原因。

    HTTP 延迟
    在 APP 开发中,我们会经常用到 HTTP 协议, HTTP 延迟就是在使用这个协议时产生的。

    3651421798-56de4c02b8c9a_articlex.png

    pasted-image 一个 HTTP 请求从客户端发送到服务端的过程中,需要进行域名查询,这时客户端就会发起一个 DNS Query 。这个过程所需的时间和 ISP (互联网服务供应商)、请求页面知名度、是否存在缓存以及服务器的响应时间都有关系。客户端在拿到解析出的 IP 后,还要经过我们熟知的 TCP 三次握手,这个过程需要耗时几百毫秒,甚至可能达到几秒。 TCP 握手完成后,还需发送 HTTP 请求传递我们的参数,取得服务器返回的数据。如果是 HTTPS 协议的话还需要进行 TLS 握手,这就又要增加两轮的延迟等待。

    所有的这些都需要消耗时间,再加上 RRC 控制平台唤醒手机到 Active 状态所要消耗的时间,形成以下 3G 网络和 4G 网络的对比图。

    2100946583-56de4c3bd28de_articlex.png

    从表中我们可以看到:在没有计算服务器反应时间的情况下, 3G 网络下一条 HTTP 请求需要 600-3500ms , 4G 网络下大概也需要 0.5s 。

    核心网络延迟
    下图是在移动网络下,一个手机向服务器传输数据的完整过程。

    344581197-56de4c6066ff7_articlex.png

    首先,手机需要切换到 Active 状态才能正常通信。手机向无线接入网络发送一条通信请求,无线接入网络收到后,给手机分配通信资源。这一步骤在 3G 网络最多需要花费 2s ,手机切换到 Active 状态后,开始向无线接入网络传输数据,基站无线接入网络收到后把数据发送给服务网关,服务网关将数据传给数据网关,数据网关再传输给服务器。

    我们再看看服务器收到数据后给手机返回数据的通信过程,如图所示:

    344581197-56de4c6066ff7_articlex.png

    服务器将数据传给数据网关,数据网关把数据交给服务网关,这时服务网关并不知道这设备在哪,只有把这个任务交给无线接入网络,无线接入网络找到设备后将手机切换到 Active 状态准备接受数据,然后告诉服务网关可以发送数据了,服务网关收到指令后将数据交给无线接入网络,无线接入网络再将数据发给手机。这样一次通信才算是最终完成。

    我们只想完成一次请求,而在这传输过程中我们却不得不忍受各种各样的延迟,包括路由选择延迟、唤醒延迟、控制平台延迟、骨干网络延迟、用户平台延迟等。

    如何降低延迟

    提前唤醒
    如果对速度要求很高,我们可以提前唤醒手机,并使其一直处于唤醒状态,当然这是以损耗电池为代价的。另外从用户体验上来说,对于超过 2s 的请求都应该给一个进度状态。

    数据缓存
    最快的请求就是不请求。网络通信的延迟是不可以避免的,但是对于已经请求过的数据请务必缓存下来,在下次再次访问时直接从本地获取。这样不仅能让用户有更流畅的操作,即使是在断网的情况下也能使用 APP 。

    压缩资源
    GZIP 压缩资源。 GZIP 压缩一般对纯文本内容可压缩到原大小的 40%,这样可以有效减少服务器带宽占用,提高我们我们的请求速度。

    使用 WebP 图片格式
    使用合适的图片格式。一般图片资源至少占整个 APP 数据量的 50%以上,所以压缩图片大小对提高性能也是非常重要的。这里推荐使用 WebP 图片格式,在质量相同的情况下, WebP 格式图片的体积要比 JPEG 格式图片小 40%。

    使用不同策略
    现在 2G , 3G , 4G 网络并存,网络速度差距也很大,针对每种网络应该有不同的应对策略。比如 2G 网络不自动打开图片, 3G , 4G 网络询问是否播放视频等。

    使用 CDN
    在全国各地多布设 CDN 加速节点,特别是网络流量比较大的区域,也能有效缓解核心网络所带来的延迟。

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2219 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:54 · PVG 23:54 · LAX 08:54 · JFK 11:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.