HTTP協議幾個版本的比較

Jsp發表於2018-05-28
HTTP協議是如今網際網路與服務端技術的基石,HTTP協議的演進也從側面反應了網際網路技術的快速發展。這兩天在準備一次關於HTTP1.1協議特性的技術分享過程中,順 便了解了下各版本HTTP協議的特點,在這裡做個簡單的總結。
HTTP協議到現在為止總共經歷了3個版本的演化,第一個HTTP協議誕生於1989年3月。

HTTP協議幾個版本的比較

1、HTTP 0.9

HTTP 0.9是第一個版本的HTTP協議,已過時。它的組成極其簡單,只允許客戶端傳送GET這一種請求,且不支援請求頭。由於沒有協議頭,造成了HTTP 0.9協議只支援一種內容,即純文字。不過網頁仍然支援用HTML語言格式化,同時無法插入圖片。

HTTP 0.9具有典型的無狀態性,每個事務獨立進行處理,事務結束時就釋放這個連線。由此可見,HTTP協議的無狀態特點在其第一個版本0.9中已經成型。一次HTTP 0.9的傳輸首先要建立一個由客戶端到Web伺服器的TCP連線,由客戶端發起一個請求,然後由Web伺服器返回頁面內容,然後連線會關閉。如果請求的頁面不存在,也不會返回任何錯誤碼。

2、HTTP 1.0

HTTP協議的第二個版本,第一個在通訊中指定版本號的HTTP協議版本,至今仍被廣泛採用。相對於HTTP 0.9 增加了如下主要特性:
  • 請求與響應支援頭域
  • 響應物件以一個響應狀態行開始
  • 響應物件不只限於超文字
  • 開始支援客戶端通過POST方法向Web伺服器提交資料,支援GET、HEAD、POST方法
  • (短連線)每一個請求建立一個TCP連線,請求完成後立馬斷開連線。這將會導致2個問題:連線無法複用,head of line blocking。連線無法複用會導致每次請求都經歷三次握手和慢啟動。三次握手在高延遲的場景下影響較明顯,慢啟動則對檔案類請求影響較大。head of line blocking會導致頻寬無法被充分利用,以及後續健康請求被阻塞。

3、HTTP 1.1

HTTP協議的第三個版本是HTTP 1.1,是目前使用最廣泛的協議版本 。HTTP 1.1是目前主流的HTTP協議版本,因此這裡就多花一些筆墨介紹一下HTTP 1.1的特性。

HTTP 1.1引入了許多關鍵效能優化:keepalive連線,chunked編碼傳輸,位元組範圍請求,請求流水線等

  • Persistent Connection(keepalive連線):允許HTTP裝置在事務處理結束之後將TCP連線保持在開啟的狀態,以便未來的HTTP請求重用現在的連線,直到客戶端或伺服器端決定將其關閉為止。在HTTP1.0中使用長連線需要新增請求頭 Connection: Keep-Alive,而在HTTP 1.1 所有的連線預設都是長連線,除非特殊宣告不支援( HTTP請求報文首部加上Connection: close )。伺服器端按照FIFO原則來處理不同的Request。

  • chunked編碼傳輸:該編碼將實體分塊傳送並逐塊標明長度,直到長度為0塊表示傳輸結束,這在實體長度未知時特別有用(比如由資料庫動態產生的資料)
  • 位元組範圍請求:HTTP1.1支援傳送內容的一部分。比方說,當客戶端已經有內容的一部分,為了節省頻寬,可以只向伺服器請求一部分。該功能通過在請求訊息中引入了range頭域來實現,它允許只請求資源的某個部分。在響應訊息中Content-Range頭域宣告瞭返回的這部分物件的偏移值和長度。如果伺服器相應地返回了物件所請求範圍的內容,則響應碼206(Partial Content)
  • Pipelining(請求流水線)

另外,HTTP 1.1還新增瞭如下特性:
  • 請求訊息和響應訊息都支援Host頭域:在HTTP1.0中認為每臺伺服器都繫結一個唯一的IP地址,因此,請求訊息中的URL並沒有傳遞主機名(hostname)。但隨著虛擬主機技術的發展,在一臺物理伺服器上可以存在多個虛擬主機(Multi-homed Web Servers),並且它們共享一個IP地址。因此,Host頭的引入就很有必要了。
  • 新增了一批Request method:HTTP1.1增加了OPTIONS,PUT, DELETE, TRACE, CONNECT方法
  • 快取處理:HTTP/1.1在1.0的基礎上加入了一些cache的新特性,引入了實體標籤,一般被稱為e-tags,新增更為強大的Cache-Control頭。

4、HTTP 2.0

HTTP 2.0是下一代HTTP協議,目前應用還非常少。主要特點有:
  • 多路複用(二進位制分幀)。HTTP 2.0最大的特點:不會改動HTTP 的語義,HTTP 方法、狀態碼、URI 及首部欄位,等等這些核心概念上一如往常,卻能致力於突破上一代標準的效能限制,改進傳輸效能,實現低延遲和高吞吐量。而之所以叫2.0,是在於新增的二進位制分幀層。在二進位制分幀層上, HTTP 2.0 會將所有傳輸的資訊分割為更小的訊息和幀,並對它們採用二進位制格式的編碼 ,其中HTTP1.x的首部資訊會被封裝到Headers幀,而我們的request body則封裝到Data幀裡面。
  • HTTP 2.0 通訊都在一個連線上完成,這個連線可以承載任意數量的雙向資料流。相應地,每個資料流以訊息的形式傳送,而訊息由一或多個幀組成,這些幀可以亂序傳送,然後再根據每個幀首部的流識別符號重新組裝。
  • 頭部壓縮:當一個客戶端向相同伺服器請求許多資源時,像來自同一個網頁的影象,將會有大量的請求看上去幾乎同樣的,這就需要壓縮技術對付這種幾乎相同的資訊。
  • 隨時復位:HTTP1.1一個缺點是當HTTP資訊有一定長度大小資料傳輸時,你不能方便地隨時停止它,中斷TCP連線的代價是昂貴的。使用HTTP2的RST_STREAM將能方便停止一個資訊傳輸,啟動新的資訊,在不中斷連線的情況下提高頻寬利用效率。
  • 伺服器端推流:Server Push。客戶端請求一個資源X,伺服器端判斷也許客戶端還需要資源Z,在無需事先詢問客戶端情況下將資源Z推送到客戶端,客戶端接受到後,可以快取起來以備後用。
  • 優先權和依賴:每個流都有自己的優先順序別,會表明哪個流是最重要的,客戶端會指定哪個流是最重要的,有一些依賴引數,這樣一個流可以依賴另外一個流。優先順序別可以在執行時動態改變,當使用者滾動頁面時,可以告訴瀏覽器哪個影象是最重要的,你也可以在一組流中進行優先篩選,能夠突然抓住重點流。


相關文章