与 HTTP/1.1 相比,HTTP/2 如何提供更快的浏览速度?

How does HTTP/2 provide faster browsing speed compared to HTTP/1.1?

我正在阅读关于 HTTP/2 发布的 article。据说HTTP/2基于SPDY(speedy)协议,通过使用"header field compression"和"multiplexing"可以提供比HTTP/1.1更快的浏览速度。这些条款究竟如何运作?

我是否应该相信 HTTP/1.1 中的请求是以 'one after the other' 方式处理的?

从 HTTP/2 开始,header 和 HTTP 响应内容都可以压缩。对于 HTTP/1.1,header 永远不会与内容相反地被压缩(指定为 Content-Encoding header)。

多路复用与server-push有关。实际上,当服务器发送 HTML 页面时,它可以使用相同的连接来推送其他资源,如 css 和 javascript 文件。如果 HTML 页面需要加载这些额外的脚本,则不再向服务器发送请求,因为它们之前已经发送过。

多路复用

对于 HTTP 1.1,很多时间都花在了等待上。浏览器发送请求并等待响应返回,然后发送另一个 GET 等。带宽使用效率低下。有时它会使用流水线,但有时请求需要等待之前完成的请求,这也很痛苦。线头阻塞问题。

有了多路复用,几乎没有等待,但浏览器可以一次请求数百个东西,它们将按照它们可以传递的任何顺序传递,没有单独的流或 objects 必须等待彼此。 (通过优先级和流量控制来帮助正确控制它们。)

这将在 high-latency 连接中最为显着。有关它可以做什么的可见和清晰的演示,请参阅 https://http2.golang.org/gophertiles?latency=1000 上的 golang 的 gophertiles 演示(需要启用 HTTP/2 的浏览器)

Header压缩

此外,HTTP/2 提供 header 压缩,使客户端能够在 TCP 连接生命周期的早期压缩更多请求。在新 TCP 连接的早期 slow-start 期间,塞入更多请求以便响应更早返回可能很有价值。 HTTP header 本质上是极其重复的。

服务器推送

HTTP/2服务器可以在客户端请求之前向客户端发送数据就好像客户端请求它一样!如果服务器认为客户端也可能want/need,那么可以节省一半的RTT。