iOS网络优化实践

1,499 阅读6分钟

前段时间项目没那么忙的时候,抽出一些实践对App的性能做了一些优化,由于我们的应用核心功能在拍照上传,所以重点优化了图片上传的网络性能,这里对网络性能优化做了一些总结。

一、移动网络的特点

与有线网络通信相比,无线网络通信受环境影响比较大(例如高层建筑、用户移动、环境噪音、相对封闭环境等等),网络的服务质量相对来说不是非常稳定,导致用户经常会在弱信号的网络环境下通信。而当用户在这种网络环境下通信时,则存在较多的丢包、误码、超时、连接中断以及难以接入网络等情况。通信除了受环境影响以外,网络覆盖和室分系统不完善、邻区漏配、导频污染、过载控制等原因也都会产生无线呼叫掉线、服务质量下降等问题。

移动网络有三个特点:

  1. 移动状态网络信号不稳定,高时延、易抖动丢包、通道狭窄;
  2. 移动状态网络接入类型和接入点变化频繁;
  3. 移动状态用户使用高频化、碎片化、非WIFI流量敏感;

二、一次网络请求的流程

我们可以先看一下一次网络请求的流程:

  1. DNS Lookup (DNS解析,请求DNS服务器获取IP)
  2. TCP HandShake (TCP的三次握手)
  3. TSL Handshake (TSL的握手,安全协议的同步流程)
  4. TCP/HTTP Request/Response (发送TCP/HTTP请求以及受到响应)

三、存在的问题

我们清楚网络请求的流程,我们可以有针对性对每一步来进行优化。我们可以看一下每个步骤可能存在的问题:

1. DNS解析

DNS解析首先会从本地系统缓存获取,接着是最近的DNS服务器获取,再往后是到主域名服务器获取,每一层都有缓存,每一层缓存都有过期时间。

这种DNS解析机制存在以下缺点:

  • DNS解析过程不受控制,速度取决于运营商
  • 域名劫持,容易被中间人攻击
  • 一次请求只能解析一个域名

2. TCP连接

DNS拿到IP之后发起TCP连接,因为TCP的连接好事也是网络性能的关键因素,常见的问题有TCP端口被封,TCP连接超时时长问题,会导致如下结果:

  • 端口被封,则TCP无法连接
  • 在超时时间过长,那么可能导致用户等待时间太长
  • 在超时时间过短,那么在低速网络上可能总是无法连接

3. TSL握手带来的耗时问题

标准协议TLS保证了网络传输的安全,类似HTTPS就是HTTP协议加上TLS安全协议。目前比较常见的就是TLS1.2,但是TLS1.2每次建立一个安全连接需要2RTT(round-trip time),这么这对用户的延迟的影响是相当明显的。

4. Request/Response的问题

在图片上传的网络请求中,不同图片压缩算法对Request数据量影响很大。

四、优化的方向

1. 接入调度优化

对于DNS的问题,有两条主要的解决思路

  1. 减少DNS的请求、查询、更新,也就是做DNS缓存
  2. 在终端配置server list,直接访问IP,不用DNS

具体的优化方案是,通过指定的地址从服务端拉取域名与IP地址映射表,并进行缓存,在有效期内,通过IP地址与服务器进行直连。这样就解决了DNS 解析耗时的问题,顺便把一部分安全问题 (DNS 劫持)也解决了。

2. TCP连接优化

HTTP协议里面有个keep-alive,HTTP1.1默认开启,字面是连接保活的意思,原理是请求完成后不会立即释放连接,而是放入连接池中,若这是有另外一个请求要发出,请求的域名以及端口是一样的,那么直接从连接池中拿出连接进行发送和接受数据,减少了建立连接的耗时。

现有的客户端默认是开启了Keep-alive,但是这个keep-alive的连接只能发送接受一个请求,一个请求处理完成之前,无法接收新的请求。

HTTP2的多路复用机制则优化了这个问题,HTTP2的多路复用机制一样是复用连接,但是它复用的连接支持同事处理多条请求,所有的请求都可以并发的在这条连接上进行,从而解决了HTTP1.1的问题。

Http1.1的协议里,传送数据都是串行顺序发送的,必须等上一个请求全部处理完后,下一个请求才能进行处理。 Http2中的多路复用协议解决了这些问题,它把传输的数据都封装成一个个stream,每一个stream都有标识,stream的发送和接受可以是乱序的,不依赖顺序,接收端可以根据stream的标识去区分属于哪一个请求,再进行数据拼接。

3. TLS优化

标准协议TLS保证了网络传输的安全,常见的HTTPS就是在HTTP协议基础上加上了TLS安全协议。我们现在比较用的比较多的是TLS1.2X协议,但是TLS1.2每次建立一个安全连接都需要额外的2RTT,这种RTT对用户的影响是很明显的,为此我们该如何解决?

我们可以参考MMTLS方案,使用ECDH来做密钥协商,ECDSA进行签名验证,AES-GCM作为对称加密算法来对业务数据进行认证加密,使用HKDF进行密钥扩展,摘要算法为SHA256。

由于我们图片存储对加密没有要求,这里我们将https改为了http,减少了TLS的消耗。

4. Request优化

我们这次的优化以图片上传为主,我们主要在减少数据包大小着重做了优化,我们在上传之前将图片格式从jpg转换为webp,图片压缩率达47%,大幅减少上传的数据量。

结语

这篇文章主要从实践层面阐述了网络性能优化,中间查阅了很多资料,调研了很多方案,包括微信开源的网络库mars,chrome的开源库cronet,这些方案在TCP连接优化做到了极致,在技术层面上极大可能的提升了网络连接性能。

这次简单的对优化的内容做个总结,后续另开文章,专门针对TCP层更加底层的优化进行分析。