QUIC(Quick UDP Internet Connection,快速UDP網絡連接)發(fā)音同 "quick",是 Google 公司在 2012 年提出的使用 UDP 進行多路并發(fā)傳輸?shù)膮f(xié)議。
2016 年,互聯(lián)網工程任務組 IETF 開始標準化 QUIC。
2017 年,Google 開發(fā)并部署了 QUIC 協(xié)議的初始設計 gQUIC。
2021 年,QUIC 協(xié)議的正式標準化版本 RFC900 發(fā)布。
QUIC協(xié)議的特性
從 QUIC 的命名中可以看到兩個關鍵詞——快速和 UDP。這個兩個關鍵詞概括了 QUIC 的特性,提供更快速、更可靠、更安全的數(shù)據(jù)傳輸方式。
快速:QUIC 比 TCP 更簡單,能夠更快速地連接。其安全性也不亞于 TCP+TLS。
UDP:QUIC 是建立在 UDP 之上的新型傳輸協(xié)議,一般在應用層發(fā)揮作用。
QUIC協(xié)議棧
QUIC協(xié)議的原理
一個 QUIC 數(shù)據(jù)包由頭部(Header)和數(shù)據(jù)(Data)組成。
QUIC數(shù)據(jù)格式
頭部(Header)中包含以下字段:
標志位(Flags):用來指示該數(shù)據(jù)包的類型、狀態(tài)等信息。
連接ID(Connection ID):用于唯一標識一個連接。
版本號(Version):表示使用的協(xié)議版本號。
包編號(Packet Number):表示數(shù)據(jù)包的順序。
數(shù)據(jù)(Data)被拆分成多個小的數(shù)據(jù)幀(Frame),每個數(shù)據(jù)幀都有自己的類型、長度和負載。數(shù)據(jù)幀通過 Stream ID 進行標識,以便于在多路復用時進行管理。
PING 幀:用于測試連接的可用性。
ACK 幀:用于確認收到數(shù)據(jù)包。
RESET_STREAM 幀:用于重置數(shù)據(jù)流的狀態(tài)。
STOP_SENDING 幀:用于停止向特定的數(shù)據(jù)流發(fā)送數(shù)據(jù)。
CRYPTO 幀:用于傳輸加密數(shù)據(jù)。
STREAM 幀:用于傳輸普通數(shù)據(jù)流。
STREAM幀結構
下面介紹 QUIC 協(xié)議中的三個核心特性原來:0-RTT 連接建立、無隊頭阻塞的多路復用、無歧義重傳。
0-RTT 連接建立
QUIC 協(xié)議使用了 0-RTT(零往返時間)連接建立技術,可以在客戶端發(fā)送第一個請求時就建立起安全連接,從而減少連接建立所需的時間。這個技術通過使用 TLS 的 Session Ticket,在服務端重啟后仍然保留連接狀態(tài),從而避免了重新握手的過程。
傳統(tǒng) HTTPs 握手包含了 TCP 和 TLS 握手,如下圖所示,總共需要 3 個 RTT。
TCP和TLS握手
從中可以看出,TLS 握手需要 1 個 RTT。通過 1 次 RTT,客戶端和服務端就協(xié)商好了通信密鑰。
客戶端:生成隨機數(shù) a,選擇公開的大數(shù) G 和 P,計算 A=a*G%P。發(fā)送 Client Hello 消息,將 A 和 G 傳遞給服務端。
服務端:生成隨機數(shù) b,計算 B=b*G%P。發(fā)送 Server Hello 消息。將 B 傳遞給客戶端。
客戶端:通過秘鑰加密算法生成通信密鑰 KEY = aB = ab*G%P。
服務端:通過秘鑰加密算法生成通信密鑰 KEY = bA = ba*G%P。
QUIC 的握手是基于 TLS1.3 實現(xiàn)的,建立連接時也應該需要1次 RTT,那 QUIC 的 0-RTT 連接是如何實現(xiàn)的?
首次握手后,QUIC 的客戶端緩存了 Server Hello,那么在下次建連時,可以直接使用緩存數(shù)據(jù)計算通信密鑰,如下圖所示。
0-RTT連接
客戶端:生成隨機數(shù) c,選擇公開的大數(shù) G 和 P,計算 A=c*G%P。發(fā)送 Client Hello 消息,將 A 和 G 傳遞給服務器。
客戶端:直接使用緩存的 Server Hello 計算通信密鑰 KEY = cB = cb*G%P,加密并發(fā)送應用數(shù)據(jù)。
服務端:根據(jù) Client Hello 消息計算通信密鑰 KEY = bA = bc*G%P。
通過緩存 Server Hello,在生成 Client Hello 的同時,加密了應用數(shù)據(jù),所以客戶端不需要經過握手就可以發(fā)送應用數(shù)據(jù),這就是 QUIC 的 0-RTT 連接。
無隊頭阻塞的多路復用
瀏覽器限制了同一個域名下的請求數(shù)量。當請求達到最大數(shù)量時,剩余的資源需要等待其他資源請求完成后才能發(fā)起請求,這就是隊頭阻塞(Head of Line Blocking)。
在傳統(tǒng)的 HTTP/1 協(xié)議中,每個 TCP 連接只能處理唯一的請求,因此當需要請求多個資源時,需要建立多個 TCP 連接。為了解決 HTTP/1 的核心問題,在 HTTP/2 中引入了多路復用的技術,這個技術可以只通過一個 TCP 連接就可以傳輸所有的請求數(shù)據(jù),如下圖。
多路復用很好的解決了瀏覽器限制同一個域名下的請求數(shù)量的問題,從而提高網絡吞吐量。此外,QUIC 協(xié)議還支持數(shù)據(jù)流級別的擁塞控制,可以更精細地控制網絡擁塞。
TCP連接
HTTP/2 雖然通過多路復用解決了 HTTP 層的隊頭阻塞,但仍然存在 TCP 層的隊頭阻塞問題。在 HTTP/2 中,如果 TCP 連接中出現(xiàn)了丟包的情況,那么整個 TCP 都要開始等待重傳,后面的所有數(shù)據(jù)都將被阻塞。在這種情況下, HTTP/2 的表現(xiàn)情況反倒不如 HTTP/1 。
QUIC 通過為每個請求流都分配一個獨立的滑動窗口,解決 TCP 層的隊頭阻塞。如下圖,A 請求流上的丟包不會影響 B 請求流上的數(shù)據(jù)發(fā)送。
QUIC連接
無歧義重傳
為了保證可靠性,TCP 使用基于序號的 Sequence Number 和 Ack 來確認消息的有序到達。在 TCP 中,重傳包的 sequence number 和原始包的Sequence Number 是不變的,也正是因此這個特性,引發(fā)了 Tcp 重傳歧義問題。當超時事件 RTO 發(fā)生后,客戶端發(fā)起重傳,然后接收到了 Ack 數(shù)據(jù)。但由于 Sequence Number 是一樣的,這個接收到的 Ack 到底是原始請求的響應還是重傳請求的響應呢?這導致了 RTT 計算歧義。
TCP重傳歧義性
QUIC 則是采用了單向遞增的 Packet Number 來標識數(shù)據(jù)包,因此不會像 TCP 一樣,不會因為超時重傳了同樣序列的數(shù)據(jù)包,造成 RTT 和 RTO(Retransmission Time Out,重傳超時時間)的計算不準確。每個 Packet Number 都嚴格遞增,就算 Packet N 丟失了,重傳的 Packet N 的 Packet Number 已經不是 N,而是一個比 N 大的值。
QUIC的RTT計算
QUIC 對于 RTT 的計算更為準確,預估的超時時間能夠有效防止更多的重傳請求被錯誤地發(fā)送回客戶端。同時也給予了 QUIC 網絡更為快速的反應時間,及時通知客戶端重傳數(shù)據(jù)包。
但是單純依靠嚴格遞增的 Packet Number 肯定是無法保證數(shù)據(jù)的順序性和可靠性。
QUIC 引入了 Stream Offset 的概念,通過 Stream Offset 可以保證應用數(shù)據(jù)的順序。假設客戶端先后發(fā)送了 Pakcet N 和 Pakcet N+1,Stream Offset 分別是 x 和 x+y。如果 Packet N 丟失,引發(fā)重傳,重傳的 Packet Number 是 N+2,但是它的 Stream Offset 依然是 x,這樣就算 Packet N + 2 是后到的,依然可以將 Stream x 和 Stream x+y 按照順序組織起來,交給應用程序處理。
QUIC協(xié)議的應用場景
QUIC 為各種領域提供了可靠、高效和安全的數(shù)據(jù)傳輸方案,其中最具潛力的應用場景包括:
實時 Web 和移動應用
這些應用需要低延遲和可靠的數(shù)據(jù)傳輸。通過相互獨立的數(shù)據(jù)流和擁塞控制機制,QUIC 可以快速高效地發(fā)送和接收數(shù)據(jù)。在多路復用模式下,QUIC 同一連接內不同數(shù)據(jù)流之間的數(shù)據(jù)傳輸互不干擾。
與物聯(lián)網設備通信
物聯(lián)網設備通常使用 TCP 和 MQTT 等協(xié)議進行通信,在受限的網絡環(huán)境中可能存在高延遲和丟包等問題。相比之下,QUIC 可以極近實現(xiàn) 0-RTT,為高延遲和丟包的網絡環(huán)境,提供了更可靠和高效的替代方案。
支付和電子商務應用
這些應用需要安全可靠的數(shù)據(jù)傳輸。QUIC 通過 TLS 加密和可靠的數(shù)據(jù)流,使其成為這些應用的理想選擇,有助于保證數(shù)據(jù)安全完整地傳輸。從用戶的角度來看,QUIC 通過保證更快、更順暢的交易,優(yōu)化了用戶體驗。
當前,QUIC 協(xié)議已經成為 IETF 標準化工作組的一個項目,并且越來越多的互聯(lián)網公司開始支持 QUIC 協(xié)議。隨著 QUIC 協(xié)議的普及,我們可以期待更快、更安全、更可靠的網絡體驗。
審核編輯:湯梓紅
-
數(shù)據(jù)傳輸
+關注
關注
9文章
1954瀏覽量
64855 -
物聯(lián)網
+關注
關注
2913文章
44930瀏覽量
377065 -
UDP
+關注
關注
0文章
327瀏覽量
34045 -
Quic
+關注
關注
0文章
25瀏覽量
7320
原文標題:三分鐘,帶你了解下一代傳輸層協(xié)議QUIC
文章出處:【微信號:ztedoc,微信公眾號:中興文檔】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論