网络的流程
- DNS解析
- TCP连接握手
- TLS连接握手
- TCP/Http request/response
首先会是DNS
解析,然后TCP
连接握手,TLS
连接握手,目前苹果商店已强制https
,所以这一步骤已不可避免,连接成功后再发送 TCP 或 HTTP 请求以及收到响应。网络服务里有一个重要的性能标准,即 RTT(Round-Trip Time),往返时延,它表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认)所间隔的时间。很容易就能计算出我们的 App 网络服务耗时的下限,当然还要加上服务器处理时间。
根据上述流程优化网络性能
-
优化DNS解析和缓存
内置Server IP 列表,该列表可以在 App 启动服务中下发更新。App 启动后的首次网络服务会从 Server IP 列表中取一个 IP 地址进行 TCP 连接,同时 DNS 解析会并行进行,DNS 成功后,会返回最适合用户网络的 Server IP,那么这个 Server IP 会被加入到 Server IP 列表中被优先使用。IP是有权重的,此外根据连接或者服务的成功失败来动态调整,这样即使 DNS 解析失败,用户在使用一段时间后也会选取到适合的 Server IP。或者使用HTTPDNS,自己做域名解析的工作,通过 HTTP 请求后台去拿到域名对应的 IP 地址
-
网络质量检测(根据网络质量来改变策略)
根据用户是在 2G/3G/4G/Wi-Fi 的网络环境来设置不同的超时参数,以及网络服务的并发数量。2G/3G/4G 网络环境对并发 TCP 连接的数量是有限制的(2G 网络下运营商经常只能允许单个 Host 一个 TCP 连接),因此网络服务重要参数能够根据网络质量状况来动态设定对性能和体验都非常重要。 举个例子,当我们从wifi切换到移动网络的情况下,主流的app会提示降低图片质量来提高体验
-
连接
HTTP1.1的协议里,在一个连接里传送数据都是串行顺序传送的,必须等上一个请求全部处理完后,下一个请求才能进行处理,导致这些请求期间这条连接并不是满带宽传输的,即使是HTTP1.1的pipelining可以同时发送多个request,但response仍是按请求的顺序串行返回,只要其中一个请求的response稍微大一点或发生错误,就会阻塞住后面的请求。
HTTP2 这里的多路复用协议解决了这些问题,它把在连接里传输的数据都封装成一个个stream,每个stream都有标识,stream的发送和接收可以是乱序的,不依赖顺序,也就不会有阻塞的问题,接收端可以根据stream的标识去区分属于哪个请求,再进行数据拼接,得到最终数据。 -
减少数据传输量
减少Payload,从xml,json数据格式转换到Protocol Buffer 数据格式
最后
网络优化涉及到的知识面很广,本文只是在学习过程中从优化思路上列举了目前业界常见的优化点,还有很多细节很多更深入的优化没涉及到,网络层实践开发经验不足