4. Relevant Differences between QUIC and TCP (QUIC 与 TCP 的相关差异)
熟悉 TCP 的丢包检测和拥塞控制的读者会发现这里的算法与众所周知的 TCP 算法相似. 然而, QUIC 和 TCP 之间的协议差异导致了算法上的差异. 下面简要描述这些协议差异.
4.1. Separate Packet Number Spaces (独立的数据包号空间)
QUIC 为每个加密级别 (Encryption Level) 使用独立的数据包号空间 (Packet Number Spaces), 但 0-RTT 和所有代的 1-RTT 密钥使用相同的数据包号空间. 独立的数据包号空间确保使用一种加密级别发送的数据包的确认不会导致使用不同加密级别发送的数据包的虚假重传 (Spurious Retransmission). 拥塞控制和往返时间 (RTT) 测量在数据包号空间之间是统一的.
4.2. Monotonically Increasing Packet Numbers (单调递增的数据包号)
TCP 将发送方的传输顺序与接收方的交付顺序混为一谈, 导致重传歧义问题 (Retransmission Ambiguity Problem) [RETRANSMISSION]. QUIC 将传输顺序与交付顺序分离: 数据包号指示传输顺序, 而交付顺序由 STREAM 帧中的流偏移量 (Stream Offsets) 确定.
QUIC 的数据包号在数据包号空间内严格递增, 并直接编码传输顺序. 更高的数据包号表示该数据包发送得更晚, 更低的数据包号表示该数据包发送得更早. 当检测到包含确认触发帧的数据包丢失时, QUIC 会在具有新数据包号的新数据包中包含必要的帧, 从而在接收到 ACK 时消除关于哪个数据包被确认的歧义. 因此, 可以进行更准确的 RTT 测量, 可以轻松检测虚假重传, 并且可以仅基于数据包号普遍应用快速重传 (Fast Retransmit) 等机制.
这个设计点显著简化了 QUIC 的丢包检测机制. 大多数 TCP 机制隐式地尝试根据 TCP 序列号推断传输顺序 -- 这是一项非常复杂的任务, 特别是当 TCP 时间戳不可用时.
4.3. Clearer Loss Epoch (更清晰的丢包周期)
QUIC 在数据包丢失时开始一个丢包周期 (Loss Epoch). 当在周期开始后发送的任何数据包被确认时, 丢包周期结束. TCP 等待序列号空间中的间隙被填充, 因此如果一个段连续多次丢失, 丢包周期可能在几个往返后才会结束. 因为两者都应该每个周期只减少一次拥塞窗口, QUIC 会对每个经历丢包的往返执行一次减少, 而 TCP 可能在多个往返中只执行一次.
4.4. No Reneging (不撤回)
QUIC ACK 帧包含与 TCP 选择性确认 (SACKs) [RFC2018] 类似的信息. 然而, QUIC 不允许撤回数据包确认 (Reneging), 大大简化了双方的实现并减少了发送方的内存压力.
4.5. More ACK Ranges (更多 ACK 范围)
QUIC 支持许多 ACK 范围, 而 TCP 支持三个 SACK 范围. 在高丢包环境中, 这加快了恢复速度, 减少了虚假重传, 并确保不依赖超时就能取得前进进展.
4.6. Explicit Correction for Delayed Acknowledgments (延迟确认的显式校正)
QUIC 端点测量从接收数据包到发送相应确认之间产生的延迟, 允许对端保持更准确的 RTT 估计; 参见 [QUIC-TRANSPORT] 的第 13.2 节.
4.7. Probe Timeout Replaces RTO and TLP (探测超时替代 RTO 和 TLP)
QUIC 使用探测超时 (PTO, Probe Timeout; 参见第 6.2 节), 其计时器基于 TCP 的重传超时 (RTO, Retransmission Timeout) 计算; 参见 [RFC6298]. QUIC 的 PTO 包括对端的最大预期确认延迟, 而不是使用固定的最小超时.
类似于 TCP 的 RACK-TLP 丢包检测算法 [RFC8985], QUIC 在 PTO 过期时不会折叠拥塞窗口, 因为尾部的单个数据包丢失不表示持续拥塞 (Persistent Congestion). 相反, QUIC 在声明持续拥塞时才折叠拥塞窗口; 参见第 7.6 节. 这样做, QUIC 避免了不必要的拥塞窗口减少, 消除了对诸如 Forward RTO-Recovery (F-RTO) [RFC5682] 等纠正机制的需求. 由于 QUIC 不会在 PTO 过期时折叠拥塞窗口, 如果 QUIC 发送方在 PTO 过期后仍有可用的拥塞窗口, 则不会被限制发送更多在途数据包. 这发生在发送方受应用限制 (Application Limited) 且 PTO 计时器过期时. 这在应用受限时比 TCP 的 RTO 机制更激进, 但在不受应用限制时是相同的.
QUIC 允许探测数据包在计时器过期时临时超过拥塞窗口.
4.8. The Minimum Congestion Window Is Two Packets (最小拥塞窗口为两个数据包)
TCP 使用一个数据包的最小拥塞窗口. 然而, 该单个数据包的丢失意味着发送方需要等待 PTO 才能恢复 (第 6.2 节), 这可能比一个 RTT 长得多. 发送单个确认触发数据包也会增加接收方延迟确认时产生额外延迟的机会.
因此, QUIC 建议最小拥塞窗口为两个数据包. 虽然这增加了网络负载, 但由于发送方在持续拥塞下仍会指数级降低其发送速率 (第 6.2 节), 因此被认为是安全的.
4.9. Handshake Packets Are Not Special (握手数据包不特殊)
TCP 将 SYN 或 SYN-ACK 数据包的丢失视为持续拥塞, 并将拥塞窗口减少到一个数据包; 参见 [RFC5681]. QUIC 将包含握手数据的数据包的丢失与其他丢包一样对待.