HTTP/3展望、我應該遷移到HTTP/2嗎

1. HTTP/3展望

  1. HTTP/3 基于 QUIC 協議,完全解決了“隊頭阻塞”問題,弱網環境下的表現會優于 HTTP/2;
  2. QUIC 是一個新的傳輸層協議,建立在 UDP 之上,實現了可靠傳輸;
  3. QUIC 內含了 TLS1.3,只能加密通信,支持 0-RTT 快速建連;
  4. QUIC 的連接使用“不透明”的連接 ID,不綁定在“IP 地址 + 端口”上,支持“連接遷移”;
  5. QUIC 的流與 HTTP/2 的流很相似,但分為雙向流和單向流
  6. HTTP/3 沒有指定默認端口號,需要用 HTTP/2 的擴展幀“Alt-Svc”來發現。

1.1. HTTP/2 的“隊頭阻塞”

HTTP/2 雖然使用“幀”“流”“多路復用”,沒有了“隊頭阻塞”,但這些手段都是在應用層里,而在下層,也就是 TCP 協議里,還是會發生“隊頭阻塞”。

在 HTTP/2 把多個“請求 - 響應”分解成流,交給 TCP 后,TCP 會再拆成更小的包依次發送(其實在 TCP 里應該叫 segment,也就是“段”)。

在網絡良好的情況下,包可以很快送達目的地。但如果網絡質量比較差,像手機上網的時候,就有可能會丟包。而 TCP 為了保證可靠傳輸,有個特別的“丟包重傳”機制,丟失的包必須要等待重新傳輸確認,其他的包即使已經收到了,也只能放在緩沖區里,上層的應用拿不出來,只能“干著急”。

舉例:

客戶端用 TCP 發送了三個包,但服務器所在的操作系統只收到了后兩個包,第一個包丟了。那么內核里的 TCP 協議棧就只能把已經收到的包暫存起來,“停下”等著客戶端重傳那個丟失的包,這樣就又出現了“隊頭阻塞”。

“HTTP over QUIC”就是 HTTP 協議的下一個大版本,HTTP/3。它在 HTTP/2 的基礎上又實現了質的飛躍,真正“完美”地解決了“隊頭阻塞”問題。

1.2. QUIC 協議

QUIC 最早是由 Google 發明的,被稱為 gQUIC。而當前正在由 IETF 標準化的 QUIC 被稱為 iQUIC。兩者的差異非常大。

gQUIC 混合了 UDP、TLS、HTTP,是一個應用層的協議。而 IETF 則對 gQUIC 做了“清理”,把應用部分分離出來,形成了 HTTP/3,原來的 UDP 部分“下放”到了傳輸層,所以 iQUIC 有時候也叫“QUIC-transport”。

以下說的 QUIC 都是指 iQUIC,它與早期的 gQUIC 不同,是一個傳輸層的協議,和 TCP 是平級的。

QUIC 的特點

1. 基于UDP的高效傳輸

QUIC使用UDP作為底層協議,避免了TCP協議因中間設備(如防火墻、路由器)的僵化導致的部署難題,同時繞開了TCP的隊頭阻塞問題

2. 多路復用與消除隊頭阻塞(HOL Blocking)

獨立邏輯流:QUIC支持在單個連接上并行傳輸多個獨立的邏輯數據流(Stream),每個流的數據包可亂序傳輸且互不影響。即使某個流的數據包丟失,其他流仍可正常處理,徹底解決了TCP層和應用層的隊頭阻塞問題。

與HTTP/2的對比:HTTP/2雖支持多路復用,但仍依賴TCP,一旦發生丟包,所有流需等待重傳;而QUIC通過UDP和流隔離機制,僅影響丟失的流。

3. 快速握手與低延遲

4. 內置安全性與加密

5. 連接遷移與網絡適應性

QUIC連接通過64位Connection ID標識,而非TCP的四元組(源IP、端口等)。即使設備切換網絡(如WiFi轉4G),連接仍可保持不斷,適合移動場景。

6. 可靠性與流控機制

QUIC 內部細節

QUIC 的基本數據傳輸單位是(packet)和(frame),一個包由多個幀組成,包面向的是“連接”,幀面向的是“流”。

QUIC 使用不透明的“連接 ID”來標記通信的兩個端點,客戶端和服務器可以自行選擇一組 ID 來標記自己,這樣就解除了 TCP 里連接對“IP 地址 + 端口”(即常說的四元組)的強綁定,支持“連接遷移”(Connection Migration)。

QUIC 的幀里有多種類型,PING、ACK 等幀用于管理連接,而 STREAM 幀專門用來實現流。

QUIC 里的流與 HTTP/2 的流非常相似,也是幀的序列,你可以對比著來理解。但 HTTP/2 里的流都是雙向的,而 QUIC 則分為雙向流和單向流

