前言
现实的通信链路都不会是理想的,也就是说,比特在传输过程中可能会产生差错,1可能会变成0,0可能会变成1,也就是比特差错,它是传输差错的一种,在一段时间内,传输错误的比特占所传输比特总数的比特率称为误码率。误码率与信噪比有很大的关系,如果设法提高信噪比,就可以使误码率减小,实际的通信链路并非是理想的,它不可能使误码率下降到0,因此为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。目前在链路层广泛使用循环冗余检验(CRC)的检错技术。循环冗余检验(CRC)的原理
1.在发送端把数据划分为组,假定每组k个比特,现假定待传输数据M = 101001,则k = 6。
2.CRC运算就是在数据M后面添加供差错检测用的n位冗余码,然后构成数据帧发送过去,一共发送(k + n)位。
3.n位冗余码可以用二进制的模2运算得出,这就相当于在M后面添加n个0。
4.用上述得到的(k + n)位数,除以收发双方事先商定的长度为(n + 1)位的除数P,得出的商为Q余数为R(n位比P少一位)。
5.这个余数R就作为冗余码拼接在数据M后面发送出去。
6.对于除数P,由于一般采用多项式的方式表示循环冗余检验过程,所以用多项式P(X) = X^3 + X ^2 + 1,表示除数P = 1101。
下面让我们通过一个例子来了解一下具体的使用情况
例:假定M= 101001( k = 6),采用CRC生成的多项式是P(X) = X^3 + X ^2 + 1则 P = 1101(n = 3).
首先在M后面添加n个0,除以除数P = 1101得到商Q = 110101(没有用处),余数R = 001,这个余数R就作为冗余码拼接在M后面发送出去。
注意用模2运算进行减法时不借位。
- 接收端检验
如果传输过程中数据无差错,那么经过CRC检验后余数R肯定为0。总之接收端对接收到的每一帧进行CRC检验后有以下两种情况。
(1)若余数R = 0,则判定这个帧没有差错则接受。
(2)若余数R != 0,则判定这个帧有差错(无法确定哪一位或者几位出错)就丢弃。