Quic如何實現udp可靠傳輸

QUIC(Quick UDP Internet Connections)是由 Google 設計并被 IETF 標準化的傳輸層協議,它基于 UDP 實現,但提供了類似 TCP 的可靠性和更高級的功能(如多路復用、0-RTT 握手、TLS 加密等)。

盡管 UDP 是不可靠的,QUIC 實現了自己的機制來提供:

? 可靠傳輸、順序保證、流控、擁塞控制、加密通信


🚀 一句話理解:

QUIC 在 UDP 之上自己造了一個“更好的 TCP”,通過用戶態實現可靠傳輸。


🧩 QUIC 如何在 UDP 上實現可靠傳輸?

下面是 QUIC 提供可靠性的核心機制:


? 1. 數據分片與多路復用(Streams)

  • QUIC 使用 Stream 概念將數據拆分成多個邏輯流,每個流有自己的 ID 和順序控制。

  • 每個數據包中可能包含多個流的數據片段。

  • 每個 Stream 保持自己的有序性和重傳機制,互不影響,解決了 TCP 的“隊頭阻塞(Head-of-line blocking)”問題。


? 2. ACK 機制與重傳

  • 每個 QUIC 包都有一個唯一的包序號(Packet Number)。

  • 接收方會通過 ACK frame 顯式告訴發送方收到了哪些包(可能是一個范圍段,例如 ACK [5,6,7,9])。

  • 發送方根據 ACK 結果進行 選擇性重傳(Selective Retransmission),而不是像 TCP 那樣使用窗口回退(Go-Back-N)。


? 3. 流控(Flow Control)

QUIC 實現了兩級流控:

類型控制內容
連接級流控控制整個連接中所有數據的大小
流級流控控制單個 Stream 可發送的字節量

避免發送方淹沒接收方,防止內存爆炸。

QUIC 實現流控(Flow Control)是為了防止發送方發送太多數據而壓垮接收方的內存,確保 發送速度與接收能力匹配

QUIC 的流控機制比 TCP 更靈活,它支持:

連接級流控(Connection-level) + 流級流控(Stream-level)


? 一句話總結:

QUIC 使用 MAX_DATAMAX_STREAM_DATA 幀,讓接收方“顯式告訴”發送方它還能接受多少數據,從而實現精細的流控。


🔍 QUIC 的兩個流控層次

類型控制范圍控制方式
連接級流控控制整個連接總共能發多少數據使用 MAX_DATA 幀通知
流級(單條流)流控控制某條 stream 能發多少數據使用 MAX_STREAM_DATA 幀通知

🧩 工作機制詳解

1. 🚦 初始窗口(Initial Flow Control Window)

  • 每當連接或某個 stream 建立時,接收方通過 Transport Parameters 告訴發送方:

    initial_max_data = 65536       # 整個連接最多能發 64KB
    initial_max_stream_data = 32768 # 每個 stream 最多能發 32KB
    

2. 📤 發送方:按窗口大小發數據

  • 每個 packet 中的數據都有位置偏移(offset)

  • 發送方不能發送超過 offset > max_data 的內容

  • 如果快達到限制,就暫停發送,等接收方“放行”


3. 📥 接收方:接收 + 消費數據后,發送 MAX_*

當接收方:

  • 消費了部分數據(應用層讀取了),或者

  • 有更多緩沖空間

就會發以下幀通知發送方放寬限制:

幀類型作用
MAX_DATA提高連接級可發送總量
MAX_STREAM_DATA提高某個 stream 的可發送數據量

📝 例子:

MAX_STREAM_DATA(StreamID=5, MaximumData=64000)
MAX_DATA(MaximumData=128000)

4. 🚧 如果發送方超過限制會怎樣?

  • 接收方會直接 丟棄該數據包

  • 并可能發送 FLOW_CONTROL_ERROR 幀,強制斷開連接


🔁 動態調整窗口(流控窗口增長)

QUIC 支持動態調整窗口大小,類似 TCP 的“滑動窗口”機制,但更靈活:

  • 接收方可以基于自身處理速度、緩沖區情況等策略動態調整

  • 應用層可參與窗口策略調整(QUIC 是用戶態協議)


📊 示例圖:QUIC 流控流程簡圖

       [Sender]                           [Receiver]│                                   ││───── Data (offset: 0~32767) ─────?│   ? 在窗口范圍內│───── Data (offset: 32768~65535) ─?│   ? 超出流窗口限制│                                   ││?───── MAX_STREAM_DATA (64000) ────│   ? 允許再發更多

