文章目录
一、数据链路层功能概述
封装成帧:其实就是帮我们从物理层过渡到链路层,我们物理层传输的是一个一个比特,我们在链路层就是要把比特封装成帧,就是把几个比特放到一个帧里面。这就是数据链路层的一个传输单位,或者说传输单元
透明传输:不管我们封装好的帧里面的比特是怎么样的一个组合,都可以把它顺利的传输过去,所以表现的就像链路层看不见它传输的帧里面到底是什么样的比特序列。就像是“透明”一样。
差错控制:我们的链路层在传输的过程中,可能会发生一些差错,这些差错主要是由于噪声引起的,那导致的结果就是位错和帧错。
位错——比特发生了错误(即1,0),解决办法就是使用检错编码或者纠错编码,检错编码顾名思义就是能检查出来它有问题,纠错编码就是指不仅能检查出有问题,还能纠正错误。
对于检错编码,如果发现错了,解决办法就是后面重传一个帧
帧错——比如帧丢了,帧重复,帧乱序。这样的错误我们可以通过定时器和编号机制来检查它是否出错。
如果发现错了,解决办法还是一样,后面重新传输一个帧。
流量控制:它其实就是在控制发送方的流量。比如发送一个帧,我们需要掌握一定的速度,这样才能避免帧丢失或者帧收不到的情况。
可靠传输:这里与其说是链路层的一个功能,不如说它是链路层的一个特点。
为了实现流量控制和可靠传输,我们引入了一个滑动窗口机制,这个我们后面会具体讲。
两种链路/信道:也可以说成两种通信方式,分为“点对点(广域网)”和“广播(局域网)”两种通信方式
对于广播信道来说,我们需要进行介质访问控制。也就是说,如果我们大家处在一个局域网里面,我要给你发送信息,怎么样才能够避免别人要发的信息和我这个信息发生碰撞,从而导致你收不到。
为了解决上述问题,就需要介质访问控制,让所有人可以有序的使用这个广播信道,才能保证信息的不丢失,或者其他问题。
介质访问控制有两种:静态划分信道、动态划分信道
链路层设备:交换机、网桥
无确认无连接服务:通常用于实时通信,或者是误码率比较低的信道。也就是原主机在发送数据的时候,不用事先和目的主机建立好一个链路的连接。而且目的主机在收到数据帧的时候,也不需要返回确认的结果。如果帧丢失了,直接交给上一层处理。这种方式其实是不负责任的,但是为了实时通信,更快的通信,就会有这种服务。
有确认无连接服务:这种也是事先不用建立连接,但是目的主机在收到数据的时候必须返回一个确认,如果原主机发现在规定时间内没有收到这个确认信号,就需要把没有收到确认的帧再重新传输一次。这样就可以提高数据链路层的可靠性了。这种服务适合误码率相对较高的信道。
有确认面向连接服务:这种就是最可靠的,事先要建立好连接,同时接收端的机器人收到这个帧之后需要返回一个确认帧。
ps:有连接一定有确认
二、封装成帧和透明传输
透明传输在组帧上的一些应用如下:
1.字符计数法:比较简单,但也容易出问题。它的方法就是用帧首部的一个计数字段,也就是第一个字节来标明帧内字符数。
这种方法的缺点就是鸡蛋在一个篮子了,假如我第1帧第一个字节出错了,后面就全错了。
2.字符填充法:
SOH就是帧首部的第一个标志开始的字节,EOT是帧尾部的结束字节。
有了这两个字节,我们接收端就可以判断从哪里接收帧,从哪里接收结束。
但是这种情况只出现在传送的帧是文本文件组成的时候,因为文本文件是指我们从键盘上输入这样一个文件,我们知道,键盘上的每一个键都对于一个ASCII码,键盘上的ASCII码和SOH还有EOT这8比特是不会有交集的。所以无论我们在键盘上敲什么,放到数据里面,都可以放在帧里面传输过去。就可以实现透明传输。
如果我们要传的是非ASCII码的文本文件组成,比如说二进制代码的程序或者图像,这样数据部分里面可能就会出现两个定界符SOH和EOT所对应的比特组合了。假如我们数据部分有一个和EOT一样对应的比特组合,如下图,那接收端就可能会提前认为帧结束了。
因此需要使用字符填充法来实现透明传输,也就是通过一种方法使接收端在看到这个和EOT结束字符一样的比特组合时,也会把它看作正常数据接收,直到遇到真正的帧结尾。
字符填充法的具体实现过程:
现在有如下的原始数据,要进行字符填充
字符填充的过程就是在控制信息的字符前加一个转义字符。加上这个字符就告诉了接收端,你不用管我后面跟着的东西是什么了,你正常接收,直到遇到真正的结束字符。
到了接收端这边,接收端会先扫描到SOH然后开始接收帧,接下来看到ESC,它就知道是转义字符,为了实现透明传输,再把这个ESC给去掉,剩下的就是真实数据了。
字符填充法简言之:在发送端填充转义字符,在接收端去掉转义字符。
3.零比特填充法:这种方法允许数据帧中包含任意个数的比特。
如下图,下面是一个帧,它和字符填充法的区别在于:零比特填充法的首部和尾部的标志符是一样的,都是0111 1110
那如果在数据部分,也出现了和标志符一样的组合怎么办?
归纳起来就是四个字:5110,就是遇到5个1,添加1个0
4.违规编码法:它其实是在物理层比特编码的时候实现透明传输的一种方法。
由于曼彻斯特编码都是前低后高,或者前高后低。我们这把高定义为1,低定义为0。在曼彻斯特编码中,每一个码元(比特)对应的电平要么是10要么是01
不可能有11和00两种,那我们可以把11和00这两种不可能的电平来标志起始和终止。
三、差错控制(检错编码)
奇校验码:在n-1位信息元之前加上1位校验元,使得1的个数是奇数
偶校验码:在n-1位信息元之前加上1位校验元,使得1的个数是偶数
举个例子:
因为是奇校验,所以我们各个选项总共1的个数应该是奇数个
A有4个1,肯定错
B有4个1,肯定错
C有4个1,肯定错
D有5个1,不一定对
所以选D
CRC循环冗余码:
对于CRC编码的方式,我们只需要3步就可以解决,
第一步:准备待传的有效数据,而待发送的数据是一系列比特的组合,每个小的组合都是等长的,假设是d位。每段都是1个组
第二步:对于每一个组,都加上冗余码,再构成一个数据链路层的传输单元——帧
d位后加的r位帧检验序列(冗余码)是如何确定的?首先我们要引入一个规则。
规则就是双方商定的一个除数,也叫做生成多项式,是r+1位的。
一般题中给的生成多项式就是1101这种
但是有时候也会给你x3 +x2 + 1,
这种你先把各阶补齐是x3 +x2 + 0*x1 +1,然后系数提出来,是1101
有时候对于这个多项式,会提到一个“阶”的概念,阶就是最高位的幂,比如x3 +x2 + 1的阶就是3
生成多项式题目会具体给出来。
拿到了除数,也拿到了要发送的d位数据,怎么求r位的FCS?
首先,我们要在发送的d位数据后,加上r位的0,这个r位就是生成多项式位数-1。然后再用FCS去除生成多项式
注意,这里的除法不是十进制的除法,是模二除法。
模二除法就是加法不进位,减法不退位。就相当于异或(同0异1)
第三步:接收方接收到了这样一个d加r位的数据,它是怎么检验的呢?
我们拿d+r位的数据,对约定好的生成多项式进行模二除看它是否余数为0
举个例子:
四、差错控制(纠错编码)
海明码:
首先是确定校验码的位数r,然后把校验码插入到数据位数中
ps:奇偶校验码和CRC循环冗余码是在最低位附加上一位或者几位校验码,但是海明码需要根据一定规则在数据位上安插上这个校验码。
再然后就是要求出校验码的值,最后就是检错和纠错。
海明距离(也称海明距、码距):
如果码距为1,传输过程中有1位出错,比如000变成了001,而000也是编码系统中的有效编码,你是不知道有没有出错的。
如果码距为2,传输过程中有1位出错,比如0000变成了0001,这样我们是可以检查出有错误的。因为码距是2啊,你0000和0001只有1位不同,码距变