流 ID 還保留了最低兩位用作標志,第 1 位標記流的發起者,0 表示客戶端,1 表示服務器;第 2 位標記流的方向,0 表示雙向流,1 表示單向流。

所以 QUIC 流 ID 的奇偶性質和 HTTP/2 剛好相反,客戶端的 ID 是偶數,從 0 開始計數。

1.3. HTTP/3 協議

HTTP/3 把流控制都交給 QUIC 去做。調用的不再是 TLS 的安全接口,也不是 Socket API,而是專門的 QUIC 函數。

HTTP/3 里仍然使用流來發送“請求 - 響應”,但它自身不需要像 HTTP/2 那樣再去定義流,而是直接使用 QUIC 的流,相當于做了一個“概念映射”。

由于流管理被“下放”到了 QUIC,所以 HTTP/3 里幀的結構也變簡單了。幀頭只有兩個字段:類型和長度,而且同樣都采用變長編碼,最小只需要兩個字節。

HTTP/3 里的幀仍然分成數據幀和控制幀兩類,HEADERS 幀和 DATA 幀傳輸數據,但其他一些幀因為在下層的 QUIC 里有了替代,所以在 HTTP/3 里就都消失了,比如 RST_STREAM、WINDOW_UPDATE、PING 等。

頭部壓縮算法在 HTTP/3 里升級成了“QPACK”,使用方式上也做了改變。雖然也分成靜態表和動態表,但在流上發送 HEADERS 幀時不能更新字段,只能引用,索引表的更新需要在專門的單向流上發送指令來管理,解決了 HPACK 的“隊頭阻塞”問題。

HTTP/3的服務發現:

HTTP/3 沒有指定默認的端口號,也就是說不一定非要在 UDP 的 80 或者 443 上提供 HTTP/3 服務。

  1. 瀏覽器需要先用 HTTP/2 協議連接服務器,然后服務器可以在啟動 HTTP/2 連接后發送一個“Alt-Svc”幀,包含一個“h3=host:port”的字符串,告訴瀏覽器在另一個端點上提供等價的 HTTP/3 服務。
  2. 瀏覽器收到“Alt-Svc”幀,會使用 QUIC 異步連接指定的端口,如果連接成功,就會斷開 HTTP/2 連接,改用新的 HTTP/3 收發數據。

2. 應該遷移到HTTP/2嗎?

  1. HTTP/2 完全兼容 HTTP/1,是“更安全的 HTTP、更快的 HTTPS”,頭部壓縮、多路復用等技術可以充分利用帶寬,降低延遲,從而大幅度提高上網體驗;
  2. TCP 協議存在“隊頭阻塞”,所以 HTTP/2 在弱網或者移動網絡下的性能表現會不如 HTTP/1;
  3. 遷移到 HTTP/2 肯定會有性能提升,但高流量網站效果會更顯著;
  4. 如果已經升級到了 HTTPS,那么再升級到 HTTP/2 會很簡單;
  5. TLS 協議提供“ALPN”擴展,讓客戶端和服務器協商使用的應用層協議,“發現”HTTP/2 服務。

2.1. HTTP/2的主要優點

1. 多路復用(Multiplexing)

  • 核心改進:在單個TCP連接上并行傳輸多個請求/響應,徹底解決HTTP/1.x的“隊頭阻塞”問題(應用層)。
  • 效果:減少延遲、提升連接利用率,避免瀏覽器為并發請求建立多個TCP連接(如HTTP/1.1的6~8個連接限制)。

2. 頭部壓縮(HPACK)

  • 技術:使用HPACK算法壓縮HTTP頭部,消除冗余字段(如重復的Cookie、User-Agent)。
  • 效果:減少數據傳輸量,提升弱網環境下的性能(尤其對移動端和小型請求顯著)。

3. 服務器推送(Server Push)

  • 功能:服務器可主動向客戶端推送資源(如CSS/JS文件),無需等待客戶端解析HTML后發起請求。
  • 場景:優化首次頁面加載速度,減少往返次數(RTT)。

4. 二進制協議

  • 格式:將HTTP/1.x的文本格式改為二進制分幀(Frame),解析更高效,避免文本歧義(如空格、大小寫)。
  • 效果:降低解析復雜度,提升傳輸可靠性。

5. 流優先級與依賴控制

  • 機制:允許客戶端為請求設置優先級(如優先加載HTML/CSS,延遲加載圖片)。
  • 效果:優化關鍵資源的加載順序,提升用戶體驗。

2.2. HTTP/2的主要缺點

1. TCP層隊頭阻塞未解決

  • 問題:HTTP/2依賴TCP協議,若傳輸層發生丟包,所有流需等待丟失包重傳,導致性能下降。
  • 影響:在高丟包率網絡(如移動網絡)中,HTTP/2可能比HTTP/1.1更慢(后者可多連接規避)。

