数据链路层
一、校验
1. 奇偶校验
- 偶校验
- 数据位和为偶数:校验位为0;
- 数据位和为奇数:校验位为1;
- 奇校验
- 数据位和为奇数:校验位为0;
- 数据位和为偶数:校验位为1;
缺点是会存在误判的情况
2. CRC循环冗余校验
在生成循环冗余码的时候,使用的是模2除(被除数高位为1就够除,商1)
在接受端接受到数据之后,将收到的数据除以生成多项式,如果能除净,那么接受到的就是正确的,除不尽就是错误的
二、纠错(海明码)
设:数据有m位,校验码有p位,则校验码共2^p位.若想通过校验码指出任一位上发生的错误,必须满足
2^p-1 >= m+p
S1 : 如果m=4,那么可以得到p=3。设传送数据为1010
S2 : 将校验码放到2^n (n=0,1,2……) 上,
1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|
p1 | p2 | 1 | p3 | 0 | 1 | 0 |
S3:建立校验位和信息位的关系
1 (001) | 2(010) | 3(011) | 4(100) | 5(101) | 6(110) | 7(111) |
---|---|---|---|---|---|---|
p1 | p2 | 1 | p3 | 0 | 1 | 0 |
对应关系表
p1 (001) | m3 (011) | m5(101) | m7 (111) |
---|---|---|---|
p2 (010) | m3 (011) | m6(110) | m7 (111) |
p3 (100) | m5 (101) | m6(110) | m7 (111) |
注释: p1 001,对应的3 (011),5 (101),7 (111),也就是最低位上全是1 , 以此类推,p2对应的都是第2位上是1的。
S4:将表中的m3,m5,m6,m7用对应的值替换
p1 | 1 | 0 | 0 |
---|---|---|---|
p2 | 1 | 1 | 0 |
p3 | 0 | 1 | 0 |
按偶校验规则 (数据位和为偶数:校验位为0):p1=1,p2=0,p3=1;
按奇校验规则 (数据位和为奇数:校验位为0):p1=0,p2=1,p3=0;
得到海明码如下
1 (001) | 2(010) | 3(011) | 4(100) | 5(101) | 6(110) | 7(111) | |
---|---|---|---|---|---|---|---|
奇 | 0 | 1 | 1 | 0 | 0 | 1 | 0 |
偶 | 1 | 0 | 1 | 1 | 0 | 1 | 0 |
S5:使用海明码检测出错位置
假设使用奇校验,发送 0110010,而接收端收到的是 0110110, 根据接受到的数据和上表的p1,p2,p3写出映射关系
按照奇校验的规则写出e1,e2,e3 (数据位和为奇数,校验位取0)
e1=1 | p1=0 | m3=1 | m5=1 | m7=0 |
---|---|---|---|---|
e2=0 | p2=1 | m3=1 | m6=1 | m7=0 |
e3=1 | p3=0 | m5=1 | m6=1 | m7=0 |
e3,e2,e1 = 101 因此说明第五位出错了
三、组帧的三种方法
1. 字符计数法
在帧首部添加一个计数字段(一个字节,八位),但是这种方法的缺点就在如果有一个帧出错(少了一个字符),后面就跟着全错了
2. 字符填充法
在帧的起止位置添加 SOH(00000001,开始)和EOT(00001001),如果在帧的中间位置出现一个EOT的,就在其前面添加一个ESC转义字符
3. 零比特填充法
在硬件上容易实现,性能要比字符填充法好
- 发送端:扫描整个帧,如果发现5个连续的1,就在后面填入一个0
- 接收端:先找到标志字段,确定帧的边界,发现有5个连续的1,就删除后面的0