数据链路层CRC差错检测技术
本科时老师照本宣科,没有搞懂CRC差错检测到底是怎么检测的。最近看到这块了,根据自己的理解在这里记录CRC差错检测技术。
现实的通信链路都不会是理想的。这就是说,比特在传输过程中可能会产生差错:1可能会变成0,0也可能会变成1。这就叫做比特差错。比特差错是传输差错中的一种,指的是:在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER(Bit Error Rate)。为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。目前在数据链路层广泛使用了循环冗余检验CRC(Cyclic Redundancy Check) 的检错技术。
下面通过一个简单的例子来说明循环冗余检验的原理。如下图:
发送方发送数据101001,为了达到无差错传输的目的,在数据的后面添加冗余码。式子里的冗余码是000。有的同学要问为什么是3个0,其实这个是发送端和接收端自己定义的,如果冗余码是3个数,那么除数就是4位数。相应地,冗余码是n位,那么除数就是n+1位数。上面的式子最后的余数是001,就是我们说的帧检验序列FCS(Frame Check Sequence)。因此加上FCS后发送的帧是101001001。
接收端接收到相应的数据后,用相同的除数进行运算,进而查看运算结果,若余数是0,则判断为无差错传输。如下式:
通过简单的例子我们可以知道CRC差错检测技术的方法。
最后再强调一下,在数据链路层若仅仅使用循环冗余检验CRC差错检测技术,则只能做到对帧的无差错接受,即:“凡是接收端数据链路层接受的帧,我们都能以非常接近于1的概率认为这些帧在传输过程中没有产生差错”。也就是说:“凡是接收端数据链路层接受的帧都没有传输差错”。(有差错的帧就丢弃而不接受)。
要做到“可靠传输”(即发送什么就收到什么)就必须再加上确认和重传机制。
可以说“CRC是一种无比特差错,而不是无传输差错的检测机制”。
总结
循环冗余码检验CRC和帧检验序列FCS并不等同。
CRC是一种常用的检错方法,而FCS是添加在数据后面的冗余码。
FCS可以用CRC这种方法得出,但CRC并非用来获得FCS的唯一方法。