HTTP/1 所能做的 HTTP/2 都能做到,而且只会更快。
作者 |Philip Jones
译者 |弯月
责编 | 屠敏
出品 |CSDN(ID:CSDNNews)
最近,HTTP/2 开始支持 WebSocket了(RFC 8441),如此说来 HTTP/2 已经实现了 HTTP/1 的所有功能。有了这个功能后,HTTP/1 所能做的一切 HTTP/2 都能做到,而且只会更快。这篇文章将为你介绍 HTTP/2 如何通过多路复用实现了更快的速度。
我们来考虑这样一种情况:一个非常复杂的拍卖网站。这是个单页应用,利用 WebSocket 链接获取当前的出价,因此每当用户选择想要参与的拍卖时,都会发送一系列的 API 请求。换句话说,用户可以通过 WebSocket 监视某个拍卖的进行情况,然后切换到另一个拍卖,这样就会触发 API 请求。由于数据的性质,显然应该都使用 HTTPS。
这个复杂的网站可以简化成利用一个 WebSocket 每隔一秒发送一次更新,同时允许在需要时调用大约20个API。这个简化版本位于这个代码库上(https://github.com/pgjones/http2_multiplexing_article),其中的页面由两个按钮组成,左边的打开 WebSocket 连接,右边的触发 20 个 API 调用。
HTTP/1.1 性能评测
HTTP/1.1 要求每个请求都有独立的连接(尽管一个请求结束后连接可以重用),从而导致多次连接的建立开销(其中包括 DNS、TCP 握手和 SSL 握手的开销)。此外,浏览器还会限制同时打开的连接数最多为六个,意味着在前六个连接结束之前,其他的请求只能阻塞。
HTTP/1.1 连接的时间线。所有请求完成需要142ms
HTTP/2
HTTP/2 改进了 HTTP/1.1,它支持多路复用和流水线,即一个连接现在可以并行服务所有请求。这就意味着连接建立的开销只有一次。此外,浏览器不必再阻塞任何请求,可以一次性全部发送,再等待服务器响应。
HTTP/2 连接的时间线。所有请求完成需要86ms
带有 WebSockets的HTTP/2
由 HTTP/2 自己完成所有请求就带来了 62ms 的巨大改进。但是,浏览器在建立连接阶段依然是阻塞的。从图 2 中可以看到,这个阶段花费了大约 10ms。
我们讨论的这个复杂的网站需要使用 WebSocket,这是个持久的连接。现在 WebSocket 可以通过 HTTP/2 实现,那么所有请求也可以复用这个连接,意味着不需要额外的开销去建立连接。
HTTP/2 请求使用已有 WebSocket 连接的时间线。所有请求完成需要69ms。
图 3 演示了这一点,没有任何阻塞,没有红色部分,也没有必要建立新的连接。像我们预期的那样,请求完成所需的时间更少,花费在建立连接上的时间也大致符合预期。
结论
HTTP/2 在本文讨论的这种非常复杂的网站上能带来巨大的效益,可以将整体时间降低到大约 50%。这可能会给用户体验带来巨大的提升,而额外的HTTP/2-WebSocket 功能也会带来微小但能感受到的提升。而且,网络连接的质量越差,建立连接的开销会变大,提升就越明显。
HTTP/2 对 WebSocket 的支持还非常新,RFC 是于 2018 年 9 月发布的,Firefox 65 到 2019 年 1 月末才支持,而 Chrome 的支持还在计划中。在服务器端,2019 年 1 月时 Hypercorn 是我能找到的支持 HTTP/2 WebSocket 的开源库。
有了 HTTP/2 的 WebSocket 支持后,就没有 HTTP/1.1 能做到而 HTTP/2做不到的事情了,而且 HTTP/2 要快很多。以后对 HTTP/2 的支持只会越来越多、越来越好,所以现在是时候切换了。
原文:https://medium.com/@pgjones/http-1-should-die-81b7588d617e
作者:Philip Jones,Octopus Wealth 的首席工程师,Quart、Hypercorn 和许多 Python HTTP 项目的维护者。
本文为 CSDN 翻译,如需转载,请注明来源出处。
热 文推 荐
喜欢就点击“好看”吧!
领取专属 10元无门槛券
私享最新 技术干货