计算机网络——数据链路层(差错控制)

计算机网络——数据链路层(差错控制)

  • 差错从何而来
  • 数据链路层的差错控制
    • 检错编码
      • 奇偶校验码
      • 循环冗余校验(CRC)
        • FCS
    • 纠错编码
      • 海明码
      • 海明距离
      • 纠错流程
        • 确定校验码的位数r
        • 确定校验码和数据位置
      • 求出校验码的值
      • 检错并纠错

我们今年天来继续学习计算机网络数据链路层这一小节的内容,我们今天主要来看数据链路层中关于数据控制与纠错——差错控制

差错从何而来

计算机网络中数据链路层出现的差错主要来源于以下几个方面:

  1. 噪声
  • 全局性噪声:这类噪声源于通信信道自身的电气特性,如随机热噪声,这是由于导体内部电子的热运动导致的,这种噪声具有随机性和持续性,是信道固有属性,难以完全避免。为了减少此类噪声的影响,通常采取提高信噪比的方法,例如使用更好的物理介质、增强信号强度或采用更先进的信号处理技术。
  • 局部性噪声:这类噪声是由于外部环境中的短暂事件引起,如电磁干扰(EMI)、闪电、电源波动或其他瞬态现象产生的冲击噪声。这类噪声往往突发性强,可能会导致短时间内大量数据位发生错误。针对这类噪声,常通过使用各种编码技术来进行差错检测和纠正,比如循环冗余校验(CRC)、前向纠错码(FEC)等。
  1. 硬件故障:包括但不限于电缆破损、接头松动、接口失效、传输设备老化等问题,这些都可能导致信号失真或错误。
  2. 信号衰减与畸变:随着信号在传输过程中的距离增加,其振幅、频率和相位可能逐渐衰减或发生改变,特别是在长距离传输和无线传输时,这种现象更为显著,从而导致接收端解码出错。
  3. 多径效应:对于无线通信而言,信号可能经过多个路径到达接收端,各个路径的信号相互叠加,可能会引入差错。
    在这里插入图片描述

同时差错的分类:
在计算机网络中,数据链路层可能出现的差错大致可以分为以下几类:

    1. 单比特错误(Single-Bit Error):
      这是最基本的错误类型,指在数据传输过程中,单个比特(bit)由于噪声或者其他原因发生了反转,即1变成了0或者0变成了1。
    1. 多比特错误(Multiple-Bit Error):
      指在一个数据单元内(如一个字节、一个码字)同时有两个或更多比特发生了错误。
    1. 突发错误(Burst Error):
      在数据流中相邻的一段比特序列中出现连续的错误。突发错误经常由传输通道中的突发噪声或信号暂时失去同步等原因造成。
    1. 帧丢失(Frame Loss):
      整个数据帧在传输过程中未能成功到达接收端,可能是由于严重的信号干扰、硬件故障或网络拥塞等原因导致。
    1. 帧重复(Frame Duplication):
      同一数据帧在传输过程中被意外地重复发送多次。
    1. 帧乱序(Frame Misordering):
      序列传输的数据帧在接收端收到了正确的帧,但它们的顺序与发送时的顺序不一致。
    1. 数据位滑动(Bit Slipping):
      在同步传输系统中,如果接收端与发送端的时钟频率稍有差异,可能会导致接收端采样点发生偏移,进而产生位滑动错误。

差错控制技术设计时会根据不同的错误类型选择合适的检错和纠错编码方案,例如奇偶校验、循环冗余校验(CRC)用于检测单比特或多比特错误,而更复杂的编码如卷积码、级联码、交织码和海明码等可以用来检测并纠正突发错误。对于帧丢失、重复和乱序问题,则需要依靠协议栈中的相关机制进行管理,如序列号、确认应答、超时重传等手段。

综上所述,数据链路层在设计差错控制机制时,需要考虑到这些潜在的错误来源,并通过适当的编码、检错和纠错算法以及重传策略来保证数据的正确传输。

数据链路层的差错控制

