HTTP協議 :Hyper Text Transfer Protocol(超文本傳輸協議),是用於從萬維網(WWW:World Wide Web)服務器傳輸超文本到本地瀏覽器的傳送協議。是互聯網上應用最為廣泛的一種網絡協議。所有的WWW文件都必須遵守這個標准。
HTTP是一個基於TCP/IP通信協議來傳遞數據(HTML 文件, 圖片文件, 查詢結果等)。
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/1.0
HTTP協議的第二個版本,第一個在通訊中指定版本號的HTTP協議版本,至今仍被廣泛采用。相對於HTTP/0.9增加了如下主要特性:
- 請求與響應支持頭域
- 響應對象以一個響應狀態行開始
- 響應對象不只限於超文本
- 開始支持客戶端通過POST方法向Web服務器提交數據,支持GET、HEAD、POST方法
- 支持長連接(但默認還是使用短連接),緩存機制,以及身份認證
HTTP/1.1
HTTP協議的第三個版本是HTTP/1.1,是目前使用最廣泛的協議版本。HTTP/1.1是目前主流的HTTP協議版本,相對於HTTP/1.0新增了以下內容:
-
默認為長連接
HTTP 1.1支持長連接(PersistentConnection)和請求的流水線(Pipelining)處理,在一個TCP連接上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲,在HTTP1.1中默認開啟Connection:keep-alive,一定程度上彌補了HTTP1.0每次請求都要創建連接的缺點。
-
提供了范圍請求功能(寬帶優化)
HTTP1.0中,存在一些浪費帶寬的現象,例如客戶端只是需要某個對象的一部分,而服務器卻將整個對象送過來了,並且不支持斷點續傳功能,HTTP1.1則在請求頭引入了range頭域,它允許只請求資源的某個部分,即返回碼是206(Partial Content),這樣就方便了開發者自由的選擇以便於充分利用帶寬和連接。這是支持文件斷點續傳的基礎。
-
提供了虛擬主機的功能(HOST域)
在HTTP1.0中認為每台服務器都綁定一個唯一的IP地址,因此,請求消息中的URL並沒有傳遞主機名(hostname)。但隨着虛擬主機技術的發展,在一台物理服務器上可以存在多個虛擬主機(Multi-homed Web Servers),並且它們共享一個IP地址。HTTP1.1的請求消息和響應消息都應支持Host頭域,且請求消息中如果沒有Host頭域會報告一個錯誤(400 Bad Request)。
-
多了一些緩存處理字段
HTTP/1.1在1.0的基礎上加入了一些cache的新特性,引入了實體標簽,一般被稱為e-tags,新增更為強大的Cache-Control頭。
-
錯誤通知的管理
在HTTP1.1中新增了24個錯誤狀態響應碼,如409(Conflict)表示請求的資源與資源的當前狀態發生沖突;410(Gone)表示服務器上的某個資源被永久性的刪除。
HTTP/2.0
HTTP協議的第四個版本是HTTP/2.0,相對於HTTP/1.1新增了以下內容:
-
二進制分幀
HTTP 2.0 的所有幀都采用二進制編碼
- 幀:客戶端與服務器通過交換幀來通信,幀是基於這個新協議通信的最小單位。
- 消息:是指邏輯上的 HTTP 消息,比如請求、響應等,由一或多個幀組成。
- 流:流是連接中的一個虛擬信道,可以承載雙向的消息;每個流都有一個唯一的整數標識符(1、2 … N);
-
多路復用
多路復用允許同時通過單一的HTTP/2.0 連接發起多重的請求-響應消息。有了新的分幀機制后,HTTP/2.0不再依賴多個TCP 連接去處理更多並發的請求。每個數據流都拆分成很多互不依賴的幀,而這些幀可以交錯(亂序發送),還可以分優先級。最后再在另一端根據每個幀首部的流標識符把它們重新組合起來。HTTP 2.0 連接都是持久化的,而且客戶端與服務器之間也只需要一個連接(每個域名一個連接)即可。
-
頭部壓縮
HTTP/1.1 的首部帶有大量信息,而且每次都要重復發送。HTTP/2.0 要求通訊雙方各自緩存一份首部字段表,從而避免了重復傳輸。
-
請求優先級
瀏覽器可以在發現資源時立即分派請求,指定每個流的優先級,讓服務器決定最優的響應次序。這樣請求就不必排隊了,既節省了時間,也最大限度地利用了每個連接。
-
服務端推送
服務端推送能把客戶端所需要的資源伴隨着index.html一起發送到客戶端,省去了客戶端重復請求的步驟。正因為沒有發起請求,建立連接等操作,所以靜態資源通過服務端推送的方式可以極大地提升速度。