HTTP/2 新特性简析 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
httpbin - 协议调试工具
httpstatuses - 协议状态码查询
httpie - cURL-like tool for humans
Fiddler
ye11ow
V2EX    HTTP

HTTP/2 新特性简析

  •  2
     
  •   ye11ow 2015-03-06 23:06:50 +08:00 3862 次点击
    这是一个创建于 3918 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这篇文章是我直接从知乎专栏同步过来的,不过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. http2 explained
    2. Hypertext Transfer Protocol version 2
    2 条回复
    xierch
        1
    xierch  
       2015-03-07 01:36:59 +08:00
    你可以直接贴专栏文章链接的,不必复制过来
    xierch
        2
    xierch  
       2015-03-07 01:44:19 +08:00
    「最坏情况我们需要建立50个TCP连接」
    其实这种情况不会发生吧,除非在用 HTTP/1.0(
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3303 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 00:41 PVG 08:41 LAX 16:41 JFK 19:41
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86