【计算机网络】数据链路层的差错控制 - 循环冗余校验(CRC)

本文详细解析了为何在数据链路层引入循环冗余校验(CRC)来增强差错控制,介绍了CRC的原理,包括模2运算、FCS和生成多项式在检测比特差错中的作用。通过实际例子演示了CRC如何工作,并提到了其在通信可靠性中的关键地位。


一、为什么引入循环冗余校验CRC - 数据链路层的差错控制机制

我们都知道,物理层在链路上传输位流(0,1比特)。但是,现实的通信链路都不会是理想的。这就是说,比特在传输的过程中(由于有噪音等)可能会产生差错:1可能会变成0,0可能会变成1,这就叫做比特差错。

因此,为了保证数据传输的可靠性,数据链路层会对物理层(只负责传输,不做任何改动的传输机器)传输过来的数据进行差错检测(数据链路层的职责之一:差错控制)。增加数据可靠性,将物理层传输过来的数据无差错地传递给上层(网络层)。

目前在数据链路层广泛使用了 循环冗余检测CRC 的比特差错检测技术。


二、CRC的原理

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

首先来介绍几个概念:

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

比如我们需要传的数据为101001,用 k 记录一共有多少位,即 k=6 。然后 CRC 运算需要把待传的数据的末尾加上用于检测的 n 位冗余码,可以简单的理解为在数据后面加上 n 个 0。假设 n=3 , 这样循环冗余检验的被除数101001000就得到了。除数是通信双方商定好的,现在一般使用的方式是用多项式来表示除数,比如P(x)=x3+x2+1,就得到除数 P=1101。现在就可以开始进行检验了,注意除数 P 的位数等于 n+1。运算的方法和除法类似,只是相减变成了异或而已。经过运算,得到了余数为 001,它被称为帧检验序列 FCS。截至现在做的一切的运算,都只是在发送端进行的。为了检验帧是否无比特差错接收了,是在接收端检验的。计算出的帧检验序列 FCS 会附加在帧的尾部一起发送。

接收端接收到后,会把 FCS 取出,添加到数据部分的末尾,得到除数 101001001,再次和除数 P=1101 相除,如果得到的余数等于 0,那么就证明此次传输是无比特错误传输的,就接受。如果余数不等于 0,那就证明这个帧有差错,就丢弃。无比特传输和可靠传输有很大的不同,比如发送端发送了 5 个帧,但是接收端只接收到了 3 个帧,此时进行循环冗余检验时,收到的 3 个帧检验合格了,这并不代表此次传输时无差错的,相反,是出了差错的,只是循环冗余检测不出来而已。

CRC是一种检错方法,而 FCS 是添加在数据后面的冗余码,两者的概念完全不同。


参考链接

  1. 循环冗余检验CRC原理
  2. 循环冗余检验
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值