1.概述
QUIC 是一種安全的通用傳輸協議。文檔定義了 QUIC 協議的第一個版本。它符合[QUIC不變特性]QUIC協議中與版本無關屬性。QUIC 是一種面向連接的協議,它在客戶端和服務器之間創建有狀態的交互。QUIC 是一種面向連接的協議,它在客戶端和服務器之間創建有狀態的交互。
QUIC 握手結合了加密和傳輸參數的協商。 QUIC 集成了 TLS 握手,盡管使用定制的幀來保護數據包。 TLS 和 QUIC 的集成在 . 握手的結構允許盡快交換應用程序數據。 這包括客戶端立即發送數據的選項 (0-RTT:Round-Trip Time 往返時延),這需要事先以某種形式的通信或配置才能啟用。
端點通過QUIC通信是通過交換QUIC 數據包。 大多數數據包都包含幀,這些幀在端點之間攜帶控制信息和應用程序數據。 QUIC 對每個數據包的整體進行身份驗證,並盡可能多地加密每個數據包。 QUIC 數據包使用 UDP 數據報傳輸,以更好地促進其在現有系統和網絡中的部署。
應用協議使用QUIC協議交換信息是通過流實現的(streams),流是有序的字節序列。 可以創建兩種類型的流:雙向流,允許兩個端點發送數據; 和單向流,只允許單個端點發送數據。 基於信用的方案用於限制流創建並限制可以發送的數據量
QUIC 提供必要的反饋來實現可靠的交付和擁塞控制。在第六節(QUIC-Recovery)中描述了一種用於檢測和恢復數據丟失的算法。 QUIC依靠擁塞控制來避免網絡擁塞。 示例性擁塞控制算法在第七節。
QUIC 連接並不嚴格綁定到單個網絡路徑。 連接遷移使用連接標識符來允許連接轉移到新的網絡路徑。 只有客戶端才能在此版本的 QUIC 中遷移。 此設計還允許在網絡拓撲或地址映射發生變化(例如可能由 NAT 重新綁定引起)后繼續連接。
一旦連接建立,就會為連接終止提供多個選項。 應用程序可以管理正常關閉,端點可以協商超時期限,錯誤可以導致立即連接斷開,並且無狀態機制支持在一個端點丟失狀態后終止連接。
1.1 文檔結構
本文檔描述了核心 QUIC 協議,結構如下
- 流是 QUIC 提供的基本服務抽象。
- 第 2 節 描述了與流相關的核心概念
- 第 3 節 提供了流狀態的參考模型
- 第 4 節 概述了流控制的操作。
- 連接是 QUIC 端點通信的上下文。
- 第 5 節 描述了與連接相關的核心概念
- 第 6 節描述了版本協商
- 第 7 節詳細介紹了建立連接的過程
- 第 8 節描述了地址驗證和關鍵的拒絕服務緩解措施
- 第 9 節描述了端點如何將連接遷移到新的網絡路徑
- 第 10 節列出了終止的選項一個開放的連接
- 第 11 節提供了流和連接錯誤處理的指南
- 數據包和幀是QUIC用來通信的基本單位
- 第 12 節描述了與數據包和幀相關的概念
- 第 13 節定義了數據傳輸、重傳和確認的模型
- 第 14 節指定了管理攜帶 QUIC 數據包的數據報大小的規則
- 最后,QUIC 協議元素的編碼細節在
- 第 15 節(版本)
- 第 16 節(整數編碼)
- 第 17 節(包頭)
- 第 18 節(傳輸參數)
- 第 19 節(幀)
- 第 20 節(錯誤)
隨附的文檔描述了 QUIC 的丟失檢測和擁塞控制,以及 TLS 和其他加密機制的使用。
本文檔定義了 QUIC 版本 1,並且符合[QUIC-INVARIANTS]中的協議不變特性
要參考 QUIC 版本 1,請引用此文檔。 對 QUIC 的有限版本獨立屬性集的引用可以引用[QUIC-INVARIANTS]
1.2 術語和定義
當這些關鍵詞出現在文檔中,當且僅當他們出現為大寫,如展示的這種”MUST“,"MUST NOT", "REQUIRED", "SHALL" ,"SHALL NOT", "SHOULD" ,"SHOULD NOT", "RECOMMENDED" ,"NOT RECOMMENDED" ,"MAY", "OPTIONAL"。需要按照 BCP14 [RFC2119],[RFC8174] 中的說明進行解釋。
本文檔中的常用術語描述如下:
QUIC: 本文檔描述的傳輸協議。 QUIC 是一個名稱,而不是首字母縮略詞
EndPoint: 可以通過生成、接收和處理 QUIC 數據包來參與 QUIC 連接的實體。 QUIC 中只有兩種類型的端點:客戶端和服務器。
Client: 發起 QUIC 連接的終端
Server: 接受 QUIC 連接的終端
QUIC package: 一個完整的 QUIC 可處理單元,可以封裝在 UDP 數據報中。 一個或多個 QUIC 數據包可以封裝在單個 UDP 數據報中
Ack-eliciting packet:一個 QUIC 數據包,包含除 ACK、PADDING 和 CONNECTION_CLOSE 之外的幀。 這些會導致收件人發送確認信號
Frame: 一種結構化協議信息的單位。 有多種幀類型,每一種都攜帶不同的信息。 幀包含在 QUIC 數據包中。
Address :當沒有獲取授權資格的時候,表示網絡路徑一端的 IP 版本、IP 地址和 UDP 端口號的元組。
Connection ID:用於標識端點處的 QUIC 連接的標識符。 每個端點為其對等端選擇一個或多個連接 ID,以包含在發送給端點的數據包中。 此值對對等方不透明。
Stream:QUIC 連接中有序字節的單向或雙向通道。 一個 QUIC 連接可以同時傳輸多個流。
Application: 使用 QUIC 發送和接收數據的實體。
本文檔使用術語“QUIC 數據包”、“UDP 數據報”和“IP 數據包”來指代各個協議的單元。 即一個或多個QUIC數據包可以封裝在一個UDP數據報中,UDP數據報又封裝在一個IP數據包中
1.3 符號約定
本文檔中的數據包和幀圖使用自定義格式。 這種格式的目的是總結而不是定義協議元素, 而是定義了結構的完整語義和細節。
復雜字段被命名的--由一對匹配的大括號包圍的字段列表。 此列表中的每個字段都用逗號分隔
各個字段包括長度信息,以及有關固定值、可選性或重復性的指示。 各個字段使用以下符號約定,所有長度均以bits為單位
x(A):表明x是A bits長度,例如x(4) x是4bit長度
x(i):表示 x 使用第 16 節中描述的可變長度編碼保存一個整數值
x(A..B):表示x可以是從A到B的任意長度; A可以省略,表示最少0位,B可以省略,表示沒有設置上限; 這種格式的值總是以字節邊界結束。
x(L)=C: 表示x有一個固定值C; x 的長度由 L 描述,它可以使用上面的任何長度形式
x (L) = C..D:表示 x 的取值范圍為 C 到 D(含),長度由 L 描述,和上面一樣
[x (L)] :表示 x 是可選的,長度為 L
x (L) ...: 表示 x 重復零次或多次,並且每個實例的長度為 L
本文檔使用網絡字節順序(即大字節序)值。 字段從每個字節的高位bit開始放置。
按照慣例,單個字段通過使用復雜字段的名稱來引用復雜字段
Figure1 提供了一個例子
Example Structure {
One-bit Field (1),
7-bit Field with Fixed Value (7) = 61,
Field with Variable-Length Integer (i),
Arbitrary-Length Field (..),
Variable-Length Field (8..24),
Field With Minimum Length (16..),
Field With Maximum Length (..128),
[Optional Field (64)],
Repeated Field (8) ...,
}
Figure 1: Example Format
當在文中引用一個One-bit字段時,該字段的位置可以通過使用帶有字段值集的字段的byte的值來闡明,例如,值 0x80 可用於引用字節最高有效位中的One-bit字段,比如Figure 1中的One-bit 字段。