HTTP/2
HTTP/2(超文本传输协议第2版,最初命名为HTTP 2.0),简称为h2(基于TLS/1.2或以上版本的加密连接)或h2c(非加密连接)[1],是HTTP協議的的第二个主要版本,使用於全球資訊網。
網際網路套組 |
---|
應用層 |
傳輸層 |
網路層 |
連結層 |
HTTP/HTTPS |
---|
版本 |
请求方法 |
报文主体 |
頭欄位 |
狀態碼 |
相关主题 |
HTTP/2是HTTP協議自1999年HTTP 1.1的改进版RFC 2616[2]发布后的首个更新,主要基於SPDY協定。它由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小组进行开发。[3]该组织于2014年12月将HTTP/2标准提议递交至IESG进行讨论[4],于2015年2月17日被批准。[5]
HTTP/2标准于2015年5月以RFC 7540正式发表。[6]HTTP/2的标准化工作由Chrome、Opera、Firefox[7]、Internet Explorer 11、Safari、Amazon Silk及Edge等浏览器提供支持。[8]
多数主流浏览器已经在2015年底支持了该协议。[9]此外,根据W3Techs的数据,截至2019年6月,全球有36.5%的网站支持了HTTP/2。[10]
协议的制定
协议制定伊始,工作组章程关注了下列目标和受关心的问题:[3]
- 建立一个协商协议标准,即应用层协议协商(ALPN),以便客户端能够从HTTP/1.0、HTTP/1.1、HTTP/2乃至其他非HTTP协议中做出选择。
- 与HTTP/1.1在请求方法、状态码乃至URI和绝大多数HTTP头部字段等方面保持高度兼容性。
- 通过以下举措,减少 网络延迟,提高浏览器的页面加载速度:
- 支持现有的HTTP应用场景,包括桌面和移动设备浏览器,网络API,不同规格的网络服务器和正向代理、反向代理服务器软件,防火墙,CDN等。
Facebook对各方案进行了评价并最终推荐了SPDY协议[11]。HTTP 2.0的首个草稿于2012年11月发布,其内容基本和SPDY协议相同[12]。
协议之间的的比较
HTTP/2与HTTP/1.1比较
HTTP/2 相比 HTTP/1.1 的修改并不会破坏现有程序的工作,但是新的程序可以藉由新特性得到更好的速度。[13]
HTTP/2 保留了 HTTP/1.1 的大部分语义,例如请求方法、状态码乃至URI和绝大多数HTTP头部字段一致。而 HTTP/2 采用了新的方法来编码、传输 客户端<——>服务器 间的数据。[13]
新特性
在 HTTP/2 的第一版草案(对 SPDY 协议的复刻)中,新增的性能改进不仅包括HTTP/1.1中已有的多路复用,修复队头阻塞问题,允许设置设定请求优先级,还包含了一个头部压缩算法(HPACK)[16][17]。此外, HTTP/2 采用了二进制而非明文来打包、传输 客户端<——>服务器 间的数据。[13]
帧、消息、流和TCP连接
有别于HTTP/1.1在连接中的明文请求,HTTP/2与SPDY一样,将一个TCP连接分为若干个流(Stream),每个流中可以传输若干消息(Message),每个消息由若干最小的二进制帧(Frame)组成。[13]这也是HTTP/1.1与HTTP/2最大的区别所在。 HTTP/2中,每个用户的操作行为被分配了一个流编号(stream ID),这意味着用户与服务端之间建立了一个TCP通道;协议将每个请求分割为二进制的控制帧与数据帧部分,以便解析。这个举措在SPDY中的实践表明,相比HTTP/1.1,新页面加载可以加快11.81% 到 47.7%[18]
HPACK 算法
HPACK算法是新引入HTTP/2的一个算法,用于对HTTP头部做压缩。其原理在于:
服务器推送
网站为了使请求数减少,通常采用对页面上的图片、脚本进行极简化处理。但是,这一举措十分不方便,也不高效,依然需要诸多HTTP链接来加载页面和页面资源。
HTTP/2引入了服务器推送,即服务端向客户端发送比客户端请求更多的数据。这允许服务器直接提供浏览器渲染页面所需资源,而无须浏览器在收到、解析页面后再提起一轮请求,节约了加载时间。[19]
瀏覽器支援
截至2015年末,主要的浏览器的最新版本已经支持HTTP/2这一协议。[20]其中:
- Google Chrome、Mozilla Firefox、Microsoft Edge和Opera已支持HTTP/2,并默认启用。
- Internet Explorer自IE 11开始支持HTTP/2,并預设啟用。[21]
HTTP/2 的实现
HTTP/2 工作组在其官方 Github 上罗列了诸多已经支持该协议的代码实现。[29]
批评与争议
HTTP/2的开发过程乃至协议本身都曾受到批评。
针对协议开发本身
FreeBSD和Varnish cache的开发者保罗-恒宁·坎瀑批评称,这个标准文件的准备过程短得不切实际,而且未基于除了SPDY之外的任何协议,以至于其他协议失去了对草案进行改进的机会。[30]Kampala批评说,这个协议本身与HTTP不一致,而且还毫无必要地变得极为复杂。[30]他还认为,这个协议违背了互联网协议的分层原则[30],例如说,将本属于TCP传输层的流控制(flow control)功能放入了协议中。
针对加密的争议
一开始,以HTTP工作组某位主席为首的成员在邮件列表[31]建议引入强制使用TLS协议实现的HTTP/2.0(Mandatory TLS in HTTP/2.0),这招致了争议。批评者认为,加密增加了十分不必要的开销,而且很多HTTP服务实际上无需加密,提供者也无意为此花费更多的资源。而支持者认为,实践中TLS加密的开销微不足道。[32]
Poul-Henning Kamp 批评IETF在制定HTTP/2时,遵循了一个特定的“政治议程”(political agenda),压缩了讨论的空间。[30][33][34]
强制加密议程的批评者认为,其基于现有的证书框架,对于开源社区并非新创造,亦不是独特的。2013年,一位思科员工表示,现有证书模型与路由器一类的小型化设备并不兼容,因为现有的证书框架需要为每张证书付出不可避免的成本,还需要进行每年更新的流程。[35]工作组最终未能在强制加密这一点上达成一致,但是大部分客户端只实现了基于TLS的HTTP/2,使之成为事实标准。[23]
HTTP/2也被批评未能支持机会性加密,即类似SMTP中存在已久的STARTTLS一样能抵御被动监控的措施。 批评者指出,HTTP/2的提议违背了IETF自身制定的《最佳实践 188》(BCP 188) 即 RFC 7258。[36]这份文件指出,被动监控应被当作一种攻击,IETF指定的标准应当设置抵御这种攻击的措施(例如机会性加密)。目前,已经有一系列机会性加密规范被提出[37][38] [39],工作组也制定了 draft-ietf-httpbis-http2-encryption-01 这一官方版方案。
参考资料
- Mike, Belshe; Martin, Thomson; Roberto, Peon. . tools.ietf.org. 2015-05 [2017-07-02]. ISSN 2070-1721. (原始内容存档于2015-06-23) (英语).
- . IETF. June 1999 [2020-11-16]. (原始内容存档于2011-03-07).
- . IETF. 2012 [2013-07-12]. (原始内容存档于2013-07-02).
- Raymor, Brian. . Microsoft Open Technologies. 2014-08-07 [2015-04-19]. (原始内容存档于2014-10-06).
- Mark Nottingham. . www.ietf.org. Internet Engineering Task Force. 2015-02-18 [2015-04-19]. (原始内容存档于2015-02-20).
- . IETF. May 2015 [14 May 2015]. (原始内容存档于2015-06-23).
- . www.mozilla.org. Mozilla Foundation. February 2015 [2017-07-01]. (原始内容存档于2015-02-24).
- . blog.restlet.com. Restlet, Inc. October 2011 [2017-07-01]. (原始内容存档于2014-01-06).
- . [March 9, 2017]. (原始内容存档于2017-04-08).
- . World Wide Web Technology Surveys. W3Techs. Jun 22, 2019. (原始内容存档于2019-05-01) (英语).
- HTTP2 Expression of Interest 页面存档备份,存于, Doug Beaver, 15 Jul 2012
- Dio Synodinos. . InfoQ. 2012-11-30 [2013-07-12]. (原始内容存档于2013-09-27).
- Ilya Grigorik. . . O'Reilly Media, Inc. [2017-07-01]. (原始内容存档于2017-06-06).
- Sebastian Anthony. . ExtremeTech. March 28, 2012 [2013-07-12]. (原始内容存档于2013-07-10).
- Grigorik, Ilya. . [2017-07-01]. (原始内容存档于2017-06-30).
- . [2017-07-01]. (原始内容存档于2017-06-27).
- Dio Synodinos. . InfoQ.com (C4Media Inc.). November 2012 [2013-07-12]. (原始内容存档于2013-09-27).
- . The Chromium Projects. [2017-07-01]. (原始内容存档于2017-06-30).
- Pratt, Michael. . apiux.com. [March 19, 2014]. (原始内容存档于2014-03-19).
- . [March 9, 2017]. (原始内容存档于2017-04-08).
- Rob Trace, David Walp. . Microsoft. October 8, 2014 [8 October 2014]. (原始内容存档于2014-10-10).
- Belshe, M.; Peon, R.; Thomson, M. . [2015-02-10]. (原始内容存档于2015-04-25).
- . IETF HTTP Working Group. [2014-09-08]. (原始内容存档于2014-09-27).
- . MozillaWiki. [2014-09-07]. (原始内容存档于2014-09-07).
- . [2017-07-01]. (原始内容存档于2017-07-02).
- Chris Bentzel; Bence Béky. . Chromium Blog. 2015-02-09 [2017-07-01]. (原始内容存档于2017-03-08).
Update: To better align with Chrome's release cycle, SPDY and NPN support will be removed with the release of Chrome 51.
- . [2017-07-01]. (原始内容存档于2017-02-01).
TL;DR: Support for HTTP/2 is widespread enough that SPDY/3.1 support can be dropped.
- . [2017-07-01]. (原始内容存档于2017-04-24).
- . HTTP/2. 2017-06-30 [2017-07-02]. (原始内容存档于2017-06-30).
- Kamp, Poul-Henning. . ACM Queue. 2015-01-06 [2015-01-12]. (原始内容存档于2015-01-13).
- . [2017-07-02]. (原始内容存档于2017-04-21).
- Grigorik, Ilya. . [30 December 2015]. (原始内容存档于2017-07-02).
- Kamp, P. H. . Communications of the ACM. 2015, 58 (3): 40. doi:10.1145/2717515.
- Kamp, Poul-Henning. . ietf-http-wg@w3.org (邮件列表). 2015-01-07 [2015-01-12]. (原始内容存档于2015-01-13).
- Lear, Eliot. . ietf-http-wg@w3.org (邮件列表). 2013-08-25 [2015-01-26]. (原始内容存档于2015-02-10).
- Murenin, Constantine A. . ietf-http-wg@w3.org (邮件列表). 2015-01-09 [2015-01-12]. (原始内容存档于2015-01-13).
- Paul Hoffman. . Internet Engineering Task Force. [2020-09-26]. (原始内容存档于2015-01-13).
- Mark Nottingham; Martin Thomson. . Internet Engineering Task Force. [2020-09-26]. (原始内容存档于2015-01-13).
- Mark Nottingham; Martin Thomson. . Internet Engineering Task Force. [2017-07-02]. (原始内容存档于2017-07-04).
外部链接
- http://tools.ietf.org/wg/httpbis/页面存档备份,存于 工作组主页
- https://http2.github.io/页面存档备份,存于 HTTP/2 协议官网
- RFC 7540 – 超文本传输协议版本 2 (HTTP/2)
- RFC 7541 – HPACK: 为 HTTP/2 制定的头部压缩算法
- SPDY Protocol (draft-mbelshe-httpbis-spdy-00)
- HTTP Speed+Mobility (draft-montenegro-httpbis-speed-mobility-01)
- Proposal for a Network-Friendly HTTP Upgrade (draft-tarreau-httpbis-network-friendly-00)