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

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),其实是对同一个数据包的确认。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635084.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文阅读】GPT4Graph: Can Large Language Models Understand Graph Structured Data?

文章目录 0、基本介绍1、研究动机2、准备2.1、图挖掘任务2.2、图描述语言(GDL) 3、使用LLM进行图理解流程3.1、手动提示3.2、自提示 4、图理解基准4.1、结构理解任务4.1、语义理解任务 5、数据搜集5.1、结构理解任务5.2、语义理解任务 6、实验6.1、实验设…

史上最全EasyExcel

一、EasyExcel介绍 1、数据导入:减轻录入工作量 2、数据导出:统计信息归档 3、数据传输:异构系统之间数据传输 二、EasyExcel特点 Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内…

以后要做GIS开发的话是学GIS专业还是学计算机专业好一些?

GIS开发其实严格来说分为前后端以及底层开发。不同的方向,代表了不同的开发语言。 所以大家首先要了解自己具体要做的岗位类型是什么,其次才是选择专业侧重点。 但是严格来说,选择某个专业,到就业方向这个过程,并不是…

el-table样式错乱解决方案

bug: 图片的椭圆框住的地方,在页面放大缩小之后就对不齐了。 原因: 主要原因是当你对页面放大缩小的时候,页面进行了重构,页面的宽高及样式进行了变化,但是在这个更新的过程中,table的反应并没…

Redis: Redis介绍

文章目录 一、redis介绍二、通用的命令三、数据结构1、字符串类型(String)(1)介绍(2)常用命令(3)数据结构 2、列表(List)(1)介绍&…

CompletableFuture**应用源码分析(三)

2.3 CompletableFuture源码分析 CompletableFuture的源码内容特别多。不需要把所有源码都看了,更多的是要掌握整个CompletableFuture的源码执行流程,以及任务的执行时机。 从CompletableFuture中比较简单的方法作为分析的入口,从而掌握整体执…

python实操之网络爬虫介绍

一、什么是网络爬虫 网络爬虫,也可以叫做网络数据采集更容易理解。它是指通过编程向网络服务器(web)请求数据(HTML表单),然后解析HTML,提取出自己想要的数据。 它包括了根据url获取HTML数据、解…

R.swift SwiftGen 资源使用指南

R.swift 和 SwiftGen 资源转换使用指南 R.swift (原始代码会打包到项目?) Pod platform :ios, 12.0 target LBtest do# Comment the next line if you dont want to use dynamic frameworksuse_frameworks!pod R.swift # pod SwiftGen, ~&g…

ConcurrentHashMap和HashMap的区别

什么是HashMap (1)HashMap 是基于 Map 接口的非同步实现,线程不安全,是为了快速存取而设计的;它采用 key-value 键值对的形式存放元素(并封装成 Node 对象),允许使用 null 键和 nul…

笨蛋学设计模式行为型模式-观察者模式【14】

行为型模式-观察者模式 8.1观察者模式:arrow_up::arrow_up::arrow_up:8.1.1概念8.1.2场景8.1.3优势 / 劣势8.1.4观察者模式可分为观察者的基本结构: 8.1.5观察者模式8.1.6实战8.1.6.1题目描述8.1.6.2输入描述8.1.6.3输出描述8.1.6.4代码 8.1.7总结 8.1观察者模式⬆️…

(二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真

一、创建工作空间 mkdir catkin_ws cd catkin_ws mkdir src cd src 二、下载wpr_simulation源码 git clone https://github.com/6-robot/wpr_simulation.git 三、编译 ~/catkin_make 目录下catkin_makesource devel/setup.bash 四、运行 roslaunch wpr_simulation wpb_s…

【Backbone】Vim(Vision Mamba)架构学习笔记

1 学习资料 论文:《Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model》 阅读资料 【博文】《入局CV,Mamba再显神威!华科王兴刚团队首次将Mamba引入ViT,更高精度、更快速度、更低…

java小项目:简单的收入明细记事本,超级简单(不涉及数据库,通过字符串来记录)

一、效果 二、代码 2.1 Acount类 package com.demo1;public class Acount {public static void main(String[] args) {String details "收支\t账户金额\t收支金额\t说 明\n"; //通过字符串来记录收入明细int balance 10000;boolean loopFlag true;//控制循…

2023.1.19 关于 Redis 事务详解

目录 Redis 事务对比 MySQL 事务 MySQL 事务 Redis 事务 Redis 事务原子性解释 Redis 事务详解 执行流程 典型使用场景 Redis 事务命令 WATCH 的使用 WATCH 实现原理 总结 阅读下文之前建议点击下方链接了解 MySQL 事务详解 MySQL 事务详解 Redis 事务对比 MySQL 事…

[陇剑杯 2021]jwt

[陇剑杯 2021]jwt 题目做法及思路解析(个人分享) 问一:昨天,单位流量系统捕获了黑客攻击流量,请您分析流量后进行回答: 该网站使用了______认证方式。(如有字母请全部使用小写&#xff09…

C++ 设计模式之备忘录模式

【声明】本题目来源于卡码网(题目页面 (kamacoder.com)) 【提示:如果不想看文字介绍,可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 -- 什么是备忘录模式 (第17种模式) 备忘录模式(Meme…

【C语言】- 设置控制台标题、编码、文字颜色、大小和字体

【C语言】- 设置控制台标题、编码、文字颜色、大小和字体 文章目录 【C语言】- 设置控制台标题、编码、文字颜色、大小和字体1 - 设置控制台标题2 - 设置控制台编码3 - 设置控制台字体和大小参考链接 1 - 设置控制台标题 因为要用到 Windows API,所以需要包含头文件…

apache下的CollectionUtils工具类

目录 依赖 这个包下 1.安全检查指定的集合是否为空 2.空 安全检查指定的集合是否为空 3.(String)类型中的集合-并集 union 4.(String)类型中的集合-交集 5.(String)类型中交集的补集 6.(String)类型中差集(扣除) 7.containsAny()方法&#xff1…

UI组件在线预览,程序员直呼“不要太方便~”

一、介绍 以往大家如果想查看组件的使用效果,需要打开DevEco Studio构建工程。现在为了便于大家高效开发,文档上线了JS UI组件在线预览功能,无需本地构建工程,在线即可修改组件样式等参数、一键预览编译效果。程序员直呼&#xff…

可视化k8s页面(Kubepi)

Kubepi是一个简单高效的k8s集群图形化管理工具,方便日常管理K8S集群,高效快速的查询日志定位问题的工具 随便在哪个节点部署,我这里在主节点部署 docker pull kubeoperator/kubepi-server docker run --privileged -itd --restartunless-st…