原创:蔡锐 百度APP技术团队资深网络专家 文章来源:百度APP技术微信公众号
让大家期待已久的"百度App网络深度优化系列《二》"来啦,继续传承百度简单可依赖精神,话不多说,直接上干货,也欢迎各位同道中人一起探讨!!!
一、前言
在系列《一》里大家了解到网络优化一般会首选优化DNS,而接下来的HTTP协议成为优化的重点,一般优化者会选择协议切换,合并请求,精简数据包大小等手段来对HTTP协议进行优化,严谨的说这都不属于网络优化的范畴。
HTTP协议的基础是连接,所以我们的系列《二》连接优化应运而生,希望对大家在网络方向的学习和实践有所帮助。
二、背景
连接优化需要解决两个核心问题
1. 连接建立耗时较长,导致请求的总时长变长,进而影响用户体验。
2. 在多变的网络环境下,连接建立的过程可能会失败,导致成功率下降,进而影响用户体验。
百度App承载着亿级流量,对于每一个请求都需要追求耗时短,成功率高的体验。从协议角度出发,如何才能做到这一点呢?首先我们来看下建立连接耗时的原理。
建立连接耗时的原理
从上图我们能清晰的看出
1. DNS Query需要1个RTT(Round-Trip Time,即往返时间),百度App都是基于HTTPDNS服务的,所以大部分会命中缓存,如果降级走了系统DNS,也会命中缓存,命中不了的由于是基于UDP协议,所以在连接耗时上没有太大的影响,线上的数据也能说明这点。
2. TCP要经历SYN,SYN/ACK,ACK三次握手的1.5个RTT,不过ACK和ClientHello合并了,所以就是1个RTT。
3. TLS(Transport Layer Security,即传输层安全性协议)需要经过握手和密钥交换2个RTT。
综上所述,DNS,TLS,TCP握手阶段用了4个RTT才到了ApplicationData阶段,也就是数据开始传输阶段。
通过上面的分析可以总结出,如果我们能尽量的将TLS和TCP的RTT减少,将会大大降低连接耗时的时间。
三、连接优化我们都能做什么
百度App的优化目标分为两类,一类是TLS的连接优化,一类是TCP的连接优化。
TLS的连接优化
TLS的连接优化,需要服务端和客户端都需要支持,共同完成优化手段,包括Session Resumption和False Start。
Session Resumption
Session Resumption中文意思是会话复用,下图讲解了Session Resumption的协议原理。
Session Resumption的协议原理
通过上图可以看出TLS密钥协商交换的过程没有了,但具体是如何实现的呢?包含两种方式,一种是Sesssion Identifier,一种是Session Ticket。
1)Session Identifier
Session