? 總結:QUIC 的流控機制比 TCP 更靈活的地方

特性TCPQUIC
支持多路復用下的流控? 需應用層實現? 原生支持 per-stream 流控
流控信息粒度每個連接一組窗口每個流都有單獨窗口
流控窗口通告方式被動通告(ACK + 窗口值)主動通告(MAX_* 幀)
動態擴展有,但實現不易簡潔靈活,用戶態易擴展

? 4. 擁塞控制(Congestion Control)

  • QUIC 可復用 TCP 的擁塞控制算法(如 Reno、CUBIC、BBR 等)。

  • 因為 QUIC 完全在用戶態,所以可以快速升級/切換擁塞算法,而不需要內核修改。


? 5. 加密與握手(TLS 1.3)


🧵 四、多路復用避免隊頭阻塞,加速整體數據流

TCP 中多個邏輯流復用一個連接時,某個小包丟失可能導致整個流被阻塞(隊頭阻塞)。

QUIC 的解決方式:


📶 五、QUIC 支持連接遷移,減少斷線重連時間


🔚 小結一句話:

QUIC + UDP 快的根本原因在于它跳過了 TCP 的繁瑣握手、內核開銷和流阻塞,通過用戶態協議 + 0-RTT 加密通信讓“發第一個字節”變得更快。


? 總結對比表

項目TCP + TLSQUIC + UDP
握手延遲至少 1~2 RTT最快 0-RTT,首次僅需 1 RTT
加密TLS 分層內建 TLS 1.3,第一包就加密
隊頭阻塞存在消除(Stream 級別傳輸)
連接狀態內核態管理用戶態管理,效率高
多路復用需要上層協議實現協議原生支持
連接遷移不支持原生支持 Connection ID 遷移
適合移動網絡一般非常適合(連接遷移 + 0-RTT)
  • 所有 QUIC 數據包(除了第一個)都是 強加密 的。

  • 基于 TLS 1.3 實現握手和密鑰協商,合并傳輸和加密握手,支持 0-RTT 和 1-RTT 連接建立

  • 避免了 TCP + TLS 的多輪握手,提高首次連接速度。

  • 🔍 詳細原因分析(按階段分解)


    🟡 一、TCP + TLS 的握手流程 = 至少 3 次往返

    傳統的 TCP 連接建立 + TLS 加密握手如下:

    1. TCP 三次握手(1.5 RTT):Client → SYNServer → SYN-ACKClient → ACK2. TLS 1.2(或 1.3)握手(再來 1~2 RTT)3. 才能發送加密數據
    

    即:首次連接至少耗時 1~2 RTT(往返時間)


    🟢 二、QUIC 將 握手和加密合并在一次往返中

    QUIC 的握手流程使用 TLS 1.3 直接集成在傳輸協議中:

  • 首次連接(1-RTT):

  • Client → Initial Packet(攜帶 TLS Client Hello)   ← 第一次發包就帶加密握手← Server Hello + 加密信息(+ 證書等)
    Client → Finished(+ 應用數據)
    
  • 重連(0-RTT):

  • Client → 數據 + 加密握手(直接發數據!)   ← ★ 零延遲
    

    👉 QUIC 可以實現 “0-RTT 數據傳輸”,幾乎是立即發送第一條消息。


    🔧 三、UDP 不需要內核狀態建立連接,QUIC 在用戶態實現更靈活

  • TCP 是 面向連接的:需要在內核里維護連接狀態(socket 狀態機)。

  • UDP 是無連接協議,QUIC 在用戶態自己管理連接狀態,避免了內核/用戶態頻繁切換。

  • 用戶態連接管理允許更快的上下文切換、更容易多路復用。

  • 每個 stream 有獨立的傳輸/重傳機制

  • 某一 stream 丟包不會阻塞其他流,數據能更快抵達

  • QUIC 連接綁定在 Connection ID,而不是 IP + Port

  • 移動設備換網(如從 Wi-Fi 切 4G)時無需重新建立連接,延遲更小


? 6. 包編號與重排重組

  • QUIC 的包編號是嚴格遞增的,不可重用。

  • 即使包亂序到達,也可通過包號重排序。

  • QUIC 自己實現了類似 TCP 的 SACK(Selective ACK) 功能。?


? 7. 頭部校驗和加密保護

  • 包頭也經過加密處理,防止中間人攻擊(如修改流量控制字段等)。


