quic協議與應用開發

quic為什么出現?

quic主要是為了解決TCP協議的局限性而提出的,具體來說是要解決如下問題:

1. 加密連接建立時間長

TCP協議是傳輸層協議,而TLS是會話層協議,在Linux等主流操作系統中TCP在內核實現而TLS一般在用戶態實現,因此基于TCP+TLS的典型加密連接至少需要2RTT才能完成建連。

2. 隊頭阻塞/多流建立時延

TCP協議中沒有明確的流(stream)的概念,或者說TCP語境中流和連接是等價的。在需要并發傳輸多段數據的情況下,TCP需要建立多條連接才能實現多數據段的完全并行傳輸,而多連接的建立又會產生更多的時延,即使使用TCP fastopen也仍然會產生一次TLS握手時延。

并行傳輸的另一個實現方式是多請求復用單個連接。雖然在HTTP2等協議中支持多請求流并行收發,但這只是一個應用層的邏輯概念,在TCP傳輸中仍然只支持單流傳輸。由于TCP向應用層交付數據時是保證有序的,因此在單TCP連接上進行多請求數據并行傳輸時,只要有一個請求的報文丟失就會阻塞所有請求的數據交付。并行傳輸效果不穩定,且在實現中多邏輯流并發使用單連接socket容易產生并發正確性和性能問題。

事實上在廣域網RDMA協議iWARP中,也有報文亂序交付設計與TCP按序交付規范相沖突的問題,iWARP規范中提出了修改TCP協議實現來實現按需亂序交付的能力,以提高數據交付性能。但這種修改讓TCP協議的實現變的更加復雜,缺乏經過驗證的標準實現,因此沒有得到廣泛支持和應用。

3. 網絡切換與連接遷移

隨著移動網絡場景的普及,網絡切換(主要是wifi到4G/5G移動網絡)成為了一個高頻場景。雖然4G/5G移動網已經支持了基站間的地址遷移,網內基站切換不會產生地址切換,但跨網絡的切換仍然會造成設備網絡地址的改變。TCP連接是以網絡地址來標識的,地址切換意味著切換前的TCP連接全部失效,正在傳輸的數據流中斷。這種情況下就需要應用層支持數據的斷點恢復和續傳,增加了應用開發成本和重復度。同時需要重建所有TCP連接,引入了額外的建連時延。

雖然TCP也支持Fast open特性,可以實現快速建連,但上層協議狀態(例如TLS加密狀態)仍然無法透明恢復。此外fastopen也不支持IP地址切換后使用。

quic協議的發展過程

2012年:QUIC(Quick UDP Internet Connections)協議由Google提出,旨在解決傳統TCP協議在現代化網絡環境中暴露的局限性,特別是在HTTP協議使用場景中。早期quic協議由google定義和實現,基于quic的http協議稱作http-over-quic。

2015年:QUIC被提交至IETF標準化,逐步脫離Google的私有實現。

2018年:http-over-quic正式被命名為http/3,意味著下一代http協議完全基于quic傳輸協議

2021年:quic協議規范RFC9000正式發布

2022年:http/3協議規范RFC9114正式發布

可以看到,quic最初是用于解決http協議傳輸效率問題而提出的,之后成為了http下一代規范的指定傳輸協議。但quic本身也是一個標準的可靠加密傳輸協議,可以應用于其他網絡傳輸場景。

quic協議實現原理

快速建連

1RTT:quic協議將可靠傳輸通道建連與TLS加密通道建連結合,在一個報文中攜帶兩種握手信息(quic initial + tls client/server hello),從而只需要一次交互就能完成可靠加密傳輸通道建立,耗時1RTT。

0RTT:在通過1RTT建立成功后,可以基于TLS的會話復用機制,實現0RTT的建連。在這種模式下,quic initial協商報文與數據載荷報文同時發出,其中載荷報文復用已建立的TLS會話密鑰加密。如果對端接受quic initial報文中的會話復用協商,就能處理直接處理載荷報文。需要注意的是0RTT機制允許在未協商的情況下處理和緩存數據,容易受到重放攻擊和flooding攻擊,需要仔細考慮使用場景和策略。

單連接多流復用

quic的最小邏輯傳輸單元是流,而不是連接。建立一條quic連接后,可以在相同五元組連接上建立多條邏輯傳輸流。流不需要專門的協商創建流程,使用新的stream id傳輸stream幀就可以在兩端建立新的流。

quic連接的每條流有獨立的緩存、排序和重傳狀態,每條流內部保證數據的有序可靠交付。

每條流有獨立的接受窗口(window)用于流量控制,這是因為每條流對應的處理邏輯不同,處理能力也有差異。

但擁塞控制算法和擁塞窗口(cwnd)是連接級別的,因為同一條連接的網絡轉發路徑基本相同,擁塞對連接中的所有流都存在。

連接遷移

quic連接建立時,兩端會分別為這個連接分配connection id并同步給對方。在quic協議內連接的標識是雙方分配的connection id,而非五元組信息。這就為跨五元組的連接遷移提供了支持基礎。

