跳转到内容

HTTP/2

本页使用了标题或全文手工转换
维基百科,自由的百科全书

这是本页的一个历史版本,由Colinberte留言 | 贡献2019年8月4日 (日) 08:16 新特性编辑。这可能和当前版本存在着巨大的差异。

HTTP/2(超文本传输协议第2版,最初命名为HTTP 2.0),简称为h2(基于TLS/1.2或以上版本的加密连接)或h2c(非加密连接)[1],是HTTP協議的的第二个主要版本,使用於全球資訊網

HTTP/2是HTTP協議自1999年HTTP 1.1发布后的首个更新,主要基於SPDY協定。它由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小组进行开发。[2]该组织于2014年12月将HTTP/2标准提议递交至IESG英语Internet_Engineering_Steering_Group进行讨论[3],于2015年2月17日被批准。[4]

HTTP/2标准于2015年5月以RFC 7540正式发表。[5]HTTP/2的标准化工作由ChromeOperaFirefox[6]Internet Explorer 11SafariAmazon Silk英语Amazon SilkEdge等浏览器提供支持。[7]

多数主流浏览器已经在2015年底支持了该协议。[8]此外,根据W3Techs的数据,截至2019年6月,全球有36.5%的网站支持了HTTP/2。[9]

协议的制定

协议制定伊始,工作组章程关注了下列目标和受关心的问题:[2]

Facebook对各方案进行了评价并最终推荐了SPDY协议[10]。HTTP 2.0的首个草稿于2012年11月发布,其内容基本和SPDY协议相同[11]

协议之间的的比较

HTTP/2与HTTP/1.1比较

HTTP/2 相比 HTTP/1.1 的修改并不会破坏现有程序的工作,但是新的程序可以藉由新特性得到更好的速度。[12]

HTTP/2 保留了 HTTP/1.1 的大部分语义,例如请求方法状态码乃至URI和绝大多数HTTP头部字段一致。而 HTTP/2 采用了新的方法来编码、传输 客户端<——>服务器 间的数据。[12]

HTTP/1.1与SPDY的区别

SPDY (发音为"speedy") 是一个由 Google 主导的研究项目发明的HTTP替代协议。[13]SPDY一开始主要关注降低延迟,采用了TCP通道,但是使用了不同的协议来达到此目的。其与HTTP/1.1相比,主要的改变有:[14]

  • 实现无需先入先出的多路复用
  • 为简化客户端和服务器开发的消息—帧机制
  • 强制性压缩(包括HTTP头部)
  • 优先级排序
  • 双向通讯

HTTP/2与SPDY的比较

HTTP/2的开发基于SPDY进行跃进式改进。在诸多修改中,最显著的改进在于,HTTP/2使用了一份经过定制的压缩算法,基于霍夫曼编码,以此替代了SPDY的动态流压缩算法,以避免对协议的Oracle攻击——这一类攻击以CRIME为代表。此外,HTTP/2禁用了诸多加密套件,以保证基于TLS的连接的前向安全。

新特性

在 HTTP/2 的第一版草案(对 SPDY 协议的复刻)中,新增的性能改进不仅包括HTTP/1.1中已有的多路复用,修复队头阻塞问题,允许设置设定请求优先级,还包含了一个头部压缩算法(HPACK)[15][16]。此外, HTTP/2 采用了二进制而非明文来打包、传输 客户端<——>服务器 间的数据。[12]

帧、消息、流和TCP连接

有别于HTTP/1.1在连接中的明文请求,HTTP/2与SPDY一样,将一个TCP连接分为若干个流(Stream),每个流中可以传输若干消息(Message),每个消息由若干最小的二进制帧(Frame)组成。[12]这也是HTTP/1.1与HTTP/2最大的区别所在。 HTTP/2中,每个用户的操作行为被分配了一个流编号(stream ID),这意味着用户与服务端之间建立了一个TCP通道;协议将每个请求分割为二进制的控制帧与数据帧部分,以便解析。这个举措在SPDY中的实践表明,相比HTTP/1.1,新页面加载可以加快11.81% 到 47.7%[17]

HPACK 算法

HPACK算法是新引入HTTP/2的一个算法,用于对HTTP头部做压缩。其原理在于:

  • 客户端与服务端根据 RFC 7541 的附录A,维护一份共同的静态字典(Static Table),其中包含了常见头部名及常见头部名称与值的组合的代码;
  • 客户端和服务端根据先入先出的原则,维护一份可动态添加内容的共同动态字典(Dynamic Table);
  • 客户端和服务端根据 RFC 7541 的附录B,支持基于该静态哈夫曼码表的哈夫曼编码(Huffman Coding)。

