1豁鲤、數(shù)據(jù)包開頭:QUIC Common
所有QUIC數(shù)據(jù)包均以QUIC Common格式開頭秽誊,如下
+---------+------------------------------+
| Flags(8) | Connection ID (64) (optional)|
+---------+------------------------------+
1.1、Flag含義
- 0x01 = VERSION 版本 ??0000000_
(1)若該QUIC數(shù)據(jù)包由客戶端發(fā)送:使用這個flag并包含一個確切的建議版本
(2)若該QUIC數(shù)據(jù)包由服務(wù)器發(fā)送:不支持客戶端建議的版本琳骡,并提供給客戶端一系列可接受的版本 - 0x02 = PUBLIC_RESET ??000000_0
指明這個packet是一個公共重置數(shù)據(jù)包 Public Reset packet. - 0x04 = DIVERSIFICATION_NONCE = 00000?00
指明header中存在32位的多樣化隨機數(shù) - 0x08 = CONNECTION_ID ??0000_000
指明數(shù)據(jù)包中存在連接ID锅论, - 0x30 = PACKET_NUMBER_SIZE ??00_ _0000
指明每個數(shù)據(jù)包中存在的數(shù)據(jù)包編號的低位字節(jié)數(shù)。
11:存在6個字節(jié)的數(shù)據(jù)包編號
10:存在4個字節(jié)的數(shù)據(jù)包編號
01:存在2個字節(jié)的數(shù)據(jù)包編號
00:存在1個字節(jié)的數(shù)據(jù)包編號 - 0x40 = MULTIPATH ??0_000000
保留給多路復(fù)用使用 - 0x80 ??_0000000
暫未使用楣号,常為0
1.2最易、Connection ID含義
由客戶端選擇的64位無符號隨機數(shù),用于作為連接標(biāo)識符炫狱。
每個Connection ID與一個QUIC連接綁定藻懒,在客戶端和/或服務(wù)器IP和端口更改之間保持一致。
2视译、數(shù)據(jù)包類型
Regular packets:常規(guī)數(shù)據(jù)包
Version Negotiation packets:版本協(xié)商數(shù)據(jù)包
Public Reset packets:公共重置數(shù)據(jù)包
2.1 Regular packets:常規(guī)數(shù)據(jù)包
Common Header + 常規(guī)數(shù)據(jù)包專用字段
- Version
QUIC版本束析,僅存在于客戶端->服務(wù)器方向。與VERSION flag和版本協(xié)商相關(guān)憎亚。 - Diversification Nonce
服務(wù)器生成的32字節(jié)的隨機數(shù)员寇,僅存在于服務(wù)器->客戶端方向。目的是確保服務(wù)器能為每一個QUIC連接生成獨一無二的key第美。
具體來說蝶锋,當(dāng)使用QUIC當(dāng)0-RTT加密握手時,具有完全相同的連接ID和CHLO的什往、重復(fù)的CHLO可以為該連接生成相同的中間初始加密密鑰扳缕。服務(wù)器生成的隨機數(shù)不允許客戶端導(dǎo)致為兩個不同的連接派生相同的密鑰。一旦連接是前向安全的,該隨機數(shù)不再存在于數(shù)據(jù)包中躯舔。 - Packer Number
數(shù)據(jù)包編號驴剔,它的低8、16粥庄、32丧失、48位號碼基于PACKET_NUMBER_SIZE標(biāo)志。發(fā)送方給每個常規(guī)數(shù)據(jù)包分配了一個數(shù)據(jù)包號碼惜互。端點(C/S)發(fā)送的第一個數(shù)據(jù)包務(wù)必具有值為1的Packer Number布讹。 - AEAD Data
常規(guī)數(shù)據(jù)包的header,包括common header, Version, Diversification Nonce, and Packet Number fields训堆,已通過身份驗證描验,但未加密
2.1.1 數(shù)據(jù)包編號的壓縮和重構(gòu)
完整的數(shù)據(jù)包號是一個64位無符號號,用作數(shù)據(jù)包加密的加密隨機數(shù)的一部分坑鱼。為減少表示線路上的數(shù)據(jù)包號所需的位數(shù)膘流,最多只有48位數(shù)據(jù)包號通過有線傳輸。
一個QUIC端點不能在一個相同的連接中(即在相同的加密密鑰下)重復(fù)使用
2.2.2 常規(guī)數(shù)據(jù)包的框架(frame)和框架類型
常規(guī)數(shù)據(jù)包至少含有一個框架鲁沥,而且可能還有多個/多種框架呼股。框架必須適合單個QUIC數(shù)據(jù)包黍析,并且不得跨越QUIC數(shù)據(jù)包邊界卖怜。
以下為QUIC Frames的類型,注意其中的STREAM和ACK類型用于承載other frame-specific flags
2.2 Version Negotiation packets:版本協(xié)商數(shù)據(jù)包
版本協(xié)商數(shù)據(jù)包僅由服務(wù)器發(fā)送阐枣,必須具有VERSION標(biāo)志集马靠,并且必須包含完整的64位連接ID。版本協(xié)商數(shù)據(jù)包的其余部分是一系列服務(wù)器支持的版本的4字節(jié)的列表蔼两。
2.3 Public Reset packets:公共重置數(shù)據(jù)包
需要PUBLIC_RESET被置1甩鳄,且必須包括完整的64位連接ID,其余部分被編碼為標(biāo)簽PRST的加密握手消息额划。
圖中的tag value map包括以下tag-values:
o RNON (public reset nonce proof 公共重置隨機數(shù)證明) - a 64-bit unsigned integer.
o RSEQ (rejected packet number 被拒絕的數(shù)據(jù)包編號) - a 64-bit packet number.
o CADR (client address 客戶端地址) - the observed client IP address and port number. This is currently for debugging purposes only and hence is optional. 觀察到的客戶端IP地址和端口數(shù)妙啃。當(dāng)前這僅用于調(diào)試目的,因此是可選的俊戳。