一、HTTP1.0
HTTP
協議的第二個版本,第一個在通訊中指定版本號的HTTP協議版本
HTTP 1.0
瀏覽器與伺服器只保持短暫的連線,每次請求都需要與伺服器建立一個TCP
連線
伺服器完成請求處理後立即斷開TCP
連線,伺服器不跟蹤每個客戶也不記錄過去的請求
簡單來講,每次與伺服器互動,都需要新開一個連線
例如,解析html
檔案,當發現檔案中存在資原始檔的時候,這時候又建立單獨的連結
最終導致,一個html
檔案的訪問包含了多次的請求和響應,每次請求都需要建立連線、關係連線
這種形式明顯造成了效能上的缺陷
如果需要建立長連線,需要設定一個非標準的Connection欄位 Connection: keep-alive
二、HTTP1.1
在HTTP1.1
中,預設支援長連線(Connection: keep-alive
),即在一個TCP連線上可以傳送多個HTTP
請求和響應,減少了建立和關閉連線的消耗和延遲
建立一次連線,多次請求均由這個連線完成
這樣,在載入html
檔案的時候,檔案中多個請求和響應就可以在一個連線中傳輸
同時,HTTP 1.1
還允許客戶端不用等待上一次請求結果返回,就可以發出下一次請求,但伺服器端必須按照接收到客戶端請求的先後順序依次回送響應結果,以保證客戶端能夠區分出每次請求的響應內容,這樣也顯著地減少了整個下載過程所需要的時間
同時,HTTP1.1
在HTTP1.0
的基礎上,增加更多的請求頭和響應頭來完善的功能,如下:
- 引入了更多的快取控制策略,如If-Unmodified-Since, If-Match, If-None-Match等快取頭來控制快取策略
- 引入range,允許值請求資源某個部分
- 引入host,實現了在一臺WEB伺服器上可以在同一個IP地址和埠號上使用不同的主機名來建立多個虛擬WEB站點
並且還新增了其他的請求方法:put
、delete
、options
...
三、HTTP2.0
而HTTP2.0
在相比之前版本,效能上有很大的提升,如新增了一個特性:
- 多路複用
- 二進位制分幀
- 首部壓縮
- 伺服器推送
多路複用
HTTP/2
複用TCP
連線,在一個連線裡,客戶端和瀏覽器都可以同時傳送多個請求或回應,而且不用按照順序一一對應,這樣就避免了”隊頭堵塞”
二進位制分幀
幀是HTTP2
通訊中最小單位資訊
HTTP/2
採用二進位制格式傳輸資料,而非 HTTP 1.x
的文字格式,解析起來更高效
將請求和響應資料分割為更小的幀,並且它們採用二進位制編碼
HTTP2
中,同域名下所有通訊都在單個連線上完成,該連線可以承載任意數量的雙向資料流
每個資料流都以訊息的形式傳送,而訊息又由一個或多個幀組成。多個幀之間可以亂序傳送,根據幀首部的流標識可以重新組裝,這也是多路複用同時傳送資料的實現條件
首部壓縮
HTTP/2
在客戶端和伺服器端使用“首部表”來跟蹤和儲存之前傳送的鍵值對,對於相同的資料,不再透過每次請求和響應傳送
首部表在HTTP/2
的連線存續期內始終存在,由客戶端和伺服器共同漸進地更新
伺服器推送
HTTP2
引入伺服器推送,允許服務端推送資源給客戶端
伺服器會順便把一些客戶端需要的資源一起推送到客戶端,如在響應一個頁面請求中,就可以隨同頁面的其它資源
免得客戶端再次建立連線傳送請求到伺服器端獲取
這種方式非常合適載入靜態資源
四、總結
HTTP1.0:
- 瀏覽器與伺服器只保持短暫的連線,瀏覽器的每次請求都需要與伺服器建立一個TCP連線
HTTP1.1:
- 引入了持久連線,即TCP連線預設不關閉,可以被多個請求複用
- 在同一個TCP連線裡面,客戶端可以同時傳送多個請求
- 雖然允許複用TCP連線,但是同一個TCP連線裡面,所有的資料通訊是按次序進行的,伺服器只有處理完一個請求,才會接著處理下一個請求。如果前面的處理特別慢,後面就會有許多請求排隊等著
- 新增了一些請求方法
- 新增了一些請求頭和響應頭
HTTP2.0:
- 採用二進位制格式而非文字格式
- 完全多路複用,而非有序並阻塞的、只需一個連線即可實現並行
- 使用報頭壓縮,降低開銷
- 伺服器推送
參考文獻
- https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE#HTTP/1.0
- https://www.jianshu.com/p/52d86558ca57
- https://segmentfault.com/a/1190000016496448
- https://zhuanlan.zhihu.com/p/26559480
如果對您有所幫助,歡迎您點個關注,我會定時更新技術文件,大家一起討論學習,一起進步。