博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[翻译]http2-for-a-faster-web——快速了解http2
阅读量:6271 次
发布时间:2019-06-22

本文共 4174 字,大约阅读时间需要 13 分钟。

http2-for-a-faster-web

Benjamin发表于2015年3月18日

目标

互联网工程任务组(IETF)于2015年2月通过了HTTP/2标准的提议。HTTP/2是HTTP协议自1999年HTTP 1.1发布后的首个重要的更新。HTTP/2的主要目标是保持与HTTP/1.1的高度兼容性,同时减少延迟。换句话说,避免破坏Web,同时速度更快。

起源

自2009年底以来,谷歌一直在开发一种名为SPDY的实验性协议(发音为speedy)。SPDY是Google的商标,而不是首字母缩略词。HTTP/2最初基于SPDY进行实验。其实,许多SPDY核心开发人员都参与了HTTP/2的开发。截至2015年2月,谷歌宣布到2016年将完全撤销对SPDY的支持,转而对HTTP/2进行支持。

HTTP/1.1

虽然HTTP/1.1自1999年发布以来一直很好用,它是专为当时的计算机和Web而设计的。毋庸置疑,HTTP早就应该进行更新了。为了更好的描述HTTP/1的工作原理,如下图所示。

按照以下数字表示的步骤,首先从客户端(或者Web浏览器)开始,在右侧建立与服务器的HTTP/1连接。

(2)客户端/浏览器访问网站的index.html页面并发送了一个GET请求(HTTP方法)。

(3)第三步表示服务器响应请求的资源。

(4-7)HTML文档所需的CSS样式和JS脚本的请求过程,和上面例子中的请求响应周期一样。

(8)结束,HTTP/1连接关闭。

队头阻塞(Head-of-Line Blocking)

众所周知,客户端/浏览器花费大量时间等待每个资源。由于HTTP/1无法通过单个连接发出并发请求,因此浏览器通常会尝试通过打开多个连接来加快进程。

昂贵的连接(Expensive Connections)

从计算机网络的角度来看,虽然多个连接是有帮助的,但每打开一个连接都非常昂贵。所以,现代浏览器将HTTP/1.1连接数限制为最多6-8个。由于许多网站现在需要80个或更多资源,因此这些限制会产生严重的性能瓶颈。

HTTP管线化(HTTP Pipelining)

HTTP/1.1尝试使用HTTP管线化的技术来纠正性能瓶颈。然而,当有一个大的或慢的响应的时候,它仍然会阻塞随后的其他响应(也就是说,还是会出现线头阻塞的现象)。HTTP管线化很难进行部署。没有现代浏览器支持HTTP管线化,因为许多中介和服务器无法正确处理它。

HTTP/2多路复用(HTTP/2 Multiplexing)

多路复用允许多个request-response消息同时在单个HTTP/2连接上传输。为了演示HTTP/2连接的效率,如下图,与HTTP/1进行了比较。即使在只有三个必需资源的简单示例中,请注意网页开始渲染的速度有多快。

将80种所需资源的常见情况进行对比,可以明显的得出6-8个HTTP/1.1的连接开销以及单个HTTP/2连接的效率。

其他HTTP/2性能因素

除了多路复用,HTTP/2是二进制的,而不像HTTP/1是文本。与文本协议相比,二进制协议解析效率更高,在线上更严谨、不容易出错。

HTTP/2还会通过压缩headers来减少开销,而HTTP/1则不会。

服务器推送(Server Push)

Server Push(服务器推送)是一种HTTP/2机制,用于在客户端请求之前向客户端发送数据。例如,如果你的主页有请求,服务器可以使用主页以及徽标、样式表进行响应,因为它知道客户端需要这些资源。除了推送的资源可以缓存外,这与在HTML文档中内联所有资源基本相同。

在客户端已经缓存资源的情况下,Server Push可能就会显得冗余。所以我建议使用Server Hints(服务器提示)。

服务器提示(Server Hints)

在客户端发现资源之前,Server Hints(服务器提示)告知客户端即将需要的资源。服务器不发送资源的全部内容,而只发送URL。然后,客户端可以验证其缓存,如果需要的话就正式请求资源。Server Hints对于HTTP/2并不陌生,但值得一提的是,它们不会受到服务器推送可能造成冗余的缺陷的影响。

Server Hints是使用带有HTTP的链接头实现的,并与现有的链接预取语义重叠。例如,HTTP链接头如下所示:

Link: 
; rel=prefetch复制代码

如果HTML文档在head标记中包含预取链接,则不需要服务器端实现。例如:

复制代码

想要了解有关rel =“prefetch”的更多信息,请参阅Mozilla

进一步了解资源提示

预加载关系用于声明资源和获取属性。此规范通过其他处理策略扩展了功能,这些策略可以有效地获取下一个导航可能需要的资源。例如:

复制代码

"next inert"相当于某些浏览器实现的rel = prefetch。“next”在语义上相当于某些浏览器实现的rel = prerender。该规范通过使附加功能标准化并扩展了以前的预取和预渲染功能。

要了解更多信息,请参阅由Ilya Grigorik发布在W3C上的。

HTTP/2安全性批评

尽管HTTP/2的主要目标是使Web更快,但是由于没有强制对连接进行加密,它受到了很严厉的批评。而且,主要的浏览器制造商迄今拒绝对没有加密的HTTP/2进行支持。所以HTTP/2通过代理来部署加密的连接。如果你认为这不利于Web的未来,请查看我的文章:

