爲什麼需要 http-2?

       大家好,今天要跟大家談論的是爲什麼需要 HTTP/2,我們在談論這個話題的時候,實際上在談論的是 HTTP 的現在、過去和將來。在本文中,將重點介紹 HTTP/1 的過去,現在和其面臨的固有問題。

http/2 連接

     HTTP 作爲非常通用的廣泛使用的協議,其經歷了比較長的一個發展的過程。

     1991 年左右,發佈了第一版的 HTTP 0.9 版本。一開始並沒有很多的 header 字段和複雜的功能,客戶端僅僅發送 GET 方法獲取文件,客戶端發送文件並關閉連接,就這麼簡單。

HTTP 0.9 版本

        隨着互聯網的發展以及瀏覽器的誕生,我們需要擴展 HTTP 協議,使用更加通用和適應更多複雜的場景。1995 年 HTTP1.0 版本應運而生了。

HTTP 1.0 版本

HTTP1.0 版本相比之前進行了大量協議上的修改,這些改變包括:

        HTTP1.0 之後,隨着互聯網的進一步發展,網絡環境發生了不少變化,這些變化包括,當我們訪問一個網頁時,這個網頁的圖片等資源可能來自於外部幾十個網站,即更多的資源分佈在不同的主機中。

請求瀑布圖,更多的資源分佈在不同的主機中

        如果這些資源我們都一個一個的去訪問的話,會經歷 DNS 查找,然後 TCP 三次握手,TLS 加密,然後再加上 HTTP 請求與回覆,那這個時候資源加載太慢,嚴重影響了訪問速度。

第二個特點是,資源的大小越來越大。

第三個特點是,相對於網絡帶寬,網絡往返延遲瓶頸更大

        爲了應對上面的問題,1997 年時 HTTP1.1 提供了一些解決的辦法,當然它也解決了早期協議的一些問題。HTTP1.1 引入一些比較關鍵的性能優化和提高,包括:

下面講解 3 個比較重要的優化。包括比較熟知的 keepalive 機制.

                           沒有 keepalive 機制,兩個請求都需要建立 tcp 連接

       keepalive 保證在默認的情況下,客戶端跟服務器保持長鏈接狀態,而不是每一次請求完了就關閉掉,通過複用這個鏈接,減少握手的成本。

keepalive 機制減少握手的成本

        HTTP1.1 還包括了分塊編碼傳輸的流式處理機制,即一開始處理的過程中,可能並不明確要傳輸數據的大小,直到最後傳輸完成。

HTTP1.1 還包括了請求流水線(request pipeline)機制。

未使用 pipeline 機制,往返的延遲增大了資源獲取時間

        在過去,客戶端發送一條消息給服務器,等待服務器處理完畢返回之後,客戶端繼續發送第二條請求。那可能的優化是客戶端可不可以一次就發送兩三條請求給服務器,這樣大大避免了往返的延遲。

雖然這些優化看起來比較好,但是 HTTP1.1 並沒有徹底解決之前提到的瓶頸。

        HTTP1.1 pipeline 機制對提高性能的解決方案並不徹底,舉一個栗子,客戶端發送了兩個請求,分別是獲取 HTML 文件以及獲取 CSS 文件,但是,假如說 HTML 這個文件服務器處理了很長時間,那這個時候 CSS 這個文件也發送不過來,因爲它被前面的 HTML 請求給堵塞住了,這就是 head of line 問題,即在 http 層的阻塞問題。

pipeline 機制,前一個請求堵塞後一個請求

       稍微理想一些的情況是服務器並行兩個請求,處理完了以後分別發給客戶端,這個時候仍然有堵塞問題,但速度要稍微快一些。

 稍微理想一些的改進辦法

        更理想的情況可能是一種多路複用的機制。比如 CSS 處理 20 毫秒,那服務器處理完成之後,立馬就發給客戶端,然後,再過 20 毫秒,HTML 也處理好了,那麼也立即發送,這個時候就解決了堵塞問題。

**但是很遺憾,HTTP1.1 協議的限制沒有解決這樣的問題。**HTTP1.1 面臨的其他問題是,現在請求的 header 字段和 cooking 越來越大,每一次請求都攜帶了一些沒有用的數據,資源大大浪費

header 越來越大


                                                       cookie 數據量巨大

       在實踐中,http1.1 解決 head of line 問題是通過與服務器創建多個 TCP 連接來實現的,這種方式在 TCP 層仍然問題,筆者將在介紹 http/3 時,介紹 TCP 層面臨的固有問題。

       在 10 多年的探索中,2012 年左右提出了 HTTP/2 的概念, 它源自早期的實驗性 SPDY 協議,最初由 Google 開發。然後在 2015 年,IETF 正式發佈 HTTP/2 標準的版本。HTTP/2 仍然建立在 TCP 之上,主要通過

 等機制對性能進行優化。目前,HTTP/2 已經被主流的瀏覽器和代理服務器支持。截至 2021 年 10 月,排名前 1000 萬個網站中有 47% 支持 HTTP/2(wiki)

**總結
**

      本文簡要介紹了 http 的歷史,主要通過 http/1 面臨的問題,header 和 cookie 太大,面臨 head of line 堵塞問題,請求 pipeline 機制面臨的問題,表明了我們需要一種新的協議克服 http/1 面臨的問題,升級到 http/2 將得到進一步的性能優化。

參考資料:

《HTTP/2 in Action》

《High Performance Browser Networking》

《HTTP: The Definitive Guide》

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Hs3QdXtX2SN9N-QTOMrkvw