What happened?
RFC9002: Appendix B.8 OnPacketsLost
RFC伪代码要求持久拥塞时重置 congestion_recovery_start_time = 0:
if (InPersistentCongestion(pc_lost)):
congestion_window = kMinimumWindow
congestion_recovery_start_time = 0 // <-- 重置recovery时间
xquic Reno正确重置: reno_recovery_start_time = 0 xquic CUBIC未重置: xqc_cubic_reset_cwnd() 不包含 congestion_recovery_start_time = 0
void xqc_cubic_reset_cwnd(void *cong_ctl) {
cubic->epoch_start = 0;
cubic->cwnd = cubic->min_cwnd;
cubic->tcp_cwnd = cubic->min_cwnd;
cubic->last_max_cwnd = cubic->min_cwnd;
// 缺少: cubic->congestion_recovery_start_time = 0;
}
影响: 持久拥塞后CUBIC的recovery状态未被清除,新的ACK可能被错误地认为在recovery期间,导致cwnd无法正常增长
xquic代码位置: xqc_cubic_reset_cwnd() (xqc_cubic.c:222-230)
ngtcp2参考: ngtcp2通过 cc->on_persistent_congestion 回调处理,具体实现在ngtcp2_cc.c中
Steps To Reproduce
Information and Steps to reproduce the behavior.
Relevant log output
What happened?
RFC9002: Appendix B.8 OnPacketsLost
RFC伪代码要求持久拥塞时重置 congestion_recovery_start_time = 0:
if (InPersistentCongestion(pc_lost)):
congestion_window = kMinimumWindow
congestion_recovery_start_time = 0 // <-- 重置recovery时间
xquic Reno正确重置: reno_recovery_start_time = 0 xquic CUBIC未重置: xqc_cubic_reset_cwnd() 不包含 congestion_recovery_start_time = 0
void xqc_cubic_reset_cwnd(void *cong_ctl) {
cubic->epoch_start = 0;
cubic->cwnd = cubic->min_cwnd;
cubic->tcp_cwnd = cubic->min_cwnd;
cubic->last_max_cwnd = cubic->min_cwnd;
// 缺少: cubic->congestion_recovery_start_time = 0;
}
影响: 持久拥塞后CUBIC的recovery状态未被清除,新的ACK可能被错误地认为在recovery期间,导致cwnd无法正常增长
xquic代码位置: xqc_cubic_reset_cwnd() (xqc_cubic.c:222-230)
ngtcp2参考: ngtcp2通过 cc->on_persistent_congestion 回调处理,具体实现在ngtcp2_cc.c中
Steps To Reproduce
Information and Steps to reproduce the behavior.
Relevant log output