服务器推送

网站为了使请求数减少,通常采用对页面上的图片、脚本进行极简化处理。但是,这一举措十分不方便,也不高效,依然需要诸多HTTP链接来加载页面和页面资源。

HTTP/2引入了服务器推送,即服务端向客户端发送比客户端请求更多的数据。这允许服务器直接提供浏览器渲染页面所需资源,而无须浏览器在收到、解析页面后再提起一轮请求,节约了加载时间。[18]

瀏覽器支援

截至2015年末,主要的浏览器的最新版本已经支持HTTP/2这一协议。[8]其中:

h2c 的支持度

HTTP/2 的设计本身允许非加密的 HTTP 协议,也允许使用 TLS 1.2 或更新版本协议进行加密。[20]协议本身未要求必须使用加密,[21] 惟多数客户端 (例如 Firefox,[22] Chrome, Safari, Opera, IE, Edge) 的开发者声明,他们只会实现通过TLS加密的HTTP/2协议,这使得经TLS加密的HTTP/2(即h2)成为了事实上的强制标准,而h2c事实上被主流浏览器废弃。[23]

SPDY 退出历史舞台

2015年9月,Google 宣布了计划,移除对SPDY的支持,拥抱 HTTP/2[24],并将在Chrome 51中生效。[25][26]

HTTP/2 的实现

HTTP/2 工作组在其官方 Github 上罗列了诸多已经支持该协议的代码实现。[27]

批评与争议

HTTP/2的开发过程乃至协议本身都曾受到批评。

针对协议开发本身

FreeBSDVarnish cache的开发者保罗-恒宁·坎瀑英语Poul-Henning Kamp批评称,这个标准文件的准备过程短得不切实际,而且未基于除了SPDY之外的任何协议,以至于其他协议失去了对草案进行改进的机会。[28]Kampala批评说,这个协议本身与HTTP不一致,而且还毫无必要地变得极为复杂。[28]他还认为,这个协议违背了互联网协议的分层原则[28],例如说,将本属于TCP传输层的流控制(flow control)功能放入了协议中。

针对加密的争议

一开始,以HTTP工作组某位主席为首的成员在邮件列表[29]建议引入强制使用TLS协议实现的HTTP/2.0(Mandatory TLS in HTTP/2.0),这招致了争议。批评者认为,加密增加了十分不必要的开销,而且很多HTTP服务实际上无需加密,提供者也无意为此花费更多的资源。而支持者认为,实践中TLS加密的开销微不足道。[30]

Poul-Henning Kamp 批评IETF在制定HTTP/2时,遵循了一个特定的“政治议程”(political agenda),压缩了讨论的空间。[28][31][32]

强制加密议程的批评者认为,其基于现有的证书框架,对于开源社区并非新创造,亦不是独特的。2013年,一位思科员工表示,现有证书模型与路由器一类的小型化设备并不兼容,因为现有的证书框架需要为每张证书付出不可避免的成本,还需要进行每年更新的流程。[33]工作组最终未能在强制加密这一点上达成一致,但是大部分客户端只实现了基于TLS的HTTP/2,使之成为事实标准。[21]

HTTP/2也被批评未能支持机会性加密,即类似SMTP中存在已久的STARTTLS一样能抵御被动监控英语passive monitoring的措施。 批评者指出,HTTP/2的提议违背了IETF自身制定的《最佳实践 188》(BCP 188) 即 RFC 7258[34]这份文件指出,被动监控应被当作一种攻击,IETF指定的标准应当设置抵御这种攻击的措施(例如机会性加密)。目前,已经有一系列机会性加密规范被提出[35][36] [37],工作组也制定了 draft-ietf-httpbis-http2-encryption-01 这一官方版方案。

