jinzhe

jinzhe

github
email

http的歷史

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)#

  • 支援請求頭和響應頭(包括狀態碼、緩存、授權、字符集等)
  • 額外支援HEADPOST方法
  • 支援更多的響應格式如視頻、文本、圖像等

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)#

  • 額外添加了PUTPATCHOPTIONSDELETE
  • 添加了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...
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。