1. 数据链路层功能概述
基础定义:
- 结点:主机、路由器
- 链路:网络中两个结点之间的物理通道,链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路。
- 数据链路:网络中两个结点之间的逻辑通道,把实现控制数据传输协议的硬件和软件加到链路上就构成数据链路
- 帧:链路层的协议数据单元,封装网络层数据报。
数据链路层基本功能概述:
数据链路层负责通过一条链路从一个结点向另一个物理链路直接相连的相邻结点传送数据报。
数据链路层在物理层提供服务的基础上向网络层提供服务。
其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。
其主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路,使之对网络层表现为一条无差错的链路。
总结功能如下:
- 为网络层提供服务。有三种模式:无确认无连接服务(实时通信),有确认无连接服务(有确认应答机制,适合无线通信),有确认面向连接服务(建立连接,有收到应答机制)
- 链路管理,即连接的建立、维持、释放(用于面向连接的服务)
- 组帧
- 流量控制
- 差错控制(帧错/位错)
数据链路层的学习就是围绕这这些功能而展开的。
2. 封装成帧+透明传输
封装成帧:将网络层来的数据报+帧头帧尾形成帧
这样接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。
帧头和帧尾包含很多控制信息,它的重要作用就是帧定界。(确定帧的界限)
常见的术语:
- 帧同步:接收方从接收到的二进制比特流中区分出帧的起始和终止。
- 数据链路层的帧长:从帧头到帧尾的长度
- 最大传送单元MTU:数据链路层帧长包括三部分(帧头,帧的数据部分,帧尾),MTU就是最长帧的数据部分。(不同协议的MTU不同)
- 组帧的四种方法:
- 字符计数法
- 字符(节)填充法
- 零比特填充法
- 违规编码法。
透明传输
透明传输是指不管所传数据是什么样的比特组合,都可以在链路上传送。因此,链路层就“看不见”有什么妨碍数据传输的东西。
当所传数据中的比特组合恰巧与某一个控制信息完全一样时,就必须采取适当的措施,使收方不会将这样的数据误认为是某种控制信息。这样才能保证数据链路层的传输是透明的。
四种组帧方法:
-
字符计数法:帧首部使用一个计数字段(第一个字节,八位)来标明帧内字符数。
缺点:如果第一个帧头错误,后续的所有帧都会发生错误。
当传送的帧是由文本文件组成时(文本文件的字符都是从键盘上输入的,都是ASCII码)。不管从键盘上输入什么字符都可以放在帧里传过去,即透明传输。
当传送的帧是由非ASClI码的文本文件组成时(二进制代码的程序或图像等),这样传送的数据可能和EOT二进制位相同,导致错误判断帧尾,就要采用字符填充方法实现透明传输。
-
字符填充法:在帧的有效数据前后添加两个字节(SOH(帧头),EOT(帧尾)),当接受方接受到帧尾EOT这个字节,代表数据传输完毕。
类似于转义字符的概念,如果帧数据中出现了控制信息,就添加一个字节的填充信息(ESC)来防止其下一个字节被接收方错误解析。
-
零比特填充法:和字符计数法类似,也是在有效数据前后添加两个字节的数据。不同的是,零比特填充法帧头帧尾填充的数据相同。(01111110)
特点:- 在发送端,扫描整个信息字段,只要连续5个1,就立即填入1个0。
- 在接收端收到一个帧时,先找到标志字段确定边界,再用硬件对比特流进行扫描。发现连续5个1时,就把后面的0删除。
保证了透明传输,在传送的比特流中可以传送任意比特组合,而不会引起对帧边界的判断错误。
-
违规编码法:
eg:曼切斯特编码中,一个CPU时间周期内电位是高低,或低高,不可能出现高高,低低这两种情况。
违规编码法就是把这种不可能出现的情况作为帧头和帧尾,这样就不用担心中间信息干扰接收方判断了
3. 差错控制
检错编码(奇偶校验码,CRC循环冗余码)
信号传输的差错主要有两类:位错(比特位错误),帧错(帧丢失,帧重复,帧失序)
差错控制要检查错误使用检错编码。
如果要纠正错误就是用纠错编码。
检错编码有两种:
- 奇偶校验码
- 循环冗余码CRC
纠错编码:
- 海明码
需要特别区分物理层的编码和数据链路层的编码:
- 物理层编码针对的是单个比特,解决传输过程中比特的同步等问题,如曼彻斯特编码。
- 数据链路层的编码针对的是一组比特,它通过冗余码的技术实现一组二进制比特串在传输过程是否出现了差错。
奇偶校验码:
奇偶校验码中包含n-1位信息元和1位校验元
奇校验码:添加校验元,使比特流中1的个数是奇数
偶校验码:添加校验元,使比特流中1的个数是偶数
接收方发现接受的比特流1的个数不是约定好的奇数或偶数,就是错误的信息。
(当然,只是1的个数是奇数或偶数不一定这个信息一定是正确的它的是检错率50%)
CRC循环冗余码:
数据在链路上传输的是FCS振检验序列(冗余码)和原来的数据相加的值
发送方:
1. 准备待传有效数据,并将其分成等长的组
2. 每个组都加上冗余码(r位FCS)构成帧再发送(通信双方需要商定生成多项式的值)
eg:x^3+x^2+1 生成多项式: 1*x^3 + 1*x^2 + 0*x^1 + 1*x^0 (生成多项式为1101)
生成多项式的位数为r+1位(r是生成多项式的阶数)
FCS生成规则:
要传送数据二进制+r位0 ÷ 生成多项式 =商+ 余数(FCS帧检验序列(冗余码)r位)
链路上传输的是原始数据拼接上FCS
接收方:
接受的二进制数据 ÷ 生成多项式 = x 余 m
如果m为0的话,说明传输过程中是正确的,否则是错误的丢弃
FCS的生成以及接收端CRC检验都是由硬件实现,处理很迅速,因此不会延误数据的传输。
需要特别注意:
链路层使用CRC检验,能够实现无比特差错的传输,但这还不是可靠传输。因为出现错误的帧被丢弃了
纠错编码(海明码)
海明码工作流程:
1. 确定校验码位数r
2. 确定校验码和数据的位置
3. 求出校验码的值
4. 检错并纠错
海明距离(码距):两个合法编码(码字)的对应比特值不同的比特数称为这两个码字的海明距离(码距)。
一个有效编码集中,任意两个合法编码(码字)的海明距离的最小值称为该编码集的海明距离(码距)。
所以当出错位数小于这个系统的海明距离,就可以被检查出来。
海明码要检验d位错误需要码距为d+1
海明码要纠正d位错误需要码距为2d+1
如果信息码有m位,冗余码/校验码有r位,校验码一共有 2r 种取值
要想实现纠错,校验码需要对每一位错误进行对应,还有一种是正确的情况
所以可以得到海明不等式: 2r >=m+r+1
eg:
要发送的数据:D=1100数据的位数m=4,
满足不等式的最小r为3,所以D=1100的海明码应该有4+3=7位,其中原数据4位,校验码3位。
确定了校验码位后,需要确定校验码放置的位置。
这里规定:校验码放在序号为2"的位置,数据按序填上
eg:D=1100根据上面算出海明码7位,校验码3位
校验码放到 1,2,4位上
7 6 5 4 3 2 1
此时D就变为1 1 0 P(3) 0 P(2) P(1)
求出校验码的值:
将序号写成二进制的形式,最后如图:
可以根据图看出
4号校验码(1**)负责4,5,6,7的校验
2号校验码负责2,3,6,7的校验
1号校验码(**1)负责1,3,5,7的校验
这里采用偶校验
第一组4号校验码1的个数要是偶数,所以P(3)=0
第二组2号校验码1个数是偶数,所以P(2)=0
第三组1号校验码1个数是偶数,所以P(1)=1
最后海明码为1100001
检错和纠错
如果接受方收到了1110001序列
根据上文可知
4号校验码(1**)负责4,5,6,7的校验 0 1 0 0 偶校验不通过
2号校验码负责2,3,6,7的校验 0 0 1 1 偶校验通过
1号校验码(**1)负责1,3,5,7的校验 1 0 1 1 偶校验不通过
数据出错,纠错方式有两种:
- 找到不满足奇/偶校验的分组取交集,并与符合校验的分组取差集。
- P(3) 0,1,1,1 P(3)=1
P(2) 0,0,1,1 ===>为满足偶校验 P(2)=0
P(1) 1,0,1,1 P(1)=1
出错位为:P(3)P(2)P(1) 即 101 第5位出错