📦 總結:QUIC 如何在 UDP 上“可靠傳輸”

技術點實現作用
Stream(多路復用)消除隊頭阻塞、實現數據隔離
Packet Number + ACK保證數據到達與丟包檢測
重傳機制實現可靠交付
流控 + 擁塞控制限制數據發送速度,防止擁堵
TLS1.3 加密確保安全性和身份驗證
用戶態實現更靈活,可快速迭代


📌 簡圖:QUIC vs TCP(在可靠性層面)

         ┌──────────────┐         ┌──────────────┐│   應用層     │         │   應用層     │└────┬──────▲──┘         └────┬──────▲──┘▼      │                  ▼      │┌──────────────┐         ┌──────────────┐│   QUIC 協議  │         │   TCP 協議   │└────┬──────▲──┘         └────┬──────▲──┘▼      │                  ▼      │┌──────────────┐         ┌──────────────┐│   UDP/IP     │         │   IP層       │└──────────────┘         └──────────────┘

QUIC + UDP 連接更快,是因為它在 連接建立階段(握手)和數據傳輸機制方面做了大量優化,特別針對 TCP 的延遲瓶頸進行了設計改進。


? 簡要結論:

QUIC 比 TCP 快,主要因為它省掉了握手輪次 + 消除了 TCP+TLS 分層帶來的延遲 + 更高效的連接復用。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81190.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81190.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81190.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp-商城-59-后臺 新增商品(屬性的選中,進行過濾展示,filter,some,every和map)

前面講了屬性的添加,添加完成后,數據庫中已經存在數據了,這時再繼續商品的添加時,就可以進行屬性的選擇了。 在商品添加過程中,屬性選擇是一個關鍵步驟。首先,界面需要展示嵌套的屬性數據,用戶通…

負載均衡 ELB 在 zkmall開源商城高流量場景下的算法優化

在電商大促、直播帶貨等高頻交易場景下,流量突發增長對系統穩定性提出嚴峻挑戰。ZKmll 開源商城通過對負載均衡 ELB(Elastic Load Balancer)算法的深度優化,結合業務場景特性設計動態加權輪詢 地域感知 熱點分流的混合策略&…

Linux干貨(三)

前言 從B站黑馬程序員Linux課程摘選的學習干貨,新手友好!若有侵權,會第一時間處理。 目錄 前言 1.which find命令 1.which命令 2.find命令 2.grep wc 管道符 1.grep命令 2.wc命令 3.管道符 3.echo tail 重定向符 1.echo命令 2.反…

Sigmoid與Softmax:從二分類到多分類的深度解析

Sigmoid與Softmax:從二分類到多分類的深度解析 聯系 函數性質:二者都是非線性函數 ,也都是指數歸一化函數,可將輸入值映射為0到1之間的實數 ,都能把輸出轉化成概率分布的形式,在神經網絡中常作為激活函數使用。Softmax是Sigmoid的推廣:從功能角度看,Softmax函數可視為…

文件系統交互實現

關于之前的搭建看QT控件文件系統的實現-CSDN博客,接下來是對本程序的功能完善,我想著是這樣設計的,打開一個目錄以后,鼠標選中一個項可以是目錄,也可以是文件,右鍵可以出現一個菜單選擇操作,比如…

[ctfshow web入門] web75

