【计算机网络】数据链路层——两种可靠传输机制GBN与SR。

后退N帧协议(GBN)

停等协议的弊端:太闲了

解决办法:使用流水线技术

image-20240301221658586

为了失配流水线技术:1.必须增加序号范围。2.发送方需要缓存多个分组。

对应方法:后退N帧协议(GBN) 选择重传协议(SR)

后退N帧协议中的滑动窗口

发送窗口:发送方维持一组连续的允许发送的帧的序号。(停等协议中,发送窗口和接受窗口都为1)

  • 先依次发送发送窗口内的帧。(先拷贝副本再发送)
  • 接受窗口接收到第一个帧后,发送一个ACK回去,然后接受窗口向前移动一位

image-20240301222148529

  • 发送方收到ACK,向前移动。至此0号帧交易成功。

    累计确认机制:没必要每个帧都发ACK

GBN发送方必须响应的三件事

上层的调用

上层要发送数据时,发送方先检查发送窗口是否已满,如果未满,则产生一个帧并将其发送;

如果窗口已满,发送方只需将数据返回给上层,暗示上层窗口已满。上层等一会再发送。

(实际实现中,发送方可以缓存这些数据,窗口不满时再发送帧)。

收到了一个ACK确认帧

GBN协议中,对n号帧的确认采用累积确认的方式,标明接收方已经收到n号帧和它之前的全部帧。

超时事件

协议的名字为后退N帧/回退N帧,来源于出现丢失和时延过长帧时发送方的行为。

就像在停等协议中一样,定时器将再次用于恢复数据帧或确认帧的丢失。

如果出现超时,发送方重传所有已发送但未被确认的帧。

GBN接收方要做的事

  • 如果正确收到n号帧,并且按序,那么接收方为n帧发送一个ACK,并将该帧中的数据部分交付给上层。

  • 其余情况都丢弃帧,并为最近按序接收的帧重新发送ACK。接收方无需缓存任何失序帧,只需要维护一个信息: expectedseqnum (下一个按序接收的帧序号)。

流程示范

image-20240301230219425

丢失处!!!

因为接收方从未接收到2帧,所以接下来接受的3帧4帧5帧都丢弃。

直到:发送方的超时重传机制发现第二针并没有ack回来

于是后退345这几帧,重新发送2345!!!!!!!

滑动窗口问题

窗口可以无限么?

若采用n个比特对帧编号,那么发送窗口的尺寸W-应满足:

image-20240301230646769

因为发送窗口尺寸过大,就会使得接收方无法区别新帧和旧帧。

重点总结

  • 累计确认、偶尔稍待确认

  • 接收方只按顺序接收帧,不按序无情丢弃

  • 确认序列号最大的、按序到达的帧

  • 发送窗口最大为2"-1,接收窗口大小为1

例题

1、数据链路层采用了后退N帧(GBN)协议,发送方已经发送了编号为0~7的帧。

当计时器超时时,若发送方只收到0、2、3号帧的确认,则发送方需要重发的帧数是

A.2 B.3 C.4 D.5

只需要看3号。因为最后只有3号帧的确认,所以无论如何接下来重发的是4567! 选C

2、image-20240301230917364

先计算甲的发送时长

窗口尺寸*帧长 得到总长度:1000 x 1000 x8b

然后除以发送速度,用带宽来近似计算:100*10^6 b/s

得到发送时长是80ms

再计算甲收到乙的确认帧时长

用帧长1000 * 8b。除以带宽100*10^6 b/s 得到发送确认帧的时长

再加上往返的时长50+50ms

得100.08ms

因为这个确认时长大于发送时长,所以计算数据传输率使用这个。

最后计算数据传输率:image-20240301231406819

选择重传协议(SR)

GBN协议的弊端:累计确认带来的批量重传

可不可以只重传出错的帧?

解决办法:设置单个确认,同时加大接收窗口,设置接收缓存,缓存乱序到达的帧。

image-20240306154907459

发送方:

  • 0和1帧是已经发送并且收到确认了。否则窗口不会向前滑动
  • 24:已经发送但是等待确认的
  • 3:已经收到确认,但缓存这个确认,等2号收到确认后一次性向前滑动两帧#
  • 5:还能发送的,有可能已经在发送的路上了

接收方:

  • 01234:已经确认收到了,否则窗口不会向前滑动
  • 5:没收到但是希望收到
  • 6:已经收到,但是先缓存,不急着向前滑动,等5号也收到后一次性滑动两帧
  • 7:未收到。

SR发送方需要响应的三件事

上层的调用

从上层收到数据后, SR发送方检查下一个可用于该帧的序号,如果序号位于发送窗口内,则发送数据帧;

否则就像GBN一样,要么将数据缓存,要么返回给上层之后再传输。

收到了一个ACK

如果收到ACK,加入该帧序号在窗口内,则SR发送方将那个被确认的帧标记为已接收。

如果该帧序号是窗口的下界(最左边第一个窗口对应的序号),则窗口向前移动到具有最小序号的未确认帧处。

如果窗口移动了并且有序号在窗口内的未发送帧,则发送这些帧。

超时事件

每个帧都有自己的定时器,一个超时事件发生后只重传该帧

SR接收方要做的事

对于接受窗口内的帧来者不拒。

SR接收方将确认一个正确接收的帧而不管其是否按序。

失序的帧将被缓存,并一返回给发送方一个该帧的确认帧【收谁确认谁】,

直到所有帧(即序号更小的帧)皆被收到为止,

这时才可以将一批帧按序交付给上层,然后向前移动滑动窗口。

image-20240306170857918

滑动窗口的长度

若窗口过长,可能会收到同名帧的ACK,就会乱掉!!

image-20240306171126725

发送窗口最好等于接受窗口

大了会溢出,小了没意义

最大长度:

image-20240306171246914

这里的n是多少比特个比特表帧序号,

例如0123 ,需要两个比特出四种排列,于是n=2

例如01234567 需要3个比特出四种排列,于是n=3

上面那个0123,所以最大长度应该是2。

SR重点

1.对数据帧逐一确认,收一个确认一个

2.只重传出错帧

3.接收方有缓存

4.最大长度

数据链路层采用了选择重传(SR)协议,发送方已经发送了编号为0~3的帧。现已收到1号帧的确认,而0、2号帧依次超时,则发送方需要重传的帧数是

A.2 B.3 C.4 D.5

超时谁重传谁。选A

posted @   晓梦ペ  阅读(633)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示