【计算机网络】数据链路层——两种可靠传输机制GBN与SR。
后退N帧协议(GBN)
停等协议的弊端:太闲了
解决办法:使用流水线技术
为了失配流水线技术:1.必须增加序号范围。2.发送方需要缓存多个分组。
对应方法:后退N帧协议(GBN) 选择重传协议(SR)
后退N帧协议中的滑动窗口
发送窗口:发送方维持一组连续的允许发送的帧的序号。(停等协议中,发送窗口和接受窗口都为1)
- 先依次发送发送窗口内的帧。(先拷贝副本再发送)
- 接受窗口接收到第一个帧后,发送一个ACK回去,然后接受窗口向前移动一位
-
发送方收到ACK,向前移动。至此0号帧交易成功。
累计确认机制:没必要每个帧都发ACK
GBN发送方必须响应的三件事
上层的调用
上层要发送数据时,发送方先检查发送窗口是否已满,如果未满,则产生一个帧并将其发送;
如果窗口已满,发送方只需将数据返回给上层,暗示上层窗口已满。上层等一会再发送。
(实际实现中,发送方可以缓存这些数据,窗口不满时再发送帧)。
收到了一个ACK确认帧
GBN协议中,对n号帧的确认采用累积确认的方式,标明接收方已经收到n号帧和它之前的全部帧。
超时事件
协议的名字为后退N帧/回退N帧,来源于出现丢失和时延过长帧时发送方的行为。
就像在停等协议中一样,定时器将再次用于恢复数据帧或确认帧的丢失。
如果出现超时,发送方重传所有已发送但未被确认的帧。
GBN接收方要做的事
-
如果正确收到n号帧,并且按序,那么接收方为n帧发送一个ACK,并将该帧中的数据部分交付给上层。
-
其余情况都丢弃帧,并为最近按序接收的帧重新发送ACK。接收方无需缓存任何失序帧,只需要维护一个信息: expectedseqnum (下一个按序接收的帧序号)。
流程示范
丢失处!!!
因为接收方从未接收到2帧,所以接下来接受的3帧4帧5帧都丢弃。
直到:发送方的超时重传机制发现第二针并没有ack回来
于是后退345这几帧,重新发送2345!!!!!!!
滑动窗口问题
窗口可以无限么?
若采用n个比特对帧编号,那么发送窗口的尺寸W-应满足:
因为发送窗口尺寸过大,就会使得接收方无法区别新帧和旧帧。
重点总结
-
累计确认、偶尔稍待确认
-
接收方只按顺序接收帧,不按序无情丢弃
-
确认序列号最大的、按序到达的帧
-
发送窗口最大为2"-1,接收窗口大小为1
例题
1、数据链路层采用了后退N帧(GBN)协议,发送方已经发送了编号为0~7的帧。
当计时器超时时,若发送方只收到0、2、3号帧的确认,则发送方需要重发的帧数是
A.2 B.3 C.4 D.5
只需要看3号。因为最后只有3号帧的确认,所以无论如何接下来重发的是4567! 选C
2、
先计算甲的发送时长
窗口尺寸*帧长 得到总长度:1000 x 1000 x8b
然后除以发送速度,用带宽来近似计算:100*10^6 b/s
得到发送时长是80ms
再计算甲收到乙的确认帧时长
用帧长1000 * 8b。除以带宽100*10^6 b/s 得到发送确认帧的时长
再加上往返的时长50+50ms
得100.08ms
因为这个确认时长大于发送时长,所以计算数据传输率使用这个。
最后计算数据传输率:
选择重传协议(SR)
GBN协议的弊端:累计确认带来的批量重传
可不可以只重传出错的帧?
解决办法:设置单个确认,同时加大接收窗口,设置接收缓存,缓存乱序到达的帧。
发送方:
- 0和1帧是已经发送并且收到确认了。否则窗口不会向前滑动
- 24:已经发送但是等待确认的
- 3:已经收到确认,但缓存这个确认,等2号收到确认后一次性向前滑动两帧#
- 5:还能发送的,有可能已经在发送的路上了
接收方:
- 01234:已经确认收到了,否则窗口不会向前滑动
- 5:没收到但是希望收到
- 6:已经收到,但是先缓存,不急着向前滑动,等5号也收到后一次性滑动两帧
- 7:未收到。
SR发送方需要响应的三件事
上层的调用
从上层收到数据后, SR发送方检查下一个可用于该帧的序号,如果序号位于发送窗口内,则发送数据帧;
否则就像GBN一样,要么将数据缓存,要么返回给上层之后再传输。
收到了一个ACK
如果收到ACK,加入该帧序号在窗口内,则SR发送方将那个被确认的帧标记为已接收。
如果该帧序号是窗口的下界(最左边第一个窗口对应的序号),则窗口向前移动到具有最小序号的未确认帧处。
如果窗口移动了并且有序号在窗口内的未发送帧,则发送这些帧。
超时事件
每个帧都有自己的定时器,一个超时事件发生后只重传该帧
SR接收方要做的事
对于接受窗口内的帧来者不拒。
SR接收方将确认一个正确接收的帧而不管其是否按序。
失序的帧将被缓存,并一返回给发送方一个该帧的确认帧【收谁确认谁】,
直到所有帧(即序号更小的帧)皆被收到为止,
这时才可以将一批帧按序交付给上层,然后向前移动滑动窗口。
滑动窗口的长度
若窗口过长,可能会收到同名帧的ACK,就会乱掉!!
发送窗口最好等于接受窗口
大了会溢出,小了没意义
最大长度:
这里的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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)