HTTP/2
参考链接
SPDY
SPDY(发音如英语:speedy),一种开放的网络传输协议,由 Google 开发,用来传输网页内容。基于传输控制协议(TCP)的应用层协议。SPDY 也就是 HTTP/2 的前身。
设计 SPDY 的目的在于降低网页的加载时间。通过优先级和多路复用,SPDY 使得只需要建立一个 TCP 连接即可传送网页内容及图片等资源。SPDY 中广泛应用了 TLS 加密,传输内容也均以 gzip 或 DEFLATE 格式压缩(与 HTTP 不同,HTTP 的头部并不会被压缩)。另外,除了像 HTTP 的网页服务器被动的等待浏览器发起请求外,SPDY 的网页服务器还可以主动推送内容[9]。
2015 年 9 月,Google 宣布了计划,移除对SPDY的支持,拥抱 HTTP/2,并将在Chrome 51中生效。
—— SPDY - 维基百科
HTTP/2
新特性
在 HTTP/2 的第一版草案(对 SPDY 协议的复制)中,新增的性能改进不仅包括 HTTP/1.1 中已有的多路复用,修复队头阻塞问题,允许设置请求优先级,还包含一个头部压缩算法(HPACK)。此外,HTTP/2 采用了二进制而非明文来打包、传输客户端-服务器间的数据。
帧、消息、流和 TCP 连接
有别于 HTTP/1.1 在链接中的明文请求,HTTP/2 与 SPDY 一样,将 TCP 连接分为若干个流,每个流中可以传输若干消息,每个消息由若干最小的二进制帧组成。这也是 HTTP/1.1 与 HTTP/2 最大的区别所在。HTTP/2 中,每个用户的操作行为被分配了一个流编号,这意味着用户与服务端之间建立了一个 TCP 通道;协议将每个请求分割为二进制的控制帧与数据帧部分,以便解析。这个举措在 SPDY 中实践表明,相比于 HTTP/1.1,新页面加载可以加快 11.81% 到 47.7%
HPACK 算法
HPACK 算法是新引入 HTTP/2 的一个算法,用于对 HTTP 头部做压缩,其原理在于:
- 客户端与服务端根据 RFC 7541 的附录 A,维护一份共同的静态字典,其中包含了常见头部名及常见头部名称-值组合的代码
- 客户端与服务端根据先进先出的原则,维护一份可动态添加内容的共同动态字典
- 客户端与服务端根据 RFC 7541 的附录 B,支持基于该静态哈夫曼码表的哈夫曼编码
服务器推送
网站为了使请求数减少,通常采用对页面上的图片、脚本进行极简化处理。但是,这一举措十分不方便,也不高效,依然需要诸多 HTTP 链接来加载页面和页面资源。
HTTP/2 引入了服务器推送,即服务端向客户端发送比客户端请求更多的数据。这允许服务器直接提供浏览器渲染页面所需资源,而无需浏览器在收到、解析页面后在提起新一轮请求,节约了加载时间。
对比
HTTP/2 vs HTTP/1.1
- HTTP/2 相比 HTTP/1.1 的修改并不会破坏现有程序的工作,但是心的程序可以藉由新特性得到更好的速度
- HTTP/2 保留了 HTTP/1.1 的大部分语义,例如请求方法、状态码乃至 URI 和绝大多数 HTTP 头部字段一致。而 HTTP/2 采用了新的方法来编码、传输客户端-服务器之间的数据
SPDY vs HTTP/1.1
- 实现无需先进先出的多路复用
- 为简化客户端和服务器开发的消息——帧机制
- 强制性压缩(包括 HTTP 头部)
- 优先级排序
- 双向通讯
HTTP/2 vs SPDY
- HTTP/2 的开发基于 SPDY 进行跃进式改进。在诸多修改中,最显著的改进在于,HTTP/2 使用了一份经过定制的压缩算法,基于哈夫曼编码,一次替代了 SPDY 的动态流压缩算法,以避免对协议的 Oracle 攻击。此外,HTTP/2 禁用了诸多加密套件,以保证基于 TLS 的连接的前向安全。