链路层----差错检测方法

1 奇偶校验(Parity Check

奇偶校验是最简单的差错检测方法,在每个数据帧中添加一个附加位,使得整个帧中1的个数为奇数或偶数,接收端通过计算接收到的帧中1的个数来检测差错。

更好的方法:二维奇偶校验

2 检验和方法
  1. 校验和(Checksum):校验和是通过计算数据帧中所有字节的累加和,并将结果添加到帧的尾部。接收端同样计算接收到的帧的校验和,然后将两者进行比较,若不一致则说明帧中存在错误。

 3 循环冗余检测  (  重点!!!

循环冗余检测(CRC,Cyclic Redundancy Check):CRC 是一种更强大的差错检测方法,通过对数据帧进行除法运算,生成一个固定长度的冗余码。发送端将生成的冗余码添加到数据帧的尾部,接收端也进行同样的除法运算,将计算出的余数与接收到的冗余码进行比较,若不一致则存在差错。

下面举例

假设发送端要传输以下数据:110101。我们选择一个生成多项式 G(x) = x^3 + x + 1 作为校验多项式。

首先,我们确定生成多项式的位数。由于 G(x) 是一个 3 次多项式,所以需要用 3 位二进制数来表示。

接下来,在要传输的数据后面添加 3 个零作为校验位。于是,发送端实际上发送的是:110101000。

现在,我们使用除法运算来进行 CRC 计算。

步骤 1:将发送的数据(包括附加的 3 个零)作为被除数。

                 ________________________
G(x) | 110101000                 
                 | 1011
                 ------------------
                 | 

步骤 2:进行第一次除法运算。将生成多项式 G(x) 与被除数的最高位对齐,并执行异或操作。

                 ________________________
G(x) | 110101000                 
                 | 1011
                 ------------------
                       11101

步骤 3:将得到的结果作为新的被除数,并重复上述步骤,直到完成所有运算。

                 ________________________
G(x) | 110101000                 
                 | 1011
                 ------------------
                       111010    
                       1011
                 ------------------
                           1001
                 
                 ________________________
G(x) | 110101000                 
                 | 1011
                 ------------------
                       111010    
                       1011
                 ------------------
                          1001
                          1011
                 ------------------
                           111

步骤 4:完成所有运算后,得到的余数就是校验位。在这个例子中,余数为 111。

最后,将计算得到的校验位附加到原始数据后面,发送端实际发送的数据为:110101000111。

接收端在接收到数据后,进行相同的 CRC 运算。如果计算得到的余数为零,说明数据未被损坏;如果余数不为零,说明数据可能存在差错。

 接收端进行的操作

在接收端进行循环冗余检测(CRC)时,接收到的数据包括传输的原始数据和附加的校验位。

接收端需要执行与发送端相同的除法运算步骤,使用生成多项式 G(x) 对接收到的数据进行除法运算。如果最终得到的余数为零,说明数据未被损坏;如果余数不为零,说明数据可能存在差错。

让我们以前面提到的例子为例:发送端发送的数据为 110101000111,生成多项式为 G(x) = x^3 + x + 1。

接收端使用相同的生成多项式 G(x) 进行除法运算:

步骤 1:将接收到的数据作为被除数。

                 ________________________
G(x) | 110101000111                
                 | 1011
                 ------------------
                 | 

步骤 2:进行第一次除法运算。将生成多项式 G(x) 与被除数的最高位对齐,并执行异或操作。

                 ________________________
G(x) | 110101000111                
                 | 1011
                 ------------------
                       11101

步骤 3:将得到的结果作为新的被除数,并重复上述步骤,直到完成所有运算。

                 ________________________
G(x) | 110101000111                
                 | 1011
                 ------------------
                       111010    
                       1011
                 ------------------
                           1001
                 
                 ________________________
G(x) | 110101000111                
                 | 1011
                 ------------------
                       111010    
                       1011
                 ------------------
                          1001
                          1011
                 ------------------
                           111

步骤 4:完成所有运算后,得到的余数为 111。如果余数为零,则说明数据未被损坏;如果余数不为零,则说明数据可能存在差错。

在这个例子中,接收端计算得到的余数也为 111,与发送端相同。因此,接收端可以确认数据未被损坏。

这是一个简单的循环冗余检测(CRC)的检验过程。请注意,实际中 CRC 的具体细节和计算方法可能有所不同,但基本原理相似。

猜你喜欢

转载自blog.csdn.net/qq_64200765/article/details/131719297
今日推荐