CRC英文为Cyclic Redundancy Check,翻译过来即循环冗余校验,通过添加余式进行错误校验,CRC编码作为循环码字的一种,其生成原理与循环码字的生成完全一致。
严格来说,CRC并不属于物理层,它属于链路层的一部分,在CPU繁忙时,CRC用软件实现的时候占用资源较多,CRC会用硬件实现,此时和物理层接口比较紧密,同时CRC检错功能也可以用来定性物理层的错误,所以CRC也可以看做物理层的一部分。
为什么需要CRC?在通信设备传输过程中,尤其是无线通信中,无论传输系统物理层的设计再怎么完美,差错总会存在,有的时候,出错的某些数据一旦进入下一个流程,可能会引起重大的破环作用,这时需要丢弃,同时也可通知发送端重传,所以在接收方接收数据之前需要对数据进行差错检测,当且仅当检测的结果为正确时接收方才真正收下数据。检测的方式有多种,常见的有奇偶校验、因特网校验和循环冗余校验等。CRC特点是:检错能力强,开销小,易于用编码器及检测电路实现。从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式
各种书籍和网站都对CRC进行了大量的介绍,如果只进行应用的话,发送接收端设计比较简单,按照标准流程和开源算法进行设计即可,但其实稍微仔细研究的话,会发现CRC其实并不简单,有一些有趣的性能会影响系统设计,比如CRC能纠错吗?CRC能发现所有的错误吗?通过CRC校验就一定没有错误吗?这里对基本问题进行总结,试图能全面了解CRC性能,为工程应用提供更好的支持。
一、定义
先给出