引子
HTTP協議已經有多個版本了,一般情況我們訪問的網站要是HTTP1.1要么是HTTP2,它們有什么區別呢? 為什么各個網站不統一使用同一種協議呢?
版本
截止到現在,IETF已經發布了5個HTTP協議了,包括HTTP0.9、HTTP1.0、HTTP1.1、HTTP2、HTTP3.下面講一下各個版本的區別:
HTTP0.9
1991年發布, 沒有header,功能非常簡單,只支持GET。
HTTP1.0
1996年發布,明文傳輸安全性差,header特別大。它相對0.9有以下增強:
- 增加了header(使用元數據與數據解耦)
- 增加了status code,用于聲明請求的結果。
- content-type可以傳輸其它文件。
- 請求頭增加了http/1.0版本號。
缺點:每請求一次資源就新建一次tcp連接
HTTP1.1
1997發布,是現在使用最廣泛的版本。它相對1.0有以下增強:
- 可以設置keepalive讓http重用tcp連接(請求必需串行發送)
- 支持pipeline傳輸,請求發出后可以繼續發送請求
- 增加了HOST頭,讓服務端知道用戶請求的是哪個域名
- 增加了type、language、encoding等header
2014年更新了內容:
- 增加了TLS支持,即https傳輸
- 支持四種模型:短連接,可重用tcp的長鏈接,服務端push模型(服務端主動將數據推送到客戶端cache中),websocket模型
缺點:還是文本協議,客戶端服務端都需要利用cpu解壓縮
HTTP2
2015年發布,主要是提升安全性與性能。它相對1.1的增強有:
- 頭部壓縮(合并同時發出請求的相同部分)
- 二進制分幀傳輸,更方便頭部只傳輸差異部分
- 流多路復用,同一服務下只需要用一個連接,節省了連接
- 服務器推送,一次客戶端請求服務端可以多次響應。
- 可以在一個tcp連接中并發發送請求
缺點:基于tcp傳輸,會有隊頭阻塞問題(丟包停止窗口滑動),tcp會丟包重傳。tcp握手延時長,協議僵化問題。
HTTP3
2018年發布,基于谷歌的QUIC,底層使用udp代碼tcp協議,
這樣解決了隊頭阻塞問題,同樣無需握手,性能大大地提升,默認使用tls加密。
原文鏈接:https://mp.weixin.qq.com/s/00EqbbncGVbhxH1mAmmaMg