客户端HTTP请求优化指南

为什么要优化网络性能

对于一款互联网应用,用户体验是成功与否的重要指标之一。

网络性能一般指请求的成功率、延时等。目前的移动互联网时代,前端一般扮演信息展示与用户交互的角色,网络性能对用户体验的影响非常巨大。

据统计,网页加载时间从 1 秒增加到 3 秒,跳出率就会提高 32%;如果网页加载时间从 1 秒增加到 6 秒,跳出率就会上升 106%。

对于移动端APP,现在普遍在提一个APP秒开率(1S内完成APP冷启动及首页展)和页面秒开率(1S内完成页面跳转、渲染及展示)的指标,想要提高秒开率,提高网络性能是其中非常重要的一环。

HTTP请求流程

HTTP(Hyper Text Transfer Protocol,超文本传输协议)是目前移动端应用最广泛的网络传输协议之一,掌握原理是优化的第一步。

常规的HTTP请求流程如下图所示:


HTTP流程.png

整个流程中,除了客户端发起请求、服务端处理这两个在端上处理的环节,其余都与网络有交互。两个端上的处理,一般可以通过算法优化、处理逻辑优化等降低耗时,这里我们不多做分析,下面我们主要看下与网络交互的环节如何优化。

优化思路

DNS优化

DNS防劫持

DNS 是将域名转换为IP的查询服务,使用UDP协议实现。
一般客户端的DNS功能通过查询ISP(互联网服务提供商)提供的DNS服务器实现。

出于性能考虑,现代操作系统中内置的本地DNS客户端将缓存DNS搜索的结果;ISP的DNS也是如此,并不会按照DNS协议声明的TTL去定期更新缓存。

DNS域名劫持现代互联网最常见的共计方式之一,一般通过攻击运营商DNS服务器或者伪造DNS服务器的方式实现。

DNS解析作为请求与网络交互的第一步,如果发生DNS劫持,会直接影响请求的成功率或者数据安全问题。现在业内常见的方式是采用 HTTPDNS 解决:

HTTPDNS的实现非常简单,就是用HTTPS代替不可靠的UDP进行DNS查询服务,绕开了运营商的Local DNS。目前提供相关服务的公有云服务商很多,例如阿里、腾讯、网宿等,也可以自行搭建HTTPDNS服务。

DNS结果缓存

HTTPDNS服务通过HTTPS去进行查询,在没有缓存的情况下,速度大大慢于传统的UDP。一般一个公司的APP,使用的域名大都相同,关于这点我们可以通过本地缓存和定期更新(建议按照TTL间隔更新)的方式来解决。

如果服务器多地部署,或者多IP,我们可以对DNS的结果进行跑马竞速后排序缓存,下次使用时按照之前的竞速结果使用,提高整体建联性能。

iOS在使用HTTPDNS的时候,可能有个小问题,就是TLS的证书是对域名的,如果我们使用IP直接替换域名,会造成TLS不可用的问题,iOS上层网络库NSURLConnection/NSURLSession没有提供接口进行SNI字段的配置,可以通过CFNetwork来实现。具体实现搜索“iOS SNI”可以找到解决方案。

包体优化

包体压缩

传输数据的包体大小与传输耗时成正相关,压缩算法是减小包体的最有效手段之一。

HTTP压缩是通过在Request的header声明Accept-Encoding字段,表明客户端支持的压缩格式,服务端解析后,会使用声明列表内的算法之一对Response的body进行压缩,并在Response的header内Content-Encoding字段声明使用的压缩算法,客户端收到Response后,按照此压缩算法解压即可获得原始内容。

目前HTTP使用的压缩算法有:

  • deflate:是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法,无专利,并有众多开源实现
  • gzip:基于deflate实现
  • br:Brotli,该数据格式旨在进一步提高压缩比,对文本的压缩相对deflate能增加20%的压缩密度,而其压缩与解压缩速度则大致不变

高效序列化方式

目前在HTTP使用最多的数据系列化方式是JSON,JSON是基于文本的,虽然解析简单,但是编码长度较长,解析效率与传输效率较低。

目前比较流行的数据序列化方式是Google的Protobuf,简称PB。PB是一种基于二进制编码的高效、轻量化的信息描述格式,它具有语言中立、平台中立、高效、可扩展等特性,与 json、xml 相比,Protobuf 的编码长度更短、传输效率更高。将JSON切换为PB也是比较常见的HTTP优化手段,可以在降低传输包体大小的同时,提高客户端与服务端的编解码速度,一举两得。下面是网上找到的pb、josn、xml对比:


image.png

合并请求

如果一个页面内同时有多个请求,请求同时发起时可能会面临重复建联,网络带宽挤兑等情况,影响请求性能,这种情况下我们会建议将请求进行合并,减少请求数量来提高业务请求质量。

但是,切记不可以一味地合并请求,因为合并后传输包体必然会变大,合并的太多反而降低请求性能。原则上只合并相关的请求,降低同一个页面的请求数量。

域名合并 + 连接复用

从HTTP/1.1版本开始,支持同域名的连接复用,即可以在同一个TCP连接上传输多个请求,正常HTTP请求需要TCP三次握手建联和TLS握手,连接复用减少了重复建联的消耗,可以大大降低请求的前置耗时。

连接复用的维度一般是域名,即相同的域名对应的IP地址是相同的,可以复用相同的连接,所以可以通过合并域名的形式,尽量让客户端的请求使用同一个域名,大大提高连接复用的概率,优化HTTP请求性能。

幂等重试

幂等是指同一个请求多次调用,返回的结果都是相同的,对于支持幂等的请求,我们可以通过重试的方式提高请求的成功率。

HTTP协议中的GET、HEAD、PUT等支持幂等,可以进行重试。

你可能感兴趣的:(客户端HTTP请求优化指南)