1. 简介 (Introduction)
超文本传输协议 (Hypertext Transfer Protocol, HTTP) 是一个极其成功的协议. 然而, HTTP/1.1 使用底层传输的方式 ([RFC7230], Section 6) 具有若干特征, 这些特征在当今会对应用性能产生总体上的负面影响.
具体而言, HTTP/1.0 在一个给定 TCP 连接上一次只允许有一个未完成请求. HTTP/1.1 增加了请求流水线 (request pipelining), 但这只部分解决了请求并发问题, 并且仍然受到队头阻塞 (head-of-line blocking) 的影响. 因此, 需要发出大量请求的 HTTP/1.0 和 HTTP/1.1 客户端会使用多个到服务器的连接来实现并发, 从而降低延迟.
此外, HTTP header fields 往往重复且冗长, 会造成不必要的网络流量, 也会导致初始 TCP [TCP] 拥塞窗口很快被填满. 当在一个新的 TCP 连接上发出多个请求时, 这可能造成过高的延迟.
HTTP/2 通过定义 HTTP 语义到下层连接的优化映射来解决这些问题. 具体来说, 它允许在同一连接上交错传输请求和响应消息, 并对 HTTP header fields 使用高效编码. 它还允许对请求进行优先级排序, 使更重要的请求能够更快完成, 从而进一步提升性能.
由此得到的协议对网络更加友好, 因为与 HTTP/1.x 相比, 它可以使用更少的 TCP 连接. 这意味着它与其他流的竞争更少, 连接存活时间更长, 进而能够更好地利用可用网络容量.
最后, HTTP/2 还通过使用二进制消息分帧 (binary message framing), 使消息处理更加高效.