HTTP2 的特性
HTTP2 采用二进制格式传输,取代了 HTTP1.x 的文本格式,二进制格式解析更高效。HTTP2 在应用层修复了 HTTP1 的许多问题,优化了应用。其主要新增了以下特性。
- 减少头部的体积;
- 添加请求优先级;
- 服务器推送;
- 多路复用。
减少头部的体积
每个 HTTP 传输都包含一组描述传输资源的元信息。HTTP2 使用 HPACK 压缩格式来压缩请求和响应头元信息。它允许通过静态霍夫曼编码对传输的头部字段进行编码,从而减少它们各自的传输大小。它要求客户端和服务器都维护和更新先前看到的标题字段的索引列表(即,建立共享压缩上下文),然后将其用作参考以高效编码先前传输的值。
添加请求优先级
为了方便流的传输顺序,每个流都有权重和依赖。每个流的权重值在1~256之间,每个流可以详细给出对其他流的依赖。权重和依赖的结合可以使客户端构建出优先级二叉树的形式,来表达出更想依次得到哪些响应,然后服务端可以按权重分配硬件资源。
服务器推送
服务端可以为每个客户端请求发送多个响应,也就是说,除了原始的响应,服务端还可以给客户端发送额外的资源。服务器推送的资源可以由客户端缓存,推送的资源可以在不同的页面上重复使用,推送的资源可以与其他资源一起复用,推送的资源可以由服务器决定优先级,推送的资源也可以被客户端拒绝。
多路复用
在 HTTP1 中有以下两个性能问题:
- 多次连接:并发多个请求需要多个 TCP 连接,而且浏览器为了控制资源会有 6-8 个 TCP 连接限制。即便开启了 Keep-Alive,也存在很大的效率问题;
- 阻塞:开启了长连接之后,每个请求都要一步步执行。比如有 a,b,c 三个请求,假设分别为 1s。那么需要等到 a 请求完成,再执行 b 请求,最后执行 c 请求。这样的话就一共需要花费 3s。
HTTP2 的多路复用主要是为了解决以上问题,它的优点在于:
- 一个域一个连接:同域名下的所有请求都通过同一个 TCP 连接完成,节省了时间和空间。
- 并行传输:单个连接上还可以并行交错地请求和响应,互不干扰。因为 HTTP2 是使用二进制帧和流来进行传输,每个流都是双向流通的,并且有唯一的标志和优先级。流由二进制帧组成,每个二进制帧的头部信息会标志着属于哪一个流。所以信息可以交错传输,然后在接收端可以通过帧的头部信息组装完整的数据。