二进制数据传输中错误的检测与修正

发布时间:2024年01月20日

1 文章问题概述

????????在二进制传输中,由于各种原因(如电磁干扰、硬件故障等),数据位可能会发生变化,导致“1”变成“0”,或者“0”变成“1”,这就是所谓的传输错误。

1.1?如何检测错误

????????一般通过在发送的数据块后附加一些额外的冗余序列来实现错误检测。这个冗余序列是通过特定的函数计算出来的,通常基于原始数据。

????????当数据到达目的地时,会用同样的函数对数据进行计算,并将计算结果与传输的冗余序列进行比较。如果两者不匹配,则意味着在传输过程中发生了错误。

1.2?如何修正错误

????????如果冗余序列足够详细并具有错误修正的特性,可以直接进行错误修正。另一种常见的修正方法是通过重传。当检测到错误时,接收方可以请求发送方重发原始数据。

????????错误检测和修正是通信系统中非常重要的部分,它们确保数据的完整性和准确性。有多种算法和协议可以用于错误检测和修正,包括奇偶校验、循环冗余校验(CRC)、哈明码等。

2. 通过冗余序列进行错误检测的过程

2.1?错误检测机制

????????在发送消息之前,会根据原始消息、使用一个特定的计算函数、来生成一个冗余序列。这个冗余序列随后会附加到原始消息的末尾,一起组成了最终传输的消息(Message transmis)。

????????当消息到达接收方后,会用同一个计算函数对接收到的原始消息部分进行计算,以产生一个新的冗余序列。

????????接收方将这个新计算出的冗余序列与接收到的冗余序列进行比较。如果两个冗余序列相同,则认为消息没有错误;如果不同,则认为消息在传输过程中发生了错误。

2.2?常见的错误检测方法

2.2.1 奇偶校验位

2.2.1.1 基本概念

????????通过添加一个奇偶校验位(bit de parité)来保证整个数据序列的1的数量为奇数或偶数来检测错误。

2.2.1.2?奇偶校验位

????????奇偶校验位:是在数据序列中加入的一个额外的位,用于检测数据是否在传输过程中发生了错误。

????????偶校验:奇偶校验位设置为使得包括校验位在内的整个序列中1的总数为偶数。

????????奇校验:奇偶校验位设置为使得包括校验位在内的整个序列中1的总数为奇数。

????????举例来说,如果数据序列是`1 0 0 1 0 0 1 0`,

????????我们使用偶校验,校验位会被设置为1,使得整个序列中1的数量(3个)加上校验位后总数为偶数(4个)。

????????如果是奇校验,给定同样的数据序列,校验位会被设置为0,因为不包括校验位的序列中1的数量(3个)已经是奇数。

????????奇偶校验方法不能检测所有类型的错误,特别是不能检测到双错误(即序列中两个位同时发生错误的情况)。它还提到,这种方法常用于PC的串行接口标准,如ANSI RS232-C(国际电信联盟的V24标准)。这是一种简单但有限的错误检测技术,通常用在错误率不高的通信信道中。

2.2.1.3?检测并修改错误

????????如果冗余信息足够,并且使用的算法足够强大,那么即使在数据传输中出现错误,也能够检测并且修正这些错误。

????????示例:使用奇偶校验位:

????????提供了一个简单的例子,说明如何使用奇偶校验(偶校验)来检测和定位错误。每行和每列都有一个额外的位,这是奇偶校验位。

????????幻灯片展示了一个数据块,其中每行和每列的最后一个位是校验位,用以确保该行或该列有偶数个`1`。

????????通过比较每行和每列的奇偶校验位,可以找出错误位(如果有的话)。

其他错误修正技术:

????????其他更先进的错误修正技术,如Reed-Solomon码和Turbo码。这些技术能够检测并修正更复杂的错误模式,它们在现代通信系统中得到了广泛应用。

????????Reed-Solomon码特别用于CD和DVD的错误修正,而Turbo码则用于深空通信和移动通信等领域。

????????使用足够冗余信息和强大算法的重要性,这些可以显著提高数据传输的可靠性。通过这些方法,即使在数据中发生了错误,也能够被有效地检测和修正。

2.2.2?循环冗余校验(CRC, Cyclic Redundancy Code)

2.2.2.1 基本概念