数据链路层的差错控制主要包括以下几个方面的技术和方法:

    1. 检错编码
      奇偶校验:通过对数据添加额外的校验位,使得所有位数的总和是奇数或偶数,接收方可以通过重新计算校验和来判断是否有错误。
      循环冗余校验(CRC):是一种更强大的检错方法,它通过附加一个冗余码(CRC码)到原始数据块后面,然后通过数学算法在接收端验证CRC值是否相符,以此来检测帧中的错误。
    1. 纠错编码
      前向纠错(FEC):通过使用特殊的编码技术(如Hamming码、BCH码、RS码、Turbo码或LDPC码等),不仅可以检测错误,还可以在一定范围内纠正错误,无需等待重传。
      在这里插入图片描述

检错编码

奇偶校验码

奇偶校验码(Parity Check Code)是一种简单的错误检测编码方法,主要用于在数据传输或存储过程中检测数据的完整性。奇偶校验码通过在原始数据位之后或之中增加一个校验位(也称为奇偶校验位),使得包含校验位在内的所有“1”的个数要么是奇数(奇校验),要么是偶数(偶校验)

具体来说:

  • 奇校验:如果原始数据位中“1”的个数是偶数,则校验位设置为“1”,使得整个数据块(原始数据位+校验位)中“1”的总数成为奇数。如果原始数据位中“1”的个数已经是奇数,则校验位设为“0”。
  • 偶校验:与此相反,若原始数据位中“1”的个数是奇数,则校验位设为“1”以保证总“1”的个数为偶数;若原始数据位中“1”的个数已经是偶数,则校验位设为“0”。

奇偶校验码的主要优点在于实现简单,占用资源少。然而,它也有明显的局限性:

  1. 它只能检测出单个比特错误,也就是说,如果数据在传输过程中恰好只有一位发生变化,那么奇偶校验可以在接收端检测出这一错误。
  2. 当传输过程中出现两个或两个以上的比特错误时,奇偶校验可能无法检测出来,因为它无法区分单比特错误和多比特错误对“1”的总数的影响。

举一个例子:

假设我们有一个8位的数据串 “1010 0110”,现在我们要给这个数据串添加一个奇校验位,以确保整个数据块中"1"的个数为奇数。
首先,我们需要计算当前8位数据中"1"的个数。在这个例子中,共有4个"1"。由于我们想要的是奇数个"1",而现在已经有偶数个"1"(4个),所以我们需要在最后添加一个"1"作为奇校验位于是,加上奇校验位后的完整数据串就变成了 “1010 0110 1”

在数据接收端,对于带有奇校验位的数据串 “1010 0110 1” 的奇偶校验检查步骤如下:
接收端收到完整的数据帧后,将奇校验位与原始8位数据合并考虑。
计算整个数据帧(包括原始数据位和奇偶校验位)中 “1” 的个数。
根据奇校验的原则,如果计算得出的 “1” 的个数是奇数,则认为校验通过,数据没有发生错误
如果计算得出的 “1” 的个数是偶数,则意味着数据在传输过程中可能发生了错误,因为按照奇校验规则,应该是一个奇数个 “1”,但现在却成了偶数个。
在这个例子中,接收端计算 “1010 0110 1” 中 “1” 的个数,发现共有5个 “1”,满足奇校验的要求,因此校验结果表明数据正确传输,无误。

对于奇偶校验码,只能检测单位出错,而不能检测多位出错的原因如下:

假设我们有一个4位的数据字1011,并决定使用偶校验。为了保持1的总数为偶数(或奇数,取决于我们选择的是偶校验还是奇校验),我们需要在数据后面添加一个校验位。在这个例子中,数据字中已经有3个1了(奇数个),所以我们需要添加一个1作为校验位,使得1的总数变为偶数。
原始数据字:1011
添加偶校验位后(假设校验位加在末尾):10111(此时1的个数为4,是偶数,满足偶校验的要求)
现在,假设在传输过程中发生了两位错误,数据变为了11011。如果我们用偶校验来检查这个数据:11011中1的个数仍然是4,是偶数,满足偶校验的要求。因此,从偶校验的角度来看,这个数据似乎是正确的。但是,实际上它包含了两位错误。这就是奇偶校验码不能检测多位错误的原因。它只能告诉我们数据中1的总数是奇数还是偶数,而不能告诉我们错误的具体位置或数量。
在这里插入图片描述

为了检测多位错误,我们需要使用更复杂的校验方法,如循环冗余校验(CRC)等。这些方法通过添加更多的校验位和使用更复杂的算法来提供更强大的错误检测能力。