2. 服務器推送的局限性

  • 實現復雜:需服務器準確預測客戶端所需資源,推送錯誤內容會浪費帶寬。
  • 緩存問題:客戶端可能已緩存推送資源,導致冗余傳輸。
  • 實際采用率低:多數網站未廣泛使用此功能,部分瀏覽器已棄用(如Chrome 106+)。

3. 強制依賴HTTPS

  • 現狀:主流瀏覽器(如Chrome、Firefox)僅支持加密的HTTP/2(基于TLS)。
  • 代價:需維護證書和TLS配置,對簡單內網服務可能增加復雜度。

4. 協議復雜性提升

  • 實現難度:二進制分幀、流控制、優先級等機制增加了協議棧復雜度,可能引入新類型Bug(如流狀態管理錯誤)。
  • 調試困難:二進制協議需要專用工具(如Wireshark)分析流量,調試門檻高于HTTP/1.x的文本協議。

5. 中間設備兼容性問題

  • 代理與防火墻:部分老舊中間設備(如傳統代理服務器)不完全支持HTTP/2,可能導致連接降級或失敗。

2.3. 適用場景與替代方案

場景

推薦協議

原因

高延遲、低丟包網絡

HTTP/2

多路復用顯著減少RTT,頭部壓縮節省帶寬。

高丟包率網絡(如4G/5G)

HTTP/3

QUIC解決TCP隊頭阻塞,適應弱網環境。

簡單低頻請求

HTTP/1.1

協議簡單,兼容性更好,無額外性能負擔。

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

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

相關文章

【大模型面試每日一題】Day 15:流水線并行的Bubble問題及其緩解方法

【大模型面試每日一題】Day 15:流水線并行的Bubble問題及其緩解方法 📌 題目重現 🌟🌟 面試官:解釋流水線并行(Pipeline Parallelism)的bubble問題及其緩解方法。 #mermaid-svg-Uz7WGsO8akW5F…

Windows環境下maven的安裝與配置

1.檢查JAVA_HOME環境變量 Maven是使用java開發的,所以必須知道當前系統環境中的JDK的安裝目錄。 搜索欄直接輸入“cmd” 或者 WinR 輸入cmd 在打開的終端窗口輸入“echo %JAVA_HOME”,就可以看到jdk的位置了。 如果沒有的話,請參考我的文章&a…

Kubernetes 集群部署應用

部署 Nginx 應用 命令行的方式 1. 創建 deployment 控制器的 pod # --imagenginx:這個會從 docker.io 中拉取,這個網站拉不下來 # kubectl create deployment mynginx --imagenginx# 使用國內鏡像源拉取 kubectl create deployment mynginx --imaged…

如何使用依賴注入來實現依賴倒置原則?

依賴注入(Dependency Injection, DI)是實現依賴倒置原則(DIP)的具體技術手段,它通過將依賴對象的創建和管理交給外部容器,從而實現高層模塊與低層模塊的解耦。下面從原理、實現方式、框架應用及最佳實踐四個方面詳細解析: 一、依賴倒置原則(DIP)的核心思想 高層模塊不…

python使用AES進行加密和解密

