这简简单单的几句话里浓缩了大量的信息,我们再重申一次。要理解HTTP/2 ,就必须理解流、消息和帧这几个基本概念。
所有通信都在一个TCP连接上完成。
流是连接中的一个虚拟信道,可以承载双向的消息;每个流都有一个唯一的整数标识符(1、2...N)。
消息是指逻辑上的HTTP消息,比如请求、响应等,由一或多个帧组成。
帧是最小的通信单位,承载着特定类型的数据,如HTTP首部、负荷,等等。
简言之,HTTP/2 把HTTP协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息。相应地,很多流可以并行地在同一个TCP连接上交换消息。
多向请求与响应在HTTP 1.x中,如果客户端想发送多个并行的请求以及改进性能,那么必须使用多个TCP连接。这是HTTP 1.x交付模型的直接结果,该模型会保证每个连接每次只交付一个响应(多个响应必须排队)。更糟糕的是,这种模型也会导致队首阻塞,从而造成底层TCP连接的效率低下。
HTTP/2 中新的二进制分帧层突破了这些限制,实现了多向请求和响应:客户端和服务器可以把HTTP消息分解为互不依赖的帧(如下图所示),然后乱序发送,最后再在另一端把它们重新组合起来。
上包含了同一个连接上多个传输中的数据流:客户端正在向服务器传输一个DATA帧(stream 5),与此同时,服务器正向客户端乱序发送stream 1和stream 3的一系列帧。此时,一个连接上有3个请求/响应并行交换!
把HTTP消息分解为独立的帧,交错发送,然后在另一端重新组装是HTTP/2 最重要的一项增强。事实上,这个机制会在整个Web技术栈中引发一系列连锁反应,从而带来巨大的性能提升,因为:
可以并行交错地发送请求,请求之间互不影响;
可以并行交错地发送响应,响应之间互不干扰;
只使用一个连接即可并行发送多个请求和响应;
消除不必要的延迟,从而减少页面加载的时间;
不必再为绕过HTTP 1.x限制而多做很多工作。
……
总之,HTTP/2 的二进制分帧机制解决了HTTP 1.x中存在的队首阻塞问题,也消除了并行处理和发送请求及响应时对多个连接的依赖。结果,就是应用速度更快、开发更简单、部署成本更低。
支持多向请求与响应,可以省掉针对HTTP 1.x限制所费的那些脑筋和工作,比如拼接文件、图片精灵、域名分区。类似地,通过减少TCP连接的数量,HTTP/2 也会减少客户端和服务器的CPU及内存占用。
请求优先级