概念
发送方按照接收方的处理能力来发送数据(每一层都要解决这个问题)
发送方需要有缓存的原因:数据只能是从高层推到低层,不能低层从高层拉,也就是说低层如果不妥善保存这个数据的话一旦丢失或者出问题,就没有了,不能从高层索要。因此要先放到缓存里。而且一旦一个主机上面有很多应用进程有很多帧要发送,这时就要去缓存里排队等待被发送,即使是排在帧首的那个帧也不能立即发送,必须要等到物理信道空闲的时候才能发送,这时也需要存到缓存里
接收方需要有缓存的原因:数据在提交给高层的时候必须保证正确,这就要先放在缓存里进行校验和的计算,正确了才能提交。如果帧没有按序到达,有足够的缓存的时候可以把先到的帧缓存起来。如果一个服务数据单元被发送方分段,分成若干个帧,那么即使帧是按序到达的,但是组成一个服务数据单元的帧没有全到的时候就需要先缓存起来,都到了以后才能向上层提交
发送方在确认帧发送成功了以后就可以把缓存里的帧删除,把缓存腾出空间给别的帧使用
接收方在确认高层收到这个数据的时候才可以把缓存里的帧删除
如果采用正向应答机制,接收方是在把数据提交给高层,缓冲区释放以后发送正向应答
因为即使数据正确接收到了,但是层间接口可能出现问题,这样就不能正确提交给高层,所以不能收到数据检验正确了以后就发送正向应答
↓图:数据链路层解决的是一条物理介质上相连的点对点的问题,网络层解决的是源节点到目的节点的问题。传输层解决的是从源主机到目的主机端对端的传输问题
※H1---R1,R2---H2除了数据链路层解决它们的流量控制,还需要网络层解决流量控制问题,因为这个属于资源子网接入到通信子网的问题
流量控制的基本方法
1.单工停等协议(理想情况)
假设 单工传输,发送方无休止工作(要发的信息无限多),接收方无休止工作(缓冲区无限大),发送数据的速率低于接收数据的速率,通信线路(信道)不损坏或丢失信息帧(无错),这时候不需要流量控制
工作过程:
发送程序:取数据,构成帧,发送帧
接收程序:等待,接收帧,送数据给高层
单工停等协议(无错情况)
增加的约束条件:
接收方不能无休止接收。例如缓冲区数量有限,接收速率比发送速率低
解决办法:
接收方每收到一个帧,给发送方回送应答。发送方收到应答前不发送后续帧。这个时候的应答帧和差错控制里的应答是不一样的,这里的应答是指我做好准备接收下一个帧了,和正确错误无关
工作过程
发送程序:取数据,成帧,发送帧,等待应答帧
接收程序:等待,接收帧,数据送高层,发送应答帧
在这种情况之下是没有错误的,不需要检错,也就不需要对数据进行编号
单工停等协议(有错情况)
增加约束条件:
信道有差错,信息帧可能损坏或丢失
解决办法:
常使用正向应答+重发机制来解决差错控制。数据序号采用循环序号机制。应答帧的两种方式1.单帧应答 应答序号为某一个正确帧的序号(比如发送方发送的帧序号为D0,应答的序号为A0) 2.成批应答 应答序号为下一个期望接收的序号。通常采用附载应答方式:将数据帧携带应答信息的方式成为附载应答。可以把应答帧的序号加在信息帧中一并发送以提高效率(在双工的情况下,假如A给B发数据,B要产生应答给A,这时应答也要形成一个完整的帧的格式,有帧头帧尾,这样浪费信道资源,但是如果这个应答附在B给A传送的数据中的话就能减少信道资源的浪费。但是也有捎带不了的情况,比如A给B发送个数据,但是要等很长时间才有B发给A的数据,这个时候收到的数据需要产生一个应答,需要启动计时器,如果计时器超时了仍然没有数据要发给对方,那么就只能是组装成一个应答帧进行发送。如果有数据帧要发送,就把应答附在数据帧中一起发送)
接收方收到一个数据,通过和期望的序号进行比对发现是个重复的帧,它要把这个帧丢掉,丢掉以后还是需要有一个应答,否则发送方没有收到应答就会重发数据,如果一直没有应答会一直重发。但是这个应答不是对它丢弃的那个重复帧的应答,而是应该把刚才重发的那个应答重发一遍。绝大多数情况用的都是成批应答这种方式。因为在把数据提交给上一层以后很难知道它收到了哪些帧,但是有一个数据时它很容易获得的,就是它期望的序号,因为有个寄存器,直接取就可以了。如果不发期望序号而采用单帧应答,收到哪一个帧发应答的话,在发重复应答的时候还需要把期望的序号减1再发送,很麻烦
数据帧在链路上传输的可能情况
有噪声信道的单工停等协议示意图
吞吐率(信道利用率) =
数据帧发送时间 ÷
处理数据帧的总时间(从一个帧开始发送到能能够开始发送下一个帧的时间)
停等协议效率
单工停等协议的吞吐率比较低,所以一般很少用
卫星通信传播时延比较大,这时把信道直接当做缓冲区来进行数据传输
2.连续ARQ协议(流水线协议)
工作原理:
不需要收到应答帧就可连续不断的发下面的帧
出错后处理:
全部重发流水线协议
当一帧出错时,需重发出错帧之后的所有帧,接收方的缓冲区数量只需要一个。这时一个帧的序号和我期望的帧的序号不一致时就把这个帧丢弃掉腾出缓冲区等着发送方重发
选择重发流水线协议
当一帧出错时,只重发出错帧,接收方的缓冲区数量要足够多。这时把后续帧都先存起来,等它前面的后到的帧处理完了就去缓冲区取后续帧进行处理
※但是实际工作当中因为涉及到一个发送计时器超时的问题,比如A给B发送序号为1,2,3,4,5,6,7,8,9,10.......。比如2出错了,这个时候A没有从B得到应答,B就会一直给A发送重传2的请求,在这个过程当中,可能3,4,5都超时了,直到B给A发送一个收到后续某帧的应答,比如收到到了8,那么在这个过程中A已经把2,3,4,5都重传了,在收到B的应答之后从9开始继续传
3.滑动窗口协议(各层用的最常见的流量控制协议)
工作原理:
对连续停等协议的改进(既不是收到应答之前不能发送后续帧,也不是收到应答之前可以连续发送后续的所有帧),它能够控制已发送但未确认的数据帧的个数(滑动窗口的大小)
❀发送窗口
窗口尺寸:
允许连续发送未应答帧的个数(缓冲区有几个窗口尺寸就是多少)
数据允许发送条件:
上界 -下界 < 窗口尺寸
窗口滑动条件:
窗口上界移动:发送数据帧(一次一下滑动的)
窗口下界移动:收到应答帧(可能一次滑动一下也可能滑动多下)
发送窗口的上界和下界是各滑动各的
现在连续发了4个帧(D0 ~D3 )之后,上界4 -下界0 = 窗口尺寸4,不满足数据发送的条件了,这时窗口就停止了。通过例子得知在没有收到应答的情况之下允许连续发送未应答的个数。这时收到A0应答↓
↑此时下界变成了1,上界 - 下界=4-1=3,重新满足了数据发送的条件,这时就可以再发送一个帧。如果收到一个应答A3意味着3以及之前所有的帧都收到了,那么下界变成4,上界—下界=4-4=0,这时就又可以再发送4个帧了
☆接收方如果收到重复帧会舍弃,如果收到后续帧到底要存哪些后续帧,比如说窗口尺寸是4,那么最多只能缓存3个帧,留一个缓冲区接收正确的那个帧,不然就会造成死锁
❀接收窗口
窗口尺寸:
允许连续接收未处理帧的个数
数据允许接收的条件:
数据序号落在接收窗口中(下界 ≤ 序号<上界时才会接收)
接收窗口的上界和下界是同时滑动的
如果收到一个帧是下界的值,这个帧就刚好是我所期望的序号,要对它进行处理。如果收到的序号不等于下界并且这个序号满足下界<序号<上界,说明它是后续帧,就可以把它存起来。如果收到的序号不在这个范围内,那么不论是重复帧还是后续帧都要丢弃
窗口滑动的条件:
发送应答帧后上下界同时移动(上界和下界的距离是固定的)比如接收窗口为4,刚开始的下界在0,上界在4,也就是0≤序号<4,也就是可以接收的范围是0~3,这个范围和窗口的尺寸一致,允许连续接收4个帧
☆上面两种滑动窗口都是固定的,如果是动态的滑动窗口,即接收方的缓存是动态变化的,那么发送方要随时根据接收方的能力去改变自己滑动窗口的大小,↓例
图中A为发送方,B为接收方。A向B请求缓冲区的数量是4个,B给A一个应答(只要是应答就要加序号),下一个要接收的数据序号为0,并告诉A缓冲区是2个。这时A发送D0和D1。从B得到应答2并且缓冲区为1,此时A只能传一个帧D2,B给A反馈3并且缓冲区为0,这时A不能再传送数据,必须等待,等到B有缓冲区了会再给A发应答,然后A才可以继续发送数据
比如说B后来给A发的【ACK3 b=2】这个报文丢失了,因为发送方已经把它的窗口的尺寸改成0了,正在等接受方的一个应答,窗口尺寸重新声明的应答。这个应答其实接收方已经发送了,但是应答在传输当中丢失了,这样会造成发送方窗口尺寸始终为0,接收方因为收不到数据,也就不会产生应答,这种情况就会导致死锁,这个问题在TCP协议当中有解决
滑动窗口协议也会出现数据丢失出错的情况,也需要引入应答+重发的机制↓
窗口大小与序号关系
WT表示发送窗口的尺寸, WR表示接受窗口的尺寸,n表示序号空间(序号取了多少位)
出错全部重传: WT> WR , WR=1 同时 WT≤2n-1
如果出错全部重传,那么接收方一个缓冲区就够了,因此WR=1
(如果↑ WT也等于1,本质上就是单工停等协议的工作原理)
例:序号空间取3位,用3位序号,即二进制表示为111,即为7,按理来说窗口的最大尺寸为8(0~7)。但是这时窗口的最大尺寸只能为7,不能为8,原因:
如果窗口尺寸设定为8,发送方发送了数据0 ~ 7,接收方正确的收到了所有的帧,它产生了8个应答帧,即告诉发送方你发送的8个帧我都正确收到了。但是在传输过程中这些应答都丢失了,导致发送方将重新发从0开始的所有的帧。而因为接收方已经给了应答,它期望的序号重新变为0了,这时候发送方所重发的帧都会被接收方当做新帧接收,这样就出错了。
而规定WT≤2n-1的话,刚才那种情况下,因为窗口尺寸设定为7,发送方发送了数据0 ~ 6,接收方期待的序号将是7,而发送方重发的将是0,这时就通过这个来判断是重发的帧,就不会出错了
选择性重传:WT≤WR 且 WR ≤2n-1
一旦有一个帧出错了,接收窗口也一定要滑动,因为如果不滑动就相当于全部重传了 。也就是发送方没有收到应答接收方的窗口也会滑动。要保证接收窗口小于等于2n-1,实际上最终的结果是我的新窗口和旧窗口是完全不重复的。比如n=3时,发送窗口最大不能大于4。原来的窗口接收的帧的序号是0 ~ 3,新窗口接收的帧的序号是4~7,是完全不重复的。这时候当出现应答帧丢失的时候,当有重发帧的时候,它就认为如果落在新窗口就是新帧,如果没落在新窗口就是一个重发的帧。如果不满足这个条件,新窗口和旧窗口一旦有序号的重叠,对于重叠的那个帧到底是新帧还是旧帧就识别不出来了