“RTO到期是发送者的观察,不是原包必丢、对端必死或业务必未执行的证明。拥塞控制还规定超时后怎样降低发送窗口;那是另一个状态更新,不能只加倍计时器而保持任意大的发送压力。”
形式陈述
拥塞控制调整发送端对共享网络施加的在途压力;流量控制调整它对接收端缓存的压力。二者共同约束发送。本页选择RFC5681(2009)的Reno式慢启动、拥塞避免、快速重传与快速恢复规则,讨论单丢失恢复轨迹;不把它描述为所有现代TCP的默认算法。CUBIC等有各自规范。
令SMSS=
慢启动在cwnd<ssthresh时进行。一个ACK新确认
拥塞避免在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的新确认时,把它们作为丢失信号,设
并重传最早未确认段。后续每个重复ACK可使cwnd再增
若RTO到期,首次超时重传该段时用同样FlightSize式设置阈值,cwnd降至至多
直觉
慢启动用返回ACK较快扩展试探范围,拥塞避免随后温和增加。丢失信号出现时主动退让,以免更多重传又制造更多排队和丢失。
快速恢复临时加上的三个段额度,反映重复ACK暗示已有后续段离开网络并进入接收缓冲;它不是已经找回了缺失段。填洞ACK回来后,要撤去临时膨胀。
例子与边界
相同丢失,两种观察
取
若错误地按原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差异、队列、流数和其他流量都会改变结果。