不落辰

知不可乎骤得,托遗响于悲风

0%

计算机网络-传输层-可靠数据传输-流水线

rdt3.0 性能问题 :停止等待协议 信道利用率低
因此 需要流水线技术
解决流水线的差错恢复的两种基本方法:
Go-Back-N(GBN 回退N步)
Selective Repeat(SR 选择重传)

  • Slide Window 滑动窗口协议
    • Sending Window = 1 , Receive Window = 1
  • Go BY N 回退N步协议
    • Sending Window > 1 , Receive Window = 1
  • Selective Repeat 选择重传协议
    • Sending Window > 1 , Receive Window > 1
  • Sending Window > 1 的协议 称为流水线协议。

slide window 滑动窗口协议

  • 发送窗口:[前沿,后沿]

  • 发送窗口在发送缓冲区里面。是一段已经发送,但还没被确认的分组。

  • 发送缓冲区中 除了发送窗口之外的,就是空闲的缓冲区,可以填入分组然后发送。

  • 实际上 发送缓冲区不动,分组动。但为了便于观察,看成是缓冲区相对于分组移动。

  • 发送缓冲区什么时候向前移动?

    • 当发送窗口的后沿向前移动
    • 发送窗口的后沿向前移动,意味着有已经发送的分组被确认了。那么,这个分组就没必要再缓存在缓冲区里了。(既然已经确认,发送方就没有再重发这个分组的可能。)
    • 可以发现,发送窗口的最左端 一定 就是 发送缓冲区的最左端。因为发送窗口右移一定会导致发送缓冲区右移
  • 接收缓冲区什么时候向前移动

    • 当接收窗口的后沿向前移动

发送缓冲区

  • 发送缓冲区
    • 形式:内存中的一个区域,落入缓冲区的分组可以发送
    • 功能:用于存放已发送,但是没有得到确认的分组
    • 必要性:需要重发时可用
  • 发送缓冲区的大小:发送方在未经接收方确认的情况下,最多可以发送多少个分组。
    • 停止等待协议 的发送缓冲区大小 = 1
    • 流水线协议 > 1
      • 合理的值,不能很大,
      • 因为链路利用率不能够超过100%
  • 发送缓冲区中的分组
    • 未发送的:落入发送缓冲区的分组,可以连续发送出去
    • 已经发送的、等待对方确认的分组:发送缓冲区的分组只有得到确认才能删除

发送窗口

  • 发送窗口:发送缓冲区内容的一个范围 那些已发送但是未经确认分组的序号构成的空间
  • 发送窗口 <= 发送缓冲区
  • 一开始:没有发送任何一个分组
    • 后沿=前沿
    • 之间为发送窗口的尺寸=0
  • 每发送一个分组,前沿前移一个单位

前沿移动

  • 发送窗口前沿极限:[后沿,前沿] <= 发送缓冲区

后沿移动

  • 条件:收到老分组的确认
  • 效果:发送缓冲区罩住了新的分组,来了分组可以发送
  • 极限:后沿<=前沿

接收缓冲区

接收窗口

  • 接收窗口 (receiving window)=接收缓冲区
  • receive window 接收窗口 = 1
    • receive window = 1 即为 GBN协议
    • 返回ack 累计确认:接收方每次返回给发送方的就是最后接收到的正确的分组的ack。
    • 对于不是顺序到达的分组,接收方丢弃,然后返回最后接收到的正确的分组的ack。
    • 对于顺序到达的分组,接收方接收,返回该ack,并且移动接收窗口。
    • 即,只能顺序接收
    • 例子:Wr=1,
      • 在0的位置;只有0号分组可以接收;向前滑动一个,罩在1的位置,如果来了第2号分组,则丢弃;
  • receive window 接收窗口 > 1
    • receive window > 1 即为 SR协议
    • 返回ack 非累计确认:接收方返回给发送方 本次接收到的分组的 ack。(前提:分组要落在接收窗口内)
    • 对于不是顺序到达的分组(即高序号分组乱序到达),接收方可以接收。(只要该分组落在了接收窗口内)。
      • 缓存,但不交付(因为要实现rdt,不允许失序),窗口也不滑动。
    • 对于顺序到达的分组(即低序号分组),接收方接收,并且移动接收窗口。
    • 即,可以乱序接收

GBN and SR 的窗口互动

正常情况

  • 无论是GBN还是SR,其正常情况下的窗口互动都相同,如下
    • 互动:即发送窗口和接收窗口如何推进
    • 源动力:发送方向发送缓冲区内送入新分组

异常情况

  • GBN和SR的区别在于receiving window的大小。
  • 体现就是 异常情况下 GBN的接收方只能接收顺序、丢弃乱序,SR的接收方可以缓存乱序。

