一文總結http1.0,http1.1,http2,http3,面試強心劑

語言: CN / TW / HK

theme: healer-readable

本文已參與掘金創作者訓練營第三期「話題寫作」賽道,詳情檢視:掘力計劃|創作者訓練營第三期正在進行,「寫」出個人影響力

http1.0

HTTP1.0最早在網頁中使用是在1996年,那個時候只是使用一些較為簡單的網頁上和網路請求上,是一種無狀態、無連線的應用層協議,幾年後被HTTP1.1代替並廣泛使用

http1.1

  1. http1.1基於文字解析,把所有請求和響應作為純文字
  2. http1.1加入了快取處理(強快取和協商快取)
  3. http1.1擁有長連線,並支援請求管道化pipelining),
  4. http1.1流控制基於tcp連線。當連線建立時,兩端通過系統預設機制建立緩衝區。並通過ack報文來通知對方接收視窗大小,因為http1.1 依靠傳輸層來避免流溢位,每個tcp連線需要一個獨立的流控制機制

快取處理(強快取和協商快取)

瀏覽器快取能優化效能,而瀏覽器快取分為強快取協商快取,都是從客戶端讀取快取 強快取 1. 強快取不傳送請求,直接讀取資源,可以獲得返回200的狀態碼 2. 利用http頭中的ExpiresCache-Control兩個欄位來控制,都用來表示資源的快取時間,Expires能設定失效時間,而Cache-Control能做到更多選項更細緻,如果同時設定的話,其優先順序高於Expires 協商快取 1. 通過伺服器來確定快取資源是否可用,通過request header判斷是否命中請求,命中後返回304狀態碼,並返回新的request header通知客戶端從快取裡取 2. 普通重新整理會啟用弱快取,忽略強快取。只有在位址列或收藏夾輸入網址、通過連結引用資源等情況下,瀏覽器才會啟用強快取 3. 如果時間過期,則向伺服器傳送header帶有If-None-Match和If-Modified-Since的請求,回到1

http2

  1. http2相比於http1.1,效能大幅度提升
  2. http2通過一個連線來多路複用
  3. http2擁有頭部壓縮
  4. http2擁有新的二進位制格式,使用二進位制框架層把所有訊息封裝成二進位制,且仍然保持http語法
  5. http2允許客戶端和伺服器端實現他們自己的流控制機制,而不是依賴傳輸層,兩端在傳輸層交換可用的緩衝區大小,來讓他們在多路複用流上設定自己的接收視窗
  6. http2讓伺服器可以將響應主動“推送”到客戶端快取中

htpp2頭部壓縮

  1. http2頭部壓縮又稱為HAPCK設計簡單而靈活,是因為HPACK格式有意地簡單不靈活能降低由於實現錯誤而導致的互操作性或安全問題的風險
  2. http1.1沒有頭部壓縮,隨著請求增加,冗餘頭部欄位會不必要地佔用頻寬,從而顯著增加延遲,而頭部壓縮可消除冗餘報頭欄位,限制已知安全攻擊的漏洞,並且在受限環境中使用有限的記憶體要求

http2多路複用

  1. http 效能優化的關鍵並不在於高頻寬,而是低延遲
  2. tcp 連線會隨著時間進行自我「調諧」,起初會限制連線的最大速度,如果資料成功傳輸,會隨著時間的推移提高傳輸的速度,這種調諧則被稱為 tcp 慢啟動,由於這種原因,讓原本就具有突發性和短時性的 http 連線變的十分低效
  3. http/2 通過讓所有資料流共用同一個連線,可以更有效地使用 tcp 連線,讓高頻寬也能真正的服務於 http 的效能提升。而http1.1存在低效能的線頭阻塞,一旦有一個請求超時,便會出現阻塞等待的情況

http3

之前說了http2,那麼http3就是為了解決http2相關問題而誕生,它基於一個新的傳輸層協議QUIC,而http3就是建立一個在QUIC上執行的HTTP新規範,而http3之前的版本都是基於TCP,QUIC就是為了替代TCP,解決TCP的一些缺陷

tcp

  1. 不支援流級複用,TCP會將所有物件序列化在同一個流中,因此,它不知道TCP段的物件級分割槽,無法在同一個流中複用資料包
  2. 會產生冗餘通訊,tco三次連線握手會有冗餘的訊息交換序列
  3. 可能會間歇性地掛起資料傳輸,tcp中有個因為序列順序處理丟失的問題的缺陷稱為行頭阻塞

QUIC

  1. 同樣擁有頭部壓縮,並優化了對亂序傳送的支援,也優化了壓縮率
  2. 放棄tcp,通過udp建立,提高了連線建立的速度,降低了延遲
  3. tcp本身是無法解決隊頭擁塞,quic則解決了這個問題
  4. Connection ID使得http3支援連線遷移以及NAT的重繫結