数据链路层的差错监测
基偶校验码
- 基偶校验码是一种非常简单,检测比特流中是否有错误的一种方法,通常在比特流的尾部添加一位来检测这个比特流是否有出错。
- 假设
- 传输一个
00110010
八位的比特流,如果现在我们需要使用奇偶校验码的机制,就需要在这个八位的比特流末尾增加一个比特位值,假设为 1
,结果就是 00110010 1
,当接收端接收到这个比特流就会通过最后一位比特流来检测传输的这个比特流是否有错误。检测方法如下
- 检测
001100101
- 取出最后一位
1
- 剩余比特流相加 (
0 + 0 + 1 + 1 + 0 + 0 + 1 + 0 = 3
),等于3,3是属于奇数,故从比特流末尾取出的是 1
,所以这个比特流是正确的。相反,如果剩余比特流相加之和是偶数,那么末尾取出的比特流应该是 0
,否则比特流不正确。
奇偶校验码的局限性(出错两位,奇偶校验码检测不到错误)
- 假设
- 传输一个
00110010
八位的比特流,如果现在我们需要使用奇偶校验码的机制,就需要在这个八位的比特流末尾增加一个比特位值,假设为 1
,结果就是 00110010 1
。当接收端接收到的假设是 00000010 1
,根据奇偶校验码计算方式 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 = 1
,虽然奇偶校验能通过,但是在实际传输的过程中,的确会出现个别比特位是错误的情况。
循环冗余校验码CRC
- 介绍
- 一种根据传输或保存的数据而产生固定位数校验码的方法
- 检测数据传输或者保存后可能出现的错误
- 生成的数字计算出来并且附加到数据后面
- CRC基础
- 模 2 除法
- 模 2 除法是二进制下的除法
- 与算术除法类似,但除法不错位,实际是 “异或” 操作
- 异或操作示例:只要两个比特位不同就是1,相同就是0
- 0 xor 0 = 0
- 0 xor 1 = 1
- 1 xor 0 = 1
- 1 xor 1 = 0
- 计算示例
- 校验码CRC计算的三个步骤
- 步骤一:选定一个用于校验的多项式G(x),并在数据尾部添加r个0
- 步骤二:将添加r个0后的数据,使用模“2”除法除以多项式的位串
- 步骤三:得到的余数填充在源数据r个0的位置得到可校验的位串
CRC总结
- CRC的错误检测能力与位串的阶数r有关
- 数据链路层只进行数据的检测,不进行纠正。如果数据链路层发生了数据的错误,数据链路层会把这个数据直接丢弃。
CRC 常用的G(x)