计算机网络-自顶向下方法笔记-滑动窗口协议

计算机网络全部笔记链接🔗

滑动窗口协议

因为停等的协议,导致了发送方的利用率:发送方实际忙于将发送比特送进通道的那部分时间与发送时间之比 很低

解决方式:

不以停等方式运行, 允许发送方发送多个分组而无需等待确认。

例如说在等待确认之前发送了三个报文的话,利用率就提升了3倍,这种技术就是 流水线

为了实现这种流水线协议,条件:

  • 增加序号范围:可能会有多个在输送中未进行确认的分组
  • 发送方和接收方需要缓存多个分组
  • 解决流水线的差错恢复有两种基本的方法: 回退N步(GBN)和 选择重传(SR)

请添加图片描述

滑动窗口GBN协议概述

假设窗口的长度是N

  • 绿色序列号:0 到 send_base,就是发送并且已经确认了的分组
  • 黄色序列号:send_base 到 nextseqnum - 1,对应已经发送了但是还没有被确认的分组
  • 蓝色:【nextseqnum, send_base _ N - 1】对应的是:如果有需要立即发送的分组,可以用蓝色发送

如果想要发送白色的,就需要将前面没有确认的进行确认,那么窗口就能够右移包含到对应的序列

请添加图片描述

GBN协议发送方:

  • 分组的头部包含K比特序列号,那么序号的范围就是【0 , 2 ^ k - 1】,在一个有限的范围内,所有涉及序号的运算必须使用模2 ^ k 运算
  • 窗口的尺寸是N,最多允许N个分组未进行确认
  • 累积确认,ACK(n),标识接收方正确的接收到了序号为n的以前(包括n)的所有分组
  • 超时事件 Timeout(n):n超时,那么就重传序列号 大于等于n,还未收到ACK的所有的分组

请添加图片描述

GBN发送方FSM

就是对上述的解释进行了实现

请添加图片描述

GBN接收方FSM

请添加图片描述

如果一个序号为n的分组被正确的接收到并且按序(上次交付的是序号为n-1的分组),则接收方的分组n发送一个ACK,将该分组中的数据部分交付给上层。所有其他情况都丢弃分组,并且为最近按序接受的分组重新

🌰:接收方必须按序将数据交付给上层。假设现在 期望收到分组n,但是分组n+1却到了

  • 一种想法💡:为了按序,那么我先缓存一下n+1,等收到n之后再上传。但是发送方的规则是:如果n分组丢失了,也就是timeout(n),那么就将n以及n后面的都重新发送
  • 因此,如果n组丢失了,接收方丢弃分组n + 1就好了(因为发送方会重新发送)

优点:

  1. 接收缓存简单,接收方不需要缓存任何失序分组
  2. 接收方需要维护的唯一数据就是:下一个按序接收的分组的序号

缺点:

  1. 丢弃正确的分组,对后对于该分组的重传可能出错,甚至需要更多的重传

GBN样例🌰

请添加图片描述

  1. 发送端发送了分组0 , 1, 2 但是分组2丢失了。
  2. 因此接收端返回的ACK0 ACK1
  3. 发送端接收到ACK0,滑动窗口向后移动,继续发送分组4
  4. 接收端期待收到分组2,但是收到了分组3,直接丢弃掉,发送ACK1
  5. 。。。。。
  6. 发送端分组2Timeout,重新发送2 3 4 5分组
选择重传(SR)协议

GBN的缺陷:

单个分组的差错可能就会引起GBN大量的分组,导致信道中充斥着重复的,没必要的重传的分组

SR协议

  • 接收方对于每个分组 单独进行确认,设置了 缓存机制,缓存乱序到达的分组
  • 发送方只重传那些没有收到ACK的分组,为每一个分组都设置定时器
  • 发送方的窗口:N个连续的序列号,限制已发送且未确认的分组

发送方/接收方窗口

请添加图片描述

为了解决GBN协议的问题,我们在接收方同样设置了窗口

  • 灰色的代表期望接收但是还没有被接收的分组
  • 红色的代表乱序到达的分组,我们进行暂时的缓存在接收方,同样我们发送ACK到发送方
  • 蓝色就是可以用来接收分组的位置

这样就能够很好的提高效率

S R 发 送 方 的 事 件 与 动 作 SR 发送方的事件与动作 SR

  1. 从上层接收到数据。SR发送方检查下一个可用于该分组的序号,如果序号位于发送方的窗口内,将数据打包并且发送;否则要么缓存,要么返回给上层

  2. 超时。每个分组必须拥有自己的定时器

  3. 收到ACK。如果收到ACK并且该分组序号在窗口内,SR发送方将那个被确认的分组标记为 已接收。如果该分组就是send_base(窗口的边缘),那么窗口的基序号向前移动到 最小的为被确认的分组处(因为send_base + 1可能也接收到了)

S R 接 收 方 的 事 件 与 动 作 SR接收方的事件与动作 SR

  1. 序列号在【rcv_base, rev_base + N - 1】内的分组被正确的接收。收到的分组落在接收方的窗口内,一个选择ACK返回个发送方。如果没有收到过该分组就进行缓存。 如果收到的分组是rcv_base(那么我们就可以移动窗口了),将从窗口开始的 连续的 分组提交给上层。
  2. 序列号在【rcv_base - N, rev_base - 1】内的分组被正确的收到。产生一个ACK,即使该分组是接收方以前已经确认过的分组
  3. 其他情况,忽略分组

SR协议实例

描述的话有点乱,还是直接自己看图比较清晰(如果你理解上述了的话😇🐳)

请添加图片描述

SR协议的困境

请添加图片描述

由上图可见,接收方窗口在两种情况下是相同的,显然是不能够很好的分辨出来区别并且正确的处理的

为了避免这种情况,需要规定好序列号空间和窗口尺寸之间的关系

序列号空间大小与窗口尺寸之间的关系

  • 我们假设序列号是K位,因此可用的序列号就是2 ^ k
  • 发送方的窗口尺寸:Ns
  • 接收方的窗口尺寸:Nr

满 足 : N s + N r < = 2 K 满足:Ns + Nr <= 2 ^ K Ns+Nr<=2K

可靠数据传输机制及用途总结

请添加图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值