在客戶端的ip發生變化后,通過如下流程進行連接遷移:

1. 使用新IP+原connection id繼續發送數據幀

2. server收到數據幀發現client的ip發生改變,向client發送PATH CHALLENGE幀

3. client向server回應PATH RESPONSE幀

4. server驗證PATH RESPONSE中的路徑內容,遷移完成

TCP真的不行嗎?

從上面介紹的quic協議核心特性實現來看,在TCP的基礎上進行擴展其實也是可以實現類似效果的。

  • 快速建連:可以在TCP的三次握手報文中增加對TLS1.3協商的擴展選項,來實現1RTT協商建連
  • 多流復用:可以通過TCP fastopen+TLS 會話復用,實現0RTT的后續流快速建立和并行傳輸
  • 連接遷移:可以通過擴展改造TCP fastopen機制,實現連接連接標識在IP變化后仍能被識別,并且將新建連接關聯到舊連接數據上。

但這樣的改造在TCP上面臨的阻力會非常大。TCP協議是一個古老而復雜的協議,并且作為網絡的主要傳輸協議被實現在各種操作系統內核中。不管是重新定義和擴展TCP協議,還是修改擴展內核協議棧,都基本不可能被標準組織和內核社區接受成為標準實現,也就無法推廣應用。

此外,雖然TCP可以通過快速建立多條連接來實現類似多流復用的效果,但畢竟還是需要建立多條連接的,對端口資源的占用和建連協商驗證的資源開銷是無法避免的。因此無法完全達到和quic相同的效果。這是TCP面向連接可靠交付的核心特質決定的,無法修改。MPTCP中的連接有子流的概念,其實每個子流也是一個獨立的TCP連接。

因此,在TLS全流量加密+HTTP多流傳輸的剛需場景下,選擇在用戶態重新定義可靠加密會話傳輸協議,基于限制最小的UDP協議成為了一種自然的選擇。

但如果是在用戶態協議棧中,基于TCP協議擴展來實現quic類似的特性就重新成為了可能的選項。用戶態協議棧完全獨立于內核,可以自定義實現方式和擴展特性。與UDP協議相比,TCP協議可以通過TCP選項頭協商來實現與標準TCP協議的兼容和自動回落,同時避免部分運營商和轉發設備對UDP報文的針對性丟包和低優處理,因此也有其存在價值,值得考慮。

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

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

相關文章

【淺學】tflite-micro + ESP32S3 + VScode + ESP-IDF 基于例程快速實現自己的圖像分類模型訓練部署全流程

