循环冗余检验CRC原理

为什么引入CRC

现实的通信链路都不会是理想的。这就是说,比特在传输的过程中可能会产生差错:1可能会变成0,0可能会变成1,这就叫做比特差错。在一段是时间内,传输错误的比特占所传输比特总数的比率成为误码率BER(Bit Error Rate)。误码率与信噪比有很大的关系,在实际通信中不可能使误码率下降到零。
因此,为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。
目前在数据链路层广泛使用了循环冗余检测CRC的检测技术

CRC的原理

CRC运算实际上就是在数据长为k的后面添加供差错检测用的n位冗余码,然后构成帧k+n位发送出去。

首先来介绍几个概念
(1)模2运算:实际上是按位异或运算,即相同为0,相异为1,也就是不考虑进位、借位的二进制加减运算。如:1111+1010 = 0101
(2)FCS:其实就是冗余码,帧检验序列(Frame Check Sequence)
(3)生成多项式:其实就是除数,比如下面将要用到的除数p = 1101

这里写图片描述

<think>我们参考用户提供的引用内容[^1][^2],详细解释循环冗余检验CRC)的计算方法。CRC是一种常用的错误检测技术,广泛应用于数据通信和存储中。###一、CRC计算核心步骤设:-原始数据$M$(二进制位串),对应的多项式为$M(x)$-双方预先约定的生成多项式$G(x)$(最高位和最低位系数为1),其阶数为$r$(即$G(x)$的位数为$r+1$)计算流程如下:####1.**数据扩展**在原始数据$M$末尾追加$r$个0,得到新的二进制序列$M'$,对应的多项式为$x^rM(x)$。**示例**:$M=\mathtt{101001}$(6位),$G(x)=\mathtt{1101}$(阶数$r=3$)$\rightarrowM'=\mathtt{101001}\color{red}{\mathtt{000}}$(9位)####2.**模2除法**用$G(x)$去除扩展后的$x^rM(x)$,得到商$Q(x)$和余数$R(x)$。**计算规则**:-使用**模2运算**(异或操作,无进位/借位)-余数$R(x)$的位数必须**小于等于$r$位**(若不足$r$位,前面补0)**示例计算过程**:$$\begin{array}{r}\mathtt{110101}\\[-3pt]\mathtt{1101\space})\overline{\mathtt{101001000}}\\[-3pt]\underline{\mathtt{1101}\phantom{000}}\\[-3pt]\mathtt{1110}\\[-3pt]\underline{\mathtt{1101}}\\[-3pt]\mathtt{0110}\\[-3pt]\underline{\mathtt{0000}}\\[-3pt]\mathtt{1100}\\[-3pt]\underline{\mathtt{1101}}\\[-3pt]\mathtt{001\phantom{00}}\quad\text{←余数}\end{array}$$→余数$R=\mathtt{001}$(3位)####3.**生成校验**将余数$R$附加到原始数据$M$末尾,得到发送帧$T(x)$:$$T(x)=x^rM(x)\oplusR(x)$$**示例**:$T=\mathtt{101001}\color{blue}{\mathtt{001}}$(原始数据+冗余)###二、关键原理说明1.**校验和验证**接收方用相同的$G(x)$去除接收到的$T(x)$:-若余数为0→数据无错误-若余数非0→检测到传输错误**数学证明**:$$T(x)=x^rM(x)-R(x)\equiv0\pmod{G(x)}$$因为$x^rM(x)\equivR(x)\pmod{G(x)}$,故$T(x)$能被$G(x)$整除[^1]。2.**模2运算特性**-加法/减法等价于**异或**(无进位影响)-除法过程中每一步的减法都是按位异或操作###三、计算实例演练**任务**:计算$M=\mathtt{110100111}$在$G(x)=\mathtt{11001}$下的CRC校验**步骤**:1.确定$r=\text{deg}(G(x))=4$2.扩展数据:$M'=\mathtt{110100111}\color{red}{\mathtt{0000}}$3.模2除法求余数:$$\begin{array}{r}\mathtt{10111010}\\[-3pt]\mathtt{11001\space})\overline{\mathtt{1101001110000}}\\[-3pt]\underline{\mathtt{11001}\phantom{000000}}\\[-3pt]\mathtt{000110111}\\[-3pt]\underline{\mathtt{000000}\phantom{000}}\\[-3pt]\mathtt{110111}\phantom{00}\\[-3pt]\underline{\mathtt{11001}\phantom{00}}\\[-3pt]\mathtt{000101}\phantom{0}\\[-3pt]\underline{\mathtt{000000}\phantom{0}}\\[-3pt]\mathtt{1010}\phantom{0}\\[-3pt]\underline{\mathtt{11001}}\\[-3pt]\mathtt{1100}\quad\text{←余数}\end{array}$$→余数$R=\mathtt{1100}$4.发送帧:$T=\mathtt{110100111}\color{blue}{\mathtt{1100}}$>**注**:实际应用中可直接使用位运算加速,此处展示原理性计算。###四、CRC设计要点|参数|要求与影响||-------------|---------------------------------------------------------------------------||生成多项式|需满足:最高位和最低位系数为1;选择不同的多项式可影响检错能力||余数位数|固定为$r$位(生成多项式阶数)||检错能力|可检测所有单比特错误、奇数个错误、长度小于等于$r$的突发错误[^2]|---###相关问题延伸1.如何用编程实现CRC的高效计算(如查表法)?2.为什么CRC检测长度不超过$r+1$的突发错误?其数学原理是什么?3.常见标准生成多项式(如CRC-16,CRC-32)的二进制表示及适用场景?4.CRC校验与奇偶校验、校验和(Checksum)有何本质区别?5.接收方检测到错误后,通常如何处理?(如重传机制)>参考资料:>[^1]:CRC校验的核心算法步骤与模2运算原理>[^2]:生成多项式选择对检错能力的影响分析</think>### 循环冗余检验CRC)计算方法详解 #### **一、核心计算步骤** 设原始数据为 $M$($m$ 位二进制),生成多项式为 $G(x)$(阶数为 $r$,位数为 $r+1$): 1. **数据扩展** 在 $M$ 末尾添加 $r$ 个0,得到新数据 $M' = M \parallel \underbrace{00\cdots0}_{r\text{个}}$ → 对应多项式:$x^r \cdot M(x)$ **示例**:$M=\mathtt{101001}$,$G(x)=\mathtt{1101}$($r=3$) → $M'=\mathtt{101001}\color{red}{\mathtt{000}}$ 2. **模2除法求余数** 用 $G(x)$ 除以 $x^r \cdot M(x)$(**模2运算规则**:加减法等价于异或) $$ \frac{x^r \cdot M(x)}{G(x)} = Q(x) + \frac{R(x)}{G(x)} $$ - $Q(x)$:商(不保留) - $R(x)$:余数($r$ 位,不足时高位补0) **示例计算**: $$ \begin{array}{r} \mathtt{110101} \\[-3pt] \mathtt{1101\space}) \overline{\mathtt{101001000}} \\[-3pt] \underline{\mathtt{1101}\phantom{000}} \\[-3pt] \mathtt{1110} \\[-3pt] \underline{\mathtt{1101}} \\[-3pt] \mathtt{0110} \\[-3pt] \underline{\mathtt{0000}} \\[-3pt] \mathtt{1100} \\[-3pt] \underline{\mathtt{1101}} \\[-3pt] \mathtt{001\phantom{00}} \quad \text{← 余数 } R \end{array} $$ → $R=\mathtt{001}$ 3. **生成发送帧** 将余数 $R$ 附加到原始数据末尾: $$ T(x) = x^r \cdot M(x) \oplus R(x) $$ **示例**:$T = \mathtt{101001}\color{blue}{\mathtt{001}}$(共 $m+r$ 位) #### **二、关键原理说明** 1. **校验和验证** 接收方用 $G(x)$ 除接收到的 $T(x)$: - 余数为0 → 数据无错误 - 余数非0 → 检测到传输错误 **数学证明**: $$ T(x) \equiv 0 \pmod{G(x)} $$ 因 $x^r \cdot M(x) \equiv R(x) \pmod{G(x)}$,故 $T(x)$ 可被整除[^1]。 2. **模2运算特性** - 加法/减法 ≡ **异或操作**(无进位) - 除法中每一步减法本质是比特位异或 #### **三、计算实例** **任务**:为 $M=\mathtt{110101}$ 计算 $G(x)=\mathtt{1011}$ 的CRC **步骤**: 1. $r = \deg(G(x)) = 3$ 2. 扩展数据:$M' = \mathtt{110101}\color{red}{\mathtt{000}}$ 3. 模2除法: $$ \begin{array}{r} \mathtt{111011} \\[-3pt] \mathtt{1011\space}) \overline{\mathtt{110101000}} \\[-3pt] \underline{\mathtt{1011}\phantom{000}} \\[-3pt] \mathtt{1100} \\[-3pt] \underline{\mathtt{1011}} \\[-3pt] \mathtt{1110} \\[-3pt] \underline{\mathtt{1011}} \\[-3pt] \mathtt{1010} \\[-3pt] \underline{\mathtt{1011}} \\[-3pt] \mathtt{001\phantom{0}} \quad \text{← 余数} \end{array} $$ → $R=\mathtt{001}$ 4. 发送帧:$T = \mathtt{110101}\color{blue}{\mathtt{001}}$ > **编程实现提示**: > ```python > def crc(data: str, poly: str) -> str: > r = len(poly) - 1 > data_padded = data + '0'*r # 步骤1:填充r个0 > remainder = data_padded[:r] > for bit in data_padded[r:]: > remainder += bit > if remainder[0] == '1': > remainder = bin(int(remainder,2) ^ int(poly,2))[2:].zfill(r) > else: > remainder = remainder[1:] # 左移 > return data + remainder.zfill(r) # 步骤3:附加余数 > ``` #### **四、设计要点** | 参数 | 要求与影响 | |-------------|---------------------------------------------------------------------------| | 生成多项式 | 最高位和最低位系数必须为1;选择不同多项式影响检错能力(如CRC-16, CRC-32) | | 余数长度 | 固定为 $r$ 位(生成多项式阶数) | | 检错能力 | 可检测所有单比特错误、奇数位错误、突发错误(长度≤r)[^2] | --- ### 相关问题延伸 1. 如何选择最优生成多项式以最大化检错能力? 2. CRC校验与奇偶校验、校验和(Checksum)有何本质区别? 3. 为什么实际网络协议(如以太网)使用固定生成多项式(如CRC-32)? 4. 接收方检测CRC错误后,通常采取什么纠错机制? 5. 如何用硬件电路(移位寄存器)实现高效CRC计算? > 参考资料: > [^1]: CRC校验的核心算法与模2运算原理 > [^2]: 生成多项式对检错能力的影响分析
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值