CRC校验
循环冗余校验:
- 特征:信息字段和校验字段的长度可以任意选定。
- 具有数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法。
校验原理
- 根本思想在要发送的帧的后面附加一个数(用来校验的校验码,这个数也是二进制序列的),生成一个新的帧发送给接收端。
- 附加的校验码,要使所生成的新的帧能与发送端和接收端共同选定的某个特定数整除(“模2除法”)
- 接收端把接收的新的帧除以(“模2除法”)这个选定的除数。
- 如果没有余数,表明该帧在传输过程中出现了差错
模2除法
类似于短除法,但不向上一位借位(实际上就是异或)。
CRC校验步骤
两个关键点
- 预先确定一个发送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但最高位和最低位必须为1。
- 把原始帧与除数进行模2除法运算,计算CRC码。
具体步骤
- 选择合适的除数
- 看选定除数的二进制位数,在要发送的这个数据帧后面加上除数的二进制数位数-1位的0。
- 用新生成的帧以模2除法的方式除以除数,得到的余数就是该帧的CRC检验码。余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。
- 将计算出来的CRC校验码附加在原数据后面,构建成一个新的数据帧进行发送。
- 接收端在以模2除法方式除以选定的除数,没有余数,说明数据帧在传输的过程中没有出错。
CRC校验码计算示例
假设 CRC 生成多项式为:G(x)=X 4 + X3 + 1
要求二进制序列1011 0011的CRC检验码。
具体的计算过程:
- 将多项式转化为二进制序列,由G(x)=X 4 + X3 + 1 可知二进制一种有5位,第4、3、0位分别为1,序列为11001.
- 生成多项式的位数为5,则在数据帧后面加上5-1=4个0,数据帧变为101100110000,使用模2除法除以11001,得到余数。
- 将计算出来的CRC检验码添加在原始数据后面,真正的数据帧为101100110100,把这个数据帧发送到接收端。
- 接收端收到数据帧后,用选定的除数,模2除法,验证余数是否为0。为0,表明数据帧没有出错。
模2除法
计算校验码
计算步骤总结
- 展开多项式得到CRC除数(避免出错从右往左写)
- 原数据末端加0(多项式最高是几就加几个0)
- 从左往右,按位异或(所得结果位数如果不够长,前面的0不要漏了)
说明
- 检错码只能检测出帧在传输过程中出现了错误,但并不能定位错误,因此无法纠错。
- 要纠正错误,可以使用冗余信息更多的纠错码进行前向纠错。但纠错码的开销较大,在计算机网络中较少使用。
- 循环冗余校验有很好的检错能力(漏检率很低),应用广泛。
- 计算机网络中通常采用检错重传方式来纠正传输中的错误,或者仅仅是丢弃检测到的错误的帧,这取决于数据链路层向其上层提供的是可靠传输服务还是不可靠传输服务。