如果需要加密和解密功能,可以使用AES算法。以下是使用Python實現AES加密和解密的示例: from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad from Crypto.Random import get_random_bytesdef aes_encrypt(data,

SaaS場快訂首頁的前端搭建【持續更新】

文章目錄 一、創建頁面二、配置路由三、寫接口文件(api)1.定位的接口函數(騰訊地圖api)實現代碼: 2.獲取場館分類的數據3.獲取附近場館列表的數據 四、開發首頁頁面1.頂部區域2.搜索框3.場館分類4.附近場館列表 五、難…

深入解析 MQTT 協議:物聯網通信的基石

在當今物聯網蓬勃發展的時代,設備之間高效、可靠的通信變得至關重要。MQTT(Message Queuing Telemetry Transport)協議,作為一種輕量級的消息傳輸協議,正逐漸成為物聯網通信的基石,廣泛應用于各種場景中。 …

在Python中計算函數耗時并超時自動退出

更多內容請見: python3案例和總結-專欄介紹和目錄 文章目錄 方法1:使用裝飾器結合信號模塊(僅Unix-like系統)方法2:使用多線程(跨平臺解決方案)方法3:使用concurrent.futures(Python 3.2+)方法4:使用 multiprocessing + Process(跨平臺)?方法5:使用 time 手動計…

理解c++中explicit關鍵字的作用

理解c中explicit關鍵字的作用 explicit 關鍵字的作用是防止構造函數被隱式調用&#xff0c;從而避免意外的類型轉換 #include <iostream> class Vec3 { public://構造函數沒有被explicit修飾Vec3(float value): x(value), y(value), z(value){}Vec3(float val1, float …

不止是UI庫:React如何重塑前端開發范式?

React&#xff1a;引領現代前端開發的聲明式UI庫 在當今快速發展的前端世界&#xff0c;React以其聲明式、組件化和高效的特性&#xff0c;穩坐頭把交椅&#xff0c;成為構建交互式用戶界面的首選JavaScript庫。本文將帶你快速了解React的核心魅力、主要優勢以及生態發展&…

理解 Token 索引 vs 字符位置

以下是對“理解 Token 索引與字符位置的區別”的內容整理&#xff0c;條理清晰&#xff0c;結構完整&#xff0c;保持技術細節&#xff0c;方便閱讀&#xff0c;無多余解釋&#xff1a; &#x1f50d; 理解 Token 索引 vs 字符位置 文本分塊方法中返回的索引是 token 索引&…

《異常鏈機制詳解:如何優雅地傳遞Java中的錯誤信息?》

大家好呀&#xff01;&#x1f44b; 作為一名Java開發者&#xff0c;相信你一定見過各種奇奇怪怪的異常報錯。但有沒有遇到過這樣的情況&#xff1a;明明只調用了一個方法&#xff0c;卻看到異常信息像俄羅斯套娃一樣一層層展開&#xff1f;&#x1f914; 這就是我們今天要講的…

vector 常見用法及模擬

文章目錄 1. vector的介紹與使用1.1 vector的構造1.2 vector iterator 的使用1.3 有關大小和容量的操作1.4 vector 增刪查改1.5 vector 迭代器失效問題&#xff08;重點&#xff09;1.6 vector 中二維數組的使用 2. vector 的模擬實現2.1 拷貝構造和賦值重載的現代寫法2.2 memc…

數據結構與算法分析實驗11 實現順序查找表

實現順序查找表 1.上機名稱2.上機要求3.上機環境4.程序清單(寫明運行結果及結果分析)4.1 程序清單4.1.1 頭文件4.1.2 實現文件4.1.3 源文件 4.2 實現展效果示 上機體會 1.上機名稱 實現順序查找表 順序查找表的基本概念 順序查找表是一種線性數據結構&#xff0c;通常用于存儲…

實踐官方的 A2A SDK Python

內容列表 ? 注意? 我的環境? A2A SDK Python 注意 這只是一個原型&#xff0c;并且在快速的變化&#xff0c;本篇教程也隨時可能過期&#xff0c;可以在A2AProtocol blog最終更新的文章。 我的環境 ? Python 3.13? uv: uv 0.7.2 (Homebrew 2025-04-30)? Warp? Olla…

langchain 接入國內搜索api——百度AI搜索

為什么使用百度AI搜索 學習langchain的過程中&#xff0c;遇到使用search api的時候&#xff0c;發現langchain官方文檔中支持的搜索工具大多是國外的&#xff0c;例如google search或bing search&#xff0c;收費不說&#xff0c;很多還連接不上&#xff08;工具 | LangChain…

[強化學習的數學原理—趙世鈺老師]學習筆記01-基本概念

[強化學習的數學原理—趙世鈺老師]學習筆記01-基本概念 1.1 網格世界的例子1.2 狀態和動作1.3 狀態轉移1.4 策略1.5 獎勵1.6 軌跡、回報、回合1.6.1 軌跡和回報1.6.2 回合 1.7 馬爾可夫決策過程 本人為強化學習小白&#xff0c;為了在后續科研的過程中能夠較好的結合強化學習來…

Java開發經驗——阿里巴巴編碼規范經驗總結2

摘要 這篇文章是關于Java開發中阿里巴巴編碼規范的經驗總結。它強調了避免使用Apache BeanUtils進行屬性復制&#xff0c;因為它效率低下且類型轉換不安全。推薦使用Spring BeanUtils、Hutool BeanUtil、MapStruct或手動賦值等替代方案。文章還指出不應在視圖模板中加入復雜邏…

Java大師成長計劃之第18天:Java Memory Model與Volatile關鍵字

&#x1f4e2; 友情提示&#xff1a; 本文由銀河易創AI&#xff08;https://ai.eaigx.com&#xff09;平臺gpt-4o-mini模型輔助創作完成&#xff0c;旨在提供靈感參考與技術分享&#xff0c;文中關鍵數據、代碼與結論建議通過官方渠道驗證。 在Java多線程編程中&#xff0c;線程…

js前端分片傳輸大文件+mongoose后端解析

最近一直在完善mongoose做webserver的項目&#xff0c;其中程序升級要通過前端傳輸升級包到服務器。 因為第一次寫前端代碼&#xff0c;分片傳輸的邏輯&#xff0c;網上一堆&#xff0c;大同小異&#xff0c;而且版本啊&#xff0c;API不一致的問題&#xff0c;導致頭疼的很。后…