本章將把1.0、2.0、3.0進行理解
一、Http1.0
1.1.0的http版本,是一種無狀態,無連接的應用層協議。http1.0規定瀏覽器和服務器保持短暫的鏈接
2.瀏覽器每次請求都需要與服務器建立一個TCP(傳輸控制協議:是一種面向鏈接的,可靠的、基於節流的傳輸層通信協議。Ps:Http是建立在TCP之上的,當你建立起TCP鏈接之后,在上面傳輸的數據用的是HTTP協議)鏈接,服務器處理完成以后立即斷開TCP鏈接(無連接),服務器不跟蹤每個客戶單,也不記錄過去的請求
3.理解就是:HTTP1.0很笨,只會與瀏覽器保持短暫鏈接,在連接的時候得需要用到TCP,鏈接一次用一次TCP,而且不會記錄用戶得cookie和以前得請求
4.弊端:無法復用鏈接,因為每次請求都需要進行一次TCP鏈接,而TCP鏈接釋放過程又是比較費事得,這種無鏈接得特性會使得網絡得利用率變低;第二點:隊頭阻塞,由於http1.0規定下一個請求必須在前一個請求響應到達之前才發送,假設前一個請求響應一直不到達,那么下一個請求就不發送,后面得請求就阻塞
二、Http1.1
1.http繼承了HTTP1.0的簡單,克服了HTTP1.0性能上的問題
2.長連接:HTTP1.1增加COnnection字段,通過設置Keep-Alive保持HTTP鏈接不斷卡,避免每次客戶端與服務器請求都要重復建立釋放建立TCP鏈接,提高了網絡的利用率
三、HTTP2.0
1.二進制分幀:HTTP2.0通過在應用層和傳輸層之間增加一個二進制分層幀,突破了HTTP1.1得性能限制,改進傳輸性能
2多路復用(鏈接共享):
- 流(stream):已建立連接上的雙向字節流。
- 消息:與邏輯消息對應的完整的一系列數據幀。
- 幀(frame):HTTP2.0通信的最小單位,每個幀包含頭部,至少也會標識出當前所屬的流(stream_id)
所有HTTP2.0通信都在一個TCP鏈接上完成,這個鏈接可以承載任意流量的雙向數據流
每個數據流以消息的形式發送,而消息由一或多個幀組成。這些幀可以亂序發送,然后再根據每個幀頭部的流標識符(Stream_id)重新封裝
多路復用(連接共享)可能會導致關鍵字被阻塞,HTTP2.0里每個數據流都可以設置優先級和依賴,優先級高的數據流會被服務器優先處理和返回客戶端,數據流還可以依賴其他的子數據流
HTTP2.0實現了真正的並行傳輸,它能夠在一個TCP上進行任意數量的HTTP請求。而這個強大的功能基於“二級制分幀”的特性
3.頭部壓縮:
在HTTP1.X中,頭部元數據都是以純文本的形式發送的,通常會給每個請求增加500-8000字節的負荷
比如cookie,默認情況下,瀏覽器會在每次請求的時候,把cookie附在header上面發給服務器
HTTP2.0使用encoder來減少需要傳輸的header大小,通訊雙方各自cache一份header_files表,既避免重復header的傳輸,又減少了需要傳輸的大小
高效的壓縮算法可以很大的壓縮header,減少發送包的數量從而降低延遲
4.服務器推送:服務器除了最初請求的響應外,服務器還可以額外向客戶端推送資源,而無需客戶端明確的需求
四、HTTP3.0
1.Google搞了一個基於UDP協議的QUIC協議,並且使用在了HTTP/3上, HTTP/3之前的名稱為HTTP-over-QUIC;早期Quic協議,存在IETF和Google兩個版本,直到它被證實命名為HTTP3.0
2.多路復用
QUIC基於UDP,一個連接上的多個stream之間沒有依賴,即使丟包,只需要重發丟失的包即可,不需要重傳整個連接
3.更好得移動端表現
QUIC在移動端的表現比TCP好,因為TCP是基於IP識別連接,而QUIC是通過ID識別鏈接。 無論網絡環境如何變化,只要ID不便,就能迅速重新連上
4.加密認證得根文
TCP協議頭沒有經過任何加密和認證,在傳輸過程中很容易被中間網絡設備篡改、注入和竊聽
QUIC的packet可以說武裝到了牙齒,除了個別報文,比如PUBLIC_RESET和CHLO,所有報文頭部都是經過認證的,報文Body都是經過加密的
所以只要對 QUIC 做任何更改,接收端都能及時發現,有效地降低了安全風險
5.向前糾錯機制
QUIC協議有一個非常獨特的特性,稱為向前糾錯(Foward Error Connec,FEC),每個數據包除了它本身的內容之外還包括了其他數據包的數據,因此少量的丟包可以通過其他包的冗余數據直接組裝而無需重傳。
向前糾錯犧牲了每個數據包可以發送數據的上限,但是帶來的提升大於丟包導致的數據重傳,因為數據重傳將會消耗更多的時間(包括確認數據包丟失,請求重傳,等待新數據包等步驟的時間消耗)。
總結
HTTP 1.0
- 無狀態,無連接
- 短連接:每次發送請求都要重新建立tcp請求,即三次握手,非常浪費性能
- 無host頭域,也就是http請求頭里的host,
- 不允許斷點續傳,而且不能只傳輸對象的一部分,要求傳輸整個對象
HTTP 1.1
- 長連接,流水線,使用connection:keep-alive使用長連接
- 請求管道化
- 增加緩存處理(新的字段如cache-control)
- 增加Host字段,支持斷點傳輸等
- 由於長連接會給服務器造成壓力
HTTP 2.0
- 二進制分幀
- 頭部壓縮,雙方各自維護一個header的索引表,使得不需要直接發送值,通過發送key縮減頭部大小
- 多路復用(或連接共享),使用多個stream,每個stream又分幀傳輸,使得一個tcp連接能夠處理多個http請求
- 服務器推送(Sever push)
HTTP 3.0
- 基於google的QUIC協議,而quic協議是使用udp實現的
- 減少了tcp三次握手時間,以及tls握手時間
- 解決了http 2.0中前一個stream丟包導致后一個stream被阻塞的問題
- 優化了重傳策略,重傳包和原包的編號不同,降低后續重傳計算的消耗
- 連接遷移,不再用tcp四元組確定一個連接,而是用一個64位隨機數來確定這個連接
- 更合適的流量控制