跳到主要内容

4. QUIC 与 TCP 的相关差异 (Relevant Differences between QUIC and TCP)

熟悉 TCP 丢失检测和拥塞控制的读者会发现, 本文中的算法与众所周知的 TCP 算法相似. 但是, QUIC 和 TCP 之间的协议差异会导致算法差异. 下面简要描述这些协议差异.

4.1. 独立的分组编号空间 (Separate Packet Number Spaces)

QUIC 为每个加密级别使用独立的分组编号空间, 但 0-RTT 和所有代的 1-RTT 密钥使用同一个分组编号空间. 独立的分组编号空间确保对某个加密级别发送分组的确认不会导致使用不同加密级别发送的分组发生伪重传. 拥塞控制和往返时间 (Round-Trip Time, RTT) 测量在各分组编号空间之间统一进行.

4.2. 单调递增的分组编号 (Monotonically Increasing Packet Numbers)

TCP 将发送方的传输顺序与接收方的递送顺序混合在一起, 从而产生重传歧义问题 [RETRANSMISSION]. QUIC 将传输顺序与递送顺序分离: 分组编号表示传输顺序, 递送顺序由 STREAM 帧中的流偏移量确定.

QUIC 的分组编号在一个分组编号空间内严格递增, 并直接编码传输顺序. 更高的分组编号表示该分组发送得更晚, 更低的分组编号表示该分组发送得更早. 当检测到包含触发确认帧的分组丢失时, QUIC 会把必要帧包含在具有新分组编号的新分组中, 从而消除收到 ACK 时关于确认的是哪个分组的歧义. 因此, 可以进行更准确的 RTT 测量, 可以轻松检测伪重传, 并且 Fast Retransmit 等机制可以只基于分组编号普遍适用.

这一设计点显著简化了 QUIC 的丢失检测机制. 大多数 TCP 机制隐式尝试基于 TCP 序列号推断传输顺序, 这是一项并不简单的任务, 特别是在 TCP 时间戳不可用时.

4.3. 更清晰的丢失时期 (Clearer Loss Epoch)

QUIC 在分组丢失时开始一个丢失时期. 当该时期开始后发送的任一分组被确认时, 该丢失时期结束. TCP 会等待序列号空间中的空洞被填补, 因此如果某个段连续多次丢失, 丢失时期可能在多个往返时间内都不会结束. 由于二者都应在每个时期内只降低一次拥塞窗口, QUIC 会对每个发生丢失的往返时间执行一次降低, 而 TCP 可能跨多个往返时间只执行一次.

4.4. 不允许撤回确认 (No Reneging)

QUIC ACK 帧包含类似 TCP 选择性确认 (Selective Acknowledgments, SACK) [RFC2018] 的信息. 但是, QUIC 不允许撤回分组确认, 这极大简化了双方实现, 并降低了发送方的内存压力.

4.5. 更多 ACK 范围 (More ACK Ranges)

QUIC 支持多个 ACK 范围, 而 TCP 只有三个 SACK 范围. 在高丢包环境中, 这会加速恢复、减少伪重传, 并在不依赖超时的情况下确保继续前进.

4.6. 对延迟确认的显式校正 (Explicit Correction for Delayed Acknowledgments)

QUIC 端点测量从接收分组到发送相应确认之间产生的延迟, 使对等方能够维护更准确的 RTT 估计; 见 [QUIC-TRANSPORT] Section 13.2.

4.7. 探测超时代替 RTO 和 TLP (Probe Timeout Replaces RTO and TLP)

QUIC 使用探测超时 (Probe Timeout, PTO; 见 Section 6.2), 其定时器基于 TCP 的重传超时 (Retransmission Timeout, RTO) 计算; 见 [RFC6298]. QUIC 的 PTO 包含对等方的最大预期确认延迟, 而不是使用固定最小超时.

类似 TCP 的 RACK-TLP 丢失检测算法 [RFC8985], QUIC 在 PTO 到期时不会折叠拥塞窗口, 因为尾部单个分组丢失并不表示持续拥塞. 相反, QUIC 在声明持续拥塞时折叠拥塞窗口; 见 Section 7.6. 这样做时, QUIC 避免了不必要的拥塞窗口降低, 从而不需要 Forward RTO-Recovery (F-RTO) [RFC5682] 等校正机制. 由于 QUIC 不会在 PTO 到期时折叠拥塞窗口, 如果仍有可用拥塞窗口, QUIC 发送方在 PTO 到期后并不受限, 可以发送更多在途分组. 这种情况发生在发送方受应用限制且 PTO 定时器到期时. 当受应用限制时, 这比 TCP 的 RTO 机制更激进; 不受应用限制时则相同.

每当定时器到期时, QUIC 允许探测分组临时超过拥塞窗口.

4.8. 最小拥塞窗口为两个分组 (The Minimum Congestion Window Is Two Packets)

TCP 使用一个分组的最小拥塞窗口. 但是, 如果该单个分组丢失, 发送方需要等待 PTO 才能恢复 (Section 6.2), 这可能远长于一个 RTT. 发送单个触发确认的分组还会在接收方延迟确认时增加产生额外延迟的概率.

因此, QUIC 推荐最小拥塞窗口为两个分组. 虽然这会增加网络负载, 但它被认为是安全的, 因为发送方在持续拥塞下仍会指数级降低发送速率 (Section 6.2).

4.9. 握手分组并不特殊 (Handshake Packets Are Not Special)

TCP 将 SYN 或 SYN-ACK 分组丢失视为持续拥塞, 并将拥塞窗口降低到一个分组; 见 [RFC5681]. QUIC 将包含握手数据的分组丢失与其他丢失同等处理.