QUIC协议的丢包恢复机制
-
QUIC丢包恢复的基本前提
首先,您需要理解QUIC协议的一个核心设计:它运行在UDP之上,并自身实现了可靠的、有序的字节流传输,这原本是TCP的核心职责。因此,QUIC也必须拥有自己的机制来检测数据包丢失并触发重传。与TCP依赖隐式的“三次重复确认”(3 Duplicate ACKs)和“超时重传”(RTO)不同,QUIC的丢包恢复机制建立在两个明确的信号之上:确认(ACK)帧和探测超时(Probe Timeout, PTO)。 -
丢包检测的基础:ACK帧与确认区间
QUIC接收端会定期发送ACK帧给发送端。这个ACK帧不仅包含已收到的最大数据包号,更重要的是,它包含了一个或多个确认区间(ACK Ranges)。接收端通过这些区间明确告知发送端:“我收到了从包号N到包号M的所有数据包”。任何落在这个已确认区间之外,并且发送时间早于已确认的最大包号的包,都被认为是疑似丢失(ACK-eliciting)或已丢失。发送端维护着每个已发送但尚未被确认的数据包的发送时间。如果某个包在一段时间内(这个时间由RTT和其方差动态计算得出)没有被任何ACK帧确认,发送端就会将其标记为丢失。 -
主动探测:探测超时
当网络路径上长时间没有收到任何确认时(例如,发送了一连串数据包后,接收端的ACK全部丢失),QUIC需要一个机制来“探测”连接是否仍然存活。这就是探测超时。PTO类似于TCP的重传超时,但更精确。PTO的计算基于持续测量的平滑RTT及其方差。当PTO定时器触发时,发送端会立即发送一个探测数据包(通常是一个PING帧或重发一个最小的未确认的ACK-eliciting包)。这个探测包的唯一目的是从接收端引回一个ACK帧,从而刷新RTT估计并确认路径状态。如果连续多个PTO后仍无响应,连接可能被视为中断。 -
触发重传:即时重传与拥塞控制交互
一旦一个数据包被明确标记为丢失(通过ACK间隙推断或PTO超时),QUIC不会像TCP那样等待一个完整的RTO周期。它会立即安排重传该数据包的所有帧。但这里有一个关键点:重传的数据包会使用一个新的数据包号,而不是重复旧的包号。这使得接收端能够清晰地区分原始传输和重传,避免了TCP中重传歧义的问题,从而能更精确地计算RTT。
重传行为与拥塞控制紧密耦合。检测到丢包(特别是通过ACK间隙推断的丢包)是网络拥塞的主要信号。QUIC的默认拥塞控制器(基于TCP Cubic的衍生算法)在检测到丢包时,会立即将拥塞窗口(cwnd)减半,以减少向网络注入的数据量,这是对拥塞的标准反应。而PTO超时触发的重传,通常被视为更严重的拥塞或路径失效信号,拥塞窗口可能会被重置到一个更小的值。 -
前向纠错与乱序交付的优化
为了对抗丢包,QUIC还支持可选的前向纠错特性。发送端可以在发送数据包的同时,发送一些包含冗余纠错信息的FEC数据包。如果少量数据包丢失,接收端可能无需等待重传,直接利用FEC包和收到的其他数据包重建出丢失的数据,从而降低应用层感知到的延迟。
此外,由于每个数据流(Stream)内的数据帧都有独立的偏移量(Offset),即使数据包N丢失导致其内部的部分流数据缺失,后续到达的数据包N+1中属于其他流的数据帧依然可以立即被交付给对应的应用层流。这种基于流的、乱序的可靠交付能力,使得单个包的丢失只影响其承载的流,而不会像TCP那样“队头阻塞”所有后续数据,这也是QUIC丢包恢复机制带来的一个重要性能优势。 -
总结与核心优势
QUIC协议的丢包恢复机制是一个集成了精确丢包检测(通过详细ACK帧)、主动路径探测(PTO)、即时重传(使用新包号)、与拥塞控制协同响应,并辅以流级多路复用和可选FEC的综合性方案。其核心优势在于:更快的重传决策(无需等待3个重复ACK)、更精确的RTT测量(无重传歧义)、更细粒度的恢复影响(避免队头阻塞),共同提升了在不可靠网络(如移动网络)上的应用性能与连接韧性。