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服務器返回頁面內容,然后連接會關閉。如果請求的頁面不存在,也不會返回任何錯誤碼。

HTTP 0.9協議文檔:
http://www.w3.org/Protocols/HTTP/AsImplemented.html

 

2、HTTP 1.0

 

HTTP協議的第二個版本,第一個在通訊中指定版本號的HTTP協議版本,至今仍被廣泛采用。相對於HTTP 0.9 增加了如下主要特性:

  • 請求與響應支持頭域
  • 響應對象以一個響應狀態行開始
  • 響應對象不只限於超文本
  • 開始支持客戶端通過POST方法向Web服務器提交數據,支持GET、HEAD、POST方法
  • 支持長連接(但默認還是使用短連接),緩存機制,以及身份認證 

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 )

            

  • chunked編碼傳輸
    該編碼將實體分塊傳送並逐塊標明長度,直到長度為0塊表示傳輸結束, 這在實體長度未知時特別有用(比如由數據庫動態產生的數據)
  • 字節范圍請求
    HTTP1.1支持傳送內容的一部分。比方說,當客戶端已經有內容的一部分,為了節省帶寬,可以只向服務器請求一部分。該功能通過在請求消息中引入了range頭域來實現,它允許只請求資源的某個部分。在響應消息中Content-Range頭域聲明了返回的這部分對象的偏移值和長度。如果服務器相應地返回了對象所請求范圍的內容,則響應碼206(Partial Content)
  • Pipelining(請求流水線)
    A client that supports persistent connections MAY "pipeline" its requests (i.e., send multiple requests without waiting for each response). A server MUST send its responses to those requests in the same order that the requests were received.(摘自http://www.ietf.org/rfc/rfc2616.txt)

                   

另外,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推送到客戶端,客戶端接受到后,可以緩存起來以備后用。
  • 優先權和依賴
    每個流都有自己的優先級別,會表明哪個流是最重要的,客戶端會指定哪個流是最重要的,有一些依賴參數,這樣一個流可以依賴另外一個流。優先級別可以在運行時動態改變,當用戶滾動頁面時,可以告訴瀏覽器哪個圖像是最重要的,你也可以在一組流中進行優先篩選,能夠突然抓住重點流。 
  • 本文章為作者原創
  • 🈲禁止🈲
  • 其他公眾賬號轉載,若有轉載,請標明出處


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM