本頁使用了標題或全文手工轉換

HTTP/2

維基百科,自由的百科全書
前往: 導覽搜尋

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進行討論[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的資料,在2017年5月,在排名前一千萬的網站中,有13.7%支援了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也被批評未能支援隨機加密英語opportunistic encryption,即類似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-1721ISSN 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. 
  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. Dec 2, 2016 [Dec 2, 2016]. 
  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. 

參見[編輯]

外部連結[編輯]