TCP可靠传输:RTT估计、超时与快速重传
可靠数据传输
TCP是建立在不可靠的、尽力而为的IP服务上的可靠数据传输协议,因此TCP采用了超时重传机制,确保了接收端收到的数据是有序无损的。
第一种情况是,假设主机A给主机B发送一个报文段,序号是92,包含8字节数据。在发出该报文段后,主机A需要等待来自主机B的确认号为100的报文段。虽然主机B收到了A的报文段,但是B发往A的确认报文丢失了。在这种情况下,超时事件就会发生。主机A会重传相同的报文段,当主机B收到重复报文将会将其丢弃。
第二种情况是,假设主机A连续发送了两个报文段,第一个报文段序号是92,包含8字节数据,第二个报文段序号是100,包含20字节数据。
这两个报文段都完好无损地到达主机B,并且主机B分别发送了确认号100和120,但是这两个确认报文都没有在超时之前到达。
当超时事件发生时,主机A将会重传序号为92的第一个报文段。此时,如果第二个报文段的ACK在新的超时之前到达,那么第二个报文段就不再会被重传。
第三种情况是,主机A发送两个报文段,其中第一个报文段的确认丢失,但是在超时事件发生之前,主机A收到了第二个报文段的确认。由于累计确认,主机知道主机B已经收到了之前所有的报文段,因此不会再重传。
RTT估计与超时
固定超时过短会误重传,过长又使恢复迟缓。记为EstimatedRTT、为DevRTT,为本次SampleRTT。本节采用先用旧估计更新偏差的次序:
常用、。教学计算的原始超时为。RFC 6298还考虑时钟粒度,并建议将计算出的RTO向上限制到至少1秒;本节实验同时显示原始值与这个下限,以免将教学公式等同于全部实现细节。
超时后RTO应指数退避。没有时间戳等消除歧义的机制时,重传报文段的确认不直接用于RTT采样(Karn原则),因为无法判断ACK对应原始发送还是重传。
平滑RTT样本并调整超时
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
快速重传(Fast Retransmit)
超时触发重传存在一个问题,就是超时周期可能相对较长。当一个报文段丢失时,发送方就被迫延迟重传丢失的分组,因而增加了端到端时延。
通常,发送方可在超时事件发生之前,通过注意冗余的ACK可以检测到丢包情况。因为发送方发送大量的报文段,如果一个报文段丢失,就很可能引起许多冗余ACK。
如果发送方一旦收到3个冗余ACK,就认为该报文段已经丢失,TCP就会执行快速重传,即在该报文段超时之前就进行重传。
统计冗余ACK并修复字节缺口
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
更新RTT并选择重传时机
初值EstimatedRTT=100毫秒、DevRTT=10毫秒,α=1/8、β=1/4,先用旧估计更新偏差。依次处理140与80毫秒样本,求各次原始RTO。应用1秒下限后做一次超时退避。解释为何不直接采样重传报文段,再求本节快速重传示例补齐缺口后的ACK。