HTTP 簡史複習
初代不成熟協議,只支援GET
命令,僅接受HTML格式的子串,一次請求結束之後TCP連線隨即關閉。
HTTP/1.0
不僅支援HTML,還支援圖片、視訊、二進位制檔案等。
增加了 POST HEAD,
每次Req和Resp都必須含有頭部。整個頭部只能使用ASCII編碼
新增了狀態碼、許可權、快取、內容編碼(content encoding)等功能。
新增Content-Type欄位。
缺點:
但是每次只能傳送一個請求,三次握手比較慢,另外需要慢啟動。
連線複用採用Connection: keep-alive
欄位,該欄位非標準。
HTTP/1.1
RFC 2616
第一個有正式標準的版本。
舉個 :chestnut:
$> telnet website.org 80 Connected to xxx.xxx.xxx.xxx GET /index.html HTTP/1.1 ① Host: website.org User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4)... (snip) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 Cookie: __qca=P0-800083390... (snip) HTTP/1.1 200 OK ② Server: nginx/1.0.11 Connection: keep-alive Content-Type: text/html; charset=utf-8 Via: HTTP/1.1 GWA Date: Wed, 25 Jul 2012 20:23:35 GMT Expires: Wed, 25 Jul 2012 20:23:35 GMT Cache-Control: max-age=0, no-cache Transfer-Encoding: chunked 100③ <!doctype html> (snip) 100 (snip) 0 ④ GET /favicon.ico HTTP/1.1 ⑤ Host: www.website.org User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4)... (snip) Accept: */* Referer: http://website.org/ Connection: close ⑥ Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 Cookie: __qca=P0-800083390... (snip) HTTP/1.1 200 OK ⑦ Server: nginx/1.0.11 Content-Type: image/x-icon Content-Length: 3638 Connection: close Last-Modified: Thu, 19 Jul 2012 17:51:44 GMT Cache-Control: max-age=315360000 Accept-Ranges: bytes Via: HTTP/1.1 GWA Date: Sat, 21 Jul 2012 21:35:22 GMT Expires: Thu, 31 Dec 2037 23:55:55 GMT Etag: W/PSA-GAu26oXbDi (icon data) (connection closed)
①:附帶了encoding,charset和cookie元資訊請求HTML檔案
②:分塊傳輸結果
③:分塊的大小,以ASCII 十六進位制表示。 100代表256位元組。
④:用0,代表整個Response分塊結束。
⑤:使用同一條TCP連線請求圖示檔案
⑥:提醒伺服器,這個連線將不再被複用,可以關閉連線。
⑦:返回圖示檔案的資訊,並在結尾處關閉連線。
以上樣例重點貫徹了HTTP/1.1
的連線複用、分塊以及顯式關閉等特徵。
特徵:
- 預設TCP連線不關閉,可以被多個請求複用。不像HTTP/1.0還必須明確指明 Connection: Keep-Alive。
- 管道機制:同一個TCP連線,客戶端可以傳送多個請求。為了切分每個請求,必須在頭部註明Content-Length
- 分塊傳輸 chunk。
其他功能
增加了 content, encoding, character set 等欄位。
Host 欄位
PUT PATCH HEAD OPTIONS DELETE
缺點
隊頭堵塞 Head-of-line blocking
SPDY
谷歌自研 2009年 ,HTTP/2的基礎
HTTP/2
注意,不叫HTTP/2.0
,下一個版本將是HTTP/3
。
二進位制協議
HTTP/1.1 的header肯定是ASCII,資料體可以是文字或二進位制。
HTTP/2 是一個徹底的二進位制協議,header和body都是二進位制,並且統稱為幀
:頭資訊幀和資料幀。
多工 Multiplexing
HTTP/2 複用了TCP連線,在一個連線裡,客戶端和瀏覽器都可以同時傳送多個請求或迴應,而不是按照順序。這避免了隊頭堵塞
。
資料流
因為HTTP/2的資料包不按順序傳送,所以要指出每個資料包屬於哪個迴應。
每個請求或迴應的所有資料包,稱為一個數據流。每個資料流有個獨一無二的ID。
客戶端來的資料包的ID是奇數,服務端傳送的資料包ID是偶數。
頭資訊壓縮
一方面頭可以壓縮;另一方面,客戶端和服務端維護了一張索引表,不用傳送相同的欄位。
伺服器推送
未經過客戶端的主動秦秋,伺服器可以主動向客戶端傳送資源。
參考:
ofollow,noindex">http://www.ruanyifeng.com/blog/2016/08/http.html
https://github.com/abbshr/rfc7540-translation-zh_cn
https://tools.ietf.org/html/rfc7540 /https://httpwg.org/specs/rfc7540.html
https://developers.google.com/web/fundamentals/performance/http2/?hl=zh-cn
https://hpbn.co/brief-history-of-http/