(十四)数据链路层——流量控制

前言

在TCP/IP体系结构中,数据链路层的三大基本功能:封装成帧、透明传输、差错控制。

看起来,这其中并不包含流量控制。但实际上,进行差错控制的方法其实已经和流量控制相结合起来了。所以,一般情况下,不会经常把流量控制单独拿出来说明。但是,流量控制这其中的原理,还是比较重要的。

流量控制是什么意思呢?

在实际的通信过程中,每台主机或者说每个节点,它们的性能都是存在着差异的,它们处理数据的能力也是存在差异的。比如说,A主机要给B主机发送数据,A主机的数据处理能力高,而B主机可能比较落后,处理速度慢。那么,如果A主机按照自己发送数据的速度去给B主机发送的话,B主机处理的慢,来不及接受,肯定是承受不了的,这就会造成大量的数据到达了B主机,但是因为B主机处理不过来了,而被迫把数据丢弃掉。

那么,我们的流量控制的作用,就是为了控制着发送方的发送速率,避免因为发送速率过快,导致接收方来不及接收和处理数据而造成被迫丢弃数据的情况。简单来说,就是限制发送方的发送速率不能超过接收方的处理速率。

数据链路层的流量控制,通常有两个基本方法,一个是停止等待,一个是滑动窗口

 

停止等待

停止等待是最简单的一种流量控制的方法,只有两个步骤:发送完一帧数据就停止,然后等待接收方的确认之后,再发送下一帧。

发送方每发送出去一个数据帧,就必须要等待接收方返回对这个的确认,才能继续发送后面的帧。如果等不到接收方的确认,那么发送方就要一直等下去,这样就能保证发送方的发送速率绝不会超过接收方处理速率。

这种停止等待的方法,有一个好处就是实现起来很简单。但是,它的线路利用率是非常低的,发出数据帧之后,必须要等着接收方确认,此时的链路是空闲的。在任何时刻,线路上都是只有一个帧在传送。

看一下停止等待的示意图:

(十四)数据链路层——流量控制

 

滑动窗口

首先,我们要明确一下,什么是窗口。

其实不管是发送方,还是接收方,都要维持一个数据的缓冲区,发送方把要发送的所有数据帧都要先放在这个缓冲区里,所有数据帧现在缓冲区里排队,然后发送出去;接收方也是一样,把接受过来的数据帧先存放在自己的缓冲区里,然后一个一个把数据帧取出来再去处理。这个缓冲区就称为窗口

发送方的缓冲区叫做发送窗口,接收方缓冲区就叫做接收窗口。窗口的大小是有限的,也就是说缓冲区的容量是有限的

在上面的停止等待方式中,发送出去一个数据帧,必须要等待确认的到来,才能继续发送。在这一段等待的时间内,链路是空闲的。那么我们能不能想一个办法,利用等待的这一段空闲时间,发送缓冲区里后面的数据帧呢。

基于这种思想,提出了滑动窗口的流量控制方式。

现在我们来模拟一下这个过程,看看滑动窗口到底是怎么让窗口进行滑动的。

假设发送窗口的大小WT=6。发送方在开始发送数据帧之前,要先对所有的帧进行模n编号,理论上n可以取任何整数,只要n的值能适合实际应用就可以,为了能够说清楚整个过程我们这里假定n的值为8,也就是所有数据帧在发送前要进行模8的编号。所以,帧的编号就是:0、1、2、3、4、5、6、7、0、1、2、3……,从0开始数8个数字,也就是0到7,然后再从0开始。

先来上一个图,之后咱们一边看图一边说明原理:

(十四)数据链路层——流量控制

我们看上图的a,现在从0~5这6个帧都已经在发送窗口中排好队了,落在发送窗口中的帧都可以直接发送,而不必等待确认。上图中的b,就是正在发送的样子,0、1、2号帧已经发送出去了,3、4、5号帧要准备马上发送。

等到6个帧全部发送出去了,这时候就不能再发送了,就必须要等待接收方的确认了,就是上图中c的样子。

那么要等到什么时候才能发送后面的帧呢?就是上图中d的样子,等到接收方对于0、1号两个帧的发来的确认之后,窗口再开始向前滑动,滑动2个位置。如果接收方发来3个帧的确认,那窗口就向前滑动3个位置,如果发来4个确认,就向前滑动4个位置……

现在,我们总结一下,发送方滑动窗口的左侧是已经发送出去并且已经得到确认的帧,滑动窗口右侧是暂时还不发送的帧。落在滑动窗口中的帧,有两种情况,一是已经发送出去还没有收到确认,二是目前还没发送出去,但是马上可以发送的帧。

可以发现,收发两方的窗口通过这样规律的不断向前滑动,可以控制着数据的发送速率,实现了流量控制。