QUIC协议详解1本篇QUIC 系列 ②/④ · QUIC协议详解1· 系列总览见QUIC协议系列导读QUIC 跑在 UDP 上但逻辑单元是Packet包与Frame帧一个 UDP datagram 可含一个或多个 QUIC 包每个包内可叠多个帧。可靠传输靠Packet NumberPN与ACK Range确认丢包后帧内容重封装进新 PN而非 TCP 式原包重发。速览Long HeaderInitial / Handshake / 0-RTTShort Header1-RTT 数据。PN 分Initial / Handshake / Application三个空间单调递增、加密隐藏。丢包靠ACK Range 时间阈值 PTO无 triple dup-ACK 快重传。流控MAX_STREAM_DATA单流MAX_DATA连接MAX_STREAMS并发。目录一、报文模型1. UDP → Packet → Frame2. 包类型与 Long Header3. Short Header 与 PN 隐藏4. 常用帧类型二、可靠传输与流控5. PN 空间与 ACK Range6. 丢包判定与 PTO 重传含时间阈值/TLP7. 连接级与 Stream 级流控8. 面试要点1. UDP → Packet → FrameUDP Datagram └── QUIC Packet (Long 或 Short Header) ├── Frame: CRYPTO ├── Frame: ACK └── Frame: STREAM层级职责UDP端到端 datagram 投递不可靠QUIC Packet加密单元、PN、CIDQUIC Frame语义载荷数据、握手、控制实现上常见一个 UDP 包只放一个 QUIC 包规范允许合并但不常见。2. 包类型与 Long Header类型Header阶段典型内容InitialLong建连ClientHelloCRYPTOHandshakeLong建连ServerHello、Finished0-RTTLong复用早期应用数据ShortShort1-RTTSTREAM、ACK 等RetryLong特殊服务端要求重试 TokenVersion Negotiation特殊版本不支持时的版本列表Long Header 位图RFC 9000 §17.2概念|1| Type(7) | ← Header Form 1 | Version (32) | | DCID Len | Destination CID (*) | | SCID Len | Source CID (*) | | Type-specific (Token / Length 等因 Initial/HS/0-RTT 而异) | | [AEAD Protected PayloadPN 帧列表] |字段说明Header Form 1长头标识TypeInitial0x00 / 0-RTT0x01 / Handshake0x02 / Retry0x03VersionQUIC 版本号DCID / SCID目的 / 源 Connection IDTokenInitial 中可选Retry 后LengthPayload 长度PayloadAEAD 加密含 PN 帧列表Long Header除 Retry/VN 外头部字段明文Payload 密文。Initial / Handshake 包不得与 1-RTT 应用数据混在同一 QUIC 包类型规则下混用实现上分开发。Short HeaderLong Header复用场景InitialHandshake0-RTT1-RTT App Data3. Short Header 与 PN 隐藏Short Header1-RTTRFC 9000 §17.3|0|C|K|1|P| Reserved | ← Form0CKey PhaseK 保留PSpin Bit | Destination CID | | [Packet Number加密/掩码1/2/4 字节] | | AEAD Protected Payload |部分说明Header Form 0短头CKey Phase指示当前 / 下一套密钥Key Update见QUIC协议详解2DCID定位连接无 Version、无 SCIDPN1/2/4 字节加密/掩码PayloadAEAD 保护PN 要点每个加密级别独立 PN 空间严格单调递增。PN 用于丢包检测、ACK 引用、AEAD nonce、防重放。不能像 TCP SEQ 那样明文抓包直读——需解密或 key log。Spin Bit可选用于 RTT 采样部分网络会禁用。4. 常用帧类型帧通用格式Type变长整数 类型相关字段。核心帧数据与可靠帧作用STREAM应用/HTTP 数据含 Stream ID、Offset、FINCRYPTOTLS 握手片段按 Offset 连续重组ACK确认 PN支持多ACK Range流控与连接管理帧作用MAX_DATA连接级接收窗口上限MAX_STREAM_DATA单 Stream 接收上限MAX_STREAMS_BIDI / _UNI允许打开的流数量NEW_CONNECTION_ID下发可用 CID迁移 / 防追踪 / LBRETIRE_CONNECTION_ID退役不再使用的 CIDRESET_STREAM / STOP_SENDING异常中止 / 停止发送HANDSHAKE_DONE服务端握手确认PING保活 / PTO 探测CONNECTION_CLOSE关闭连接PATH_CHALLENGE / PATH_RESPONSE路径验证迁移STREAM 帧概念Type | Stream ID | [Offset] | [Length] | Data… | FIN?同一 Stream 内靠Offset有序FIN1表示发送结束。CRYPTO 帧无 Stream ID绑定当前 PN 空间的隐式 TLS 流Offset 必须连续。注意帧不跨 QUIC 包重组Stream 内靠 Offset 排序。PN 被加密Wireshark 需SSLKEYLOGFILE解密见QUIC应用实践。5. PN 空间与 ACK RangePN Space包类型InitialInitialHandshakeHandshakeApplication DataShort Header规则ACK 只引用同一 PN 空间不同空间 PN 互不影响。ACK 帧携带Largest AcknowledgedACK Delay接收处理延迟用于 RTTACK Range Count 多个区间示例Largest Acked 105 Ranges: [100–105], [90–95] → 确认 PN 90–95 与 100–105表达力≥ TCP SACK发送端据此判断哪些 PNlost。6. 丢包判定与 PTO 重传6.1 判丢简化机制说明PN 超前 时间阈值PN 远小于 Largest Acked − threshold → lostPTO超时未收到任何 ACK → 进入 Probe没有TCP 式triple duplicate ACK 快重传。6.2 PTO 与重传PTOProbe Timeout近似RFC 9000 §6.2此处为简化写法完整算法含指数退避、握手未确认前禁止发 1-RTT 数据、各 PN 空间独立计时等PTO smoothed_rtt max(4 × rttvar, granularity)触发后发新 PN的 probe 包非原 PN 重发。内容常为PING或未 ACK 的STREAM/CRYPTO 帧重新封装。连续 PTO 失败 → 指数退避 → 最终CONNECTION_CLOSE。是PTO发 PNNACK?清除 in_flight新 PN PING/重封装帧与 TCP 对比项TCPQUIC确认SEQ ACKPN ACK Range快重传dup ACK无靠 Range 定时器重传形态同 SEQ 重发帧进新 PN 包6.3 时间阈值判丢与尾丢TLP 思路除 PTO 外RFC 9000 丢包检测还有时间阈值time threshold常取 9/8 × smoothed_rtt某 PN 长期未被 ACK 且小于Largest Acknowledged时可判为lost并重封装发送——工程上常称TLPTail Loss Probe思路在整段 PTO 超时之前处理尾部单包久未确认尾丢、ACK 丢失等。与 PTO 互补机制典型触发作用时间阈值 / TLP 思路有 ACK 进展但尾部 PN 卡住尽早重传疑似丢失帧PTO该 PN 空间完全无 ACK发 probePING 或重封装帧7. 连接级与 Stream 级流控流控与可靠传输解耦流控答「还能不能收」ACK 答「有没有收到」。7.1 MAX_STREAM_DATA单 Stream接收方通告该 Stream 上发送方Offset 不得超过的上限。初始 Max 1MB → 发到 1MB 停等 消费 512KB → 发 MAX_STREAM_DATA 提到 1.5MB → 继续发7.2 MAX_DATA连接级所有 Stream累计未消费字节不得超过连接级上限。7.3 MAX_STREAMS限制对端可打开的双向 / 单向Stream 数量与 Stream ID 编码配合详见QUIC协议详解2。控制粒度MAX_STREAM_DATA单 Stream OffsetMAX_DATA全连接MAX_STREAMS并发 Stream 个数8. 面试要点问题要点PN 与 TCP SEQ分空间、加密、重传进新 PN如何判丢ACK Range 时间阈值TLP 思路PTOInitial 为何要 padding防 UDP 放大攻击未验证前限制响应大小帧与包关系多帧一包Stream 靠 Offset 有序发送/接收路径小结发送app → STREAM 帧 → 检查 MAX_* → 封装 Packet(PN) → in_flight 接收解密 → 按 Offset 入缓冲 → ACK → 更新 MAX_STREAM_DATA一句话QUIC协议详解1钉死两件事——线上长什么样Long/Short、帧丢了怎么办PN、ACK Range、PTO、流控。连接语义与 TLS 见QUIC协议详解2HTTP/3 见QUIC应用实践。
QUIC协议详解1
QUIC协议详解1本篇QUIC 系列 ②/④ · QUIC协议详解1· 系列总览见QUIC协议系列导读QUIC 跑在 UDP 上但逻辑单元是Packet包与Frame帧一个 UDP datagram 可含一个或多个 QUIC 包每个包内可叠多个帧。可靠传输靠Packet NumberPN与ACK Range确认丢包后帧内容重封装进新 PN而非 TCP 式原包重发。速览Long HeaderInitial / Handshake / 0-RTTShort Header1-RTT 数据。PN 分Initial / Handshake / Application三个空间单调递增、加密隐藏。丢包靠ACK Range 时间阈值 PTO无 triple dup-ACK 快重传。流控MAX_STREAM_DATA单流MAX_DATA连接MAX_STREAMS并发。目录一、报文模型1. UDP → Packet → Frame2. 包类型与 Long Header3. Short Header 与 PN 隐藏4. 常用帧类型二、可靠传输与流控5. PN 空间与 ACK Range6. 丢包判定与 PTO 重传含时间阈值/TLP7. 连接级与 Stream 级流控8. 面试要点1. UDP → Packet → FrameUDP Datagram └── QUIC Packet (Long 或 Short Header) ├── Frame: CRYPTO ├── Frame: ACK └── Frame: STREAM层级职责UDP端到端 datagram 投递不可靠QUIC Packet加密单元、PN、CIDQUIC Frame语义载荷数据、握手、控制实现上常见一个 UDP 包只放一个 QUIC 包规范允许合并但不常见。2. 包类型与 Long Header类型Header阶段典型内容InitialLong建连ClientHelloCRYPTOHandshakeLong建连ServerHello、Finished0-RTTLong复用早期应用数据ShortShort1-RTTSTREAM、ACK 等RetryLong特殊服务端要求重试 TokenVersion Negotiation特殊版本不支持时的版本列表Long Header 位图RFC 9000 §17.2概念|1| Type(7) | ← Header Form 1 | Version (32) | | DCID Len | Destination CID (*) | | SCID Len | Source CID (*) | | Type-specific (Token / Length 等因 Initial/HS/0-RTT 而异) | | [AEAD Protected PayloadPN 帧列表] |字段说明Header Form 1长头标识TypeInitial0x00 / 0-RTT0x01 / Handshake0x02 / Retry0x03VersionQUIC 版本号DCID / SCID目的 / 源 Connection IDTokenInitial 中可选Retry 后LengthPayload 长度PayloadAEAD 加密含 PN 帧列表Long Header除 Retry/VN 外头部字段明文Payload 密文。Initial / Handshake 包不得与 1-RTT 应用数据混在同一 QUIC 包类型规则下混用实现上分开发。Short HeaderLong Header复用场景InitialHandshake0-RTT1-RTT App Data3. Short Header 与 PN 隐藏Short Header1-RTTRFC 9000 §17.3|0|C|K|1|P| Reserved | ← Form0CKey PhaseK 保留PSpin Bit | Destination CID | | [Packet Number加密/掩码1/2/4 字节] | | AEAD Protected Payload |部分说明Header Form 0短头CKey Phase指示当前 / 下一套密钥Key Update见QUIC协议详解2DCID定位连接无 Version、无 SCIDPN1/2/4 字节加密/掩码PayloadAEAD 保护PN 要点每个加密级别独立 PN 空间严格单调递增。PN 用于丢包检测、ACK 引用、AEAD nonce、防重放。不能像 TCP SEQ 那样明文抓包直读——需解密或 key log。Spin Bit可选用于 RTT 采样部分网络会禁用。4. 常用帧类型帧通用格式Type变长整数 类型相关字段。核心帧数据与可靠帧作用STREAM应用/HTTP 数据含 Stream ID、Offset、FINCRYPTOTLS 握手片段按 Offset 连续重组ACK确认 PN支持多ACK Range流控与连接管理帧作用MAX_DATA连接级接收窗口上限MAX_STREAM_DATA单 Stream 接收上限MAX_STREAMS_BIDI / _UNI允许打开的流数量NEW_CONNECTION_ID下发可用 CID迁移 / 防追踪 / LBRETIRE_CONNECTION_ID退役不再使用的 CIDRESET_STREAM / STOP_SENDING异常中止 / 停止发送HANDSHAKE_DONE服务端握手确认PING保活 / PTO 探测CONNECTION_CLOSE关闭连接PATH_CHALLENGE / PATH_RESPONSE路径验证迁移STREAM 帧概念Type | Stream ID | [Offset] | [Length] | Data… | FIN?同一 Stream 内靠Offset有序FIN1表示发送结束。CRYPTO 帧无 Stream ID绑定当前 PN 空间的隐式 TLS 流Offset 必须连续。注意帧不跨 QUIC 包重组Stream 内靠 Offset 排序。PN 被加密Wireshark 需SSLKEYLOGFILE解密见QUIC应用实践。5. PN 空间与 ACK RangePN Space包类型InitialInitialHandshakeHandshakeApplication DataShort Header规则ACK 只引用同一 PN 空间不同空间 PN 互不影响。ACK 帧携带Largest AcknowledgedACK Delay接收处理延迟用于 RTTACK Range Count 多个区间示例Largest Acked 105 Ranges: [100–105], [90–95] → 确认 PN 90–95 与 100–105表达力≥ TCP SACK发送端据此判断哪些 PNlost。6. 丢包判定与 PTO 重传6.1 判丢简化机制说明PN 超前 时间阈值PN 远小于 Largest Acked − threshold → lostPTO超时未收到任何 ACK → 进入 Probe没有TCP 式triple duplicate ACK 快重传。6.2 PTO 与重传PTOProbe Timeout近似RFC 9000 §6.2此处为简化写法完整算法含指数退避、握手未确认前禁止发 1-RTT 数据、各 PN 空间独立计时等PTO smoothed_rtt max(4 × rttvar, granularity)触发后发新 PN的 probe 包非原 PN 重发。内容常为PING或未 ACK 的STREAM/CRYPTO 帧重新封装。连续 PTO 失败 → 指数退避 → 最终CONNECTION_CLOSE。是PTO发 PNNACK?清除 in_flight新 PN PING/重封装帧与 TCP 对比项TCPQUIC确认SEQ ACKPN ACK Range快重传dup ACK无靠 Range 定时器重传形态同 SEQ 重发帧进新 PN 包6.3 时间阈值判丢与尾丢TLP 思路除 PTO 外RFC 9000 丢包检测还有时间阈值time threshold常取 9/8 × smoothed_rtt某 PN 长期未被 ACK 且小于Largest Acknowledged时可判为lost并重封装发送——工程上常称TLPTail Loss Probe思路在整段 PTO 超时之前处理尾部单包久未确认尾丢、ACK 丢失等。与 PTO 互补机制典型触发作用时间阈值 / TLP 思路有 ACK 进展但尾部 PN 卡住尽早重传疑似丢失帧PTO该 PN 空间完全无 ACK发 probePING 或重封装帧7. 连接级与 Stream 级流控流控与可靠传输解耦流控答「还能不能收」ACK 答「有没有收到」。7.1 MAX_STREAM_DATA单 Stream接收方通告该 Stream 上发送方Offset 不得超过的上限。初始 Max 1MB → 发到 1MB 停等 消费 512KB → 发 MAX_STREAM_DATA 提到 1.5MB → 继续发7.2 MAX_DATA连接级所有 Stream累计未消费字节不得超过连接级上限。7.3 MAX_STREAMS限制对端可打开的双向 / 单向Stream 数量与 Stream ID 编码配合详见QUIC协议详解2。控制粒度MAX_STREAM_DATA单 Stream OffsetMAX_DATA全连接MAX_STREAMS并发 Stream 个数8. 面试要点问题要点PN 与 TCP SEQ分空间、加密、重传进新 PN如何判丢ACK Range 时间阈值TLP 思路PTOInitial 为何要 padding防 UDP 放大攻击未验证前限制响应大小帧与包关系多帧一包Stream 靠 Offset 有序发送/接收路径小结发送app → STREAM 帧 → 检查 MAX_* → 封装 Packet(PN) → in_flight 接收解密 → 按 Offset 入缓冲 → ACK → 更新 MAX_STREAM_DATA一句话QUIC协议详解1钉死两件事——线上长什么样Long/Short、帧丢了怎么办PN、ACK Range、PTO、流控。连接语义与 TLS 见QUIC协议详解2HTTP/3 见QUIC应用实践。