Skip to content

算法Algorithm

Reno拥塞窗口与丢失响应

TCP Reno · Congestion window · Slow start · Fast retransmit · Fast recovery

固定RFC5681的Reno式规则,按ACK、三次重复确认和RTO事件核算cwnd与ssthresh,区分FlightSize及接收窗口。

形式陈述 ​

拥塞控制调整发送端对共享网络施加的在途压力;流量控制调整它对接收端缓存的压力。二者共同约束发送。本页选择RFC5681(2009)的Reno式慢启动、拥塞避免、快速重传与快速恢复规则,讨论单丢失恢复轨迹;不把它描述为所有现代TCP的默认算法。CUBIC等有各自规范。

令SMSS=M为每段最大数据字节数,cwnd为拥塞窗口,ssthresh为慢启动阈值,FlightSize为已发送但尚未累计确认的数据字节数。cwnd是许可上限,FlightSize是实际占用;应用暂时没有数据或rwnd较小时,两者可相差很大。

慢启动在cwnd<ssthresh时进行。一个ACK新确认 N 字节,本页取增长 min(N,M)。

拥塞避免在cwnd>ssthresh时进行,本页选用按字节计数的基础规则:进入时计数a=0;新ACK令a←a+N;当a≥当前cwnd时,cwnd增加M并令a=0,否则不增加。还须遵守RFC每RTT增长至多M的限制;本页只在明确分轮、每轮至多确认该轮起始窗口数据的模型下用此规则复算,因此该限制自动成立。等于阈值时选择拥塞避免。重复ACK不加入a。

本页不用SACK,重复ACK须同时满足五项:发送者仍有在途数据;此ACK不携数据;SYN和FIN均关闭;确认号等于该连接已收到的最大确认号;通告窗口等于上一份ACK的窗口。三个这样的连续重复ACK之间没有推进UNA的新确认时,把它们作为丢失信号,设

ssthresh=max(FlightSize/2,2M),cwnd=ssthresh+3M,

并重传最早未确认段。后续每个重复ACK可使cwnd再增 M,按窗口许可发送新数据;下一个确认新数据的ACK到达,cwnd回落为ssthresh,退出这条基本快速恢复路径。前两个重复ACK上的Limited Transmit不计入本页轨迹,算例此时没有待发送的新数据。

若RTO到期,首次超时重传该段时用同样FlightSize式设置阈值,cwnd降至至多 M,重新慢启动;同一段再次因RTO重传时阈值保持,不无限重复减半。规范允许更保守选择,本文在上界取等号计算。

直觉

慢启动用返回ACK较快扩展试探范围,拥塞避免随后温和增加。丢失信号出现时主动退让,以免更多重传又制造更多排队和丢失。

快速恢复临时加上的三个段额度,反映重复ACK暗示已有后续段离开网络并进入接收缓冲;它不是已经找回了缺失段。填洞ACK回来后,要撤去临时膨胀。

例子与边界

相同丢失,两种观察 ​

取 M=1000字节,cwnd=10000,但FlightSize只有6000,rwnd足够大。假定一个段丢失,其后的段产生三个合格重复ACK;前两次没有新数据可做Limited Transmit。第三次到达时,阈值是 max(6000/2,2000)=3000,cwnd临时为6000,立即重传缺段。再来第四个重复ACK,cwnd=7000。填洞ACK确认全部这6000字节后,cwnd回到3000。

若错误地按原cwnd减半,会把阈值设为5000,过高估计实际在途量。正确减半对象是FlightSize,本例正是用应用受限状态区分两者。

另一条独立轨迹中,同样的FlightSize=6000一直没有足够ACK,最终RTO到期。阈值仍3000,cwnd降为1000而不是快速恢复时的6000;同时RTO按自己的规则退避。两条轨迹是不同运行,不能依次套在同一次无新增数据的事件上。

增长的单位 ​

假设无丢失,每个满段单独立即ACK,窗口完全用满,ssthresh大于8000而不截断本例,慢启动某轮从cwnd=2000开始。这轮两份ACK各新确认1000,轮末为4000;下一轮四份ACK可到8000。若接收端每两个段才ACK一次,使用本页每ACK至多1000的规则,增长就不再精确翻倍。指数外观依赖ACK模式与满窗口条件。

拥塞避免另从cwnd=4000、a=0开始,固定这一轮只确认已发的4000字节。四个各新确认1000的ACK后,a依次为1000、2000、3000,第四次达到4000,于是cwnd变5000、a清零。这轮只增一个M。若最后一个ACK额外覆盖字节,清零会保守地丢弃余量,不把它立即换成第二次增长。

推论与应用

三个重复ACK是丢失的启发信号,乱序或复制也能产生相似观察。Reno牺牲部分发送速率换取保守响应,不提供“确定某包已丢”的证明。多重丢失、SACK、ECN、pacing与恢复改进需要新增规则,本页单丢失算例不覆盖它们。

加法增长与乘法减小有助于共享瓶颈,但不能仅从这两个词推出任意网络上的严格公平、稳定低延迟或固定吞吐保证。RTT差异、队列、流数和其他流量都会改变结果。

参考资料
  • RFC 5681,2009,§2、§§3.1–3.2:FlightSize、ACK条件、慢启动、拥塞避免、超时与快速恢复。本页明确选择其中的Reno式基础机制。
  • RFC 9438,2023,§§1、4:CUBIC另有窗口增长函数,并更新RFC5681的相关约束;这里仅作算法版本边界,不以CUBIC规则复算本页Reno轨迹。
关系图谱4 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系