在数据传输的过程中,不可避免会出现差错,为判断一个数据块中是否存在传输错误,发送方可在数据块中加入一些冗余信息,使接收方可通过这些冗余信息判断传输是否出错,这些加入的冗余信息称为差错编码。


差错编码分为检错码和纠错码。
检错码只能让接收方判断数据块是否有错,但无法确认错误的位置,主要有奇偶校验码和CRC循环冗余码。
纠错码不仅能发现错误,而且能纠正错误,主要是海明码。由于纠错码开销较大,所以不适合于计算机通信。在计算机通信中主要使用检错重发方法,主要使用的是检错码,其中CRC是一种能力相当强的检错码,并且实现编码和检错的电路比较简单,因而得到了广泛的应用。


CRC编码主要用于数据链路层,它的基本思想将二进制位串看成系数为0或1的多项式。一个n位的帧被看成是n-1次多项式的系数列表。最左边是xn-1项的系数,接着是xn-2项的系数,依此类推,直到X0项的系数。如二进制数11100011可以表示为多项式X7+X6+X5+X+1。同样的,多项式X4+ X+1,可以表示为二进制数10011。


假设发送方要发送的数据帧是1010101010,在进行CRC编码时,发送方和接收方必须事先商定一个生成多项式,如X4+ X+1,对应的二进制数为10011,其最高阶为4,则在帧1010101010后面附加4个0,成为10101010100000。
用10101010100000除以10011,得到的余数就是CRC校验码。

这个除法用到的是异或运算,基本规则是两个相同的数相除,其结果是0,两个不同的数相除,其结果是1。最终得到的CRC校验码为0100(生成多项式的最高阶为几,就可以得到一个几位的CRC校验码),然后将10101010100000用模2减法(实际上也是异或运算)减去CRC校验码0100,就得到了最终实际要传输的数据帧10101010100100。


大家可以自己练习一下这道考题:

若信息码字为11100011,生成多项式 G(X)=X5+X4+X+1,则计算出的 CRC 校验码为 (16) 。
    (16)A.01101    B.11010    C.001101    D.0011010