信息收集 啟用了open_basedir,所以之前的方法又不能用了 解題 cforeach(new DirectoryIterator("glob:///*") as $a){echo($a->__toString(). ); } ob_flush();cif ( $a opendir("glob:///*") ) {while ( ($file readdir($a)) ! false …

Vulfocus靶場-文件上傳-3

WSO2 文件上傳 (CVE-2022-29464) WSO2是一家成立于 2005 年的開源技術提供商。它提供了一個企業平臺,用于在本地和整個 Internet 上 集成應用程序編程接口(API)、應用程序和 Web 服務。 某些 WSO2 產品允許無限制的文件上傳和遠程代碼執行。…

基于MCP的橋梁設計規范智能解析與校審系統構建實踐

引言 今天本文準備盤一個大活,聊一聊偏特定行業一點的AI技術深入應用思考及實踐。 一、傳統設計行業項目背景與行業痛點 在橋梁設計領域,標準規范是設計的基礎,直接關系到橋梁結構的安全性、耐久性和經濟性。然而,傳統的規范應…

遠程連接電腦的方法?異地遠程桌面連接和三方軟件實現

遠程連接電腦,是指通過網絡技術,在一臺設備上操控另一臺設備的電腦桌面,實現跨地域的操作和管理。在日常工作、技術支持、遠程辦公等場景中,遠程連接電腦都發揮著重要作用。實現遠程連接電腦主要有系統自帶工具和第三方軟件兩種方…

win11 安裝 wsl ubuntu 18.04后換源失敗!

記錄幾個問題是如何解決的。 一 下載wsl后,有報錯: Installing, this may take a few minutes... WslRegisterDistribution failed with error: 0x8007019e Error: 0x8007019e ??????? Linux ? Windows ???? Press any key to continue... …

PY32系列單片機離線燒錄器,可配置選項字節和上機臺批量燒錄

PY32離線燒錄器采用 MINI-USB 接口,提供穩定的物理連接。設備與電腦采用串口方式通訊,波特率固定為 1M。需配合我們的上位機使用。PY32離線燒錄器現支持芯片型號在PY32F002A/002B/002/003/030/071/072/040/403/303各封裝和XL32F001/003。燒錄器僅提供 3.…

深入理解 this 指向與作用域解析

引言 JavaScript 中的 this 關鍵字的靈活性既是強大特性也是常見困惑源。理解 this 的行為對于編寫可維護的代碼至關重要,但其動態特性也會讓我們感到困惑。 與大多數編程語言不同,JavaScript 的 this 不指向函數本身,也不指向函數的詞法作…

# IntelliJ IDEA企業版開發入門:包、類與項目結構詳解

--- ## 一、項目結構與包的概念 ### 1. 標準項目目錄解析 在IntelliJ IDEA中,一個Java項目通常包含以下核心目錄: - **src**:源代碼根目錄。 - **main**:主代碼目錄,存放業務邏輯代碼。 - **java**:Java…

NGINX 開源與社區動態:從基石到浪潮,持續演進的生態力量

NGINX 之所以能夠成為全球應用最為廣泛的 Web 服務器和反向代理軟件之一,其成功的核心驅動力無疑是開源。開放的源代碼、活躍的社區參與以及透明的開發過程,共同鑄就了 NGINX 的輝煌。然而,正如所有大型開源項目一樣,NGINX 的開源之路也并非一帆風順,其社區動態也時常涌現…

Electron(一)

前言: 參考尚硅谷視頻記錄:b站尚硅谷視頻-1小時上手electron 一、什么是electron? 是一款應用廣泛的、跨平臺的、桌面應用開發框架。 應用廣泛:很多桌面應用都是這個框架寫的,例如騰訊qq、百度云跨平臺:跨window、…

AI Agent開發第64課-DIFY和企業現有系統結合實現高可配置的智能零售AI Agent(上)

開篇 我們之前花了將近10個篇章講Dify的一些基礎應用,包括在講Dify之前我們講到了幾十個AI Agent的開發例子,我不知道大家發覺了沒有,在AI Agent開發過程中我們經常會伴隨著這樣的一些問題: 需要經常改貓娘;需要經常改調用LLM的參數,甚至在一個流程中有3個節點,每個節點…

ssti刷刷刷

[NewStarCTF 公開賽賽道]BabySSTI_One 測試發現過濾關鍵字,但是特殊符號中括號、雙引號、點都能用 可以考慮拼接或者編碼,這里使用拼接 ?name{{()["__cla"~"ss__"]}}?name{{()["__cla"~"ss__"]["__ba&…

google-Chrome常用插件

google-Chrome常用插件 1. json格式化展示插件 github下載jsonview-for-chrome插件 通過離線安裝方式 拓展程序-》管理拓展程序-》打開開發者模式-》加載已解壓的拓展程序-》選擇拓展程序解壓的位置 2. 翻譯插件 插件下載地址:Immersive Translate - Bilingual …

基于redis實現分布式鎖方案實戰

分布式鎖的進階實現與優化方案 作為Java高級開發工程師,我將為您提供更完善的Redis分布式鎖實現方案,包含更多生產級考量。 1. 生產級Redis分布式鎖實現 1.1 完整實現類(支持可重入、自動續約) import redis.clients.jedis.Je…

XML簡要介紹

實際上現在的Java Web項目中更多的是基于springboot開發的,所以很少再使用xml去配置項目。所以我們的目的就是盡可能快速的去了解如何讀懂和使用xml文件,對于DTD,XMLSchema這類約束的學習可以放松,主要是確保自己知道這里面的大致…