这篇文章是我直接从知乎专栏同步过来的,不过V2EX貌似不能发图片,所以想看完整版可以到我专栏
今年的2月17号,HTTPbis工作组提交了HTTP/2的第17版草稿,并被IETF小组核准通过。终于,正式RFC版本的HTTP/2已经指日可待。
最近我在尝试翻译Daniel Stenberg写的http2 explained,所以借着专栏简单对比着HTTP 1.1,介绍一些HTTP/2的新特性。
限于水平,如果本文有任何错误,请在评论区或者私信里提出,非常感谢!
0. HTTP/2是基于二进制的协议
这可能是HTTP/2对比HTTP/1.X最“颠覆”的改动。二进制协议的优势显而易见:解析开销更小,描述协议也更高效。尤其在HTTP协议被广泛应用的今天,哪怕一丁点性能的压榨,都能让整个互联网节省很多很多的开销。
1. 连接的多路复用
我们知道在打开某个网页的时候,浏览器会对每个host:port并发的连接数进行限制(例如Firefox里默认的network.http.max-persistent-connections-per-server为6,Chrome的限制也是6)。但实际上,绝大部分网站首页所需要的资源个数远大于这个限制。所以为了不让资源在下载阶段就被阻塞住,我们往往会把一些静态资源分散到CDN或者其他服务器上去,从而获得更多的并发连接数来同时下载尽可能多的资源。
但建立更多的连接也意味更多的开销。我们以第一次打开知乎为例,加载首页所需要的资源是50个左右(如下图1),这也就意味着最坏情况我们需要建立50个TCP连接(如下图2)。而这些连接里面,有很多也许只是下载几kb的小文件,这种情况下建立连接本身的开销也就变得更可观,很可能三次握手的时间比传输数据的时间还长(如下图4)。
而HTTP/2的连接通过流支持了多路复用,这也意味着,一个HTTP/2的TCP连接,可以请求多个资源。从而在最理想状况下,我们只需要一个TCP连接,就能下载到知乎上也所需要50的资源(如下图3)。
[图1] 打开知乎首页所需要的请求数
[图2] HTTP/1.1 使用了50个TCP连接
[图3] HTTP/2 只使用了1个TCP连接
[图4] 建立连接的时间 vs 下载资源的时间
2. 流的优先级
HTTP/2规定客户端可以显式的指定每个流的优先级,从而在服务器端资源有限的时候,可以按照优先级顺序来传送数据。
同样以知乎首页的例子,采用HTTP/2协议通信的话,浏览器可以指定JavaScript和CSS文件具有比图片文件更高的优先级从而尽可能的保证用户能访问到网站最基本的功能。或者在打开一个包含非常多图片的回答页面时,那些位置靠上方的图片会比下方的图片具有更高的优先级。
3. 服务器推送(Server Push)
HTTP/2里面的Server Push并不是指类似于现在的Server Sent Event或者websocket的推送技术。它是一种服务器根据客户端以前发送的请求来“猜测”未来的请求,并提前讲未来请求的结果推送给客户端的技术。
同样是打开知乎首页的例子,浏览器发送GET请求到www.zhihu.com,服务器会返回知乎首页的html文件。如果是HTTP 1.x,那么浏览器会解析当前html之后,再向服务器发送JavaScript/CSS的请求,接着服务器返回这些资源文件;而如果是HTTP/2的话,服务器在发回html文件的时候,就能“猜测”到浏览器需要html里面包含的JavaScript/CSS文件,所以在浏览器做解析并发送请求之前,就主动将这些资源文件推送给浏览器。
4. 重置流
在HTTP/1.X时代,当客户端在接收服务器发回的响应时想终止这个HTTP请求,那么它只能直接中断底层的TCP连接。这样做的代价是:你需要重新建立一个新的TCP连接来发送新的请求。
而HTTP/2的客户端只需要发送一个含重置标记(RST_STREAM)的帧,就可以只中断当前的流而不是整个TCP连接,从而节省下很多开销。
总结:
HTTP/2比起HTTP/1.X引入了很多实用的新特性,我这里只是列出了自己认为比较重要的5个。各位想了解更多的详情,可以直接去看最新版的HTTP/2 draft-17,或者Daniel Stenberg写的http2 explained。
我最近也在尝试翻译http2 explained,第一次翻译东西感觉亚历山大,,所以如果有想帮忙的小伙伴,请用力跟我联系!谢谢!
参考文献:
1
xierch 2015-03-07 01:36:59 +08:00
你可以直接贴专栏文章链接的,不必复制过来
|
2
xierch 2015-03-07 01:44:19 +08:00
「最坏情况我们需要建立50个TCP连接」
其实这种情况不会发生吧,除非在用 HTTP/1.0( |