译者注: 这里说HTTP/2没有强制对连接进行加密。但是维基百科上提到针对加密的争议时说:

一开始,以HTTP工作组某位主席为首的成员在邮件列表建议引入强制使用TLS协议实现的HTTP/2.0(Mandatory TLS in HTTP/2.0),这招致了争议。批评者认为,加密增加了十分不必要的开销,而且很多HTTP服务实际上无需加密,提供者也无意为此花费更多的资源。而支持者认为,实践中TLS加密的开销微不足道。Poul-Henning Kamp 批评IETF在制定HTTP/2时,遵循了一个特定的“政治议程”(political agenda),压缩了讨论的空间。强制加密议程的批评者认为,其基于现有的证书框架,对于开源社区并非新创造,亦不是独特的。2013年,一位思科员工表示,现有证书模型与路由器一类的小型化设备并不兼容,因为现有的证书框架需要为每张证书付出不可避免的成本,还需要进行每年更新的流程。工作组最终未能在强制加密这一点上达成一致,但是大部分客户端只实现了基于TLS的HTTP/2,使之成为事实标准。HTTP/2也被批评未能支持机会性加密,即类似SMTP中存在已久的STARTTLS一样能抵御被动监控的措施。 批评者指出,HTTP/2的提议违背了IETF自身制定的《最佳实践 188》(BCP 188) 即 RFC 7258。这份文件指出,被动监控应被当作一种攻击,IETF指定的标准应当设置抵御这种攻击的措施(例如机会性加密)。目前,已经有一系列机会性加密规范被提出,工作组也制定了 draft-ietf-httpbis-http2-encryption-01 这一官方版方案。复制代码

浏览器支持

所有主流浏览器都将支持HTTP/2

  • Chrome 40支持HTTP/2草案-14,但默认情况下不开启。HTTP/2 草案-17(最终版)可在Chrome Canary 43(开发人员预发布版本)中找到。目前,仅实现了基于TLS(加密)的HTTP/2。 要在Chrome中启用HTTP/2,请在地址栏中输入:chrome://flags/#enable-spdy4
  • Firefox支持HTTP/2,自版本36以来默认启用了HTTP/2.最初在版本34中添加了对HTTP/2的实验性支持。目前,仅实现了TLS上的HTTP/2。
  • Internet Explorer 11支持HTTP/2,但仅限于Windows 10 beta,默认情况下启用它。目前,仅实现了基于TLS的HTTP/2。
  • 尽管微软新推出的Windows 10浏览器不断爆出细节,但预计Spartan将支持HTTP/2而非TLS。
  • 默认情况下,Safari在Mac OS X Yosemite(10.10)和iOS 8中支持SPDY。预计到2015年底将提供完整的HTTP/2支持。
  • Opera默认支持SPDY。通常一旦最终的HTTP/2草案在Chrome中可用的时候,Opera就会提供支持。

服务器支持

HTTP/2支持

  • IIS(互联网信息服务)在Windows 10 beta中支持HTTP/2。
  • OpenLiteSpeed 1.3.8和1.4.5支持HTTP/2草案17。

支持SPDY,但是没有HTTP/2

  • Apache通过mod_spdy模块为旧版本的SPDY提供支持,但此模块的开发已停止。
  • LiteSpeed Web Server目前支持SPDY/3.1。
  • Nginx通过模块为SPDY(草案3.1)提供实验性支持,并计划在2015年底之前支持HTTP/2。

不计划支持HTTP/2的

  • lighttpd不对SPDY进行支持。或者计划在1.x版本中支持HTTP/2。

其他HTTP/2实现

可以在上找到HTTP/2的其他已知实现。

结语:HTTP/2的思考

正如我们探讨的那样,HTTP/2是Web早就应该做的更新。随着它在未来几年被广泛采用,网站和其他网络服务将变得比以往更快,更强。感谢具有远见的浏览器制造商,HTTP/2也将增强用户隐私和安全性。虽然还有许多工作要做,但我觉得HTTP/2是整个Web的重要一步。

如果你对HTTP/2有任何问题或意见,可以通过Twitter @BenjaminPatch 与我联系。

致谢

感谢Google的网络性能工程师对这篇HTTP/2文章的贡献。Ilya还是高性能浏览器网络的作者,它是Web开发人员了解有关网络和浏览器性能的很棒的资源。

转载于:https://juejin.im/post/5c8600146fb9a049e12b06e7

你可能感兴趣的文章
Struts2技术详解
查看>>
MFC应用程序向导生成的文件
查看>>
Oracle体系结构之oracle密码文件管理
查看>>
【leetcode】Remove Element (easy)
查看>>
mysql多表查询及其 group by 组内排序
查看>>
alsa的snd_pcm_readi()函数和snd_pcm_writei()
查看>>
Android学习网站推荐(转)
查看>>
嵌入式根文件系统的移植和制作详解
查看>>
MEF部件的生命周期(PartCreationPolicy)
查看>>
LCD的接口类型详解
查看>>
nginx 基础文档
查看>>
LintCode: Unique Characters
查看>>
Jackson序列化和反序列化Json数据完整示例
查看>>
.net 中的DllImport
查看>>
nyoj 517 最小公倍数 【java睑板】
查看>>
include与jsp:include区别
查看>>
ftp的20 21端口和主动被动模式
查看>>
MySQL存储引擎选型
查看>>
Java中的statickeyword具体解释
查看>>
Linux车载系统的开发方向
查看>>