[翻譯]http2-for-a-faster-web——快速瞭解http2

reahink發表於2019-03-11

http2-for-a-faster-web

Benjamin發表於2015年3月18日

HTTP/2 目標

網際網路工程任務組(IETF)於2015年2月通過了HTTP/2標準的提議。HTTP/2是HTTP協議自1999年HTTP 1.1釋出後的首個重要的更新。HTTP/2的主要目標是保持與HTTP/1.1的高度相容性,同時減少延遲。換句話說,避免破壞Web,同時速度更快。

SPDY 起源

自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連線關閉。

圖1.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連線的效率。

圖1.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: <https://example.com/images/large-background.jpg>; rel=prefetch
複製程式碼

如果HTML文件在head標記中包含預取連結,則不需要伺服器端實現。例如:

<link rel="prefetch" href="https://example.com/images/large-background.jpg">
複製程式碼

想要了解有關rel =“prefetch”的更多資訊,請參閱Mozilla關於連結預取的常見問題解答

進一步瞭解資源提示

預載入關係用於宣告資源和獲取屬性。此規範通過其他處理策略擴充套件了功能,這些策略可以有效地獲取下一個導航可能需要的資源。例如:

<!-- fetch and preprocess for next navigation -->
<link rel="preload" href="//example.com/next-page.html" as="html" loadpolicy="next">

<!-- fetch and do not preprocess for next navigation -->
<link rel="preload" href="//example.com/next-component.html" as="html" loadpolicy="next inert">
複製程式碼

"next inert"相當於某些瀏覽器實現的rel = prefetch。“next”在語義上相當於某些瀏覽器實現的rel = prerender。該規範通過使附加功能標準化並擴充套件了以前的預取和預渲染功能。

要了解更多資訊,請參閱由Ilya Grigorik釋出在W3C上的Resource Hints

HTTP/2安全性批評

儘管HTTP/2的主要目標是使Web更快,但是由於沒有強制對連線進行加密,它受到了很嚴厲的批評。而且,主要的瀏覽器製造商迄今拒絕對沒有加密的HTTP/2進行支援。所以HTTP/2通過代理來部署加密的連線。如果你認為這不利於Web的未來,請檢視我的文章:HTTPS Everywhere

譯者注: 這裡說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實現

可以在GitHub HTTP/2 wiki上找到HTTP/2的其他已知實現。

結語:HTTP/2的思考

正如我們探討的那樣,HTTP/2是Web早就應該做的更新。隨著它在未來幾年被廣泛採用,網站和其他網路服務將變得比以往更快,更強。感謝具有遠見的瀏覽器製造商,HTTP/2也將增強使用者隱私和安全性。雖然還有許多工作要做,但我覺得HTTP/2是整個Web的重要一步。

如果你對HTTP/2有任何問題或意見,可以通過Twitter @BenjaminPatch 與我聯絡。

致謝

感謝Google的網路效能工程師Ilya Grigorik對這篇HTTP/2文章的貢獻。Ilya還是高效能瀏覽器網路的作者,它是Web開發人員瞭解有關網路和瀏覽器效能的很棒的資源。

原文地址

相關文章