HTTP/2特性

HTTP/2

HTTP/2相比HTTP/1而言提供了更加高效的傳輸方式,解決了HTTP/1.x中存在的不少問題,協議增長了二進制幀控制層,大多數改動都封裝在這一層。如下會簡單對比HTTP/1.0 & HTTP/1.1 從而引伸出HTTP/2的改進。html

  • HTTP/1.0 & HTTP/1.1
    • 1.1新增對長連接的支持:1.0中每次client與server創建TPC連接並完成請求處理之後,TCP連接即斷開,而在1.1中HTTP支持使用keep-alive選項來開啓長連接,也就是HTTP鏈接會維持一段時間,這樣在這段時間內這個鏈接上的數據就可以直接傳輸而不須要再次進行耗時的TCP創建鏈接的過程了。長短鏈接的關係問題能夠參考HTTP長連接短連接
    • 1.1新增了對請求流水(piplining)的支持,就是圖中第二欄所示。可是這裏也有一個問題就是頭部阻塞,HTTP/1.1必須按順序接收三個請求,因此若是其中某一個請求失敗,client必須等待請求重發並接收成功後才能繼續向下處理
    • 1.1添加了更多的Catch緩存策略選項,好比:Entity tag,If-Unmodified-Since, If-Match, If-None-Match等,參考這個http緩存機制原理
    • 增長了一些錯誤通知類型
    • 支持host頭域,這個主要是爲了適應虛擬主機的使用
    • 容許部分請求資源,而不是像之前同樣必須返回整個對象
  • HTTP/2新增詳細,這裏我基本上是搬運了HTTP/2英文 良心翻譯
    • HTTP2.0並無改變以前HTTP的語義,也就是說高層的Api並無改變,它是在底層經過二進制frame來改變性能的
    • 二進制幀層: http/1.x使用換行符分割文本,而HTTP/2則改用二進制來進行傳輸,雖然麻煩一些可是在效率和正確性上都獲得了保證。
      • ASCII 協議可以很容易的看出來和開始使用。然而它們是沒有效率的,且很難正確設計:可選的空白,改變終止序列和其餘的毛病使得協議很難區別出payload。雖然二進制協議用起來須要作不少工做,可是它們能表現出更好的性能。
    • 消息傳遞方式:最小的消息單元爲幀,是消息的切片,傳輸時能夠亂序,能夠組裝。frame組成邏輯上的消息,即request和response。同一個TCP鏈接上有不少雙向流供frame流通。注意,全部的通訊都在同一個TCP鏈接上進行。
    • 多路複用解決頭阻塞問題:HTTP/2使用的是frame爲單元的二進制消息單元進行通訊的,而且提供了亂序傳遞,而後組裝的消息處理方式,使得多路數據能夠混雜在一塊兒進行傳遞,這也使得其中某個消息的丟棄並不會影響到其餘消息的正常傳遞,因此也就沒有了1.1中的頭部阻塞問題。這一特性使得HTTP協議的速度有了一個大的提高。
      固然,也有部分資料提出因爲HTTP/2一般基於TCP實現,因此依舊存在丟包會等待重傳的問題(HOL阻塞),這裏又引伸出QUIC協議,這裏本文就不在深刻介紹啦。
    • 能夠設定流的優先級和依賴
    • 服務推送:HTTP/1.x在現代網頁渲染的時候爲了處理一個完整的網頁可能同時簇發幾十甚至上百個請求,這是沒有必要的,實際上服務器徹底能夠經過特定的請求和預先恰當的定義,分析獲得前端須要哪些資源,而後由server主動推送這些資源。HTTP/2提供了這種能力。
    • 頭部壓縮:一樣的,現代網頁簇發多個request,可是它們的頭極可能是沒啥區別的,這是很大的浪費。甚至有的時候消息頭的大小會超過實際須要的數據,這是不合理的。
      爲了解決這個問題,HTTP/2引入了頭部壓縮。我的認爲它其實是在服務端創建了一個頭部索引,client能夠經過特定的索引來獲取頭信息,而不須要完整的攜帶它們,對於新的頭選項client和server協做更新並保存。如圖所示:
相關文章
相關標籤/搜索