“若RTO到期,首次超时重传该段时用同样FlightSize式设置阈值,cwnd降至至多 $M$,重新慢启动;同一段再次因RTO重传时阈值保持,不无限重复减半。规范允许更保守选择,本文在上界取…”
形式陈述
TCP发送者在已发数据长期未获确认时,需要决定何时重传。往返时间RTT是一个发送样本到其确认返回的时间;RTO是据样本和保守余量选择的重传超时时间。RTT观察值不是以后每个包的时延上界。
本页固定RFC6298(2011)的算法,时钟粒度为
计算
未使用能消除歧义的时间戳机制时,Karn规则不从重传过的段采RTT样本,因为返回ACK可能确认原发送,也可能确认重传。数据首次发出且计时器未运行时启动;新ACK确认了此前未确认数据时重启;全部在途数据获确认时关闭。计时器到期则重传最早未确认段,将RTO乘2,再启动下一轮计时。
直觉
只取平均RTT会忽略抖动。偏差大时多留一些余量,可减少原包只是慢了一点却被大量重传的情况。超时越多,退避越长,避免没有反馈时仍用原速率不断加压。
一次重传之后,ACK没有写明“这是回应第一份还是第二份”。用第二次发送时间强行计算一个很短RTT,会让以后更容易过早重传。
例子与边界
取
第三样本为0.7秒:
在另一条时间线上,时刻10发出数据,RTO=2.225。到12.225仍无新确认,重传并退避至4.45秒;若继续无新确认,下一次到期是16.675。时刻12.4到达的ACK既可能回应原包,也可能回应重传,因此本页不把0.175秒加入估计。若ACK确认全部在途数据,停止计时器;若仍有未确认数据,则依新ACK规则重启。
初始SYN等待时若发生超时,并且实现使用小于3秒的RTO,RFC6298另要求握手完成后开始数据传输时把RTO重新初始化为3秒。这是握手特定条件,不能遗漏后仍称“覆盖该RFC全部初始化路径”。本页主要算例从已有有效数据RTT开始。
推论与应用
重传计时器为了修复传输缺口;应用deadline为了限制整个调用愿意等待多久。一个调用可以在TCP下一次重传之前就到达deadline;也可能经历多次TCP重传而仍在业务预算内。两者不应共用一个含糊的“超时”字段。
RTO到期是发送者的观察,不是原包必丢、对端必死或业务必未执行的证明。拥塞控制还规定超时后怎样降低发送窗口;那是另一个状态更新,不能只加倍计时器而保持任意大的发送压力。