王道计算机网络数据链路层
Posted 生命是有光的
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了王道计算机网络数据链路层相关的知识,希望对你有一定的参考价值。
本笔记结合《2023王道计算机网络考研复习指导》食用🔥
王道考研计算机网络数据链路层
数据链路层
1.1、功能概述
1.2、基本概念
结点:主机、路由器
链路:网络中两个结点之间的物理通道,链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路。
数据链路:网路中两个结点之间的逻辑通道,把实现控制数据传输协议的硬件和软件加到链路上就构成数据链路。
帧:链路层的协议数据单元,封装网络层数据报。
数据链路层负责通过一条链路从一个结点向另一个物理链路直接相连的相邻结点传送数据报。
1.3、功能概述
数据链路层在物理层提供服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻结点的目标机网络层。其主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造成逻辑上无差错的数据链路,使之队网络层表现为一条无差错的链路。
我们来看上图:大Boss是网络层,小秘书是数据链路层,物理层是小傻子。网络层给数据链路层5份文件,数据链路层将5份文件编号给物理层,物理层传输给B公司的数据链路层,B公司的数据链路层发现文件缺失,于是让小傻子去找,小傻子将文件找全之后再给B公司数据链路层,数据链路层再交给网络层。
所以数据链路层的功能如下:
- 为网络层提供服务。无确认无连接服务,有确认无连接服务,有确认面向连接服务。(有连接一定有确认)
- 链路管理,即建立的连接、维持、释放(用于面向连接的服务)
- 组帧
- 流量控制(限制发送方)
- 差错控制(帧错/位错)
1.3.1、封装成帧
封装成帧就是在一段数据的前后部分添加首部贺尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。首部和尾部包含许多的控制信息,它们的一个重要作用:帧定界(确定帧的界限)
帧同步:接收方应当能从接收到的二进制比特流中区分出帧的其实和终止。
组帧的四种方法:
- 字符计数法
- 字符(节)填充法
- 零比特填充法
- 违规编码法
1、透明传输
透明传输是指不管所传数据是什么样的比特组合,都应当能够在链路上传送。因此,链路层就"看不见"有什么妨碍数据传输的东西。
当所传数据中的比特组合恰巧与某一控制信息完全一样时,就必须采取适当的措施,使收方不会将这样的数据误认为是某种控制信息。这样才能保证数据链路层的传输是透明的。
数据链路层实现透明传输,可以理解为数据链路层不会关心所传内容的信息,没有什么可以妨碍数据链路层的数据传输。
例如我们的小秘书,可能大Boss要传输的内容是解雇小秘书的文件,小秘书也不会去看文件内容,而是完整的传输给B公司的数据链路层。
2、字符计数法
帧首部使用一个计数字段(第一个字节,八位)来标明帧内字符数。
缺点:鸡蛋装在一个篮子里了。假如我们的第一个帧首部出错了,那么接收方对帧的判断就全部出错了。
3、字符填充法
接收方看到这样的比特组合,就知道帧什么时候开始,什么时候结束。
- 当传送的帧是由文本文件组成时(文本文件的字符都是从键盘上输入的,都是ASCII码)、不管从键盘输入什么字符都可以放在帧里传过去,即透明传输
- 当传送的帧是由非ASCII码的文本文件组成时(二进制代码的图像或图像等)。就要采用字符填充方法实现透明传输。否则会错误的找到帧的边界。
字符填充法如下:在原始数据中的除帧首尾部之外的其他帧标记前加上转义字符(也就是字节填充),对于和转义字符相同的帧标记前也加上转义字符,这样接收方碰到这样的转义字符就知道这里不是帧的结束部分,会忽视从而进行透明传输直到帧结束,最终接收端将转义字符删去就是接收到的数据。
4、零比特填充法
例如上图,我们在帧首部和帧尾部使用相同的比特进行标记,如果在帧中的数据部分也出现了相同的比特串,那么我们就需要使用零比特填充法了。零比特填充法(5110)
5、违规编码法
在曼彻斯特编码中只会出现前高后低、前低后高的编码,违规编码就将用不到的编码高高、低低来定界帧的起始和终止。
由于字节计数法Count字段的脆弱性(其值若有差错将导致灾难性后果)及字符填充实现上的复杂性和不兼容性,目前较为普遍使用的帧同步法是比特填充和违规编码法。
1.3.2、差错控制(检错编码)
1、差错从何而来
概括的说,传输中的差错都是由于噪声引起的。
全局性:1.由于线路本身电气特性所产生的随机噪声(热噪声),是信道固有的,随机存在的。
解决办法:提高信噪比来减少或避免干扰.(对传感器下手)
局部性:2.外接特定的短暂原因所造成的冲击噪声,是产生差错的主要原因。
解决办法:通常利用编码计数来解决
差错主要分为两种:
链路层为网络层提供服务:无确认无连接服务,有确认无连接服务,有确认面向连接服务。
我们对于通信质量好的一般采取无确认无连接服务,也就是不使用确认和重传机制
我们对于通信质量差的无线传输链路一般采取有确认无连接服务、有确认面向连接服务,也就是使用确认和重传机制
2、基础知识
这里我们解释一下物理层的编码和数据链路层的编码:
数据链路层编码和物理层的数据编码与调制不同。物理层编码针对的是单个比特,解决传输过程中比特的同步等问题,例如曼彻斯特编码。而数据链路层的编码针对的是一组比特。它通过冗余码的技术实现一组二进制比特串在传输过程是否出现了差错。
冗余编码:在数据发送之前,先按某种关系附加上一定的冗余位,构成一个符合某一规则的码字后再发送。当要发送的有效数据变化时,相应的冗余位也随之变化,使码字遵从不变的规则。接收端根据收到码字是否仍符合原规则,从而判断是否出错。
举个例子:我想给你两串骨肉相连,为了方式服务员偷吃,所以我告诉你肉块是偶数个,这样你拿到骨肉相连之后可以检测肉是否为奇数个来判断是否出错。当然这里有局限性,2、4、6、8块肉都是偶数个,要是数目不对岂不是也是错误。这就是下面的奇偶校验码了。
3、检错编码-奇偶校验码
奇校验码:奇校验码就是在 n-1 位的信息元之前加上1位校验元,使得 “1” 的个数是奇数
偶校验码:偶校验码就是在 n-1 位的信息元之前加上1位校验元,使得 “1” 的个数是偶数
来看上题,奇校验只需要让1的个数为奇数就行,那么A、B、C都可以检测出错误,对于D虽然1的个数确实为奇数,但是如果有两位比特码发生了错误,也不能保证说D就一定是正确的。(意思也就是如果正确的比特1的个数是3个,可是传输过来有比特码发生错误,导致1的个数变成了5个,虽然仍然符合奇校验码的规则,但是它就是错误的)
奇偶校验码特点:只能检查出奇数个比特错误,检错能力为50%
4、检错编码-CRC循环冗余码
- 准备待传的有效数据
在发送端将要发送的数据切割成一段又一段的小的比特组合,每一个小的组合都是等长的,假设是d位,每一段都叫做一个组
- 每个组都加上冗余码构成数据链路层的传输单元帧再进行发送
d位后面加r位帧检验序列FCS或者说是冗余码要如何确定呢?首先我们要引入规则,规则就是双方商定的除数/生成多项式,位数是r+1位的,基本上题当中给出的生成多项式是 1101 形式,当然有时候也会直接给一个多项式的形式,例如 X3+X2+1 ,我们要将这个多项式看破本质,将其转换为比特组合的形式,只需要添上系数并且将其他阶数的X补齐,1 *X3+1 *X2+0 *X1+1 * X0 ,我们将前面的系数提出来就是 1101 。有时候对于这个多项式也会提到一个词:阶
,阶数指的就是最高位的X右上角的幂
那么我们接下来已经拿到了除数也拿到了d位数据,怎么计算r位FCS呢?
我们在要发送的d位数据后面加上r位0(r位是取决于生成多项式的位数-1),再去除以生成多项式。这个除法不是十进制的除法,是模二除法,模二指的就是加法不进位,减法不退位,等同于异或(同0异1)。之后得到商和余数,我们要重点看余数,最后的余数其实就是r位的FCS,直接将r位FCS添到前面的r位0上面,也就是补成了d位+r位FCS的帧,再把这个帧发送到链路上面。
- 接收方检验
接收方收到d+r位数据,要怎么检验呢?我们要用d+r位数据除以我们约定的生成多项式(r+1位),看其结果,若余数为0则认为正确接收,余数不为0则丢弃。
我们来看一道例题:
例:要发送的数据是1101011011,采用CRC校验,生成的多项式是10011,那么最终发送的数据应该是?
最终发送的数据:要发送的数据+帧检验序列FCS(冗余码)
- 计算冗余码
- 加 0 :假设生成多项式G(x)的阶为r,则加r个0。
- 模2除法:数据加0后除以多项式,余数为冗余码/FCS/CRC检验码的比特序列
10011 表示成多项式为:1 * X4+0 * X3+0 * X2 +1 * X1 + 1 * X0 = X4+X1+X0 = X4+X1+1 。阶为4
小结论:多项式为N位,阶为N-1位。例如10011多项式为5位,阶为4位。
-
加0:所以多项式的阶为4,则加4个0。则要发送的数据加0之后为 1101011011
0000
-
模2除法:得到最终的余数,将余数加到要发送的数据后,得到最终发送的数据为: 1101011011
1110
接收端检错过程:把收到的每一帧都除以同样的除数,然后检查得到的余数R
- 余数为0,判定这个帧没有差错,接收。
- 余数不为0,判定这个帧有差错(无法确定到位),丢弃。
FCS的生成以及接收端CRC检验都是由硬件实现,处理很迅速,因此不会延误数据的传输。
在数据链路层仅仅使用循环冗余检验CRC差错检测奇数,只能做到对帧的无差错接收,即"凡是接收端数据链路层接受的帧,我们都能以非常接近于1的概率认为这些帧在传输过程中没有产生差错"。接收端丢弃的帧虽然曾收到了,但是最终还是因为有差错被丢弃。“凡是接收端数据链路层接收的帧均无差错”。
链路层使用CRC检验,能够实现无比特差错的传输,但这还不是可靠传输。可靠传输指的是数据链路层发送端发送什么,接收端就收到什么。
1.3.3、差错控制(纠错编码)
奇偶校验码只能发现位置,而海明码可以发现错误、找到位置、纠正错误。
1、海明距离
两个合法编码(码字)的对应比特取值不同的比特数称为这两个码字的海明距离(码距),一个有效编码集中,任意两个合法编码(码字)的海明距离的最小值称为该编码集的海明距离(码距)
举个例子:一个队伍中四个男生,表示1111,另一个队伍中一个男生三个女生,表示1000。这两只队伍位数不一样的共3位,那么这也就是两个编码的海明距离。
对于有效编码集我们计算码距,比较简单的就是看是否有海明距离为1的,有则海明距离为1。没有就看是否有海明距离为2的,有则海明距离为2。
对于上图:码距为1的的有效数据集,例如000出错变成了001,001仍然属于有效数据集,所以码距为1是无法检测出错误,更别提纠正错误了。码距为2的有效数据集,例如0000变成了0001,0001不属于有效数据集,因此1位错误是可以检测出来的,但是无法纠正,例如0000变1位变成0001,1001变1位也可以变成0001,所以无法纠正。
小结论:如果海明码要检测d位错的话,需要的码距是d+1。如果海明码要纠正d位错的话,需要的码距是2d+1
2、确定校验码位数r
对于m位数据,校验码有r位。如果有r位的校验码,那么校验码一共有2r种取值。我们之所以在海明码这用了校验码可以纠正错误,就是因为校验码在这的组合,或者说不同的取值可以代表不同的位数,不同的位置发生了错误,除了发生错误还有一种情况就是没有错误,也就是1。剩下的情况就是 m+r 位发生错误,所以就会有 m+r 种错误,因此会有海明不等式。
来看一个题:例如我们要发送的数据D=1100
数据的位数m=4,满足不等式的最小r为3,也就是D=1100的海明码应该有4+3=7位,其中原数据4位,校验码3位。
-
数据的位数m:数据D=1100有4位,m=4
-
最小r:将m带入公式,2r≥5+r,我们使用穷举法,会发现满足不等式的r最小为3
3、确定校验码和数据的位置
数据自低向高位,第一步已经知道4位数据需要3位的校验码,所以共7位。将校验码放在 20、21、22的位置上,分别为X1、
X2、X4,再将1100添上即可
4、求出校验码的值
多了一行二进制,也就是将序号转换为二进制的形式
海明码会采用一个通配符的形式,在X4也就是4号校验码的位置通配符是100
,我们写成1**
其实就是为了表示此校验码是能管所有1**
的数据位的,4、5、6、7都是1**
的形式,都是由4号校验码来校验。在X2也就是2号校验码的位置通配符是 010
,我们写成 *1*
为了表示此校验码能管所有*1*
的数据位的,2、3、6、7是*1*
的形式,所以是由2号校验码来校验。
所以我们相当于根据不同的校验位对所有的数据进行了一个分组,分完组就可以求出X1、X2、X4 分别是多少了。我们采用奇偶校验,通常会采用偶校验。如果采用奇校验,题目也会给出说明的。所以为了保证偶数个1,先看4号检验码负责的4、5、6、7要出现偶数个1,所以X4=0,再看2号校验码负责的2、3、6、7要出现偶数个1,X2=0,再看1号校验码负责的1、3、5、7要出现偶数个1,X1=1。将其填入得到完整的海明码
5、检错并纠错
接收方收到数据,写出负责校验的校验码对应负责的校验码,使用偶校验看是否符合规则,可以看到接收方在第5号位发生了错误,我们检查完就开始纠错。
将负责校验的校验码写一列,并将其收到的校验写在其后面,使用偶校验或者异或为0来求出X4、X2、X1的值 ,将其转置横着写,101对应的十进制数是5,所以第5位错了。
1.4、流量控制与可靠传输机制基础知识
1.4.1、数据链路层的流量控制
较高的发送速度和较低的接受能力不匹配,会造成传输出错,因此流量控制也是数据链路层的一项重要工作。
数据链路层的流量控制是点对点的,而传输层的流量控制是端到端的。
我们之前讲的中间系统,包括路由器、交换机,它们所在的层次只有网络层以下三层(网络层、链路层、物理层),但是在两端也就是发送端和接收端两个主机是7层或者是5层全部有的,它们有传输层。传输层的流量控制是端到端的,也就是传输层的流量控制是在两个主机之间的。而链路层的流量控制是每两个相邻结点之间的。
数据链路层流量控制手段:接收方收不下就不回复确认
传输层流量控制手段:接收端给发送端一个窗口公告。
举个例子:我养了一条猫(虽然我更喜欢狗),我将猫粮给小猫,小猫吃完了若还想吃就把空碗发送给我,若吃饱了就不会把空碗给我。这个空碗就相当于链路层的一个确认帧,如果接收到了数据同时还有足够的空间去容纳新的数据,就会从接收端发送一个确认帧发给发送端,这个时候发送端就知道接收端还是有空间的,那我就继续给接收端发送数据。
1.4.2、流量控制的方法
停止-等待协议很简单,我们看一下滑动窗口协议
发送窗口有6个,接收窗口只有1个,此时此刻发送窗口的6个全都可以一个接着一个发送,假如说发送方现在发送了0号序列帧给接收方,接收方收到0号帧之后就返回给发送方一个确认帧,同时接收方的窗口向前移动一位。也就是说接收方已经准备好来接收1号帧了。
那发送方收到0号确认帧,就继续向前移动开始发送1号帧
当然也有可能发送方发送1号帧没有接收到返回的确认帧,那么发送方就连续发送2、3、4、5、6号帧,直到收到确认帧之后才会向前移动一格
在数据链路层窗口的大小是固定的,在传输层窗口的大小是不固定的
1.4.3、可靠传输、滑动窗口、流量控制三者关系
1.4.4、停止-等待协议
-
为什么要有停止-等待协议?
除了比特出差错,底层信道还会出现丢包问题。为了实现流量控制。
丢包:物理线路故障、设备故障、病毒攻击、路由信息错误等原因,会导致数据包的丢失
-
研究停止-等待协议的前提?
虽然现在常用全双工通信方式,但为了讨论问题方便,仅考虑一方发送数据(发送方),一方接收数据(接收方)。因为是在讨论可靠传输的原理,所以并不考虑数据是在哪一个层次上传送的。"停止-等待"就是每发送完一个分组就停止发送,等待对方确认,在收到确认后再发送下一个分组。
-
停等协议有几种应用情况?
无差错情况和有差错情况
1、停等协议-无差错情况
2、停等协议-有差错情况
- 数据帧丢失或检测到帧出错
发送方首先发送0号帧,接收方收到0号帧并且回复一个确认,发送方收到确认就可以发送1号帧,在发送1号帧时线路故障导致帧丢失,那么接收方就不能发送确认帧(所以是虚线),发送方不会一直等,而是启动一个超时计时器,时间结束就会重传1号帧
注意:
- 发送方发送完一个帧,必须保留它的副本。(例如发送方发送完0号帧,要保留一个0号帧的副本,方便重传)
- 数据帧和确认帧必须编号。如果接收端收到连续编号的帧,那么就说明发送端进行了超时重传,连续出现编号相同的确认帧,就表明接收方收到了相同的重复的帧,编号可以解决帧的丢失,帧的重复等问题
RTT(往返传播时延):就是帧放到链路上之后开始传播到收到确认帧为止,这样一段时间。
- ACK丢失(确认帧丢失)
如上图,发送1号帧,但是返回确认帧ACK1丢失,那么发送方超时仍会重传1号帧,接收方因为已经收到两份1号帧,所以会丢弃第二次重复的1号帧,再重传确认1号帧。
- ACK迟到(确认帧迟到)
发送方发送0号帧,接收方返回确认帧迟迟不到,发送方等一个超时计时器之后会再次重传0号帧,因为接收方会收到两个0号帧,就会丢弃重复发送的0号帧,然后就会返回一个0号确认帧,接着发送方再发送1号帧。若此时收到接收方的的第一次0号确认帧,则发送方会丢弃
3、停等协议性能分析
TD 表示发送方发送一个数据帧的发送时延
RTT 表示往返时延
TA 表示确认帧的发送时延
从上图可以看到我们的信道利用率是比较低的,因为大部分时间都在路上,发送和接收时间相对来说占比很小
4、信道利用率
发送方在一个发送周期内,有效地发送数据所需要的时间占整个发送周期的比率
信道利用率
=
(
L
/
C
)
/
T
信道利用率 = (L/C)/T
信道利用率=(L/C)/T
- L : T内发送L比特数据
- C : 发送方数据传输率
- T :发送周期(从开始发送数据,到收到第一个确认帧为止的时间)
信道吞吐率
=
信道利用率
∗
发送方的发送速率
信道吞吐率 = 信道利用率 * 发送方的发送速率
信道吞吐率=信道利用率∗发送方的发送速率
我们来看一道题:
例:一个信道的数据传输率位4kb/s,单向传播时延位30ms,如果使停止-等待协议的信道最大利用率达到80%,要求的数据帧长度至少为()
答案:
1.4.5、后退N帧协议(GBN)
先来回顾停等协议,发送方每发送一个帧,就要一直处于等待的状态,直到接收方接收方发送给它一个确认帧,发送方才可以发送一个新的数据帧。这样就会使得发送方发送数据的时间很小。我们可以让发送方发完一个帧立马接着发第二个、第三个帧,接着等三个确认帧,这种技术叫做流水线技术,我们了解就行,不是考研重点。
我们要改进流水线技术,可以增加序号范围,传送的数据帧必要有一个唯一的序号,例如上图中三个数据帧的序号都要是不同的,这样接收方才能返回每一个唯一对应的确认帧。这样的话,如果帧丢失,我们也能根据序号找。第二个改进就是发送方需要缓存多个分组,停止等待协议中发送方可能只需要缓存一个分组,但是流水线技术中需要缓存多个分组。当然,帧丢失、帧迟到的问题我们也要通过**后退N帧协议(GBN)、选择重传协议(SR)**来改善。
1、后退N帧协议中的滑动窗口
发送窗口发送0号帧,将0号帧放到链路上,发送方同时还会copy一个0号帧副本(橙色标识
),在0号帧发送时,1号帧也是可以发送的,同时copy一个1号帧副本。
接收方收到0号帧,就会返回给发送方一个确认帧,确认帧的编号就是发送0号帧的编号,
接下来发送方和接收方都会进行窗口前移(因为发送方收到0号确认帧,接收方收到0号帧),至此这个0号帧就可以说是交易成功了。1号帧和0号帧一样,也是这样。
注意
:为了使得效率更快一些,不会依次确认收到确认帧,而是可以累积确认。(假如发送方1、2、3号帧全部发送,接收方不用逐一的确认,只需要对3号帧确认即可,也就是说只需要返回3号确认帧即可,这样发送窗口就可以前移3位了)
发送窗口这可以被分为四个区域:发完被确认的帧、已经发送但等待确认的帧、还能发送的帧、还不能发送的帧
- 停等协议:发送窗口和接受窗口数量都为1
- 后退N帧协议:发送窗口是N个,接受窗口只能有1个
- 选择重传协议:发送窗口和接受窗口数量都为N个
2、GBN发送方必须响应的三件事
-
上层的调用
上层要发送数据时,发送方先检查发送窗口是否已满,如果
未满
,则产生一个帧并将其发送;如果窗口已满
,发送方只需将数据返回给上层,暗示上层窗口已满。上层等一会再发送。(实际实现中,发送方可以缓存这些数据,窗口不满时再发送帧) -
收到了一个ACK
GBN协议中,对n号帧的确认采用
累积确认
的方式,标明接收方已经收到n号帧和它之前的全部帧。 -
超时事件
协议的名字为后退N帧/回退N帧,来源于出现丢失和时延过长帧时发送方的行为。就像在停等协议中一样,定时器将再次用于恢复数据帧或确认帧的丢失。如果出现超时,发送方重传所有已发送但未被确认的帧。
停等协议当中每一个定时器超时之后都会重传一个帧,在GBN协议当中重传的是连续的几个帧。
假如发送方给接收方发送0号帧,接收方收到0号帧就会返还一个ACK0。GBN协议强就强在它发完0号帧,就可以发送1号帧,如果1号帧很不幸在路上丢失了,因此接收方就收不到1号帧,但是接收方很专一,它知道自己要等的就是1号帧,所以对于之后到来的2、3、4号帧接收方都会丢弃掉,发送方过了定时器时间还未收到1号帧的确认帧便会重新发送1号帧以及所有已发送但是未收到确认的帧(例如2、3、4号帧)
3、GBN接收方要做的事
- 如果正确收到n号帧,并且按序,那么接收方为n帧发送一个ACK,并将该帧中的数据部分交付给上层。
- 其余情况都丢弃帧,并为最近按序接收的帧重新发送ACK。接收方无需缓存任何失序帧,只需要维护一个信息:expectedseqnum(下一个按序接收的帧序号)
4、运行中的GBN
发送0帧,接收方收到0号帧返回ACK0,之后发送方连续发送1号帧,接收方收到1号帧返回ACK1,发送2号帧时路上丢失。
5、滑动窗口长度
例如我们采用2个比特对帧编号,那么窗口帧的编号为 0、1、2、3、0、1、2、3…。因为帧的序号是可以重复利用的。我们可以算一下发送窗口的尺寸为[1,3]
。 如果我们让发送窗口为4,那么我们让0、1、2、3号帧一个接一个发送出去,然后很不幸这四个帧全部丢失,因此计时器超时之后发送方会再次重传,这个时候接收方就不知道重传的0、1、2、3号帧到底是新的帧,还是旧的帧,就无法区分了。
6、GBN协议重点总结
- 累积确认(偶尔捎带确认)
- 接收方只按顺序接收帧,不按序号则无情丢弃
- 确认序列号最大的、按序到达的帧(如果出现帧的差错问题,比如我们收到1、2号帧之后,又收到了4号帧,我本来是要收3号帧的你给我来个4号帧,那么我会将4号帧丢弃,返回给你一个
ACK2
) - 发送窗口最大为2^n-1,接收窗口大小为1
7、习题练习
- 数据链路层采用了后退N帧(GBN)协议,发送方已经发送了编号为0~7的帧。当计时器超时时,若发送方只收到了0、2、3号帧的确认,啧啧发送方需要重发的帧数是()
答案:
重新发送4、5、6、7帧
- 主机甲和主机乙之间使用后退N帧协议(GBN)传输数据,甲的发送窗口尺寸为1000,数据帧长为1000字节,信道带宽为100Mb/s,乙每收到一个数据帧立即利用一个短帧(忽略其传输延迟)进行确认,若甲、乙之间的单向传播时延是50ms,则甲可以达到的最大平均数据传输率约为
答案:
- 确认帧的发送延迟被忽略
- 带宽是发送方发送数据的理想状态的速度,我们要考虑甲发送数据的理想状态是一直发送,发送窗口一直前移,这样数据传输率自然可以向带宽速度趋近
- 还有一种情况就是甲将发送窗口的数据全部发送出去了,但是还没有等待第一个帧的确认帧,所以甲发送完所有数据就要先等一会,等到接收方发送第一个帧的确认帧,收到之后甲才可以滑动窗口前移,进而再发送第二批数据,我们来计算是否会出现这种情况呢。
首先我们计算甲将发送窗口数据全部发送出去的时间:
(1000 × 1000 × 8b)/(100 × 10^6 b/s) = 80ms
我们再来计算甲将数据发送之后再收到确认帧的时间:双向传播时延 + 甲发送第一个帧的发送时长
2 × 50ms + (1000 × 8b / 100 × 10^6 b/s) = 100.08 ms
这我们就可以看出甲发送完自己窗口的所有数据之后,还没有收到第一个帧的确认帧,因为还没有到100.08ms这个时间,因此需要再等待然后才能收到确认帧。收到确认帧之后甲发送窗口就前移,接下来的流程如上。所以我们使用 发送数据的大小/从开始发送第一个帧到收到第一个帧的确认帧这一段时间:
(1000 × 1000 × 8b)/100.08ms ≈ 80Mb/s
8、GBN协议性能分析
优点:因连续发送数据帧而提高了信道利用率
缺点:在重传时必须把原来已经正确传送的数据帧重传,是传送效率降低。
1.4.6、选择重传协议
1、GBN协议的弊端
举个例子:在GBN协议中,接收方收到一个面包片可以吃,也收到了一个火腿片也可以吃, 但是他马上收到了一个牛排,那么他是不会吃的,因为一直在等他的番茄。而且他收到的牛排也会丢弃掉,所以资源就被浪费了。
解决办法:只重传出错的帧
- 设置单个确认:逐一对帧进行确认,错的帧重传,对的帧就不重传
- 同时加大接受窗口:例如发送方乱序发送了0、2、3号帧,接收窗口虽然一直在等1号帧,但是对于到来的2、3号帧会先存储而不丢弃。(这也就是接收缓存,缓存乱序到达的帧)
2、选择重传协议中的滑动窗口
如上图,发送窗口我们设置4个,接收窗口我们也设置了4个,我们来看一下分成了几个部分:
发送方:
-
0、1 : 发完已经且被确认的帧
-
窗口内的帧:
- 2、4 :已经发送但等待确认的帧(只要未被确认,就要存一个拷贝副本)
- 3:已经发送且被确认的帧,不过窗口的下界(窗口从左数的第一个窗口),也就是2号帧是发送但等待确认的帧,所以滑动窗口不能前移
- 5:还能发送的帧
-
剩下的就是还不能发的,必须等到滑动窗口滑动到了才能发送
接收方:
- 滑动窗口内的帧
- 5:希望收到但没有收到的帧,窗口下界没有收到帧,所以滑动窗口不能前移
- 6:收到了且返回确认的帧,这个时候将6号帧要放到
缓存
里(目的就是不丢弃6号帧,等待收到5号帧且返回5号帧的确认帧,然后将滑动窗口向前移动两个格子) - 0、7:等待接受的帧,也就是接下来发送0、7号帧,接收方都有空间来接收
- 后面剩下的部分因为滑动窗口没有到达,所以不能接收
- 前面剩下的部分就是已经接收完而且也返回确认了
3、SR协议发送方必须响应的三件事
- 上层的调用
- 从上层收到数据后,SR发送方检查下一个可用于该帧的序号,如果序号位于发送窗口内,则发送数据帧;否则就像GBM一样,要么将数据缓存,要么返回给上层之后再传输
- 收到了一个ACK(确认帧)
- 如果收到ACK,加入该帧序号在窗口内,则SR发送方将那个被确认的帧标记为已接收。如果该帧序号是窗口的下界(最左边第一个窗口对应的序号),则窗口向前移动到具有最小序号的未确认帧处。如果窗口移动了并且有序号在窗口内的未发送帧,则发送这些帧。
- 超时事件
- 每个帧都有自己的定时器,一个超时事件发生后只重传一个帧。
4、SR协议接收方必须要做的事
SR接收方将确认一个正确接收的帧而不管其是否按序。失序的帧将被缓存,并返回给发送方一个该帧的确认帧(收谁确认谁),直到所有帧(即序号更小的帧)皆被收到为止,这时才可以将一批帧按序交付给上层,然后向前移动滑动窗口。
如上图:
- 5号帧:等待接收5号帧
- 6号帧:已经收到了6号帧并且正确返回了一个确认
- 7、0号帧:7、0号帧还未接收到
假如此时来了7号帧,我们就会将7号帧缓存起来,暂时存储下来,直到5号帧到来并返回确认帧。此时5、6、7号帧均正确接收且返回确认帧,那么我们就将滑动窗口向前移3位。
5、运行中的SR
来仔细分析一下上图:发送窗口和接收窗口的尺寸都是4
发送方开始发送0号帧,接收方接收0号帧并返回0号确认帧,之后接收方的滑动窗口前移一位。发送方接着发送1号帧,接收方接收1号帧并返回1号确认帧,之后接收方的滑动窗口前移一位。发送方接着发送2号帧,但是发送2号帧时在路上丢失了,于是进入定时器计时状态,接着发送方继续发送3号帧,接收方接收3号帧并返回3号确认帧,接收方知道自己要接收的其实是2号帧,于是会将3号帧进行缓存。发送方继续发送4号帧,此时刚好接收到0号帧的确认帧,所以发送方滑动窗口前移一位,接收方接收4号帧进行缓存并返回4号确认帧,发送方继续发送5号帧,此时刚好接收到1号帧的确认帧,所以发送方滑动窗口继续前移一位,接收方接收5号帧进行缓存并返回5号确认帧。此时2号帧的定时器超时,于是发送方重传2号帧,接收器接收2号帧并返回2号确认帧,此时接收方2-5帧就可以进行交付(交给网络层),滑动窗口前移三位。
6、滑动窗口长度
窗口就是为了解决流量控制的问题,发送窗口过大就会导致接收方来不及接收造成溢出的现象,发送窗口过小就没啥意义了,倒不如不传输数据罢了。
在SR协议中,窗口的上限值:WTmax=WRmax=2(n-1)
n就是多少比特来编号,例如下图的例子,用0、1、2、3来编号,其实是用了2个比特就可以满足,n就是2。
看两个例子:
左边接收方接收的是重传的0号帧,右边接收方接收的是新的0号帧。对于接收方是不清楚接收的帧是重传的还是新的帧。这里的发送窗口和接收窗口是3,但是窗口的上限值为 2(2-1)=2,超过了2就会出现问题。
7、SR协议重点总结
- 对数据帧逐一确认,收一个确认一个
- 只重传出错帧
- 接收方有缓存
- 窗口的上限值:WTmax=WRmax=2(n-1)
8、习题
- 数据链路层采用了选择重传(SR)协议,发送方已经发送了编号为0~3的帧。现已收到1号帧的确认,而0、2号帧依次超时,则发送方需要重传的帧数是()
答案:重新发送0、2号帧
1.4.7、信道划分介质访问控制
1、传输数据使用的两种链路
举个例子:
我们和美国的朋友进行通话,这种通话没有第三者,我们的通话内容只有我们自己知道,这就是点对点链路,适用于范围更大、距离更远的广域网。
但是如果如果我们在班级里喊话:“姓秦的过来一下”,这种通话内容全班都可以听见的,就是广播式链路。适用于范围小、距离近的局域网。类似于我们的对讲机。
如上图,A发信号给B,但是C也可以收到信号,只是C接收到信号发现不是发给他的,他就会丢弃。这就是总线型结构。缺点就是如果B链路出错,那么C也就收不到消息。
例如A要给B发信号,经过集线器时其余主机也可以收到信号,这就是星型(逻辑上也是总线型)。优点是即使B链路出错,不影响其余主机之间的通信。
需要记住的是总线型、星型是广播室链路的拓扑结构。
2、介质访问控制
介质访问控制的内容就是,采取一定的措施,使得两对节点之间的通信不会发生相互干扰的情况。
英文记得记住,这特么考研就爱这么考
3、信道划分介质访问控制
信道划分介质访问控制:将使用介质的每个设备与来自同一信道上的其他设备的通信隔离开,把时域和频域资源合理地分配给网络上的设备。
多路复用技术大白话:把多个信号拧成一捆,然后发送,到接受端再将信号分离开来。
3.1、频分多路复用FDM
用户在分配到一定的频带后,在通信过程中自始至终都占用这个频带。频分复用的所有用户在同样的时间占用不同的带宽(频率带宽)资源。
如上图:每个用户占一个频带,借着这个频带将数据发送出去,这样就可以使所有用户在传输数据的时候不交缠。
每个频率对应的波形如上图,随着频率的降低,频率的波形宽度会增加,每一个频带我们对应一个主机,因此即使我们把这些信号放到一个信道上面进行传输,我们也能区分开到底谁是谁,而且他们互相之间不会纠缠。
频分多路复用FDM的优点:充分利用传输介质带宽,系统效率较高。由于技术比较成熟,实现也比较容易。
3.2、时分多路复用TDM
时分多路复用TDM:将时间划分为一段段等长的时分复用帧(TDM帧)。每一个时分复用的用户在每一个TDM帧中占用固定序号的时隙。比如说A占用时隙1号,B占用时隙2号,C占用时隙3号,D占用时隙4号。而且都是有规律可循的,每一个主机都是轮流占用信道。
注意:TDM帧和链路层传输的帧不一样,TDM帧是在物理层传送的比特流所划分的帧,标志一个周期。
频分复用很类似我们OS中的"并行":同一时间,大家一起向前走
时分复用很类似我们OS中的"并发":一个人占用一段时间片,一个人占用一段时间片
思考:如果A主机休息一会,B主机休息一会,C主机休息一会,信道上只有D在传输数据。可是D并不是所有时间都占用着信道,D也是等三个时间片A、B、C之后才能占用信道,再等三个时间片才能占用信道,所以D等待的时间会比较久,因此造成信道利用率比较低。所以我们的改进时分复用->统计时分复用STDM
3.3、改进的时分复用-统计时分复用STDM
如上图:A、B、C、D四台主机,他们发送数据,但是并不是连续发送,可以看到A发送一
以上是关于王道计算机网络数据链路层的主要内容,如果未能解决你的问题,请参考以下文章
计算机网络学习笔记——数据链路层功能和服务帧定位差错海明距离检错码和纠错码