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

news/2024/5/14 17:07:20/文章来源:https://blog.csdn.net/qq_67693066/article/details/137032642

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

  • 差错从何而来
  • 数据链路层的差错控制
    • 检错编码
      • 奇偶校验码
      • 循环冗余校验(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.luyixian.cn/news_show_1029198.aspx

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

相关文章

IDEA的Scala环境搭建

目录 前言 Scala的概述 Scala环境的搭建 一、配置Windows的JAVA环境 二、配置Windows的Scala环境 编写一个Scala程序 前言 学习Scala最好先掌握Java基础及高级部分知识,文章正文中会提到Scala与Java的联系,简单来讲Scala好比是Java的加强版&#x…

求两个单链表的差集

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

【Redis】在Docker中安装Redis以及相关报错解决

文章目录 一、在docker里面手动安装(可能报错)Error:Failed to get D-Bus connection: Operation not permitted的解决方法 二、一步到位法 一、在docker里面手动安装(可能报错) 根据视频进行的redis安装 1、使用dock…

Xinstall广告效果监测,为您的App推广保驾护航

在当前的移动互联网时代,App已经成为企业与用户连接的重要桥梁。然而,App推广过程中,如何准确衡量广告效果、洞悉推广效果以及优化用户体验,一直是广告主和开发者面临的挑战。这时,一款强大而专业的App全渠道统计服务商…

pytorch反向传播算法

目录 1. 链式法则复习2. 多输出感知机3. 多层感知机4. 多层感知机梯度推导5. 反向传播的总结 1. 链式法则复习 2. 多输出感知机 3. 多层感知机 如图: 4. 多层感知机梯度推导 简化式子把( O k O_k Ok​ - t k t_k tk​) O k O_k Ok​(1 - O k O_k Ok​)起个别名…

JVM——字符串常量池

在Java程序中String类的使用几乎无处不在,String类代表字符串,字符串对象可以说是Java程序中使用最多的对象了。首先,在Java中创建大量对象是非常耗费时间的。其次,在程序中又经常使用相同的字符串对象,如果每次都去重…

python编程软件有什么

Python开发软件可根据其用途不同分为两种,一种是Python代码编辑器,一种是Python集成开发工具,两者的配合使用可以极大的提高Python开发人员的编程效率,以下是常用的几款Python代码编辑器和Python集成开发工具。 一、Python代码编…

Ubuntu20.04LTS+uhd3.15+gnuradio3.8.1源码编译及安装

文章目录 前言一、卸载本地 gnuradio二、安装 UHD 驱动三、编译及安装 gnuradio四、验证 前言 本地 Ubuntu 环境的 gnuradio 是按照官方指导使用 ppa 的方式安装 uhd 和 gnuradio 的,也是最方便的方法,但是存在着一个问题,就是我无法修改底层…

docker安装elasticseachkibana

1.docker安装es 创建本机挂载目录,与容器上目录映射 /Users/wangpei/2024/mydata/elasticsearch conf下创建yml文件 echo "http.host : 0.0.0.0" >> /Users/wangpei/2024/mydata/elasticsearch/config/elasticsearch.yml 安装容器: d…

RabbitMQ 延时消息实现

1. 实现方式 1. 设置队列过期时间:延迟队列消息过期 死信队列,所有消息过期时间一致 2. 设置消息的过期时间:此种方式下有缺陷,MQ只会判断队列第一条消息是否过期,会导致消息的阻塞需要额外安装 rabbitmq_delayed_me…

【MySQL】DQL-条件查询语句全解(附带代码演示&案例练习)

前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C Linux的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…

C++中的STL简介与string类

目录 STL简介 STL的版本 STL的六大组件 string类 标准库中的string类 string类的常用接口 string类对象对容量的操作 size()函数与length()函数 capacity()函数 capacity的扩容方式 reserve()函数 resize()函数 string类对象的操作 push_back()函数 append()函数 operator()函数…

Rust高级爬虫:如何利用Rust抓取精美图片

引言 在当今信息爆炸的时代,互联网上的图片资源丰富多彩,而利用爬虫技术获取这些图片已成为许多开发者的关注焦点。本文将介绍如何利用Rust语言进行高级爬虫编程,从而掌握抓取精美图片的关键技术要点。 Rust爬虫框架介绍 Rust语言生态中有…

【谷歌开发者月刊】聚焦三月精彩内容,让开发思路更加开阔

随着春日的到来,阳光渐煦,正是吸收能量的大好时机,我们也为开发者们带来了众多更新内容,为您的开发之路提供思路!本月精彩内容众多,快来一起查收! 本月看点 01Android 15 首个开发者预览版到来0…

git基本操作(小白入门快速上手一)

1、前言 我们接上一篇文章来讲,直接开干 1.1、工作区 1. 工作区很好理解,就是我们能看到的工作目录,就是本地的文件夹。 2. 这些本地的文件夹我们要通过 git add 命令先将他们添加到暂存区中。 3. git commit 命令则可以将暂存区中的文件提交…

在.Net6中用gdal实现第一个功能

目录 一、创建.NET6的控制台应用程序 二、加载Gdal插件 三、编写程序 一、创建.NET6的控制台应用程序 二、加载Gdal插件 Gdal的资源可以经过NuGet包引入。右键单击项目名称,然后选择 "Manage NuGet Packages"(管理 NuGet 包)。N…

SD 修复 Midjourney 有瑕疵照片

Midjourney V6 生成的照片在质感上有了一个巨大的提升。下面4张图就是 Midjourney V6 生成的。 如果仔细观察人物和老虎的面部,细节真的很丰富。 但仔细观察上面四张图的手部细节,就会发现至少有两只手是有问题的。这也是目前所有 AI 绘图工具面临的问题…

阿里云2核4G服务器租用价格30元、165元和199元1年

阿里云2核4G服务器租用优惠价格,轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月,活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图: 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

thinkadmin 新版安装步骤

1.通过 Composer 安装: ( 推荐方式,默认只安装 admin 模块 ) ### 创建项目( 需要在英文目录下面执行 ) composer create-project zoujingli/thinkadmin### 进入项目根目录 cd thinkadmin### 数据库初始化并安装 ### 默认使用 Sqlite 数据库,若使用其他数据库请按第二步修…

大话设计模式之原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,它用于创建对象的复制,同时又能保持对象的封装。原型模式通过复制现有对象的方式来创建新的对象,而无需知道具体创建过程的细节。 在原型模式中,通常会有…