????????一种用于检测数据传输或存储中的错误的方法。

????????多项式除法来进行错误检测的方法,这种方法通常用于计算循环冗余校验(CRC)码

2.2.2.2 多项式除法错误检测

????????数据表示:一个二进制消息`M`可以被视为一串位,也可以视为一个多项式。例如,二进制串`101101`可以对应于多项式`x^5 + x^3 + x^2 + 1`。

????????消息长度:如果消息`M`有`m`个位,那么它可以表示为一个`m-1`次多项式。

????????生成多项式:选择一个`n`位的生成多项式`G`,其次数为`n-1`。这个多项式用于生成CRC码,其中`n`必须小于`m`。

????????以下是展示了几种循环冗余校验(CRC)的类型以及使用移位寄存器进行CRC-16计算的示例

????????CRC:

????????CRC-12:使用一个12位长的生成多项式`x^12 + x^11 + x^3 + x^2 + 1`。

????????CRC-16:使用一个16位长的生成多项式`x^16 + x^15 + x^2 + 1`。

????????CRC-CCITT:使用一个16位长的生成多项式,通常用于异步传输,`x^16 + x^12 + x^5 + 1`。

????????CRC-32:使用一个32位长的生成多项式,通常用于以太网,`x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1`。

????????这些多项式代表了在计算CRC时使用的特定算法。每种CRC的设计都有不同的错误检测能力,通常与数据的长度和预期错误类型有关。

2.2.2.3?CRC-16的计算

????????使用移位寄存器来计算CRC-16的过程。

????????移位寄存器是一种数字逻辑电路,用于暂存数据并在每个时钟周期将其向左或向右移动一位。

????????在计算CRC时,数据会被送入这样的寄存器,并与生成多项式相结合进行计算。

????????在图中,"0"和"1"的位置表示在计算过程中需要进行异或(XOR)操作的位。异或操作是CRC计算中的核心步骤,用于生成校验码。

2.2.2.4?CRC的验证过程

????????在数据传输或存储过程中,通过将CRC校验码附加到数据后面,可以在数据接收端进行错误检测。如果在接收端计算出的CRC码与发送端附加的CRC码不一致,则表明数据在传输过程中可能已经发生了错误。

????????多项式乘法:将消息`M`乘以`x^n`(等同于将`M`向左移`n`位),这样可以在`M`的末尾腾出`n`位空间。

????????除法与余数:将修改后的消息`M'`(即`M`乘以`x^n`的结果)除以生成多项式`G`,得到的余数就是CRC码。(这里的除法是模2除法),得到商`Q`和余数`R`。

????????构造传输多项式:然后构造一个新的多项式`T`,它等于`M'`减去余数`R`(在模2算术中,减法与加法相同)。

????????发送消息:将原始消息`M`和这个CRC码一起发送。接收方使用同样的生成多项式`G`对接收到的消息(包括CRC)进行除法运算。如果余数为0,则认为在传输过程中没有发生错误;如果余数不为0,则表示检测到错误。

????????多项式乘法和除法的示意图,说明了如何将消息`M`转换成`M'`并为其添加CRC码。CRC是一种广泛使用的强大错误检测技术,能够检测到由于噪声引起的多位错误。

????????多项式除法在错误检测中的应用,特别是循环冗余校验(CRC)的计算过程。

????????公式`T = M' - R = G × Q`展示了如何通过生成多项式`G`来确保传输的数据`T`在没有错误的情况下能够被`G`整除。这是一种非常可靠的错误检测机制,广泛应用于各种数据通信和存储系统中。通过这种方法,可以检测到传输过程中发生的错误,并且在很多情况下还能确定错误发生的位置。

2.2.3?校验和(Checksum)

2.2.3.1 基本概念

????????是对数据中所有字节的值进行求和(有时还有其他运算),然后通常取其反码作为校验和。

2.2.3.2?校验和的计算方法

????????消息组成:设想有一个由多个字(words)组成的消息,每个字由8位(一个字节)或16位组成。字的示例为 A, B, C, ... R, S, T。

????????计算:校验和是通过将所有的字相加来计算的,计算公式可以表示为:Z = A + B + C + D + ... + R + S + T。在这里,加法是模2^8或模2^16的加法,取决于字的大小。

