HTTP/1 已死!

百家 作者:CSDN 2019-01-30 13:52:07


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 翻译,如需转载,请注明来源出处。



 热 文 推 荐 

鏖战九载,Google 是否会因 Oracle 而弃用 Java?

程序员该怎么做,才能成为 coding 王者?

年会宣布 996 后,那些保持沉默的人

☞孟岩:区块链的原则与价值观

☞Spring-Data-JPA尝鲜:快速搭建CRUD+分页后台实例

☞她说:是的,嫁人当嫁程序员!

☞有赞公开强推 996 制,员工:已拨打市长电话

☞Python一键转Java?“Google翻译”你别闹

print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!n");
cout < < "点个好看吧!" < < endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"

喜欢就点击“好看”吧!

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接