HTTP / 1.x与HTTP / 2
首先,让我们看看有哪些高层差异:
- HTTP / 2是二进制的,而不是文本的
与HTTP / 1.x等文本协议相比,二进制协议更有效地解析,在信道上更紧凑,最重要的是,与HTTP / 1.x等文本协议相比,它们更不容易出错,因为它们通常具有一些像空白处理,大写,行结尾,空白等等的“帮助” 。
例如,HTTP / 1.1定义了四种不同的解析消息的方法; 在HTTP / 2中,只有一个代码路径。
- HTTP / 2是完全多路复用的,而不是有序和阻塞的
HTTP / 1.x有一个称为“行头阻塞”(head-of-line blocking)的问题,实际上一次只有一个请求在连接上活动。
HTTP / 1.1试图通过流水线修复此问题,但它没有完全解决问题(大的或慢的响应仍然可以阻止在后面的请求)。此外,发现流水线很难部署,因为许多中介和服务器不能正确处理它。
这迫使客户端使用一些启发式方法(通常是猜测)来确定哪些请求放在哪个连接到源的时候; 由于页面加载10次(或更多)可用连接的数量是常见的,这会严重影响性能,通常会形成阻塞请求的“瀑布”。
多路复用通过允许多个请求和响应消息同时在传输中来解决这些问题; 甚至可以将一条消息的一部分与另一条消息混合在一起。
反过来,这允许客户端每个源只使用一个连接来加载页面。
- HTTP / 2可以使用一个连接进行并行
使用HTTP / 1,浏览器可以在每个源的4到8个连接之间打开。由于许多站点使用多个源,这可能意味着单个页面加载打开超过30个连接。
一个应用程序打开这么多连接同时打破了许多基于TCP的假设; 由于每个连接都会在响应中传输大量数据,因此存在中间网络中的缓冲区溢出,导致拥塞事件和重新传输的真实风险。
您可以在此处查看HTTP / 2如何工作的演示:
此外,使用