计算机网络自顶向下方法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。它巧妙地结合了:

  1. GBN的累积确认:实现简单,节省ACK开销。

  2. SR的缓存与选择性重传思想:通过快速重传/恢复机制,高效地处理单个丢包,避免了GBN的性能悬崖。

这种混合设计使得TCP在保持相对简单的同时,在效率上达到了一个非常高的水平,完美地平衡了复杂性、效率和可靠性。

相关推荐
BingoGo2 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack2 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo3 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack3 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack4 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo4 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack5 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
DianSan_ERP5 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
呉師傅5 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