如果你用Pytorch訓練的模型那么可以參考我的步驟,使用的是Tensorflow的話參考官方文檔即可,但流程都是一樣的,每一步我都會提到部分操作細節及注意事項 官方教程 要詳細學習的話tflite-micro里的微控制器章節下都詳細看(頁面左側…

【HarmonyOS】應用設置全屏和安全區域詳解

【HarmonyOS】應用設置全屏和安全區域詳解 一、前言 IDE創建的鴻蒙應用,默認采取組件安全區布局方案。頂部會預留狀態欄區域,底部會預留導航條區域。這就是所謂的安全區域。 如果不處理,界面效果很割裂。所以業內UI交互設計,都會設…

openfeign 只有接口如何創建bean的

OpenFeign 能夠為純接口創建 Spring Bean,其核心機制是通過動態代理和 Spring 的 FactoryBean 機制實現的。以下是詳細的工作原理:1. EnableFeignClients 注解的啟動在 Spring Boot 主類上添加 EnableFeignClients 注解:SpringBootApplicatio…

【展廳多媒體】互動地磚屏怎么提升展廳互動感的?

在數字化展廳設計中,互動地磚屏 正成為提升觀眾參與度的重要工具。這種融合視覺科技與交互體驗的裝置,通過動態影像與即時反饋,讓參觀者從被動觀看轉變為主動探索,從而大幅增強展廳的互動感。 Led地面互動屏的優勢在于其強大的視…

AI賦能電力巡檢:變壓器漏油智能檢測系統全解析

🔥 AI賦能電力巡檢:變壓器漏油智能檢測系統全解析 📖 前言 在電力系統的日常運維中,變壓器作為核心設備,其安全運行直接關系到整個電網的穩定性。傳統的人工巡檢方式不僅效率低下,還存在安全隱患和漏檢風險…

GitHub上值得Star的計算機視覺項目

GitHub上值得Star的計算機視覺項目 前言 一、OpenCV:計算機視覺領域的瑞士軍刀 1.1 項目簡介 1.2 核心功能與技術特點 1.3 代碼示例 二、YOLO 系列:實時目標檢測的領導者 2.1 項目簡介 2.2 核心功能與技術特點 2.3 代碼示例 三、Detectron2:Facebook AI Research 的目標檢測…

【深度學習】pytorch深度學習框架的環境配置

文章目錄1. 配置cuda環境2. 配置conda環境3. 配置pytorch gpu環境1. 配置cuda環境 在命令行輸入以下命令可以查看當前顯卡驅動版本和最高支持的cuda版本 nvidia-smi根據cuda版本去官網下載并安裝cuda 下載鏈接:https://developer.nvidia.com/cuda-toolkit-archive…

數據處理與統計分析 —— 房源數據集分析案例

數據集網盤下載: 鏈接:https://pan.quark.cn/s/0e577858dba3?pwdFJnb 提取碼:FJnb代碼僅供參考具體可打開ipynb文件進行學習和練習:鏈接:https://pan.quark.cn/s/8efbe3061fad?pwdT47B 提取碼:T47Bimport…

藍牙如何測試?

車載藍牙測試需覆蓋 連接穩定性、功能完整性、兼容性、交互體驗等核心維度,結合車載場景的特殊性(如行駛中信號干擾、多設備交互、安全需求),具體測試點如下: 一、基礎配對與連接測試 1. 首次配對 觸發配對:車機端 “藍牙設置” 中搜索設備、手機端搜索車機(車機名稱是…

算法02 二進制與位運算

二進制作為計算機底層數據的核心表示方式,其獨特的位結構和運算規則在算法設計中有著廣泛且關鍵的應用。以下從基礎操作、算法技巧、數據結構、經典問題等多個維度,全面梳理二進制在算法中的應用: 一、基礎位運算:算法的“原子操作…

PAT 1071 Speech Patterns

題目大意是說給出一個文本,找出里面出現最多的單詞,如果有多個單詞出現次數一樣多,則輸出字典序最小的。 需要注意的是: 給出的文本字符串不僅有數字還有字母,還有一些特殊的字符,還有空格。 而單詞是只包含…

CSS中的 :root 偽類

在CSS中&#xff0c;偽類是一種用于選擇元素特定狀態的選擇器。:root 偽類專門用于選擇文檔的根元素&#xff08;在HTML中通常是<html>元素&#xff09;&#xff0c;它是CSS變量&#xff08;Custom Properties&#xff09;的理想載體&#xff0c;常用于定義全局樣式變量&…

能源行業數字化轉型:邊緣計算網關在油田場景的深度應用

能源行業數字化轉型&#xff1a;邊緣計算網關在油田場景的深度應用能源行業是國民經濟的支柱產業&#xff0c;而油田作為能源生產的重要基地&#xff0c;其數字化轉型對于提高生產效率、降低能耗、減少碳排放具有重要意義。然而&#xff0c;油田往往地處偏遠&#xff0c;油井分…

CAG緩存增強生成與RAG檢索增強生成對比

深度定制 LLM 知識,除了 RAC &#xff0c;現在又有新技術假設有一份200頁的產品手冊,你想讓 LLM 準確回答里面的相關問題,要實現這個目標,除了常用的檢索增強生成技術 rep ,現在有了新思路,緩存增強生成 CAG &#xff0c;它是什么,何時使用.RAG檢索增強是常規套路,CAG緩存增強是…

基于vue、node.js、express的網絡教學系統設計與實現/基于vue、node.js、express的在線學習系統設計與實現

基于vue、node.js、express的網絡教學系統設計與實現/基于vue、node.js、express的在線學習系統設計與實現

享元模式引發的關于ECS和對象池的思考記錄

文章目錄概念概述解決了什么區別與聯系享元模式的某個例子的細節分析概念概述 ECS&#xff08;Entity-Component-System&#xff09; 1、Entity&#xff08;實體&#xff09;&#xff1a;唯一標識符。 2、Component&#xff08;組件&#xff09;&#xff1a;純數據容器&#x…

STM32驅動SG90舵機全解析:從PWM原理到多舵機協同控制

一、SG90舵機核心特性 1.1 基本參數與選型 SG90作為??微型舵機的代表??,憑借其??輕量化設計??(僅9g)和??高性價比??,在機器人、智能小車和云臺系統中廣泛應用: ??關鍵參數對比??: ??參數?? 180定位舵機 360連續旋轉舵機 ??控制目標?? 精確…

goland怎么取消自動刪除未使用的包

1.settings-Go-Imports-取消勾選Optimize imports on the fly2.settings-Tools-取消勾選Optimize imports

halcon基于透視的可變形模型匹配

算子1&#xff0c;create_planar_uncalib_deformable_model_xld***基于平面未校準的輪廓模型算子2&#xff0c;find_planar_uncalib_deformable_model***查找平面未校準可變形模型算子3&#xff0c;projective_trans_contour_xld***將輪廓進行透視變換附加算子 算子4read_conto…

Flink Stream API - 源碼開發需求描述

概述 本文介紹如何基于Flink源碼進行二次開發&#xff0c;實現一個動態規則引擎系統。通過自定義算子和算子協調器&#xff0c;實現數據流的動態規則計算和協調管理。以此更好理解前面介紹的源碼相關文章 項目需求 核心功能 實現一個動態規則引擎&#xff0c;具備以下特性&…