数据链路层-第四节:流量控制与可靠传输
Posted 快乐江湖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据链路层-第四节:流量控制与可靠传输相关的知识,希望对你有一定的参考价值。
文章目录
本节概念较为繁杂,但核心是三点:流量控制、滑动窗口、可靠传输
- 流量控制:限制发送方发送速率,确保接收方能够接收数据
- 可靠传输:发送端发什么,接收端就接收什么
- 滑动窗口:是一个解决流量控制与可靠传输的手段
其中,流量控制和可靠传输这两个功能是交织在一起的,可以看成一个整体
一:流量控制
前面说过,由于收发双方各自的工作速率和缓存空间的差异,可能出现发送方的发送能力大于接收方的接收能力的现象,如若此时不适当限制发送方的发送速率(即链路上的信息流量),前面来不及接收的帧将会被后面不断发送来的帧“淹没”,因此流量控制也是数据链路层的一项重要工作,其目的就是限制发送方的数据流量,使其发送速率不超过接收方的接收能力
需要特别注意的,这里很容易和传输层的流量控制产生混淆,区别如下
- 传输层流量控制是两个主机之间的;是端到端的,接收端会给发送端一个窗口公告(告诉自己缓冲区有多大)
- 链路层流量控制是两个相邻节点之间的,是点到点的,接收方如若收不下不回复确认(确认帧)
流量控制方法有如下几种
(1)停止-等待协议
在研究本协议相关内容之前,注意以下几点
- 虽然现在常用全双工通信方式,但为了讨论问题方便,仅考虑一方发送数据 (发送方),一方接收数据(接收方)
- 因为是在讨论可靠传输的原理,所以并不考虑数据是在哪一个层次上传送的
停止-等待协议:每发送完一个帧就停止发送,等待对方的确认,在收到确认后再发送下一个帧;且有两种应用情况
- 无差错情况
- 有差错情况
A:无差错情况
具体过程如下,每发送1个数据帧就停止并等待,用1bit编号即可
- 发送方发送0号帧,接收方接受0号帧后发送
ACK 0
确认 - 发送方接受到
ACK0
后,继续发送1号帧 - 重复上述过程
- …
B:有差错情况
无差错只是一种理想的状况,实际传输时会出现很多状况
①:数据帧丢失或检测到帧出错
- 接收方检测到帧出错后将其丢弃,所以和数据帧丢失的情况大致相似
如下,发送方在接受到接收方发来的ACK 0
后,发送了1号帧,但是此帧在传输过程中却丢失了,因此接收方就无法收到此帧同时也不能发出ACK 1
,发送方此时一直处于等待状态
在这种情况下,发送方自然不能一直等下,否则传输将无法进行。因此,发送方在发送完一个帧之后超时计时器便会启动计时,此时
- 如果
ACK
信号能在倒计时结束之前到达那么计时器就作废 - 如果
ACK
信号未能在倒计时结束之前送到,那么就会被判断为数据帧丢失,接着,此帧将会被重发
其中,超时计时器所设置的重传时间应当比帧传输的平均RTT更长一点
- RTT(往返传播时延):帧从开始传输到
ACK
到达的时间
②:ACK丢失
如下,接收方发送的ACK 1
在传输过程中丢失,于是经过一定时间后发送方就会重传1号帧。接收方在接受后就会丢弃重复的1号帧,重新发ACK 1
③:ACK迟到
如下:
- 接收方发送了
ACK 0
,但是发送方没有等到,于是会重传0号帧 - 接收方接受到了重复的0号帧,丢弃,然后再发送
ACK 0
- 发送方接收到了
ACK 0
,于是发送1号帧 - 发送方在准备接受
ACK 1
时却接收到了迟到的ACK 0
,于是会直接丢弃
C:优缺点
-
优点:简单
-
缺点:信道利用率很低
(2)滑动窗口协议
滑动窗口协议:在任意时刻,发送方都维持一组连续的允许发送的帧的序号,称为发送窗口,同时接收方也维持一组连续的允许接收帧的序号,称为接收窗口
- 发送窗口:在还未收到对方确认信息的情况下发送最多还可以发送多少个数据帧
- 接收窗口:控制可以或者不可以接受哪些数据帧
在接收方,只有收到的数据帧的序号落入接收窗口内时,才允许收下该数据帧,反之则一律丢弃
- 如下例子中,发送窗口为6,接受窗口为1,因此收到一个确认发送窗口才能向前移动一格
根据发送和接受窗口的大小不同,滑动窗口协议可以有三种
- 所以,停止-等待协议是一种特殊的滑动窗口协议(发送/接受窗口均为1)
发送窗口大小 | 接受窗口大小 | |
---|---|---|
停止-等待协议 | =1 | =1 |
后退N帧协议(GBN) | >1 | =1 |
选择重传协议(SR) | >1 | >1 |
A:后退N帧协议(GBN)
①:GBN协议中的滑动窗口
发送窗口:发送维持的一组连续的允许发送的帧的序号,换句话说就是指发送方要发送的数据必须在此窗口之内;发送窗口会使发送方数据分为如下四个区域
- 发完被确认的
- 已经发送但等待确认的
- 还能发送的
- 还不能发送的
需要注意,若采用 n n n个比特对帧进行编号,那么发送窗口尺寸 W T W_T WT应该满足 1 ≤ W T ≤ 2 n − 1 1 \\leq W_T \\leq 2^n-1 1≤WT≤2n−1
如果发送窗口尺寸过大,会使得接收方无法区别新帧和旧帧
接收窗口:接收方维持一组连续的允许接收帧的序号,在GBN协议中固定为1
基本发送过程如下
- 发送方发送0号帧,同时会保存0号帧副本
- 0号帧在传输过程中,凡是在发送窗口内的帧都是可以发送的,所以这里1号帧也发送
- 0号帧到达接收方,接收方返回
ACK 0
- 然后发送方和接收方的窗口向前移动1
- 1号帧也是如此
另外在GBN协议中,为了使效率更高,接收方没有必要对每一个帧都进行确认,也即可以累计确认
- 比如在下面的例子中,一旦接收方返回
ACK 3
,那么发送方就知道接收方已经正确接收了1、2、3号帧了
②:GBN协议中发送方和接收方必须做的事情
发送方需要响应的三件事情
- 上层调用:上层在发送数据时,发送方会检查发送窗口是否已满;如果未满,则产生一个帧并发送,如果已满,发送方只需要将数据返回给上层,暗示上层窗口已满,让上层等会再发送(实际实现时,发送方可以缓存这些数据,窗口不满时再发送帧)
- 收到了一个ACK:对 n n n号帧的确认采取累积确认的方式,表明接收方已经收到了 n n n号帧和其之前的全部帧
- 超时事件:当出现超时时,发送方会重传所有已发送但没有被确认的帧
接收方需要做的事情
- 正确情况:如果正确接收到了 n n n号帧,并且按序,那么接收方会为 n n n帧发送一个ACK,并将该帧中的数据部分交付给上层
- 其余情况:直接丢弃帧,并为最近按序接收的帧重新发送ACK;接收方无需缓存任何失序帧,只需要维护
expectedseqnum
(下一个按序接收的帧序号)
③:GBN协议重点
关于GBN协议重点注意以下几点
- 累积确认(偶尔捎带确认)
- 接收方只按顺序接受帧,如果无序则直接丢弃
- 确认序列号最大的、按序到达的帧
- 发送方窗口大小为 1 ≤ W T ≤ 2 n − 1 1 \\leq W_T \\leq 2^n-1 1≤WT≤2n−1
④:GBN协议优缺点
- 优点:因连续发送数据帧而提高了信道利用率
- 缺点:在重传时必须把原来已经正确传送的数据帧重传,使传送效率降低
B:选择重传协议(SR)
①:SR协议中的滑动窗口
发送窗口:发送方维持的一组连续的允许发送的帧的序号,换句话说就是指发送方要发送的数据必须在此窗口之内;发送窗口会使发送方数据分为如下5个区域
- 发完被确认的
- 已经发送但等待确认的
- 已经发送且被确认的
- 还能发送的
- 还不能发送的
接收窗口:接收方维持一组连续的允许接收帧的序号;接收窗口会使发送方数据分为如下3个区域
- 希望收到但还没有收到的
- 收到且确认的(缓存)
- 等待接收的
其中发送窗口大小和接受窗口大小建议相等,为
W T m a x = W R m a x = 2 ( n − 1 ) W_Tmax=W_Rmax=2^(n-1) WTmax=WRmax=2(n−1)
②:SR协议中发送方和接收方必须做的事情
发送方需要响应的三件事情
- 上层调用:从上层收到数据后,发送方检查下一个可用于该帧的序号,如果序号位于发送窗口内,则发送数据帧,否则就像GBN那样,要么将数据缓存,要么返回给上层再传输
- 收到了一个ACK:收到ACK时,假如该帧序号在窗口内,则发送方将那个被确认的帧标记为已接收;如果该帧序号是窗口的下界,则窗口向前移动到具有最小序号的未确认帧处;如果窗口移动了并且有序号在窗口内的未发送帧,则发送这些帧
- 超时事件:每个帧都有自己的定时器,一个超时事件发生后只重传一个帧
接收方需要做的事情:来者不拒(窗口内的帧):接收方将确认一个正确接收的帧而不管其是否按序;失序的帧将会被缓存,并返回给发送方一个该帧的确认帧(收谁确认谁),直到所有帧(也即序号更小的帧)都被收到为止,这时才可以将一批帧按序交付给上层,然后向前移动滑动窗口
③:SR协议运行实例
④:SR协议重点
关于SR协议重点注意以下几点
- 对数据帧逐一确认,收到一个确认一个
- 只重传出错帧
- 接收方有缓存
- W T m a x = W R m a x = 2 ( n − 1 ) W_Tmax=W_Rmax=2^(n-1) WTmax=WRmax=2(n−1)
以上是关于数据链路层-第四节:流量控制与可靠传输的主要内容,如果未能解决你的问题,请参考以下文章
OSI七层详解之二 数据链路层(DataLinkLayer)