循环冗余校验(CRC)

循环冗余校验(Cyclic Redundancy Check, CRC)是一种广泛应用在数据通信和存储系统中的错误检测编码技术。相较于简单的奇偶校验,CRC提供了更强的错误检测能力,尤其适用于检测并定位突发错误。

CRC工作原理的核心是利用一个预先定义好的多项式(称为生成多项式)对数据进行模2除法操作,生成一个固定长度的校验码(CRC码),并将这个校验码附加到数据块的末尾。当数据在传输过程中可能发生错误时,接收端重新计算接收到的数据块的CRC校验码,并与接收到的校验码进行比较。如果两者相符,则认为数据传输正确;如果不符,则表示数据在传输过程中出现了错误

具体步骤如下:

  1. 初始化CRC寄存器:选择一个预设长度的二进制寄存器(通常是16位或32位),并填充初始值(通常是全1或全0)。
  2. 数据位处理:将待校验的数据从最高位到最低位逐位(或按指定字节顺序)与CRC寄存器内的值进行异或(XOR)操作,然后将结果向左移一位(相当于模2除法中的除法操作)。
  3. 除法运算:每次左移后,如果最高位是1,则还需要与生成多项式的二进制表示进行异或(相当于模2除法的减法步骤),直到所有的数据位都被处理完。
  4. 得到CRC校验码:最终留在CRC寄存器内的数值即为CRC校验码,将其添加至原始数据的末尾。
  5. 接收端校验:接收端收到带有CRC校验码的数据块后,独立地对该数据块重新计算CRC校验码,并与收到的CRC校验码进行对比,若二者相同则表示数据传输无误。
    在这里插入图片描述

CRC的一个关键特性是其能够检测到多位错误,而且在特定条件下还能一定程度上检测到突发错误。不同的CRC算法使用的生成多项式不同,每种生成多项式对应着不同的CRC校验标准,如CRC-16、CRC-32等。这些标准因其在数据安全和效率上的平衡而广受青睐。
在这里插入图片描述

FCS

上面还有一个概念FCS:

FCS(Frame Check Sequence)是指帧校验序列,它是数据链路层用于错误检测的一种方法,类似于CRC(循环冗余校验)。FCS通常被包含在一个数据帧的尾部,作为该帧数据完整性和准确性的校验码。
在数据链路层协议中,如以太网Ethernet、HDLC(高级数据链路控制)、PPP(点对点协议)等,FCS都是必不可少的一部分。发送方会在每个数据帧后面附加上根据特定算法计算出的FCS,接收方在接收到整个帧后会重新计算FCS并与接收到的FCS进行比较。如果两者一致,则表明该帧在传输过程中没有发生错误或者错误在纠错范围内;如果不一致,则说明数据帧在传输过程中可能受到了损坏,接收方可能会丢弃该帧。
FCS的具体计算方法可以采用多种错误检测算法,其中CRC算法是最常用的实现方式之一。在以太网中,FCS就是基于CRC-32算法计算得出的32位校验值,而在PPP协议中,既可以使用CRC-16也可以使用其他类型的FCS算法。

举个栗子:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

但是注意一下:
在这里插入图片描述

纠错编码

海明码

海明码(Hamming Code)是由美国科学家理查德·卫斯里·海明(Richard W. Hamming)于1950年发明的一种线性纠错码。海明码是一种能够同时检测并纠正单个比特错误的编码方法,特别适用于存储和通信领域,以提高数据的可靠性。
海明码的基本思想是在原始数据位的基础上增加若干校验位(也称作冗余位),形成一个新的编码字。这些校验位被巧妙地分布在编码字的不同位置上,每个校验位负责监督一组特定的数据位,通过计算这些数据位的异或(XOR)值来确定校验位的值
当数据在传输或存储过程中发生错误时,海明码能够通过比较接收到的编码字中各个校验位与其负责监督的数据位之间的关系,准确地定位出发生错误的比特位置,并在某些情况下直接修正单比特错误。
在这里插入图片描述

海明距离

