HTTP/2的那些事
文/孫鏡濤
HTTP/2,也就是超文本傳輸協議第 2 版,是下一代 HTTP 協議。該版本是自 1999 年 HTML 1.1 發布后的首個更新,目前它正由互聯網工程任務組(IETF)的 Hypertext Transfer Protocol Bis (httpbis)工作小組進行開發。
對于 HTTP/2,來自于 Google 的性能工程師Ilya Grigorik 最近發布了一個 PPT 對此進行了詳細的說明。在該呈現中,Ilya Grigorik 首先提到了一組數據:目前平均每個 Web 頁面大約會訪問 12 個不同的主機,包含 78 個不同的請求,傳輸 1232KB 的數據,導致一個頁面的渲染時間通常會在 2.6s 至 5.6s 之間。而在渲染占用的整個時間里面,網絡大約占 69.5%,JavaScript 占 6.6%,布局占 5.1%,繪制占 4.5%,因此網絡傳輸的效率對整體性能有明顯的影響。
Ilya Grigorik 認為 HTTP/1.1 在性能方面有明顯的缺陷,主要體現在以下幾個方面:
a) 并行能力有限
- 每一個源最大只支持 6 個請求
- 管道在實際使用時不起作用
- 競爭性的 TCP 流,強制快速重傳(Spurious retransmissions)
- 額外的握手、內存緩沖等 </ul>
- 隊首阻塞
- 延遲的請求分發 </ul>
- 頭信息和 Cookies 大約要 800 字節
- HTTP 元數據沒有壓縮 </ul>
b) 客戶端請求隊列
c) 較高的協議負載
另外,HTTP/1.1 只允許由客戶端主動發起請求,服務端只能等待客戶端發送請求,這對于滿足預加載的現狀是一種桎梏。
針對這些問題,雖然我們可以通過一些變通的方法進行處理,但是這不可避免的會引發另外的問題。例如,針對請求數的限制我們可以把多個小文件打包 到一個大文件中,但是由于并不是每一個頁面都需要所有的小文件,所以這樣做會造成帶寬的浪費。那么 HTTP/2 是否能夠幫助我們解決這些問題呢?它都包含哪些內容呢?
實際上 HTTP/2 是為了在萬維網上進行低延遲的數據傳輸而設計的一個協議,它提供了 HTTP 語義的傳輸優化,支持 HTTP/1.1 的所有核心特征,并且在其他方面做的更高效。在 HTTP/2 中,基本的協議單位是幀,每個幀都有不同的類型和用途。例如,報頭(HEADERS)和數據(DATA)幀組成了基本的 HTTP 請求和響應;其他幀,例如設置(SETTINGS)和推送承諾(PUSH_PROMISE)則用來實現 HTTP/2 的其他功能。
HTTP/2 基于 SPDY 協議,充分解決了 TCP 連接的限制。它允許多個并發 HTTP 請求共用一個 TCP 會話,而不是為每個請求單獨開放連接,這樣只需建立一個 TCP 連接就可以傳送網頁上所有資源,不僅可以減少消息交互往返的時間還可以避免創建新連接造成的延遲,使得 TCP 的效率更高。
針對只能由客戶端發起請求的問題,HTTP/2 添加了一種新的交互模式,即服務器能夠通過復用一個以 PUSH_PROMISE 幀發送的請求來實現推送。而對于數據冗余問題,在 HTTP/2 中幀包含的 HTTP 報頭字段是壓縮的,同時它還舍棄掉了不必要的頭信息,因此能顯著地減少請求和響應的大小。
如果你想了解與 HTTP/2 相關的更多信息,可以查看百度閱讀提供的 HTTP/2 中文版。
對于 Ilya Grigorik 所分享的內容 Hacker News 社區上也有一些人發表了自己的看法,byuu 認為:
首先 Firefox 以及一些其他的瀏覽器只能在 TLS 上使用 HTTP/2, 這對很多人而言是一種阻礙。雖然加密非常好,但是 SSL 證書可能需要一定的成本以及額外的 CPU 資源。其次,使用一種新的、自定義的壓縮算法對頭信息進行處理并不一定合適,因為如果頭信息只有 300 字節的數據,那么壓縮數據所帶來的帶寬收益并不一定會比它所消耗的 CPU 成本高,況且這樣還增加了程序的復雜性。最后,byuu 認為新協議可能會改變我們既有 Web 網站的工作方式,如果優化做的不好,那么性能可能會比 HTTP/1.1 更糟,同時兼容性也會阻礙大家對 HTTP/2 的采納。
</blockquote>而 kator 則從另一個角度發表了自己的看法:
“我并不懷疑這里有大量可提升的空間,很明顯 HTTP/2 有很多內容來自于 SPDY 以及其他的一些項目。我擔心的是我們現在正在做的事情對那些可以將所有內容塞到一個流中的大公司而言有巨大好處,而對于小公司而言則更多的是劣勢。另外, 作為一個老家伙,我擔心人們會丟失與這些服務對話,或者以文本的方式查看對話的能力。”
</blockquote>來自: InfoQ<span id="shareA4" class="fl"> </span>
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!