状态机与链路动画
SLOW START指数增长
CONG AVOID线性增长 AIMD
FAST RECOVNewReno 恢复
TIMEOUTRTO 重启
实时变量
Mode
SLOW START
指数增长
cwnd
10 pkt
发送窗口
ssthresh
∞
慢启动 / 拥塞避免边界
dupACK count
0
3 个触发快速重传
Throughput
0 Mbps
ACK 滑窗估计
RTT / Inflight
0 ms / 0
队列会推高 RTT
Total Retx
0
快速重传 + 超时重传
Recovery round
-
partial ACK 处理
TCP 交互序列图(三次握手 + 数据传输 + 快速重传)
窗口曲线
cwnd / inflight (pkt)
cwndinflight
吞吐量
Throughput (Mbps)
throughput
RTT 曲线
RTT (ms)
sampleRTTSRTT
NewReno 核心流程
1. 慢启动 (Slow Start)
每收到 1 个 ACK,
cwnd += 1(每 RTT 翻倍)。当 cwnd ≥ ssthresh 进入拥塞避免。
2. 拥塞避免 (Congestion Avoidance)
每收到 1 个 ACK,
cwnd += 1/cwnd(每 RTT 增加约 1 MSS)。经典 AIMD 的 AI 部分。
3. 快速重传 & 快速恢复 (NewReno)
3 个 dupACK 触发:
后续每个 dupACK:
Partial ACK:确认了部分丢失数据但不是全部 → 重传下一个未确认段,不退出恢复。
Full ACK:确认所有恢复前数据 →
ssthresh = cwnd/2,cwnd = ssthresh + 3。后续每个 dupACK:
cwnd += 1(窗口膨胀)。Partial ACK:确认了部分丢失数据但不是全部 → 重传下一个未确认段,不退出恢复。
Full ACK:确认所有恢复前数据 →
cwnd = ssthresh,退出恢复。
4. RTO 超时
ssthresh = cwnd/2,cwnd = 1,回到慢启动。这是最严重的惩罚。
事件日志
与其它算法的对比
NewReno vs Reno:Reno 在 Fast Recovery 期间收到 partial ACK 会立即退出恢复再重新触发,导致多次减半;NewReno 保持在恢复状态并逐个重传,窗口只减半一次。
NewReno vs CUBIC:NewReno 使用线性增长(每 RTT +1 MSS),CUBIC 使用三次函数,高 BDP 链路下 CUBIC 能更快探回丢包前的窗口。
NewReno vs BBR:NewReno 是 loss-based(丢包驱动),BBR 是 model-based(带宽-RTT 模型驱动),BBR 不依赖丢包来调整速率。
NewReno vs CUBIC:NewReno 使用线性增长(每 RTT +1 MSS),CUBIC 使用三次函数,高 BDP 链路下 CUBIC 能更快探回丢包前的窗口。
NewReno vs BBR:NewReno 是 loss-based(丢包驱动),BBR 是 model-based(带宽-RTT 模型驱动),BBR 不依赖丢包来调整速率。
- RFC 6582: The NewReno Modification to TCP's Fast Recovery Algorithm
- RFC 5681: TCP Congestion Control (Slow Start, Congestion Avoidance, Fast Retransmit/Recovery)
core/internal/congestion/utils.go: quic-go 默认路径使用的reno即为 NewReno 变体