海明距离(Hamming Distance)是指两个等长字符串之间对应位置上不同字符的个数。在信息论和编码理论中,尤其是在讨论纠错编码时,这个概念非常关键。它以其发明者理查德·哈明的名字命名。
具体来说,如果我们有两个二进制序列
A=a1​a2​…anB = b1b2…bn ,它们长度都是 ( n ),那么这两个序列的海明距离 ( H(A, B) ) 就是:
( ˝ A , B ) = ∑ i = 1 n ∣ a i − b i ∣ \H(A, B) = \sum_{i=1}^{n} |a_i - b_i|\ (˝A,B)=i=1naibi 
由于这里考虑的是二进制数,所以只有两种可能的结果:要么是 0,要么是 1(如果它们不同)。因此,海明距离实际上就是两个序列不相同的比特位的数量。
在这里插入图片描述
在纠错编码中,比如海明码,设计的目的是确保任何两个合法编码(即没有错误的编码)之间的海明距离至少达到某个最小值,这样就能保证即使有单个比特错误发生,也能通过比较接收码与预期码之间的海明距离来发现并纠正该错误。

纠错流程

确定校验码的位数r

海明不等式给出了构造纠错码时数据位数(n)、校验位数®以及可纠正错误位数(t)之间的关系。海明不等式表达为:
2 k ≥ ( n + 1 ) 2^{k} \geq(n+1) 2k(n+1)
其中,kk 是信息位数(等于原始数据位数),nn 是编码后的码字长度(包括信息位和校验位)
或者:
2 k ≥ m + k + 1 {2^k} \ge {m + k+1} 2km+k+1
在这里插入图片描述

确定校验码和数据位置

在这里插入图片描述在这里插入图片描述

求出校验码的值

在这里插入图片描述

检错并纠错

在这里插入图片描述在这里插入图片描述

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

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

相关文章

【Linux】-Linux下的编辑器Vim的模式命令大全及其自主配置方法

目录 1.简单了解vim 2.vim的模式 2.1命令模式 2.2插入模式 2.3底行模式 3.vim各模式下的命令集 3.1正常(命令模式下) 3.1.1光标定位命令 3.1.2 复制粘贴 3.1.3 删除 3.1.4 撤销 3.1.5大小写转换 3.1.6替换 「R」:替换光标所到之处的字符&…

ComfyUI SDWebUI升级pytorch随记

目前使用的版本是去年10月的1.6版本,有点老。希望支持新的特性,于是乎开始作死。从升级torch开始。先看看已有的版本: (venv) rootubuntu-sd-server:~# pip show torch Name: torch Version: 2.0.1 Summary: Tensors and Dynamic neural net…

maya获取帧长度

目录 maya获取帧长度 python实现 获取对象的帧长度 maya获取帧长度 python实现 import maya.cmds as cmds# 获取动画的起始帧和结束帧 start_frame cmds.playbackOptions(queryTrue, minTimeTrue) end_frame cmds.playbackOptions(queryTrue, maxTimeTrue)# 计算帧长度 fr…

论文翻译 - Multilingual Jailbreak Challenges in Large Language Models

论文链接:https://arxiv.org/pdf/2310.06474.pdf 项目代码:https://github.com/DAMO-NLP-SG/multilingual-safety-for-LLMs Multilingual Jailbreak Challenges in Large Language Models Abstract1 Introduction2 Preliminary Study2.1 Setup2.2 Result…

【贪心]【字符串】【分类讨论】420 强密码检验器

本文涉及知识点 贪心 字符串 分类讨论 LeetCode420 强密码检验器 满足以下条件的密码被认为是强密码: 由至少 6 个,至多 20 个字符组成。 包含至少 一个小写 字母,至少 一个大写 字母,和至少 一个数字 。 不包含连续三个重复字…

Reactor 模式全解:实现非阻塞 I/O 多路复用

Reactor网络模式是什么? Reactor网络模式时目前网络最常用的网络模式。如果你使用Netty,那么你在使用Reactor;如果你使用Twisted,那么你子啊使用Reactor;如果你使用netpoll,那么你在使用Reactor。 这里先给出答案:Reactor I/O多…

204基于matlab的图像融合

基于matlab的图像融合,包括三种方式,加权、PCA、IHS变换。比较三者融合后的图像差异。程序已调通,可直接运行。 204 matlab 图像融合 信息融合 - 小红书 (xiaohongshu.com)

软件工程的相关知识点