参考资料

  1. ^ Mike, Belshe; Martin, Thomson; Roberto, Peon. Hypertext Transfer Protocol Version 2 (HTTP/2). tools.ietf.org. 2015-05 [2017-07-02]. ISSN 2070-1721 (英语). 
  2. ^ 2.0 2.1 Hypertext Transfer Protocol Bis (httpbis) - Charter. IETF. 2012. 
  3. ^ Raymor, Brian. Wait for it – HTTP/2 begins Working Group Last Call!. Microsoft Open Technologies. 2014-08-07. [永久失效連結]
  4. ^ Mark Nottingham. HTTP/2 Approved. www.ietf.org. Internet Engineering Task Force. 2015-02-18 [2015-04-19]. (原始内容存档于2015-02-20). 
  5. ^ RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2). IETF. May 2015 [14 May 2015]. 
  6. ^ See what’s new in Firefox!. www.mozilla.org. Mozilla Foundation. February 2015. 
  7. ^ Can the rise of SPDY threaten HTTP?. blog.restlet.com. Restlet, Inc. October 2011. 
  8. ^ 8.0 8.1 HTTP2 browser support. [March 9, 2017]. 
  9. ^ Usage of HTTP/2 for websites. World Wide Web Technology Surveys. W3Techs. Jun 22, 2019 (英语). 
  10. ^ HTTP2 Expression of Interest, Doug Beaver, 15 Jul 2012
  11. ^ Dio Synodinos. HTTP 2.0 First Draft Published. InfoQ. 2012-11-30. 
  12. ^ 12.0 12.1 12.2 12.3 Ilya Grigorik. Chapter 12: HTTP 2.0. High Performance Browser Networking. O'Reilly Media, Inc. 
  13. ^ Sebastian Anthony. S&M vs. SPDY: Microsoft and Google battle over the future of HTTP 2.0. ExtremeTech. March 28, 2012. 
  14. ^ Grigorik, Ilya. Life beyond HTTP 1.1: Google's SPDY. 
  15. ^ https://tools.ietf.org/html/rfc7541
  16. ^ Dio Synodinos. HTTP 2.0 First Draft Published. InfoQ.com (C4Media Inc.). November 2012. 
  17. ^ SPDY: An experimental protocol for a faster web. The Chromium Projects. 
  18. ^ Pratt, Michael. Apiux. apiux.com. [March 19, 2014]. 
  19. ^ Rob Trace, David Walp. HTTP/2: The Long-Awaited Sequel. Microsoft. October 8, 2014 [8 October 2014]. 
  20. ^ Belshe, M.; Peon, R.; Thomson, M. Hypertext Transfer Protocol Version 2, Use of TLS Features. [2015-02-10]. 
  21. ^ 21.0 21.1 HTTP/2 Frequently Asked Questions. IETF HTTP Working Group. [2014-09-08]. 
  22. ^ Networking/http2. MozillaWiki. [2014-09-07]. 
  23. ^ mnot’s blog: HTTP/2 Implementation Status. 
  24. ^ Chris Bentzel; Bence Béky. Hello HTTP/2, Goodbye SPDY. Chromium Blog. 2015-02-09. Update: To better align with Chrome's release cycle, SPDY and NPN support will be removed with the release of Chrome 51. 
  25. ^ API Deprecations and Removals in Chrome 51. TL;DR: Support for HTTP/2 is widespread enough that SPDY/3.1 support can be dropped. 
  26. ^ https://www.nginx.com/blog/supporting-http2-google-chrome-users/
  27. ^ http2-spec: Working copy of the HTTP/2 Specification. HTTP/2. 2017-06-30. 
  28. ^ 28.0 28.1 28.2 28.3 Kamp, Poul-Henning. HTTP/2.0 – The IETF is Phoning It In (Bad protocol, bad politics). ACM Queue. 2015-01-06 [2015-01-12]. 
  29. ^ https://lists.w3.org/Archives/Public/ietf-http-wg/2012JulSep/0601.html
  30. ^ Grigorik, Ilya. Is TLS Fast Yet?. [30 December 2015]. 
  31. ^ Kamp, P. H. Http/2.0. Communications of the ACM. 2015, 58 (3): 40. doi:10.1145/2717515. 
  32. ^ Kamp, Poul-Henning. Re: Last Call: <draft-ietf-httpbis-http2-16.txt> (Hypertext Transfer Protocol version 2) to Proposed Standard. ietf-http-wg@w3.org (邮件列表). 2015-01-07 [2015-01-12]. 
  33. ^ Lear, Eliot. Mandatory encryption *is* theater. ietf-http-wg@w3.org (邮件列表). 2013-08-25 [2015-01-26]. 
  34. ^ Murenin, Constantine A. Re: Last Call: <draft-ietf-httpbis-http2-16.txt> (Hypertext Transfer Protocol version 2) to Proposed Standard. ietf-http-wg@w3.org (邮件列表). 2015-01-09 [2015-01-12]. 
  35. ^ Paul Hoffman. draft-hoffman-httpbis-minimal-unauth-enc-01 - Minimal Unauthenticated Encryption (MUE) for HTTP-2. Internet Engineering Task Force. 
  36. ^ Mark Nottingham; Martin Thomson. draft-nottingham-http2-encryption-03 - Opportunistic Encryption for HTTP URIs. Internet Engineering Task Force. 
  37. ^ Mark Nottingham; Martin Thomson. draft-ietf-httpbis-http2-encryption-01 - Opportunistic Security for HTTP. Internet Engineering Task Force. 

参见

外部链接