循环冗余校验
循环冗余校验(CRC, Cyclic Redundancy Check)
现今的计算机网络中广泛应用的差错检测技术基于循环冗余检测,CRC编码也称为多项式编码(polynomial code)。
CRC中的计算采用模2运算,即加法不进位、减法不借位,这意味着加法和减法是相同的,同时模2运算等价于异或XOR运算。
+=101101011110−=101101011110XOR=101101011110
题目在模2运算中,1101 + 0111 等于多少?1101 − 0111 呢?
发送方与接收方
假设待发送的数据D的长度为d位,发送方和接收方首先需要协商一个长度为r+1位的生成多项式G(generator)。
对于发送方,需要在数据D后附加一个长度为r位的R,即得到一个长度为d+r位的序列,并且这个序列用模2运算能够被G整除。
对于接收方,使用G去除接收到的d+r位。如果余数不为0,则说明出现了差错。
发送方需要构造的长度为d+r位的序列可以通过将数据D左移r位,并加上R得到。由于得到的d+r位序列能够被G整除,即为G的整数倍。
D⋅2r XOR RD⋅2r=nG=nG XOR R
R为D⋅2r除以G的余数:
R=remainder[GD⋅2r]
计算示例
假设D = 101110,G = 1001,那么r = 3,需要在D末尾补齐3个0进行除法。
计算得出余数R为011,因此发送方需要传输的数据为101110011。
PRO EXCLUSIVE探索不止于此解锁完整互动实验、进阶解析与精选参考答案。
尊享 Pro 权益
为什么叫“多项式编码”
一个比特串可以看作一个系数只取0或1的多项式:最高位对应最高次幂。例如D=101110对应x5+x3+x2+x,G=1001对应x3+1。“左移r位”就是乘以xr,模2长除法就是多项式除法,只是系数的加减都按异或计算。
CRC能发现哪些差错
设发送的比特为T,传输中出错的位置构成差错模式E(出错的位为1),接收方收到的就是T⊕E。由于T是G的倍数:
remainder[GT⊕E]=remainder[GE]
所以只有当E恰好是G的倍数时,差错才会漏检。由此可以得到CRC的几条重要性质:
| 差错类型 | 能否检测 | 原因 |
|---|
| 单比特差错 | 总能检测 | G的最高位和最低位都是1,xi不可能是G的倍数 |
| 长度不超过r的突发差错 | 总能检测 | 次数低于G的非零多项式不可能是G的倍数 |
| 奇数个比特差错 | G含因子(x+1)时总能检测 | (x+1)的倍数一定含偶数个1 |
| 随机差错 | 漏检概率约为1/2r | 只有G的倍数会漏检 |
以太网和802.11使用的CRC-32有r=32位,随机差错漏检的概率约为2−32,而且长度不超过32的突发差错全部能被发现。CRC的计算可以用移位寄存器和异或门在硬件中高速完成,这也是它被广泛使用的原因之一。
PRO EXCLUSIVE探索不止于此解锁完整互动实验、进阶解析与精选参考答案。
尊享 Pro 权益
题目发送方与接收方约定的生成多项式G = 10011。发送方要在数据后附加几位R?下面哪类差错一定能被检测出来?
数据D = 110101,生成多项式G = 101。
- 计算CRC比特R以及发送方传输的8位比特。
- 接收方收到11000111。差错能被检测出来吗?
- 接收方收到11111111。哪些位出错了?接收方会如何判断?说明原因。
编写处理0/1字符串的Python函数mod2_remainder(bits, gen)和crc_encode(data, gen)。用它们:(1) 重现本节的例子D = 101110、G = 1001,并在接收方校验该帧;(2) 说明翻转一位后余数不为0;(3) 分别统计G = 1001和G = 1011时,9位帧中36种可能的双比特差错有多少种会漏检。