HTTP 3規範正式發佈

語言: CN / TW / HK

一、概述

6月6日,IETF QUIC、比利時的HTTP工作組成員Robin Mark在Twitter上宣佈: 歷時 5 年,HTTP 3終於被標準化為RFC 9114。將與RFC 9204(QPACK header 壓縮)和 RFC 9218 (可擴展的優先級)一起開啟 Web 的新篇章!

這意味着HTTP 3協議已經進入了穩定的狀態,與此同時,HTTP 2也更新為新的RFC 9113標準。

image.png

不同於HTTP 1、HTTP 2,HTTP 3 是基於UDP的QUIC協議。

image.png

相比HTTP 1.x和HTTP2而言,HTTP3主要是集中在如何提高傳輸效率。眾所周知,HTTP2協議雖然大幅提升了HTTP 1.1的性能,基於TCP實現的HTTP2遺留下3個問題: - 有序字節流引出的隊頭阻塞(Head-of-line blocking),使得HTTP2的多路複用能力大打折扣; - TCP與TLS疊加了握手時延,建鏈時長還有1倍的下降空間; - 基於TCP四元組確定一個連接,這種誕生於有線網絡的設計,並不適合移動狀態下的無線網絡,這意味着IP地址的頻繁變動會導致TCP連接、TLS會話反覆握手,成本高昂。

而HTTP3協議解決了上述的問題: - HTTP3基於UDP協議重新定義了連接,在QUIC層實現了無序、併發字節流的傳輸,解決了隊頭阻塞問題; - HTTP3重新定義了TLS協議加密QUIC頭部的方式,既提高了網絡攻擊成本,又降低了建立連接的速度; - HTTP3 將Packet、QUIC Frame、HTTP3 Frame分離,實現了連接遷移功能,降低了5G環境下高速移動設備的連接維護成本。

二、QUIC協議

QUIC 協議層就實現了可靠的數據傳輸,擁塞控制,加密,多路數據流。至於 QUIC 為什麼使用了 UDP 協議,作用是頻繁的用户態和核心態切換會效率問題。

理論上説,將應用層的東西遷移到內核從而提升效率是可行的,但是這麼做會帶來操作系統穩定性的問題。另一方面,我們可以選擇將這部分內容遷移到用户空間。比如目前流行的 DPDK,當網卡將數據包傳輸過來時,它是繞過內核在用户空間進行控制和應用。

那為什麼QUIC 使用了 UDP協議呢? - 避免 ossification(僵化):QUIC 協議加密負載,也是避免協議僵化一種方式,比如當中間層處理 UDP 數據時,只需要按照數據包的方式去處理即可,不需要去關注內部層的具體信息。 - 放棄改進 TCP 本身,效率上得到完全的提升; - QUIC 是由谷歌提出的,所以 UDP 是以瀏覽器為出發點,從協議、從瀏覽器方向來進行創新。

Quic(QuickUDP Internet Connections)是一種新的傳輸方式,與TCP相比,它減少了延遲。表面上,Quic非常類似於在UDP上實現的TCP+TLS+HTTP/2。由於TCP是在操作系統內核和中間件固件中實現的,因此對TCP進行重大更改幾乎是不可能的。然而,由於Quic是構建在UDP之上的,所以它沒有受到這樣的限制。

  • Quic在現有TCP+TLS+HTTP 2上的關鍵特性包括:
  • 大大縮短連接建立時間
  • 改進的擁塞控制
  • 無線頭阻塞的多路複用
  • 前向糾錯
  • 連接遷移

下圖是使用Quic協議的HTTP3的工作流程圖:

3.gif

三、HTTP3協議

通過前文的介紹,相信大家對HTTP3已經有了一個初步的瞭解。總的來説,HTTP3協議使用的QUIC提供的多路複用提高了傳輸效率,而本身並沒有更改HTTP的語義。

HTTP 3與HTTP2一樣,採用二進制、靜態表、動態表與Huffman算法對HTTP Header編碼,不只提供了高壓縮率,還加快了發送端編碼、接收端解碼的速度。不過,由於HTTP1協議不支持多路複用,這樣高併發只能通過多開一些TCP連接實現。因此,HTTP2與HTTP3都在應用層實現了多路複用功能。

image.png

HTTP2協議基於TCP有序字節流實現,因此應用層的多路複用並不能做到無序地併發,在丟包場景下會出現隊頭阻塞問題,下圖演示了HTTP2協議中報文丟失造成的阻塞。

1.gif

當網絡繁忙時,丟包概率會很高,多路複用受到了很大限制。因此,HTTP3採用UDP作為傳輸層協議,重新實現了無序連接,並在此基礎上通過有序的QUIC Stream提供了多路複用,如下圖所示:

image.png

可以看到,相比HTTP2,HTTP3對傳輸層和表示層進行了重新改造,改造後在多路複用後,丟包阻塞的問題得到了解決,雖然某個包丟失了,但是並不會影響其他包的傳遞。

2.gif

總的來説,HTTP3創造出Connection ID概念實現了連接遷移,通過融合傳輸層、表示層,既縮短了握手時長,也加密了傳輸層中的絕大部分字段,提升了網絡安全性。

同時,HTTP3在Packet層保障了連接的可靠性,在QUIC Frame層實現了有序字節流,在HTTP3 Frame層實現了HTTP語義,這徹底解開了隊頭阻塞問題,真正實現了應用層的多路複用。

參考:https://zhuanlan.zhihu.com/p/431672713