客户端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等支持幂等,可以进行重试。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容