差错控制技术

本文深入探讨了数据传输中的差错控制技术,包括检错码和纠错码的原理及应用,重点介绍了奇偶校验码、循环冗余校验(CRC)以及海明码等常见编码方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

现实环境中,数据的传输很有可能受到干扰而出现错误,为了确保数据传递的正确,就需要有差错控制技术。要实现差错控制,就要具备两种能力,其一是发现错误,其二是纠正错误。

在数据链路层里常用的数据校验方法有奇偶校验码(PCC, Parity Check Code)循环冗余校验(CRC, Cyclic Redundancy Check),这些都统称为检错码(Error-detecting code)

而差错纠正方面针对不同类型的传输有不同实现,如字符的异步传输一般采用反馈检测法,即接收一帧往源发回一帧,发送端如果判断出错则重发一帧,对应的还有自动重发法等等。

也有一些具有纠错功能的编码,它们又称为纠错码(Error-Correcting Code)前向纠错码(Forward Error Correction),**海明码(Hamming Code)**就是纠错码。

下面详细看看各种差错控制方法。


检错码(Error-detecting Code)

奇偶校验码(Parity Check Code)

奇偶校验码是非常广泛使用的一种检错方法,它具有实现简单的优势。它有效用于检测单个错误,基本思想就是在原信息码最后加一位校验位,使得整个编码始终为奇数位或者偶数位(一般为编码中1的个数),这就是奇校验和偶校验。

从这个原理也可以看出来,奇偶校验无法判断大于一个的错误,所以就校验码一般用于错误率低的环境。

假设要传输7位二进制码1011010,要做偶校验,那么其最终传输的编码就是10110100。如果目的地收到的编码最终不为偶数,那么就知道里面一定出现了错误,注意,不能说最终编码是偶数就一定没有错误,这也就是奇偶校验的局限所在。


循环冗余校验(Cyclic Redundancy Check)

再考虑CRC之前得先简单了解一下模2运算和多项式表示二进制码串。

模2运算

模2运算和普通算术运算最主要的不同在于模2无进位,也无借位。

加法规则为:1+1=0、1+0=1、0+1=1、0+0=0

减法规则为:1-1=0、1-0=1、0-1=1、0-0=0

很容易可以看出来实际上就是异或运算。

但乘法和一般运算一致,不同的是,多位数乘法中间结果相加用的是模2加法。

乘法和除法示例如下:

Mod2Calc

图片来自《深入理解计算机网络》


码多项式(多项方式)

其表达方式和二进制转十进制是类似的,如有二进制串10011100,那么它的码多项式表述如下:
x 7 + x 4 + x 3 + x 2 x^7+x^4+x^3+x^2 x7+x4+x3+x2
注意发现它与二进制转十进制的规律,不再赘述。


CRC流程

CRC的原理看起来有点复杂,但实际上就是在待发送数据后面加一段校验码,接收方通过模2除法来发现是否出现了位变动(因为基于模2运算的特性,任一位变动都会影响结果),它的具体实现有如下步骤:

  1. 选择一个用于进行模2除法的除数供接收方使用,一般使用码多项式表达,所以CRC又称多项式编码法。
  2. 设选定除数的二进制位数为k,待发送的数据帧位数为m。在m后面加上k-1位0为新的帧,然后将该新帧模2除选定的除数,所得的余数就是该帧的CRC校验码,又称FCS(帧校验序列)。要注意的是,余数的位数也一定为k-1位,0也不能忽略。
  3. 将该FCS附加在原数据帧后面,构建成一个新帧发送到接收端。
  4. 接收端将附加了FCS的帧模2除之前定出的除数,无余数则表明无差错。

从该流程就可以看出,CRC的关键有二:预先确定双方用于CRC的除数、通过原始帧与除数计算出FCS。其中前者可以随机选择,也可以使用国际上通行的标准。但要注意,除数的最高位和最低位必须为1

国际上的标准有如:

IBM的SDLC规程使用CRC-16,它规定除数为:
x 16 + x 15 + x 2 + 1 它 所 对 应 的 二 进 制 串 为 : 11000000000000101 x^{16}+x^{15}+x^2+1 \\它所对应的二进制串为:11000000000000101 x16+x15+x2+111000000000000101
ISO的HDLC、ITU的SDLC、X.25等等规程中使用CCITT-CRC-16,它规定除数为:
x 16 + x 15 + x 5 + 1 它 所 对 应 的 二 进 制 串 为 : 11000000000100001 x^{16}+x^{15}+x^5+1 \\ 它所对应的二进制串为:11000000000100001 x16+x15+x5+111000000000100001

计算示例

设CRC除数码多项式(又叫生成多项式)为 G ( x ) = x 4 + x 3 + 1 G(x) = x^4+x^3+1 G(x)=x4+x3+1,要求出二进制序列10110011的FCS,下面是计算过程:

  1. 生成多项式转换为二进制串:11001
  2. 给原数据帧加上k-1个0,这里生成多项式为5位,因此加4位0,得到数据帧10110011 0000
  3. 对得到的数据帧使用模2除法除以生成多项式,得到余数0100(注意,余数一定是k-1位,0也不能忽略)Mod2Div
  4. 用第3步的结果和原数据帧组合成新的数据帧10110011 0100发送给接收方。
  5. 接收到数据帧后用模2除法除以选定的生成多项式,如余数为0则无差错,否则则有差错。

纠错(Error-correcting)

纠错有编码纠错以及方法纠错两种,编码纠错常见的有海明码,这类有纠错能力的编码又叫做纠错码(Error-correcting Code)。纠错方法有反馈检测法等。下面详细讲讲这两种方式。

反馈检测法

这是一种实施容易,但不常用的差错控制法,这种方法的信道利用率低。它的基本原理是,接收端收到的所有内容都回传至发送端,如果发送端收到后发现错误则重传错误的帧。

这种基础的方式也会遇到问题,如整个帧全都丢失了,这样发送方自然就无法接收到任何反馈,因为对方根本没有收到。为了避免这种情况,通常引入一个计时器来为每个帧限定反馈信息的时间,如果超时仍然没有收到,则认为传输出了差错,直接重传该帧。有时候因为网络延迟导致接收端可能收到多次同一数据帧,为了防止这种现象,数据链路层有一种帧序列号的方法来对每个帧编号,接收端可以通过判断帧编号来甄别这种现象。

海明码(Hamming Code)

海明码是一个有多个校验位,具有检测并纠正一位错误的纠错码,因为它只能纠正一位错误,所以一般只能用于信道条件比较好的环境中。

它的基本思想是将有效信息按规律分组,使的校验码不仅可以发现错误,还能知道错误发生的位,最终将错误的位取反即纠正成功。

基本上是通过对不一样的分组进行奇偶校验,最终比对多组的结果即可锁定出错的位,因为这个原理导致海明码只能发现并纠错一位。

它的原理有点类似于一个数学游戏叫做国王与毒酒。

细节比较繁琐,在这篇文章中详细说明了:计算机系统基础知识_校验码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值