计算机网络自顶向下方法24——运输层 可靠数据传输 超时间隔加倍 快速重传 是回退n步还是选择重传
可靠数据传输的进阶机制:超时间隔加倍与快速重传
我们之前讨论的回退N步和选择重传是基础模型,而TCP的实现是一种混合体,它汲取了多种思想的精华,以应对复杂的真实网络环境。
一、一些“有趣”的情况与基础协议的困境
1. 情况一:轻微的临时延迟 vs 严重的包丢失
场景:一个数据包的ACK稍微来晚了一点,可能是因为网络中存在短暂的排队。
GBN/SR的困境:如果超时间隔是固定的,这次轻微的延迟就会触发不必要的重传。在GBN中,这甚至会引发一连串不必要重传,浪费带宽。
2. 情况二:单个数据包丢失
场景:在一个很长的数据流中,只有一个数据包丢失了,其后的数据包都顺利到达。
GBN的困境:由于GBN接收方会丢弃所有失序的包,发送方需要回退并重传丢失包之后的所有包。一个丢包,代价巨大。
SR的困境:SR虽然只重传丢失的包,但它需要等待该包的超时计时器到期,这可能需要等待一个完整的超时间隔,恢复速度慢。
二、TCP的解决方案之一:超时间隔加倍
这是TCP拥塞控制的重要组成部分,但它在处理上述“情况一”时非常有效。
机制:每当TCP重传一个报文段后,它并不是使用原来的超时间隔,而是将下一次的超时间隔设置为前一次的两倍。
如何解决问题一?
如果是因为轻微的网络波动导致超时,在重传后,网络很可能已经恢复。重传的包会很快被确认,TCP随后会将超时间隔降回正常值。
如果是因为真正的网络拥塞导致连续丢包,这种指数级退避策略能迅速降低发送方的重传速率,给网络足够的时间来缓解拥塞,这是一种“利他”行为。
本质:这是一种谨慎的、自适应的策略。它承认自己无法准确判断丢包原因,于是采取一种对网络更友好的方式。
三、TCP的解决方案之二:快速重传
这是TCP为了处理“情况二”(单个包丢失)而设计的高效机制,它极大地减少了等待超时的时间。
机制:如果接收方收到了一个失序的数据包(例如,期望Seq=1000,却收到了Seq=1500),根据TCP标准,它应该立即重复发送最后一个按序包的ACK(即再次发送Ack=1000)。
触发条件:当发送方连续收到3个重复的ACK时,它就有很强的理由认为这个被期望的报文段(Seq=1000)已经丢失了,而不是仅仅延迟了(因为如果只是延迟,不会引发后续多个包的确认)。
行动:于是,发送方无需等待该报文段的超时计时器到期,就立即重传那个被认为丢失的报文段。

四、是回退N步还是选择重传?
这是一个非常好的问题。答案是:TCP是一种混合体,但它的行为在此时更偏向于“选择性重传”。
它像GBN的地方:
TCP使用累积确认,确认号表示该序号之前的所有字节都已收到。这是GBN的思想。
接收方可以接受失序的报文段并缓存它们,这是对纯GBN的改进,偏向SR。
它像SR的地方(尤其是在快速重传中):
快速重传机制只重传那个被推断为丢失的单个报文段,而不是所有后续报文段。这正是SR的核心思想。
在快速重传之后,TCP通常会进入一个名为 “快速恢复” 的阶段,而不是像GBN那样完全回退。
结论:
TCP的可靠数据传输协议不是一个教科书式的GBN或SR。它巧妙地结合了:
GBN的累积确认:实现简单,节省ACK开销。
SR的缓存与选择性重传思想:通过快速重传/恢复机制,高效地处理单个丢包,避免了GBN的性能悬崖。
这种混合设计使得TCP在保持相对简单的同时,在效率上达到了一个非常高的水平,完美地平衡了复杂性、效率和可靠性。
