CRC简介
数据在传输过程中可能会因为传输介质故障或外界的干扰而产生比特差错(使原来的0变为1,原来的1变为0),从而导致接收方接收到错误的数据。为尽量提高接收方收到数据的正确率,在接收数据之前需要对数据进行差错检测,仅当检测的结果为正确时才接收数据。
循环冗余校验CRC(Cyclic Redundancy Check)是数据通信领域常用的一种数据传输检错技术。通过在发送端对数据按照某种算法计算出校验码,并将得到的校验码附在数据帧的后面,一起发送到接收端。接收端对收到的数据和校验码按照相同算法进行验证,以此判断接收到的数据是否正确、完整。
CRC是如何计算的?
CRC的思想就是先在要发送的K比特长度的数据后面附加一个R比特长度的校验码,然后生成一个新帧发送给接收端。接收端接收到新帧后,根据收到的数据和校验码来验证接收到的数据是否正确。
在K比特数据后面再拼接R比特的校验码,整个编码长度为N比特,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以通过一个最高次幂为N-K=R的多项式g(x),生成R比特的校验码。
不同的CRC生成多项式,其检错能力是不同的。要使用R位校验码,生成多项式的次幂应为R。以下为常见的一些标准多项式。
校验码是通过某个特定数整除(“模2除法”)得到,这些多项式的值便是模2除法的除数。根据这个除数获得校验码并进行校验的原理可以分为以下几个步骤:
- 发送端、接收端在通信前,约定好除数P,也就是前面说的多项式的值。P应该是R 1位长度;
- 发送端首先在原来的K位数据后面加R个0,相当于原来的数据左移了R位;
- 然后进行模2除法运算(其实就是异或XOR运算),将加0之后的K R位的数除以P,循环计算,直到余数的阶数小于R,这个余数就是附加的校验码,如果长度不足R位需要在前面加0补齐;
- 发送端将R位校验码附加在原数据后面发送给接收方;
- 接收方接收到数据后,将数据以模2除法方式除以除数P。如果没有余数,说明在传输过程中没有出现错误,否则说明有错误。
下面以一个简单示例来展示CRC的计算过程:
以g(x)为CRC-4=X⁴ X 1为例,此时除数P=10011。假设源数据M为10110011。在发送端将M左移4位,然后除以P。
计算得到的余数就是0100,也就是CRC校验码。将0100附加到原始数据帧10110011后,组成新帧101100110100发送给接收端。接收端接收到该帧后,会用该帧去除以上面选定的除数P,验证余数是否为0,如果为0,则表示数据在传输过程中没有出现差错。
CRC错误如何处理?
网络设备的接口偶尔出现极少量的CRC错包可以不用关注。如果是接口持续产生CRC错包,一般主要由传输介质导致的,比如连接的双绞线或者光纤质量有问题,接口光模块异常等。此时可尝试更换接口或光模块、线缆等,然后再检查此问题是否已解决。