HTTP2.0,HTTP1.1,HTTP1.0三者在通性效能上的優化方法

塗印發表於2018-10-18

本文從從通訊效能角度,來分析對比HTTP1.0和HTTP1.1之間的區別。以及HTTP1.1與HTTP2.0之間的區別。本文詳細內容組織如下

目錄

一丶HTTP1.0與HTTP1.1通訊效能上的區別

  1. 持久化連線
  2. 管線化技術

二丶HTTP2.0與HTTP1.1通訊效能上的區別

  1. 多路複用
  2. HTTP協議頭部壓縮

正文

一丶HTTP1.0與HTTP1.1通訊效能上的區別

  • 持久化連線

    HTTP1.1是預設支援持久化連線的。HTTP1.0若要支援持久化連線需要顯示指定Keep-alived報文頭。

    1. 非持久化連線下HTTP協議的通訊

    • 比如訪問www.taobao.com這個URL。訪問該URL時,首先會從目標伺服器上到HTML這樣的靜態資源,伺服器返回資源後會自動斷開連線,這是一次非持久的HTTP通訊過程。在該過程中包括TCP三次握手和四次揮手。
    • 更進一步考慮,靜態HTML上必然包括很多圖片,js,css等資源,這些資源全部都是儲存在伺服器上。對這些資源的訪問會重複上述的HTTP通訊過程,其中又包括了TCP三次握手和四次揮手。這種反覆建立和釋放TCP連線的過程無疑浪費了伺服器很多的頻寬資源,也降低了Web頁面的載入速度。非持久化連線下HTTP協議的通訊過程如下圖所示

    非持久化連線下的通訊

    2. 持久化連線下HTTP協議的通訊

    持久化連線很易懂。在一次HTTP通性過程後,伺服器若沒有受到顯示關閉連線的通知其不會斷開連線,而是一直保持該連線。如此一來,在訪問諸如www.taobao.com這樣的頁面時,頁面上的多數資源能夠在一條TCP連結上傳輸。這樣極大的減少了多次TCP連線,釋放帶來的效能損失。持久化連線下的通訊如下圖所示

    持久化連線下的通訊

    • 管線化技術

    管線化技術是在持久化連線的基礎上,進一步對通訊效能的提升。在持久化連線下,請求和相應是順次進行的。上次請求得到響應後,才能傳送下次請求。管線化技術就是指能在未收到響應時,順次傳送多個響應。

    基於管線化下的通訊流程

二丶HTTP2.0與HTTP1.1之間通訊效能對比

  1. 多路複用技術

    多路複用技術建立在持久連線的基礎上,允許所有請求公用同一連線,並且能夠並行傳輸。此處的多路複用技術和管線化技術值不同之處在於:。

    • 管線化技術中所有,請求是順次傳送出去的。而多路複用中,所有請求是並行傳送出去的。
      非持久,持久化,管線化,多路複用技術對比
  2. 報文頭壓縮

    報文頭壓縮同樣比較容易理解,減小HTTP報文中頭部欄位的開銷,提供通訊效率。採用報文頭壓縮主要是兩個原因:

    (1)對於單個HTTP報文而言,當攜帶較少的通訊資料時,報文頭部大小將遠遠大於有效的通訊資料,導致頻寬利用率較低。

    (2)在持久化連線下,傳送的多個HTTP報文之間,經常存在重複報文頭欄位在傳輸。

    HTTP2.0提出的報文頭壓縮演算法針對上述兩點均做了優化:

    • 基於靜態字典壓縮 在HTTP協議中的客戶端以及服務端之間,共同維護了一份靜態字典。該靜態字典中儲存了大量常見的HTTP報文頭欄位。比如下述,靜態字典:

      靜態字典
      靜態字典中,保留了兩種情況:

      • 完整的報文頭以及欄位值,比如Content-Language:zh-CN。
      • 完整報文頭,比如User-agent。

    在靜態字典的基礎上,可以利用靜態字典中的索引號代替HTTP中的報文頭,一般來說一個位元組就足以覆蓋靜態字典中的所有索引號了。如下圖所示,利用一個位元組格式,來代替HTTP報文頭,index是靜態字典中的索引號。

    利用一個位元組代替報文頭部

    • 基於動態字典壓縮

      靜態字典並不能夠涵蓋HTTP頭部鍵值對所有的組合情況,為此在靜態字典壓縮的基礎上補充了動態字典壓縮。

      動態字典壓縮過程比較簡單。如果遇見在靜態字典中不存在的HTTP頭部欄位,那麼此處採用非壓縮傳輸,接著把該頭部欄位新增到動態欄位中。當下次傳送同樣的頭部欄位時,則可以依據動態字典的內容對該頭部欄位進行壓縮了。

      1. 當通訊過程越長導致動態字典積累的內容將越多,因此HTTP頭部壓縮的效果越佳
      2. 動態字典的內容會在連線新建立的時候重置。

相關文章