软件工程是一个广泛的领域,涉及到从软件的概念化设计到开发、测试、维护以及最终的退役全过程。它不仅仅关注编程,还包括需求分析、系统设计、项目管理、质量保证等多方面的知识。下面是一些软件工程的关键知识点: 需求工程:需求工…

前端理论总结(js)——DOM、BOM

什么是DOM? DOM 指的是Document Object Model(文档对象模型),它指的是把文档当做一个对象来对待,这个对象主要定义了处理网页内容的方法和接口。 有什么用? 就是为了操作 HTML 中的元素,比如…

【二叉树】Leetcode 94. 二叉树的中序遍历【简单】

二叉树的中序遍历 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2] 解题思路 中序遍历是一种二叉树遍历方式,按照“左根右”的顺序遍历二叉树节点。 1、递归…

python 处理png图片无损压缩

代码利用了Pillow库来处理图片的压缩,并使用了 glob 模块来搜索所有的 .png 文件。这个脚本应该能够按照当前的编写来完成预期的工作。 请注意,compress_level9 指定了Pillow保存PNG图片时采用的最大压缩等级。这确保了每张图片都被以可能的最小文件大小…

线程安全(买票案例):加锁方式(synchronized、Lock锁)【同步代码块、同步方法】--学习JavaEE的day31上

day31上 线程安全 – 加锁 注意:要想多个线程互斥住,就必须使用同一把锁(对象)!!! 加锁方式 synchronized Lock synchronized 继day30的售票需求案例学习 学习思路: 1.使用线程类、任务类方式不同 2.加锁方…

【Spring】Spring框架中的一个核心接口ApplicationContext 简介,以及入口 Run() 的源码分析

一、简介 ApplicationContext 是Spring框架中的一个核心接口,它是Spring IoC容器的实现之一,用于管理和组织应用程序中的各种Bean,同时提供了一系列功能来支持依赖注入、AOP等特性。 简单来说,ApplicationContext 是一个大型的、…

求两个单链表的差集

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 但行前路,不负韶华&#…

发车,易安联签约某新能源汽车领军品牌,为科技创新保驾护航

近日,易安联成功签约某新能源汽车领军品牌,为其 数十万终端用户 建立一个全新的 安全、便捷、高效一体化的零信任终端安全办公平台。 随着新能源汽车行业的高速发展,战略布局的不断扩大,技术创新不断引领其市场价值走向高点&am…

移动端Web笔记day03

移动 Web 第三题 01-移动 Web 基础 谷歌模拟器 模拟移动设备,方便查看页面效果,移动端的效果是当手机屏幕发生了变化,页面和页面中的元素也要跟着等比例变化。 屏幕分辨率 分类: 硬件分辨路 -> 物理分辨率:硬件…

GTC 2024 火线评论:DPU 重构文件存储访问

编者按:英伟达2024 GTC 大会上周在美国加州召开,星辰天合 CTO 王豪迈在大会现场参与了 GPU 与存储相关的最新技术讨论,继上一篇《GTC 2024 火线评论:GPU 的高效存储利用》之后,这是他发回的第二篇评论文章。 上一篇文章…

Spring框架与Spring Boot的区别和联系

引言 Spring框架和Spring Boot都是Java生态中最受欢迎的开源框架,它们各自扮演着不同的角色,帮助开发者构建高效的企业级应用。本教程将从零基础的角度出发,让你轻松理解这两者的区别和联系。 Spring框架简介 Spring框架,简称Spri…

C#中让字典、列表、数组作为只读的方法参考

一、字典 在 C# 中&#xff0c;可以通过使用 ReadOnlyDictionary<TKey, TValue> 类或者是通过调用普通字典的 .AsReadOnly() 方法来创建一个只读的字典。ReadOnlyDictionary 不允许修改字典&#xff0c;任何试图改变字典的操作都会抛出 NotSupportedException。 以下是使…

pear-admin 项目结构讲解

上一篇文章介绍了pear-admin用到flask的技术&#xff0c; 深入代码后发现其结构也是令人眼前一亮&#xff0c; 结构化&#xff0c;模块化&#xff0c; 解耦做得非常优秀。 整个项目数据库使用migrate做了版本管理&#xff0c; 使用marshmallow做了序列化&#xff0c;这样数据库…