????????结果反转:计算出的校验和Z随后会被反转(即取反),得到Z'。在8位的情况下,如果原始校验和是`1111 0000`,反转后就会变成`0000 1111`。

????????传输:接着传输整个消息和反转后的校验和Z'。

????????验证:接收端收到消息后,将消息中的所有字再次相加,包括校验和Z',计算公式为Z'' = A + B + C + ... + R + S + T + Z'。

????????错误检测:如果消息在传输过程中没有发生错误,最终的计算结果Z''应该是全1,即`1111 1111`(8位的情况)或者对应长度的全1。这是因为加上原始的校验和Z和反转的校验和Z'应该得到全1的结果。如果Z''不是全1,那么说明在传输过程中发生了错误。

2.2.3.3?校验和的应用

????????校验和是一种基本的错误检测方法,虽然它不能提供CRC那样的错误检测能力,但由于计算简单,在某些场合仍然非常有用。例如,一些网络协议和文件格式会使用校验和来初步检测数据的完整性。

????????这些方法能够提高数据传输的可靠性,尤其是在不可靠的通信信道中。通过冗余序列的使用,即使在数据在传输过程中出现一定程度的损坏,也能在一定程度上检测到错误。

3. 重传(retransmission)来进行错误修正的方法

????????错误修正通过重传:当接收方检测到错误时,它会丢弃(jette)错误的数据段(segment de données erroné)。

3.1发送方如何知道已经发生了错误?

????????在没有收到确认(acquittement)的情况下,发送方无法知道传输是否成功。因此,需要一个确认机制。

????????确认机制被称为“发送并等待”(Send & Wait):

????????这是一种流控制机制,发送方在发送一个数据段后,会暂停发送其他数据,等待接收方的确认信号。

3.2 如果数据或确认丢失了怎么办?——超时重传机制

????????如果数据丢失,接收方不会发送确认。

????????如果确认信号丢失,发送方不会收到确认,会触发超时重传机制。

????????在超时后,发送方会重发数据段,然后再次等待确认。这个过程会一直重复,直到发送方收到确认或者达到重发次数上限。

????????发送方发送数据并等待确认(Donnée → Acquit.),如果确认没有收到,发送方会重发数据。

????????这种错误修正机制是很多通信协议,例如TCP(传输控制协议),中的一个基本组成部分。这种方法保证了即使在不可靠的网络中也能够正确地传输数据。然而,它也可能会因为网络状况差或者高延迟而导致效率低下。

3.3 交替位协议

????????这是一种简单的流控制协议,用于确保数据正确地从发送方(E)传输到接收方(R)。每个数据包都附带一个标志位,这个标志位交替地设置为0和1,以此来区分连续的数据包。

????????在时间1(T1),发送方E发送了一个标志位为0的数据包(Donnée-0)。

接收方R正确接收数据包,并发送确认(Acq-0)。

????????在时间2(T2),发送方E再次发送一个标志位为0的数据包,但在这个例子中,这个数据包没有成功地被接收方接收,因此没有确认被发送。

????????在时间3(T3),发送方E发送一个标志位为1的数据包(Donnée-1),这次数据包成功到达接收方R,并且接收方R发送了确认(Acq-1)。

????????在时间4(T4),发送方E收到确认,知道标志位为1的数据包已被成功接收,然后继续发送下一个数据包。

3.4 定时器太短的问题

????????如果发送方设置的定时器太短,它可能会在接收方来得及发送确认之前重发数据包。这可能导致发送方错误地认为数据包丢失,并因此不必要地重发数据包。这种情况可能会导致网络拥塞和数据包重复,从而降低通信效率。

????????发送方E在时间1(T1)发送了一个数据包,并在时间2(T2)收到了确认(Acq)。

????????但在时间3(T3),发送方E由于定时器设置太短,错误地认为需要重新发送数据包(Donnée-0),尽管接收方R实际上已经收到了这个数据包并准备发送确认。

????????这导致了在时间4(T4)发送方E接收到了两个确认(Acq),其实是对同一个数据包的确认。

????????在实施流控制协议时,定时器的设置对于协议性能至关重要。如果定时器设置不当,可能会导致效率低下和不必要的网络流量。

文章来源:https://blog.csdn.net/weixin_65190179/article/details/134844295
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。