HTTP/0.9、HTTP/1.0、HTTP/1.1、HTTP/2、HTTP/3各版本之間的區別?
HTTP是什麼?
HTTP是一個在計算機世界裡專門在兩點之間傳輸文字、圖片、音訊、視訊等超文字資料的約定和規範。
HTTP通常跑在TCP/IP協議棧之上,依靠IP協議實現定址和路由、TCP協議實現可靠資料傳輸、DNS協議實現域名查詢、SSL/TLS協議實現安全通訊。當然,WebSocket、HTTPDNS依賴於HTTP。
HTTP/0.9
GET/index.html
HTTP/0.9當時是為了學術交流,基於請求和響應的模式,在網路中傳輸HTML超文字的內容。
如上所示,只有一個請求行,沒有HTTP請求頭和請求體。同樣,伺服器也沒有響應頭資訊,只是返回了資料。
因為都是HTML格式的檔案,決定了返回的檔案內容通過ASCII字元流
HTTP/1.0
1994年低開啟撥號上網,網景也在同年推出了第一款瀏覽器,人們對全球資訊網的需求不再僅侷限於學術交流。
W3C和HTTP工作組HTTP-WG也在這個時代建立。為了滿足人們對瀏覽器的需求(不光是HTML,還有CSS、JS、圖片、音視訊等),檔案格式不再侷限於ASCII編碼。
HTTP/1.0的解決辦法是引入了請求頭和響應頭。
accept: text/html accept-encoding: gzip, deflate, br accept-Charset: ISO-8859-1,utf-8 accept-language: zh-CN,zh
同時也引入了狀態碼,為了減輕伺服器的壓力,提供了Cache機制
HTTP/1.1
改進持久連線
一個TCP連線上可以傳輸多個HTTP請求,只要瀏覽器或者伺服器沒有斷開連線,該TCP會一直保持。
持久連線是預設開啟的,如果想要關閉,在請求頭中加上Connection:close即可關閉。
目前瀏覽器中對於同一個域名,預設允許同時建立6個TCP持久連線。
不成熟的HTTP管線化
HTTP/1.1 中試圖通過管線化的技術來解決隊頭阻塞的問題。但是因為各種原因,被各大廠商放棄治療了。
增加對虛擬主機的支援
HTTP/1.0中每個域名都只繫結唯一的IP地址,因此一個伺服器只能支援一個域名。
但是隨著虛擬主機技術的發展,一臺物理主機上繫結多個虛擬主機的需求大大提升,每個虛擬主機都有自己單獨的域名,這些單獨的域名都公用同一個IP地址。
因此,請求頭中也增加了Host欄位,表示當前的域名地址,伺服器可根據不同的Host值做不同的處理。
增加對動態生產內容的支援
HTTP/1.0需要在響應頭中設定完整的資料大小Content-Length:900,這樣,瀏覽器就可以根據設定的資料大小來接收資料。
由於伺服器端技術發展,頁面都是動態生成的,傳輸資料之前並不知道最終資料大小,導致瀏覽器不知道何時會接受完所有的檔案資料。
HTTP/1.1通過引入Chunk transfer機制來解決問題,伺服器將資料分割成若干個任意大小的資料塊,每個資料塊傳送時會附上上一個資料塊的長度,最後使用一個長度為0的塊作為傳送資料完成的標誌。
客戶端Cookie、安全機制
HTTP1.1引入了客戶端Cookie機制和安全機制。
HTTP/2.0
HTTP/1.1的缺陷
對頻寬的利用率不理想,三個問題導致:
-
TCP 的慢啟動
-
同時開啟了多條 TCP 連線,那麼這些連線會競爭固定的頻寬
-
HTTP/1.1 隊頭阻塞的問題
HTTP/2多路複用
HTTP/2使用多路複用機制解決了上述問題。
一個域名只使用一個 TCP 長連線和消除隊頭阻塞問題。通過引入二進位制分幀層,實現了 HTTP 的多路複用技術。
HTTP/2伺服器推送
伺服器可以提前將資料推送到瀏覽器,瀏覽器有權選擇是否接受。瀏覽器傳送RST_STREAM幀可以選擇拒收。
HTTP/2頭部壓縮
頭部的壓縮大大的提升了傳輸效率。HTTP/2開發了“HPACK”演算法,在客戶端和伺服器建立“字典”,用索引號表示重複的字串,還採用哈夫曼編碼來壓縮整數和字串。
HTTP/2可以設定請求的優先順序
可以設定讓某些重要的資料優先被伺服器處理並返回。
HTTP/3.0
HTTP/2的缺陷
TCP的隊頭阻塞
在 TCP 傳輸過程中,由於單個數據包的丟失而造成的阻塞稱為 TCP 上的隊頭阻塞。
HTTP/2只解決了應用層面的隊頭阻塞,隊頭阻塞的問題還存在於TCP協議本身。
TCP建立連線的延時
TCP以及TCP+TLS建立連線的所產生的延時也是影響傳輸效率的一個主要因素。
TCP協議僵化
中介軟體僵化
我們把在網際網路的各處搭建的裝置叫做中間裝置(中介軟體),比如路由器、NAT、防火牆、交換機等,它們通常依賴一些很少升級的軟體,這些軟體使用了大量的 TCP 特性,設定之後便很少進行更新。這就對我們我們更新TCP的時候造成了很大的困難,新協議的資料包經過這些中介軟體時,它們不會去理解包的內容從而丟棄掉這些資料包。
作業系統
因為 TCP 協議都是通過作業系統核心來實現的,應用程式只能使用不能修改。通常作業系統的更新都滯後於軟體的更新,所以想要更新作業系統核心中的TCP協議也是非常困難的。
QUIC協議
HTTP/3 選擇了一個折衷的方法——UDP 協議,基於 UDP 實現了類似於 TCP 的多路資料流、傳輸可靠性等功能,我們把這套功能稱為QUIC 協議。
-
實現了類似 TCP 的流量控制、傳輸可靠性的功能
-
集成了 TLS 加密功能
-
實現了 HTTP/2 中的多路複用功能
-
實現了快速握手功能