http 是基於 TCP/IP 的應用層通信協議,用於定義客戶端和伺服器之間的通信規則。
http/0.9(1991)#
http 第一個有記錄的版本是 1991 年提出的http/0.9
,他是有史以來簡單的協議。
- 無請求頭
- 只支援
GET
方法 - 只能返回
HTML
GET /index.html
伺服器可能返回以下信息
(res body)
(connection closed)
http/1.0(1996)#
- 支援請求頭和響應頭(包括狀態碼、緩存、授權、字符集等)
- 額外支援
HEAD
和POST
方法 - 支援更多的響應格式如視頻、文本、圖像等
Warning
http/1.0 的主要缺點之一就是每個連接不能有多個請求。對於任何一個請求,都必須建立在新的連接上,會因為三次握手導致性能浪費。
GET /index.html HTTP/1.0
Host: jinzhe.cc
Accept: */*
伺服器可能返回以下信息
HTTP/1.0 200 OK
Content-Type: text/plain
Server: Apache 0.84
(res body)
(connection closed)
http/1.1(1999)#
- 額外添加了
PUT
、PATCH
、OPTIONS
、DELETE
- 添加了
Connection
請求頭,允許客戶端和伺服器指定連接的選項。 - 管道化,客戶端可以在同一連接上向伺服器發送多個請求,而無需等待伺服器的響應,並且伺服器必須按照接收請求的順序發送響應。客戶端必須使用
Content-Length
識別結束位置。 - 分塊傳輸,當伺服器無法真正找到
Content-Length
的時候,就會分塊傳輸,並給每一個塊加上Content-Length
,伺服器包含標頭Transfer-Encoding: chunked
。
Warning
Content-Length
並不能完全解決持久連接的問題,假如說數據是動態的,並且服務端無法知道內容長度,那麼客戶端就無法知道數據何時結束。
队頭阻塞
SPDY(2009)#
- 多路復用
- 壓縮
- 優先級
- 安全性
SPDY 的出現並不是取代 HTTP,而是在 HTTP 發出請求之前對其修改。它開始成為事實上的標準,大多數瀏覽器開始實現它。到了 2015 年,Google 不想出現兩個相互競爭的標準,
所以它決定將 SPDY 合併到 HTTP/2.0 中並棄用 SPDY。
http/2.0(2015)#
HTTP/2
專為低延遲內容傳輸而設計,
- 二進制,每個
HTTP/2
請求和響應都會被賦予一個唯一的流 ID,流是幀的集合,每個幀都包含包含幀類型、流 ID、幀長度等信息。 - 多路復用,所有連接的請求和響應都在同一個 TCP 連接上完成。客戶端異步發送,服務端異步響應,按流 ID 識別。
HPACK
頭部壓縮,使用霍夫曼編碼。- 伺服器推送。無需客戶端請求,推送給客戶端資源。
- 請求優先級,可以更改流的優先級。
- 安全,儘管
HTTP/2
不要求按規範進行加密,但無論如何它在默認情況下已成為強制性。
三次握手#
Mermaid Loading...