基本概念
- 节点:主机、路由
- 链路:物理通道
- 数据链路:逻辑通道(控制协议的硬件+软件)
- 帧:协议数据单元,封装数据报
数据链路层任务:向相邻节点传输数据报
功能
- 功能二:为网络层提供服务:
无确认无连接服务
,有确认无连接服务
,有确认面向连接服务
。 - 功能二:链路管理,即连接的建立、维持、释放(用于面向连接的服务)。
- 功能三:组帧。
- 功能四:流量控制。
- 功能五:差错控制(帧错/位错)。
组帧
封装成帧:在一段数据的前后部分添加 首部
和 尾部
,这样就构成了一个帧。
接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束.
首部和尾部包含许多的控制信息,他们的一个重要作用:帧定界(确定帧的界限)。
帧同步:接收方应当能从接收到的二进制比特流中区分出帧的起始和终止。
组帧的四种方法
1. 字符计数法
做法:帧首部使用一个计数字段(第一个字节,八位)来标明帧内字符数(包括他自己)。
缺点:若帧的第一个字节丢失就全体GG(一般不采用)
2. 字符(节)填充法
做法:在首部和尾部分别添加特殊的控制信息,若数据中有相同比特流则在前面填充特殊的转义字符让接收方忽略它
缺点:so复杂了点
3. 零比特填充法
做法:类似字符填充法,填充的字符不同(`01111110`),并且遵循`5110`
`5110`:扫描整个数据段。若有连续5个1出现就在后面无脑加0,防止和首尾数据重复
4. 违规编码法。
做法:比如我们使用曼彻斯特编码编码数据
数据的定义是靠电平上升沿(低-高)和下降沿(高-低)表示。
那我们产生一个(高-高)/(低-低)这样不符合编码规则的电平就可以和数据区分
字节计数法
: Count字段的脆弱性(其值若有差错将导致灾难性后果)
字符填充法
: 实现上的复杂性和不兼容性
目前较普遍使用的帧同步法是 比特填充
和 违规编码法
。
差错控制
差错源于噪声:
- 全局噪声(链路电气随机干扰):提高信噪比解决
- 局部噪声(外界噪声干扰):编码技术解决
差错
- 位错:(比特位出错,1变成0,0变成1)
- 帧错:丢失、重复、失序
位错解决
冗余编码: 在数据前面添加校验数据,和最终收到的数据比对是否有误,有误证明传输出错
检错编码(只能检测出错)
- 奇偶检验码(检错能力50%)
构成:1位检验元 + n-1位数据元
奇校验码:加上校验元后使得数据中的 1 个数位奇数
偶校验码:加上校验元后使得数据中的 1 个数位偶数
eg:如果一个字符S的ASCll编码从低到高依次为1100101,采用奇校验,在下述收到的传输后字符中,哪种错误不能检测?
A. 11000011
B. 11001010
C. 11001100
D. 11010011
Ans:D。因为前采用奇校验,ABC三项中1都为偶数传输均错误,D有可能是正确的(万一是偶数位错呢)
- 循环冗余码CRC
1.发送端编码
要传送的数据 / 生成多项式。取其余数作为冗余码
2.发送数据
要传送的数据 + 冗余码
3.接收端校验
接收到数据 / 生成多项式。庞贝余数是否为0,否则传输出错
板栗🌰
课件中商漏了一个1,但是过程是对的余数正确,故不影响结果
这个模2除法(异或)适应一下和以前数学不太一样
一段晦涩的话
在数据链路层仅仅使用循环冗余检验CRC差错检测技术,只能做到对帧的无差错接收,即“凡是接收端数据链路层接受的帧
我们都能以非常接近于1的概率认为这些帧在传输过程中没有产生差错”。接收端丢弃的帧虽然曾收到了,但是最终还是因为有差错被丢弃。
“凡是接收端数据链路层接收的帧均无差错”。
“可靠传输”:数据链路层发送端发送什么,接收端就收到什么。
链路层使用CRC检验,能够实现无比特差错的传输,但这还不是可靠传输。
纠错编码(发现错误,还能找出出错位置)
海明码(发现双比特错,纠正单比特错)
原理: 多个校验位同时检验一个数据
构成: 检验位和数据位
检验位个数:海明不等式 2^r >= k + r + 1
计算得出(r为检验位个数,k为数据位位数)
检验位位置:2的(1-r次方)
编码: (以数据D = 101101为例)
- 计算检验位
1.1 第一个检验位,使得校验位和所有位数末尾第一位为1(二进制)的所有数据异或值为0
eg:P1 ⊕ D1 ⊕ D2 ⊕ D4 ⊕ D5 = 0 ==> P1 = 0
1.2 第二个检验位,使得校验位和所有位数末尾第二位为1(二进制)的所有数据异或值为0
eg:P2 ⊕ D1 ⊕ D3 ⊕ D4 ⊕ D6 = 0 ==> P2 = 0
……
以此类推,最终
P1 = 0
P2 = 0
P3 = 0
P4 = 1
最终传输数据(海明码): 0010011101
海明不等式和它的位置巧妙的使校验位 校验的位置都是数据位
校验:
- 校验异或值(假设传输中第五位传输错误变为0010111101)
1.1 第一个检验位
eg:P1 ⊕ D1 ⊕ D2 ⊕ D4 ⊕ D5 = 1
1.2 第二个检验位
eg:P2 ⊕ D1 ⊕ D3 ⊕ D4 ⊕ D6 = 0
1.3 第二个检验位
eg:P3 ⊕ D2 ⊕ D3 ⊕ D4 = 1
1.4 第二个检验位
eg:P4 ⊕ D5 ⊕ D6 = 0
2. 校验结果 "出栈" : `0101` 转换位十进制 `5`
3. 确认海明码第五位出错,将1改为0
校验结果出栈后
0000
第0
位出错就不用解释了它压根就没错
🌰🌰板栗+1