1 奇偶校验(Parity Check)
奇偶校验是最简单的差错检测方法,在每个数据帧中添加一个附加位,使得整个帧中1的个数为奇数或偶数,接收端通过计算接收到的帧中1的个数来检测差错。
更好的方法:二维奇偶校验
2 检验和方法
- 校验和(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 的具体细节和计算方法可能有所不同,但基本原理相似。