TCP检测到丢包后,是否会在重传报文的ACK返回前发送新数据包?
问题:TCP完成丢包重传后,是否会在收到重传报文的ACK前发送新数据包
这个问题没有统一的答案,具体行为取决于TCP的拥塞控制实现、触发重传的原因,以及当前的发送窗口余量:
- 若为*快重传(收到3次重复ACK触发的丢包检测)*场景,使用TCP Reno及后续兼容快恢复机制的实现:
完成重传后会进入快恢复阶段,此时拥塞窗口会被调整为ssthresh + 3 * MSS,后续每收到一个新的重复ACK,拥塞窗口还会增加1个MSS。只要当前拥塞窗口大于已发送未确认的字节数,就可以直接发送新数据包,不需要等待重传报文的ACK返回。 - 若为*超时重传(RTO计时器超时才检测到丢包)*场景:
传统TCP实现会直接把拥塞窗口降低到1个MSS,进入慢启动阶段。此时唯一的窗口配额已经被用于发送重传报文,所以必须等这个重传报文的ACK返回,拥塞窗口上涨之后,才能继续发送新的数据包。 - 针对BBR这类基于带宽探测的新型TCP拥塞控制实现:
丢包不再是判断拥塞的唯一依据,如果TCP判断当前链路的传输管道还有空余,就算刚发完重传报文,也可以直接发送新的数据包,不需要等重传对应的ACK。
内容的提问来源于stack exchange,提问作者Jason Zhou
相关产品推荐
相关产品推荐

