HTTPS 和 HTTP 用 TCP 协议进行传输,也就意味着需要通过三次握手打造 TCP 连接,但一个 RTT 的时间内只传输一个 syn 包是否太浪费?能否在 syn 包发出的同时捎上应用层的数据?其实是可以的,这也是 tcp fast open 的思路,简称 TFO。具体原理可以参考 rfc7413。遗憾的是 TFO 需要高版本内核的支持,linux 从 3.7 将来支持 TFO,但现在的 windows 系统还不支持 TFO,所以只能在公司内部服务器之间发挥用途。
前面提到过将用户 HTTP 请求 302 跳转到 HTTPS,这会有两个影响HTTPS 访问速度优化HSTS(HTTP Strict Transport Security)。服务端返回一个 HSTS 的 http header,浏览器获得到 HSTS 头部之后,在一段时间内,不管用户输入都会默认将请求内部跳转成。Chrome, firefox, ie 都支持了 HSTS。
Session resume 顾名思义就是复用 session,达成简化握手。复用 session 有哪些好处有两个HTTPS 访问速度优化
需要消耗服务端内存来存储 session 内容。
现在的开源软件包含 nginx,apache 只支持单机多进程间共享缓存,不支持多机间分布式缓存,对于百度或者其他大型网络公司而言,单机 session cache 几乎没用途。
Session cache 也有一个很大的优点HTTPS 访问速度优化server 将 session 信息加密成 ticket 发送给浏览器,浏览器后续握手请求时会发送 ticket,server 端假如能成功解密和处置 ticket,就能完成简化握手。显然,session ticket 的优点是无需服务端消耗很多资源来存储 session 内容。Session ticket 的缺点HTTPS 访问速度优化
一般情况下,应用层数据需要等完全握手全部结束之后才能传输。这个其实比较费时,那能否类似 TFO 一样,在完全握手的第二个阶段将应用数据一块发出来呢?谷歌 提出了 false start 来达成这个功能。详细介绍参考 简单概括 False start 的原理就是在 client_key_exchange 发出时将应用层数据一块发出来,可以节省一个 RTT。False start 依靠于 PFS(perfect forward secrecy 好前向加密),而 PFS 又依靠于 DHE 密钥交换系列算法(DHE_RSA, ECDHE_RSA, DHE_DSS, ECDHE_ECDSA),所以尽可能优先支持 ECDHE 密钥交换算法达成 false start。
SPDY 是 谷歌 推出的优化 HTTP 传输效率的协议,它基本上沿用了HTTP 协议的语义 , 但通过用帧控制达成了多个特质,显著提高了 HTTP 协议的传输效率。SPDY 大的特质就是多路复用,能将多个 HTTP 请求在同一个连接上一块发出去,不像现在的 HTTP 协议一样,只能串行地逐个发送请求。Pipeline 虽然支持多个请求一块发送,但接收时依旧得根据顺序接收,本质上没办法解决并发的问题。HTTP2 是 IETF 2015 年 2 月份通过的 HTTP 下一代协议,它以 SPDY 为原型,经过两年多的讨论和健全最后确定。本文就不过多介绍 SPDY 和 HTTP2 的收益,需要说明两点HTTPS 访问速度优化HTTPS 访问速度优化推荐路径: