前言
HTTP協議是一種用于在網絡上傳輸信息的應用層協議,它為萬維網的運作提供了基礎。
最早的版本是HTTP/0.9,它是HTTP協議的第一個版本,誕生于1991年,其設計初衷是為了在計算機之間傳輸簡單的超文本文檔,即HTML。
在HTTP2之前,HTTP一直都是基于文本的協議,足夠的簡單、良好的可讀性是HTTP協議能取得如此成功的重要原因之一。
然而,隨著互聯網的發展和網頁內容的復雜性增加,基于文本的HTTP協議逐漸暴露出一些性能上的限制。為了解決這些問題,才有了HTTP2。
HTTP協議
版本 | 發布年份 | 主要特點 |
---|---|---|
HTTP 0.9 | 1991年 | 最初版本,用于傳輸超文本(HTML)文檔 |
HTTP 1.0 | 1996年 | 支持多種類型的數據和HTTP頭部 |
HTTP 1.1 | 1997年 | 長連接、管道化、緩存機制,提高了性能和效率 |
HTTP/2 | 2015年 | 二進制協議、多路復用、頭部壓縮、服務器推送、流量控制 |
HTTP/0.9
HTTP/0.9是最早的HTTP協議版本,于1991年發布。它非常簡單,典型的請求-響應模型,沒有定義任何HTTP頭部信息,只支持傳輸HTML。它的主要特點如下:
- 只支持GET
- 無HTTP頭部
- 純文本協議
請求示例:
GET /index.html
響應示例:
<html><body>content</body>
</html>
HTTP/1.0
HTTP/1.0是HTTP協議的一個重要版本,于1996年發布。
HTTP/1.0相對于HTTP/0.9,增加了以下內容和特性:
- 新增POST、HEAD請求方法
- 引入請求頭信息
- 引入響應狀態碼,如:200表示成功
請求示例:
GET /path/file.html HTTP/1.0
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0
響應示例:
HTTP/1.0 200 OK
Date: Fri, 08 Jul 2023 18:30:00 GMT
Server: Apache/2.4.7 (Ubuntu)
Content-Length: 256
Content-Type: text/html<html>
<body>...
</body>
</html>
HTTP/1.1
HTTP/1.1相對于HTTP/1.0,增加了以下內容和特性:
- 持久連接:HTTP/1.1默認使用持久連接,即在單個TCP連接上可以發送多個請求和獲得多個響應。這樣可以減少建立和關閉連接的開銷,提高性能。
- 管道化:在一個連接上可以同時發送多個請求,而無需等待每個請求的響應。服務器也可以按照請求的順序回復響應,進一步提高了性能。
- 分塊傳輸編碼:允許服務器將響應分成多個部分進行傳輸,這對于傳輸大文件或者流式數據非常有用。
- Host頭部:允許在一個物理服務器上托管多個域名或多個虛擬主機,服務器根據不同的 Host 頭部字段來選擇不同的網站或虛擬主機進行請求處理。
HTTP2
為什么命名不是HTTP/1.2?因為HTTP2協議關于數據傳輸的部分改動很大,從一個基于文本的協議升級到了二進制協議,屬于是大版本的升級。
相較于HTTP/1.1,HTTP2的特點是:
- 二進制分幀消息:從一個文本協議升級到了二進制協議,HTTP2把消息切分成多個二進制幀Frame發送,為了區分不同的消息,幀有很多類型,例如傳輸請求頭的HEADERS幀,傳輸消息體的DATA幀等。
- 多路復用:HTTP2在單個連接上可以同時開辟多個邏輯上的流Stream,消息是基于Stream發送的,意味著請求和響應可以并發處理。
- 頭部壓縮:之前是消息體可以壓縮,在HTTP2上,消息頭也支持壓縮了。
- 服務端推送:不止是客戶端請求服務端,現在服務端也可以主動推送數據給客戶端了。
- 流量控制:HTTP1因為在單個連接上,請求-響應都是串行的,因此直接依賴于底層TCP的流控就好了。HTTP2有了多路復用,單個連接上可以同時有多個Stream,此時必須要實現更精細化的流量控制。
HTTP2會把消息拆分成多個Frame發送,這些Frame是基于二進制傳輸的,無法直接拆看,必須使用對應的工具或三方庫來處理這些Frame。
關于HTTP2的各種Frame的格式,以及其它介紹,可以查看這篇文檔:https://httpwg.org/specs/rfc9113.html#FrameTypes