標籤:

HTTP協議幾個版本的比較

HTTP協議幾個版本的比較

HTTP協議是如今互聯網與服務端技術的基石,HTTP協議的演進也從側面反應了互聯網技術的快速發展。這兩天在準備一次關於HTTP1.1協議特性的技術分享過程中,順 便了解了下各版本HTTP協議的特點,在這裡做個簡單的總結。

HTTP協議到現在為止總共經歷了3個版本的演化,第一個HTTP協議誕生於1989年3月。

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推送到客戶端,客戶端接受到後,可以緩存起來以備後用。
  • 優先權和依賴:每個流都有自己的優先順序別,會表明哪個流是最重要的,客戶端會指定哪個流是最重要的,有一些依賴參數,這樣一個流可以依賴另外一個流。優先順序別可以在運行時動態改變,當用戶滾動頁面時,可以告訴瀏覽器哪個圖像是最重要的,你也可以在一組流中進行優先篩選,能夠突然抓住重點流。

推薦閱讀:

寫程序得女友——日本OJ Paiza Online Hackathon小遊戲"戀愛SLG"題解
中美兩位 AI 大師的「巔峰對話」:為何 NLP 領域難以出現「獨角獸」? | 獨家
2018最新國外EI源刊SCI期刊徵稿發表寫作經驗分享
忘記電腦開機密碼怎麼辦?不要慌,試試這個方法吧!
基礎·操作系統

TAG:計算機科學 |