各位同学大家好,这节课呢我们将来学习一下链路层的流量控制与可靠传输机制。那这节课内容十分重要,因为它不仅和传输层的一些协议有交叉,同时呢它还第一次提及了这个滑动窗口机制。那这些知识点啊,在选择题当中一定会考。而且呢在自主命题的一些大题里面呢,也会出。所以大家这一块要好好学习。那在这里面给大家一个小的建议,就是在学习的时候呢,不需要太过于去钻牛角尖,把这几个重点的协议,它所规定的内容掌握好,同时呢把滑动窗口机制这样一个原理还有流程弄清楚就ok了。
那话不多说,我们来开始今天的学习。首先呢,我们来讲一下链路层的流量控制。总结下来其实就是这样一个图,发送方,你慢一点。接收方呢它是要控制发送方的发送速率,这样就可以正确地接收到发送方发来的数据。
也就是说如果较高的发送速度和较低的接收能力,啊这样的话接收方和发送方两个人就不匹配了,所以就会造成传输出错。因此呢,流量控制就是链路层的一项非常重要的工作。那这里面的传输出错啊,主要指的就是如果发送方发送的速率过高,而接收方呢接收的能力比较差,啊或者说接收的速度比较慢,那这样,发送方发来的一些数据,就有可能超出接收方的一个缓冲空间。也就是说接收方它可能这个门口只能容纳这么多人,但是呢你这个发送方一下挤来太多人了,那不可能所有人都进入这个接收方。所以呢,就会导致一个溢出的结果。那这种溢出呢,就会使得发送方发来的一些数据,接收方接收不到。既浪费了空间,也浪费了我们这个资源。所以说,流量控制是必须的。那这个流量控制呢,不仅在链路层有,它同时在传输层也有。在这里面,先提前给大家说一下这个链路层流量控制和传输层流量控制的一个主要区别。
链路层流量控制呢是点对点的,而传输层的流量控制是端到端的。我们之前有讲过中间系统,中间系统呢包括交换机啊路由器等等,那它们所在的层次只有网络层以下三层,网络层、链路层、物理层这三层。但是呢,在两端,也就是发送端和接收端,两个主机,它们是七层或者是五层全部有的,它们有传输层。那这个传输层的流量控制是端到端的,指的就是传输层它负责的这种流量控制,是在两个主机之间的,而链路层的流量控制呢,是每两个相邻结点之间的。那这是它们的一个区别。
还有一个区别就是它们的控制手段是不一样的。链路层的控制手段呢是接收方收不下就不回复确认。那这个确认呢其实说的就是一个确认帧,它是一个不包含数据的一个控制帧。我们可以想象成它就是一个不不包含数据的一个命令,啊发回一个确认帧就相当于告诉发送方,你可以再发送下一个了。这就是确认帧的功能。
而这个传输层的流量控制手段呢,是接收端给发送端发送一个窗口公告。那这个窗口公告呢其实就是告诉发送端,我现在窗口有多少,我的缓冲区还有多大,那你就控制一下你的速度,不要发太多,就是这样一个意思。所以它们的区别就在这里。
那我们既然这节课要讲链路层的流量控制,我们就来举一个链路层流量控制的例子。假如说呢这儿有一个铲屎官,他养了一只非常可爱的小猫。
那这个小猫呢,是关在一个房子里养的。铲屎官呢每天都会定时去给这个小猫送吃的。
这节课呢我们来讲解一下停止-等待协议。
那相信在学习内容之前啊,有很多同学可能会有这样的疑问,就是停止-等待协议它究竟是哪一层的呢?因为它在这两本书当中啊,停止-等待协议放在了传输层。而在王道的辅导书当中呢,我们把停止-等待协议放在了链路层。所以可能有的同学就会纠结这样一个问题,这里面要说的就是在计算机网络发展的前期啊,通信链路质量不是很好,所以呢链路层它就要担负起可靠传输的这个职责。因此,链路层它就会使用停止-等待协议,后退N帧协议,选择重传协议等等。那随着现代技术的发展呢,我们这个通信链路的质量越来越好,那出现差错的可能性呢就不像以前那么大。那因此链路层,它就可以暂时抛弃掉可靠传输的这样一个职责,把这个责任呢交给传输层来实现。而这个链路层呢,主要就负责一个差错的控制。这样就会使得我们数据在链路上进行传递的过程当中呢速度更快,所用的时间更小。啊,延迟也就更小。那因此我们在学习这节课的时候呢,大家不需要太去纠结这三个协议究竟是哪一层次的,啊因为它在哪一层次你最后影响的也只是这个传输数据的一个对象。比如说我们如果说这三个协议它是传输层的,那我们发送的数据就可以称之为分组。而在这个链路层传输的时候呢,我们就会把这样一个数据称作是一个帧,一个数据帧。那它只是一个对象上命名的不同,但是它本质呢都是我们要传送的数据。所以大家不需要纠结这个问题。
那我们就来开始今天的课程。停止-等待协议呢,在这里面我们先说三点内容。第一个问题,就是为什么要有停止-等待协议。
因为我们知道在链路上,除了比特会发生差错,也就是每一个帧,帧内会出现比特的差错,那底层信道呢还会出现一些丢包问题。这里面说的丢包问题啊,非常的常见。那什么叫丢包呢?它就指物理线路故障、设备故障、病毒攻击、路由信息错误等原因导致数据包的丢失,那这个数据包呢它其实就是一个数据。那在链路层呢,它就可以叫做帧。那在网络层呢,它就可以叫做IP数据报或者是分组。那在传输层呢,它又可以叫做报文段。所以这个数据包,在不同层次,它可以有不同的名字。
为了解决这个丢包问题啊,同时为了实现流量的控制,我们就需要有这样一个停止等待协议。那具体的原因呢,我们在上一节课也有讲过。
那我们再来看第二个问题,就是研究停止-等待协议的一个前提。在这里面呢我们就简称停止-等待协议为停-等协议。
研究它的前提有几个。首先第一个就是虽然我们现在在通信过程当中呢,通常采用的都是一个全双工通信方式,也就是双方可以同时发送信息也可以同时接收信息。但是我们为了讨论问题方便,其实也就是为了做题方便,我们现在只考虑一方发送数据,一方接收数据。那发送数据的那一方呢叫做发送方,接收数据的就叫做接收方。这是第一个前提。
第二个前提就是因为我们现在是在讨论可靠传输的原理,所以呢我们并不需要纠结数据是在哪一个层次上进行传送的。那这里也是我刚才在一直强调的内容,大家只需要了解这一个协议的一个工作原理和机制就可以了,并不需要去考虑这个数据是在哪一层次传送,以及这个协议它究竟是哪一层次的。
那第三个前提就是,停止-等待啊,就是指每发送完一个分组就停止发送,等待对方确认。那等收到确认之后呢,我们再发送下一个分组。其实就是我们上节课讲的那个猫粮的例子。铲屎官如果要为小猫喂食的话,小猫只有吃完了它如果还有胃口,它才会把这个空碗给这个主人。那如果没有胃口呢,它这个碗就一直留空碗就一直留着,所以这就类比我们的停止-等待协议的一个工作原理。
那第三个问题就是,停止等待协议它有几种应用的情况。主要有两种,无差错的和有差错的。
首先呢我们来看第一种,无差错的情况。首先呢我们有一个发送方,
这节课呢我们来学习一下后退N帧协议,也叫做GBN协议。
首先我们来回顾一下上节课所讲的这个停等协议,它是指发送方每发送一个帧呢,就要一直处于等待的状态。等到接收方发送给它一个确认帧,它才可以发送一个新的数据帧。那这种状况呢就会使得我们发送方发送数据的时间很小,比如说我们这个发送方的发送速率极快,那它可能一天的时间只能有一个小时在发送数据,其他的时间啊都是在等待这样一个接收方的一个确认帧的回复,所以说这是非常浪费资源、浪费时间的。
那因为这个停止-等待协议太闲了,我们就想,有没有什么别的技术或者别的方法,使我们这个信道利用率更高一些呢?
当然可以。我们可以发送完一个之后呢,
紧接着再发送一个,也可以再发送一个。那现在这个图示呢其实就是三个数据帧一起发送的一个状态,按序发送的一个状态。那它们连续发送三个帧,就会比我们刚才的停等协议,信道利用率要更高一些了。
那其实这一种技术呢,就叫做流水线技术。那这个并不是考研的考点,大家了解一下就可以。为什么称它为流水线,就是因为每一个数据帧都会接着上一个数据帧往下发送。所以说这样连续起来的一个发送,就像流水线工作一样,所以它叫做流水线技术。
那这个流水线技术呢也给我们带来了一定的影响。因为它要把这个停止等待协议进行一个改善,所以我们就需要在其他方面也做出一些改进。首先第一点,就是必须要增加一个序号的范围。因为我们知道每个传输、传送当中的数据帧呢,必须有一个唯一的序号。那像这三组数据帧当中呢,它们三个的序号都要是不同的。那这样接收方呢才能返回给它们每一个人唯一对应的一个帧。这样的话,如果丢失我们也好找到底是哪一个帧出现了问题。
那第二个就是发送方需要缓存多个分组。这个还是因为我们这个传输的过程当中啊,非常容易出现帧丢失的情况。那比如说我们发送这个0号、1号、2号帧,2号帧呢出现了丢失,一号帧呢也出现了丢失,但是零号帧没有。那所以我们这个缓存啊,就比停止等待协议的缓存要大一点。因为停止等待协议它只需要缓存它自己刚发送的这一个数据帧就可以了。而现在这种三个数据帧的情况呢,我们可能就要增加两个啊增加两个缓存的一个空间,让这两个数据帧可以把拷贝放到缓存空间里面,所以说发送方就需要缓存多个分组。
那针对这两种解决方案呢,我们就有如下两种协议。第一个就是后退N帧也叫做GBN,另一个就是选择重传协议SR。这节课我们就先来讲第一个后退N帧协议。
首先我们来看一下后退N帧协议当中的滑动窗口。这个滑动窗口啊它包括两种,一个是发送窗口,一个就是接收窗口。发送窗口呢指的就是发送方维持一组连续的允许发送的帧的序号。那我们先来看下面这一个图。那这个图呢其实从这个第一个0开始到最后一个7为止,就是我们要发送的可能说是一长条数据帧。那每一个小格子呢,就对应的是一个数据帧。而其中的这个数字,对应的就是对于那个数据帧的编号。比如说这个小格子,它就是对应的7号帧,而这个6号小格子呢,它对应的就是6号帧。那这一些小格子它们都其实是一些非常抽象的概念,并不是说把数据帧塞到格子里面,而是说每一个格子里的序号对应的就是我们一个要发送的帧。那这里面的发送窗口呢,自然就是蓝色框框这样一个范围。蓝色框框的范围就是发送窗口,指的就是发送方可以发送的数据帧,也就是现在发送方可以把这个窗口里面的所有数据帧都发送出去。那如果收到一个确认帧,发送窗口就可以往前移动一位。啊,那它可以发送的数据帧,又增加了一个,增加到6了。
这节课呢我们来学习一下选择重传协议。
首先我们回顾一下上节课所讲到的GBN协议。它有一个最大的特点,是累积确认。那这个累积确认呢,从一方面来说它是一个优点,因为它不用说每一个帧都要回复一个确认,几个帧之后可以回复一个确认,确认前面全部的帧。但是呢,这也相应的给它带来了一定的问题。因为有了这样一个累积确认,所以就导致出现问题的时候会有一个批量重传的情况。假如说我们在传递0帧、1帧、2帧,然后呢3帧在路上丢失了,但是呢又传了4帧和5帧,那这样4帧和5帧是不会接收的。那因此,等这个超时的时候,3号帧超时的时候,我们还要把3帧、4帧、5帧再重传一次。那我们就会觉得4帧、5帧它们本来发送的好好的,凭什么要让它们重传呢,那这个就是GBN协议它带来的一个缺点,就是一次性可能损失很大。啊如果有一个帧出错了,它后面可能所有帧都要重传一次。还记得我们上节课讲的这个汉堡的例子吗?如果接收方它收到了一个面包片,它可以吃。它收到了一个芝士,也可以吃。但是呢,它马上收到了一个牛排或者一个沙酱或者是一个生菜,它是绝对不会吃的,因为它一直在等它的番茄。那因此它收到的那些生菜啊,牛排啊沙拉啊等等,它全都要丢弃掉,所以这是对于资源的一种浪费。那因此,我们就想,有没有一种办法,可以只重传出错的帧呢?让其他正确的帧照样传,只是把出错的帧重新传送一次。当然有的,它解决的办法呢就是设置单个确认,同时呢加大接收窗口,设置一个接收缓存,缓存乱序到达的帧。这个设置单个确认指的就是,我们可以逐一对帧,我们逐一对帧进行确认,这样的话,出错一个帧丢失一个帧,我们就直接把那个出错的帧重传就可以了。同时呢,加大接收窗口,就是让这个接收窗口变得更加智能一点。比如说我们这个发送方可能乱序发送帧了,发的0号帧、2号帧,1号帧晚发了。那这个接收方呢可以先把2号帧存起来,等收到1号帧之后,然后再把0、1、2号帧交付给网络层,再把这个窗口进行一个前移,所以这就是我们这节课要讲的SR选择重传协议。
那看这个名字它就已经很old气了,SR对不对,玩VR的同学都知道。那这个SR选择重传协议呢自然就是我们现在所讲的几种协议当中最优秀的、最优质的一个。那首先我们还是来看一下,选择重传协议当中的滑动窗口是一个什么样的机制。首先是发送方、接收方,它们都有发送窗口以及接收窗口。那这个其实就是我们要发送的数据帧的一个排队号。啊,0号帧要发送,1号帧也要发送,然后这个是它准备接收0号帧、准备接收1号帧,就有这样一个序列。然后我们可以看到,现在帧的编号呢,是用了3位比特,也就是编了8位号。
那这个发送窗口呢它的个数设置为4个,接收窗口呢也设置为4个。那我们就来看一下这样一长串的序号,我们给它分成了几个部分。
首先呢,就发送方来说,这个0号和1号啊,它们俩现在对应的是已经发完的、而且是已经被确认的帧。也就是说,我们这个发送窗口,把这两个帧发完了之后,才进行了一个前移,那么就说明这两号帧它已经处理结束了。
那再来看这个窗口内的帧,窗口内的帧呢有这样几种类型,首先第一个,和它们一样,都是已经发送完,而且呢收到了来自接收方的确认的,也就是说3号帧它也完事了。不过呢,它没有在这个下界,这个下界说的就是我们这个窗口的第一个,从左数第一个这样一个窗口。它没有在下界,那么我们这个滑动窗口它是不可以往前移的。除非它在下界,我们才能把它往前移动。
那我们看这个2和4,那这个2和4呢,它们是已经发送,但是呢正在等待确认的。也就是说2号帧和4号帧,它们已经发到接收方了,可是确认帧还没有到达,啊或者说有可能确认帧发生了丢失。总之,就是没有收到确认。但是呢它们自己看到这边是变成橙色了,它们自己也有一个存了一个拷贝,啊存了一个拷贝以防出现丢失的问题。那这个2号帧、4号帧就是已发送,但是正在等待确认的。
那剩下的这个5号帧呢,啊这个5号对应的帧就是还能够发送的。也就是说现在你再给我个数据,我可以给它塞到5号里面,给它标上5号帧,然后发送出去。
那剩下的部分呢,就是还不能发的。这些号对应的帧它们只能一直等待,等到这个滑动窗口滑到它们的位置才可以开始发送。那这里面,具体啊哪几个格子、哪几个窗口对应是什么样的类型,不是固定的,我们只是先举了一个简单的例子。
那再来看一下这个接收方。