HTTP/2協議特點
gRPC基于HTTP/2協議,原因:
- 多路復用:允許在同一個TCP連接上并行傳輸多個請求和響應,即多個gRPC調用可以通過同一個連接同時進行,避免了HTTP/1.x中常見的線頭阻塞問題,減少了連接建立和關閉的開銷,提高了性能和連接利用率。
- 二進制分幀:HTTP/2將數據分割成二進制幀,每個幀都有自己的類型、標志和內容。gRPC利用這種機制可以更高效地傳輸數據,使數據的傳輸更加有序和可靠,并且能夠在應用層對數據進行更細粒度的管理。
- 流控制:HTTP/2提供了流控制機制,允許客戶端和服務器控制數據流的速率,以防止發送方發送過快導致接收方緩沖區溢出。gRPC借助這一機制來管理數據的傳輸速率,確保通信的穩定性和可靠性。
- 頭部壓縮:HTTP/2使用HPACK算法等對頭部進行壓縮,減少了頭部信息的傳輸大小,提高了傳輸效率。對于gRPC來說,這有助于減少元數據的傳輸開銷,特別是在頻繁進行RPC調用時,可以顯著降低網絡帶寬占用。
菜鳥教程總結版:
多路復用:HTTP/2 允許同時發送多個請求和響應,而不是像 HTTP/1.1 一樣只能一個一個地處理。
這樣可以減少延遲,提高效率,提高網絡吞吐量。二進制傳輸:HTTP/2 使用二進制協議,與 HTTP/1.1 使用的文本協議不同。
二進制協議可以更快地解析,更有效地傳輸數據,減少了傳輸過程中的開銷和延遲。頭部壓縮:HTTP/2 使用 HPACK 算法對 HTTP 頭部進行壓縮,減少了頭部傳輸的數據量,從而減少了網絡延遲。服務器推送:HTTP/2 支持服務器推送,允許服務器在客戶端請求之前推送資源,以提高性能。改進的安全性:HTTP/2 默認使用 TLS(Transport Layer Security)加密傳輸數據,提高了安全性。兼容 HTTP/1.1:HTTP/2 可以與 HTTP/1.1 共存,服務器可以同時支持 HTTP/1.1 和 HTTP/2。
如果客戶端不支持 HTTP/2,服務器可以回退到 HTTP/1.1。
HTTP/1.x中線頭阻塞
在HTTP/2中被解決
產生原因
- 同一個 TCP 連接上的請求必須按順序發送,服務器也會按順序處理請求并返回響應。
- HTTP/1.1 雖引入 長連接,允許復用 TCP 連接,但瀏覽器默認對同一域名僅建立 6-8 個并發連接(不同瀏覽器策略不同)
- 當頁面需要加載大量資源(如圖片、CSS、JS 等)時,大量請求會被分配到有限的連接中,導致每個連接上的請求隊列過長,加劇阻塞問題。
所以解決思路大致有兩條線:1. 改變接收的硬性順序規定,實現并行;2. 壓縮數據大小
HTTP/2解決方案
-
引入 多路復用
- 同一 TCP 連接中并行處理多個請求,響應
- 請求和響應被拆分為獨立的 二進制幀,并且由于這里二進制分幀都含有自己的標識,可以實現混亂傳輸,最后到達時重新組裝
gRPC、Protobuf、HTTP/2 的關系及核心知識點匯總表:
技術維度 | Protobuf (Protocol Buffers) | HTTP/2 | gRPC |
---|---|---|---|
定義 | 語言無關的數據序列化協議(Google 開發) | HTTP 協議 | 高性能開源 RPC 框架(Google 開發) |
核心功能 | 結構化數據的高效序列化/反序列化(生成二進制消息) | 二進制分幀、多路復用、頭部壓縮、流控制 | 遠程過程調用(定義服務接口 & 自動生成代碼) |
數據格式 | 二進制格式(體積小、解析快) | 二進制協議(幀結構) | 基于 Protobuf 消息(默認)或其他格式 |
傳輸協議 | 不依賴特定傳輸層(可與任何協議結合) | 基于 TCP,支持 TLS 加密 | 強制基于 HTTP/2(利用其所有特性) |
主要用途 | 跨語言數據交換、存儲(如微服務間通信) | 通用 Web 通信(替代 HTTP/1.x) | 構建高性能分布式系統(API、微服務) |
關鍵優勢 | 1. 序列化效率極高(比 JSON/XML 快 3-10 倍) 2. 自動生成強類型代碼 3. 向后兼容(支持字段增刪) | 1. 多路復用(徹底解決線頭阻塞) 2. 頭部壓縮(HPACK) 3. 二進制分幀 4. 流控制 | 1. 基于 HTTP/2 的高性能傳輸 2. 自動生成客戶端/服務器代碼 3. 支持流式通信 4. 豐富的攔截器機制 |
典型應用場景 | 1. 微服務間數據交換 2. 移動應用與后端通信 3. 緩存數據存儲 | 1. 現代 Web 應用(如 SPA) 2. API 網關 3. 推送通知系統 | 1. 跨語言微服務通信 2. 邊緣計算(低延遲需求) 3. 設備與云端通信 |
關系 | gRPC 默認使用 Protobuf 定義服務接口和消息格式 | HTTP/2 是 gRPC 的底層傳輸協議 | gRPC = Protobuf(接口定義 + 消息序列化) + HTTP/2(網絡傳輸) |
總結邏輯:
- Protobuf 是數據格式層,負責高效序列化。
- HTTP/2 是傳輸協議層,提供高性能通信能力。
- gRPC 是應用框架層,整合兩者并提供完整 RPC 解決方案。
https://github.com/0voice