一文串聯(lián) HTTP / [ 0.9 | 1.0 | 1.1 | 2 | 3 ]
1989 年,萬維網(wǎng)誕生之后,HTTP 迅速成為主導世界的應用層協(xié)議。在今天,幾乎任何場景都或多或少用到了 HTTP 協(xié)議。
在 30 多年的歷史中,HTTP 協(xié)議本身有比較大的發(fā)展,同時,還有一些重大的變動也在醞釀之中。這些演化使得這個協(xié)議的表現(xiàn)力更強,性能更好,更能滿足日新月異的應用需求。本文就來回顧和展望一下 HTTP 的歷史和未來。
HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/2 HTTP/3
HTTP/0.9
HTTP/0.9 誕生于 1991 年,是 HTTP 協(xié)議的最初版,構(gòu)造十分簡單:
請求端只支持 GET 請求 響應端只能返回 HTML 文本數(shù)據(jù)
GET /index.html
Hello World
請求示意圖如下:

可以看到,HTTP/0.9 只能發(fā)送 GET 請求,且每一個請求都單獨創(chuàng)建一個 TCP 連接,響應端只能返回 HTML 格式的數(shù)據(jù),響應完成之后 TCP 請求斷開。
這樣的請求方式雖然能夠滿足當時的使用需求,但也還是暴露出了一些問題。
HTTP/0.9 痛點:
請求方式唯一,返回格式唯一 TCP 連接無法復用
HTTP/1.0
HTTP/1.0 誕生于 1996 年,它在 HTTP/0.9 的基礎上,增加了 HTTP 頭部字段,極大擴展了 HTTP 的使用場景。這個版本的 HTTP 不僅可以傳輸文字,還能傳輸圖像、視頻、二進制文件,為互聯(lián)網(wǎng)的迅速發(fā)展奠定了堅實的基礎。
核心特點如下:
請求端增加 HTTP 協(xié)議版本,響應端增加狀態(tài)碼。 請求方法增加 POST、HEAD。 請求端和響應端增加頭部字段。 Content-Type 讓響應數(shù)據(jù)不只限于超文本。 Expires、Last-Modified 緩存頭。 Authorization 身份認證。 Connection: keep-alive 支持長連接,但非標準。
GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
Hello World
請求示意圖如下:

可以看到,HTTP/1.0 擴展了請求方法和響應狀態(tài)碼,并且支持定義 HTTP 頭部字段,通過 Content-Type 頭,我們就能傳輸任何格式的數(shù)據(jù)了。同時可以看出,HTTP/1.0 仍然是一個請求對應一個 TCP 連接,不能形成復用。
HTTP/1.0 痛點:
TCP 連接無法復用。 HTTP 隊頭阻塞,一個 HTTP 請求響應結(jié)束之后,才能發(fā)起下一個 HTTP 請求。 一臺服務器只能提供一個 HTTP 服務。
HTTP/1.1
HTTP/1.1 誕生于 1999 年,它進一步完善了 HTTP 協(xié)議,一直用到了 20 多年后的今天,仍然是使用最廣的 HTTP 版本。
核心特點如下:
持久連接。
HTTP/1.1 默認開啟持久連接,在 TCP 連接建立后不立即關(guān)閉,讓多個 HTTP 請求得以復用。 管線化技術(shù)。
HTTP/1.1 中,多個 HTTP 請求不用排隊發(fā)送,可以批量發(fā)送,這就解決了 HTTP 隊頭阻塞問題。但批量發(fā)送的 HTTP 請求,必須按照發(fā)送的順序返回響應,相當于問題解決了一半,仍然不是最佳體驗。 支持響應分塊。
HTTP/1.1 實現(xiàn)了流式渲染,響應端可以不用一次返回所有數(shù)據(jù),可以將數(shù)據(jù)拆分成多個模塊,產(chǎn)生一塊數(shù)據(jù),就發(fā)送一塊數(shù)據(jù),這樣客戶端就可以同步對數(shù)據(jù)進行處理,減少響應延遲,降低白屏時間。 Bigpipe 的實現(xiàn)就是基于這個特性,具體是通過定義 Transfer-Encoding頭來實現(xiàn)的。增加 Host 頭。
HTTP/1.1 實現(xiàn)了虛擬主機技術(shù),將一臺服務器分成若干個主機,這樣就可以在一臺服務器上部署多個網(wǎng)站了。 通過配置 Host 的域名和端口號,即可支持多個 HTTP 服務: Host:: 其他擴展。
增加 Cache-Control、E-Tag 緩存頭。 增加 PUT、PATCH、HEAD、 OPTIONS、DELETE 請求方法。
GET /en-US/docs/Glossary/Simple_header HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header
200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Wed, 20 Jul 2016 10:55:30 GMT
Etag: "547fa7e369ef56031dd3bff2ace9fc0832eb251a"
Keep-Alive: timeout=5, max=1000
Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT
Server: Apache
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding
Hello World
請求示意圖如下:

可以看到,HTTP/1.1 可以并行發(fā)起多個請求,并且也能復用同一個 TCP 連接,傳輸效率得到了提升。但響應端只能按照發(fā)送的順序進行返回,為此很多瀏覽器會為每個域名至多打開 6 個連接,用增加隊列的方式減少 HTTP 隊頭阻塞。
HTTP/1.1 痛點:
HTTP 隊頭阻塞沒有徹底解決,響應端必須按照 HTTP 的發(fā)送順序進行返回,如果排序靠前的響應特別耗時,則會阻塞排序靠后的所有響應。
HTTP/2
HTTP/2 誕生于 2015 年,它的最大的特點是 All in 二進制,基于二進制的特性,對 HTTP 傳輸效率進行了深度優(yōu)化。
HTTP/2 將一個 HTTP 請求劃分為 3 個部分:
幀:一段二進制數(shù)據(jù),是 HTTP/2 傳輸?shù)淖钚挝弧?/section> 消息:一個請求或響應對應的一個或多個幀。 數(shù)據(jù)流:已建立的連接內(nèi)的雙向字節(jié)流,可以承載一條或多條消息。

圖中可以看到,一個 TCP 連接上有多個數(shù)據(jù)流,一個數(shù)據(jù)流承載著雙向消息,一條消息包含了多個幀,每個幀都有唯一的標識,指向所在的數(shù)據(jù)流,來自不同數(shù)據(jù)流的幀可以交錯發(fā)送,然后再根據(jù)每個幀頭的數(shù)據(jù)流標識符重新組裝,這樣就實現(xiàn)了數(shù)據(jù)傳輸。
HTTP/2 核心特點如下:
請求優(yōu)先級 多個 HTTP 請求同時發(fā)送時,會產(chǎn)生多個數(shù)據(jù)流,數(shù)據(jù)流中有一個優(yōu)先級的標識,服務器端可以根據(jù)這個標識來決定響應的優(yōu)先順序。 多路復用 TCP 傳輸時,不用按照 HTTP 的發(fā)送順序進行響應,可以交錯發(fā)送,接收端根據(jù)幀首部的標識符,就能找到對應的流,進而重新組合得到最終數(shù)據(jù)。 服務器端推送 HTTP/2 允許服務器未經(jīng)請求,主動向客戶端發(fā)送資源,并緩存到客戶端中,以避免二次請求。 HTTP/1.1 中請求一個頁面時,瀏覽器會先發(fā)送一個 HTTP 請求,然后得到響應的 HTML 內(nèi)容并開始解析,如果發(fā)現(xiàn)有 欧美成人三级在线 | 真人美女操逼网站 | 国产日韩欧美一级电影 | 天天一区二区 | 日日操天天操夜夜操 |