GBN

  • 发送窗口

    • 新分组落入发送缓冲区范围,发送。前沿向右滑动
    • 超时重发机制让发送端将发送窗口中的所有分组发送出去
    • 来了老分组的重复确认->后沿不向前滑动->新的分组无法落入发送缓冲区的范围
  • 接收窗口

    • 收到乱序分组,没有落入到接收窗口范围内,则抛弃。然后发送老分组的确认,累计确认;
  • 为什么GBN的超时重发机制会将发送窗口中的所有分组发送出去?

    • 原因如下
    • GBN发送方是一个发送窗口用一个定时器(窗口内最老的分组的定时器)。一旦窗口中最早发送的分组超时,那么会把整个分组都重传。
    • 因为发送方知道 接收方如果有一个已发送的分组没接收到,那么这个已发送分组之后的已发送分组,必然也没有接收到。
      • 为什么接收方会这样?
        • 因为接收方的接收窗口的大小只有1个分组。不可接受乱序分组。
    • 并且 发送方的发送窗口最左端 就是已被发送但还没被确认的第一个分组。因此,从滑动窗口最左端向右,即整个滑动窗口内的分组,都还没有被接收方接收。因此发送方要将滑动窗口内的所有分组全部重发。

SR

  • 发送窗口

    • 新分组落入发送缓冲区范围,发送->前沿滑动
    • 超时重发机制让发送端将超时的分组重新发送出去
    • 来了乱序分组的确认->后沿不向前滑动->新的分组无法落入发送缓冲区的范围
  • 接收窗口

    • 收到乱序分组,落入到接收窗口范围内,接收
    • 发送该分组的确认,单独确认
  • SR协议,发送方对于每一个分组都有一个定时器;而非整个窗口使用一个定时器(GBN协议就是)。

    • 如果接收方接收到乱序的分组(高序号分组),那么会缓存在缓冲区中(并不移动窗口),并且发送该分组的ACK给发送方。
    • 发送方会接受返回的ACK,这些ACK使得发送方知道:发送窗口里的哪些分组已经被接收了。停止这些分组的定时器。这些分组没必要再重发,更没有必要继续缓存在窗口里,不过可惜,如果窗口后沿的分组没被确认,即使其他高序号被确认,窗口仍旧不能移动。
    • 当发送方发生超时重传时,只需要重传发送窗口内没被确认的分组即可。不需要像GBN一样,全部重新发送。

GBN 和 SR协议的内容异同

相同

  • 发送窗口>1

  • 一次能够可发送多个未经确认的分组

  • 发送端最多在流水线中有N个未确认的分组

    不同

  • GBN : receiving window = 1

    • 接收端:只能顺序接收
    • 发送端:从表现来看,一旦一个分组没有发成功,如:发送窗口:0,1,2,3,4 ; 假如1未成功,234都发送出去了,要回退到1再发送;GO BACK TO 1
  • SR: receiving window > 1

    • 接收端:可以乱序接收
    • 发送端:发送窗口:0,1,2,3,4,一旦1未成功,2,3,4,已发送,无需重发234,只选择性重发1 : SELECT 1
  • receiving window的差异 带来了是【回退、重传窗口内所有分组】;【还是选择性重传】的差异

总结

GBN

  • 发送端最多在流水线中有N个未确认的分组

    • 发送窗口的最大值(发送缓冲区)限制发送未确认分组的个数
  • 接收方发送累计型确认 cumulative ack

    • 接收端如果发现乱序(高序号来了),不确认新到来的分组
  • 发送端拥有最老的未确认的分组的定时器

    • 一个窗口只需设置一个定时器
    • 若定时器到时,重传所有未确认分组,GBN中即重传窗口内所有分组

发送方状态机


发送窗口[base,seqnum-1]
发送缓冲区[base,base+N-1]

接收方状态机

例子

SR

  • 发送端最多在流水线中有N个未确认的分组

    • 发送窗口的最大值(发送缓冲区)限制发送未确认分组的个数
  • 发送方每个未确认的分组保持一个定时器

    • 每收到一个ack,就将相应的定时器关掉。
  • 接收方对每个到来的分组单独确认individual ack 非累计确认

    • 接收窗口>1
      • 可以缓存乱序的分组
    • 最终将分组按顺序交付给上层
  • 如图

  • 例子

  • 状态机:略。有时间再搞。

窗口大小

  • 如果用nbits来代表分组序号

    • 那么序号空间为2^n 即[0,…2^n-1]
  • 那么 对于SR协议,窗口长度必须<=序号空间大小的一半

    • 即 SR协议的 窗口长度 <=2^(n-1)
    • 原因:发送方和接收方之间的窗口缺乏同步,并不总是一致的。
    • 见自顶向下P150
  • 那么 对于GBN协议,窗口长度必须 <= 序号空间大小-1

    • 即 GBN协议的 窗口长度 <=2^n - 1
  • 分析

    • 略。改天再搞。写密码学实验了该。