(考研湖科大教书匠计算机网络)第三章数据链路层-第三节:差错控制

news2024/11/26 13:57:06
  • 专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航

文章目录

  • 一:检错编码
    • (1)奇偶校验码
    • (2)循环冗余检验码(CRC)
  • 二:纠错编码(海明校验码)
    • (1)码字和码距
    • (2)海明校验码
      • A:纠错理论
      • B:求解海明码
      • C:补充-全校验位
  • 三:注意

本节对应视频如下

【计算机网络微课堂(有字幕无背景音乐版)】:3.3:差错检测

差错检测:数据在传输过程中可能会因为各种因素而出现差错,主要有以下两种类型的错误

  • 位错(本节研究内容):比特位出现错误
  • 帧错:几个比特出现错误;包括帧丢失、帧重复、帧失序;对于帧错误可以通过编号、确认重传解决

其中关于位错,可由差错检测码解决,差错检测码主要包括检错编码和纠错编码

  • 检错编码:奇偶校验码、循环冗余校验码CRC
  • 纠错编码:海明码

一:检错编码

  • 注意此部分内容在《计算机组成原理》校验码部分已有介绍:【专栏必读】王道考研408计算机组成原理万字笔记和题目题型总结(从学生角度辅助大家理解):各章节导航及思维导图

(1)奇偶校验码

奇偶校验码:在原编码的基础上增加一个校验码,可以检测出一位错误(或奇数位错误),但不能确定出错位置,也不能检测出偶数位出错,增加的冗余位称为奇偶校验位;校验位只取0或1,它的加入使整个校验码中“1”的个数要么是奇数要么是偶数,所以就有两种可选的校验规律

  • 奇校验码:整个检验码中“1”的个数为奇数
  • 偶校验码:整个校验码中“1”的个数为偶数

在这里插入图片描述

例如:1001101的奇校验码和偶校验码设置如下

在这里插入图片描述
奇偶校验具有很大的局限性,只能发现数据代码中的奇数位出错的情况
在这里插入图片描述
校验过程

  • 传输前,发送端和接收端会协议确定彼此之间采用奇校验还是偶校验
  • 以偶校验为例:首先会将二进制所有位进行异或运算,所得结果就是偶校验位,例如上面信息“1001101”,进行异或运算“1⊕0⊕0⊕1⊕1⊕0⊕1=0”,这表明“1”的个数为偶数个,故偶校验位为0
  • 接收端在接受信息后会进行异或运算,一旦结果为“1”表明错误;例如上图中第一个例子,在接受到之后进行异或运算“0⊕1⊕0⊕1⊕1⊕1⊕0⊕1=1”,所以结果错误

(2)循环冗余检验码(CRC)

  • 举个例子,A要向B传送数据882,为了校验数据是否准确,A和B约定了一个除数7882除以7是可以除尽的;B在接收到数据之后同样也使882除以7,如果没有余数,数据可能正确,但如果有余数那么一定出现了错误

循环冗余校验码:CRC的原理和上面除法的例子基本一致。发送方和接收方提前约定好一个数,作为除数(这里的数自然指的是二进制序列),然后在 K K K个信息位后拼接 R R R个校验位作为被除数(添加的校验位需要保证被除数除以除数余数为0),接受方在接收到数据之后进行除法运算,检查余数是否为0

在这里插入图片描述

双方会通过生成多项式 G ( x ) G(x) G(x)来确定除数

  • 例如多项式 G ( x ) = x 3 + x 2 + 1 G(x)=x^{3}+x^{2}+1 G(x)=x3+x2+1,其完整形式为 G ( x ) = 1 × x 3 + 1 × x 2 + 0 × x 1 + 1 × x 0 G(x)=1\times x^{3}+1\times x^{2}+0\times x^{1}+1\times x^{0} G(x)=1×x3+1×x2+0×x1+1×x0,取其系数,则除数为 1101 1101 1101

这里以传送信息101001,生成表达式为 G ( x ) = x 3 + x 2 + 1 G(x)=x^{3}+x^{2}+1 G(x)=x3+x2+1为例,演示CRC码的求解过程

①:确定 K K K R R R以及生成多项式对应的二进制码

首先

  • 校验位 R = R= R=生成多项式最高幂次 = 3 =3 =3
  • K = K= K=信息码长度的 = 6 =6 =6
  • 整个编码位数 N = K + R = 9 N=K+R=9 N=K+R=9
  • 多项式 G ( x ) G(x) G(x)对应二进制码(即除数)为 1101 1101 1101

②:移位

现在我们要确保添加的 3 3 3位校验位形成的被除数可以整除除数,因此将信息码 101001 101001 101001左移R位,低位补0,也即 101001000 101001000 101001000,称其为新信息码

③:相除
对于新信息码,用生成多项式进行模2除法,产生余数。
在这里插入图片描述

  • 举个例子,用1001000作为被除数,1011作为除数,模2除法为的是求余数,不关心商。
    在这里插入图片描述

    首先商为1,得出结果
    在这里插入图片描述

    此时不应该做减法,而应该做对应为的异或运算
    在这里插入图片描述
    接着如果高位为0,就抹去一位,同时后面用被除数的补齐一位
    在这里插入图片描述
    这里经过异或运算,然后抹位补位得到的结果(比如上图0100)中,如果首位为0就商0,首位为1就商1
    在这里插入图片描述
    继续异或,然后抹位,补位后
    在这里插入图片描述
    继续
    在这里插入图片描述
    运算到这里,其实可以进行快捷操作。异或后前面有多少0都全部扔掉,再从被除数哪里补齐相应位即可。但是这里很明显只能取一个,于是就得到下面的结果,此时也是最终结果,因为余数位数小于除数
    在这里插入图片描述

好的,回到正题。此时运算出的余数为001,作为校验位。于是整个CRC码即为信息码+校验码= 101001001 101001001 101001001

④:检验纠错

接收方接受到数据后,会使用约定的除数进行模2除运算,如果余数为000,表示结果可能正确;如果接收方数据为 101001011 101001011 101001011(导数第二位出现错误),计算结果为010,对应是十进制数为2,表示第二位出现错误,但是特别注意这只是巧合,出错位置与计算结果没有必然联系

我们把每一个位置出错的情况统计如下,大家可以发现,余数为3位最多映射8种情况,因此第1-7位是属于一个周期,但是从第8位又开始了一个新的周期,因此010有可能对应第2位出错,也有可能是第9位
在这里插入图片描述
难道说CRC码不能确定出错位置吗?其实也不是的,出现这种情况的原因主要在于信息位过长,无法一一映射。所以要想确定纠错位置就要选择合适的多项式(纠错1位),需要满足以下不等式

2 R ≥ K + R + 1 2^{R}\geq K+R+1 2RK+R+1

二:纠错编码(海明校验码)

(1)码字和码距

网络传输内容实则是二进制序列,每种编码都对应特定的信息,如下
在这里插入图片描述

  • 码字:由若干位代码组成的一个字称为码字,比如上面的“00”,“01”
  • 码距:将两个码字逐位比较,具有不同的位的个数称为两个码字的距离,比如“00”和“10”距离就是1;一种编码方法可能有若干合法码字,各合法码字之间的最小距离称为“码距”,上面这种编码方案码距为1。

码距为1无检错能力;对于码距大于等于2的校验码,具有检错能力,且码距越大,检错、纠错能力就越强,而且检错能力总大于等于纠错能力

(2)海明校验码

海明校验码:海明码是一种广泛采用的有效的校验码,本质是一种多重奇偶校验码。其实现原理是在有效信息位中加入几个校验位形成海明码,并把海明码的每个二进制位分配到奇偶校验组中。当某一位出现错误后,就会引起有关的几个校验位的值发生变化。它不但可以发现错误位置,还可以为自动纠错提供依据

A:纠错理论

假设信息位为 n n n,校验位为 k k k,因此 k k k个比特位一共可以映射 2 k 2^{k} 2k种状态;海明码由信息位和校验位组成,因此共有 n + k n+k n+k位, n + k n+k n+k位每一个位置都有可能出现错误,因此这 2 k 2^{k} 2k种状态要把这 n + k n+k n+k种全部映射到,但是要注意其中还要包含一种全部正确的情况。

综上所述,得出下面的重要不等式

2 k ⩾ n + k + 1 2^{k}\geqslant n+k+1 2kn+k+1

B:求解海明码

范例:求1010的海明码,具体流程如下
在这里插入图片描述

1:确定海明码位数

此二进制序列信息位 n = 4 n=4 n=4,根据前述不等式 : 2 k ⩾ n + k + 1 2^{k}\geqslant n+k+1 2kn+k+1,可知 k k k为3时不等式方可成立。

  • 除了实际计算,也可以熟悉下面这张表,从而快速写出
    在这里插入图片描述

为了区分信息位和校验位,我们用 D 4 D 3 D 2 D 1 D_{4}D_{3}D_{2}D_{1} D4D3D2D1表示信息位(对应 1010 1010 1010);用 P 3 P 2 P 1 P_{3}P_{2}P_{1} P3P2P1表示校验位;整个海明码序列可以表示为 H 7 H 6 H 5 H 4 H 3 H 2 H 1 H_{7}H_{6}H_{5}H_{4}H_{3}H_{2}H_{1} H7H6H5H4H3H2H1

2:确定校验位分布

海明码中校验位不能直接放在信息位的头部和尾部
规定:校验位 p i p_{i} pi应该放在海明码 H 2 i − 1 H_{2^{i-1}} H2i1的位置,因此 P 1 P 2 P 3 P_{1}P_{2}P_{3} P1P2P3分别对应 H 1 H 2 H 4 H_{1}H_{2}H_{4} H1H2H4,其实也就是2进制的权值

校验位分布如下,首先放入校验位,信息位从低到高依次补全空位

海明码位置 H 7 H_{7} H7 H 6 H_{6} H6 H 5 H_{5} H5 H 4 H_{4} H4 H 3 H_{3} H3 H 2 H_{2} H2 H 1 H_{1} H1
分布情况 D 4 D_{4} D4 D 3 D_{3} D3 D 2 D_{2} D2 P 3 P_{3} P3 D 1 D_{1} D1 P 2 P_{2} P2 P 1 P_{1} P1
海明码1010

接下来,由于校验位为3位,因此信息位需要根据校验位分为3组,每个分组分别进行偶校验

3:求校验位的值

首先,我们需要海明码中对应位置为信息位的下标(也就是所处位置)转为二进制序列,比如上面表格中, H 7 H_{7} H7对应位置为信息,其下标为 7 7 7,对应二进制序列为111

海明码位置 H 7 H_{7} H7 H 6 H_{6} H6 H 5 H_{5} H5 H 4 H_{4} H4 H 3 H_{3} H3 H 2 H_{2} H2 H 1 H_{1} H1
二进制111110101011
分布情况 D 4 D_{4} D4 D 3 D_{3} D3 D 2 D_{2} D2 P 3 P_{3} P3 D 1 D_{1} D1 P 2 P_{2} P2 P 1 P_{1} P1
信息位值1010

然后我们需要根据二进制序列确定每个校验位所在组包括哪些信息位

前面我们说过, P 3 P 2 P 1 P_{3}P_{2}P_{1} P3P2P1实则对应的是二进制的权值 421 421 421,而分组依据就是根据这个权值,比如 P 1 P_{1} P1表示所有二进制序列第0位为1的分到该组,
所以 H 3 H 5 H 7 H_{3}H_{5}H_{7} H3H5H7就分到了这一组

在这里插入图片描述

分为三个组后,我们就要对每一组进行偶校验。上面内容提到,偶校验码计算实则通过异或运算完成,因此对每组进行异或运算,确定 P P P的取值
在这里插入图片描述
填充表格如下

海明码位置 H 7 H_{7} H7 H 6 H_{6} H6 H 5 H_{5} H5 H 4 H_{4} H4 H 3 H_{3} H3 H 2 H_{2} H2 H 1 H_{1} H1
二进制111110101011
分布情况 D 4 D_{4} D4 D 3 D_{3} D3 D 2 D_{2} D2 P 3 P_{3} P3 D 1 D_{1} D1 P 2 P_{2} P2 P 1 P_{1} P1
海明码1010010

4:校验纠错

每个校验组分别利用校验位和参与形成该校验位的信息位进行奇偶校验检查。这里是偶校验,如果 S 3 S 2 S 1 S_{3}S_{2}S_{1} S3S2S1为“000”,表明无错误

在这里插入图片描述
如果 S 3 S 2 S 1 S_{3}S_{2}S_{1} S3S2S1为“010”,表明第2位出现错误
在这里插入图片描述
其原理可以用下面的这张图解释。
在这里插入图片描述

  • 比如 D 3 D_{3} D3信息位发生变化,由于 D 3 D_{3} D3包含于 P 2 和 P 3 P_{2}和P_{3} P2P3,同时 P 2 和 P 3 P_{2}和P_{3} P2P3又在 S 2 S 3 S_{2}S_{3} S2S3的校验方程中,导致 S 3 S 2 S 1 S_{3}S_{2}S_{1} S3S2S1 110 110 110, 也就是 H 6 H_{6} H6发生改变
  • 再比如校验位 P 2 P_{2} P2发生改变时,其只存在于 S 2 S_{2} S2的校验方程中,所以 S 3 S 2 S 1 S_{3}S_{2}S_{1} S3S2S1 010 010 010,也就是 H 2 H_{2} H2发生改变

C:补充-全校验位

海明码具有1位的纠错能力和2位的检错能力

刚才设计的海明码,在使用时还是有一定问题的,比如发送刚数据为

海明码位置 H 7 H_{7} H7 H 6 H_{6} H6 H 5 H_{5} H5 H 4 H_{4} H4 H 3 H_{3} H3 H 2 H_{2} H2 H 1 H_{1} H1
二进制111110101011
分布情况 D 4 D_{4} D4 D 3 D_{3} D3 D 2 D_{2} D2 P 3 P_{3} P3 D 1 D_{1} D1 P 2 P_{2} P2 P 1 P_{1} P1
海明码1010010

发送中, P 2 P 1 P_{2}P_{1} P2P1这两个校验位发生改变

海明码位置 H 7 H_{7} H7 H 6 H_{6} H6 H 5 H_{5} H5 H 4 H_{4} H4 H 3 H_{3} H3 H 2 H_{2} H2 H 1 H_{1} H1
二进制111110101011
分布情况 D 4 D_{4} D4 D 3 D_{3} D3 D 2 D_{2} D2 P 3 P_{3} P3 D 1 D_{1} D1 P 2 P_{2} P2 P 1 P_{1} P1
海明码1010001

那么按照之前的校验规则, S 3 S 2 S 1 S_{3}S_{2}S_{1} S3S2S1的值为“110”,表明 H 3 H_{3} H3位置发生错误。很明显发现,判断错误,此时发生的是两个比特位的改变。所以之前的方案是没有办法区分1位错误,还是2位错误的

为此,在使用时我们在海明码首部加入“全校验位”,对整体统一进行一次偶校验

发送方数据

海明码位置 H 8 H_{8} H8 H 7 H_{7} H7 H 6 H_{6} H6 H 5 H_{5} H5 H 4 H_{4} H4 H 3 H_{3} H3 H 2 H_{2} H2 H 1 H_{1} H1
二进制111110101011
分布情况 P 全 P_{全} P D 4 D_{4} D4 D 3 D_{3} D3 D 2 D_{2} D2 P 3 P_{3} P3 D 1 D_{1} D1 P 2 P_{2} P2 P 1 P_{1} P1
海明码11010010
  • 如果此时接收方校验后 S 3 S 2 S 1 S_{3}S_{2}S_{1} S3S2S1的值为“000”,并且全体偶校验成功,表明没有错误;
  • 如果 S 3 S 2 S 1 S_{3}S_{2}S_{1} S3S2S1的值不为“000”,并且全体偶校验失败,表明有1位错误,纠正即可;
  • 如果 S 3 S 2 S 1 S_{3}S_{2}S_{1} S3S2S1的值不为“000”,并且全体偶校验成功,很明显产生了两位错误,此时无法纠正,需要重传

三:注意

  • 检错码只能检测出帧在传输过程中出现了差错,但并不能定位错误,因此无法纠正错误
  • 要想纠正传输中的差错,可以使用冗余信息更多的纠错码进行前向纠错。但纠错码的开销比较大,在计算机网络中较少使用
  • 循环冗余校验CRC有很好的检错能力(漏检率非常低),虽然计算比较复杂,但非常易于用硬件实现,因此被广泛应用于数据链路层
  • 在计算机网络中通常采用我们后续课程中将要讨论的检错重传方式来纠正传输中的差错,或者仅仅是丢弃检测到差错的帧,这取决于数据链路层向其上层提供的是可靠传输服务还是不可靠传输服务

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

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

相关文章

Opencv调参神器——trackBar控件

Opencv调参神器——trackBar控件 调参需求介绍trackBar控件介绍trackBar控件使用函数案例一:trackBar控件调整图片颜色案例二:trackBar控件调整Canny算子参数案例三:trackBar控件调整图像融合参数trackBar控件总结调参需求介绍 想要学好计算机视觉,有一个库必不可少,那就…

ARM Makefile 基础

一、Makefile 的作用和意义 (1) 工程项目中 c 文件太多管理不方便,因此用 Makefile 来做项目管理,方便编译链接过程。 (2) uboot 和 linux kernel本质上都是 C 语言的项目,都由很多个文件组成,因此都需要通过 Makefile 来管理。…

nodejs小区物业管理系统vue前端

目 录 1 概述 1 1.1课题背景及意义 1 1.2 国内外研究现状 1 1.3 本课题主要工作 2 2 系统开发环境 3 前端技术:nodejsvueelementui 前端:HTML5,CSS3、JavaScript、VUE 1、 node_modules文件夹(有npn install产生) 这文件夹就是…

STM32-Modbus-RTU-01-05-15功能码补充-波特率在线修改-断电数据保护

文章目录一、本文主要内容二、使用modbus通信协议在线修改STM32波特率(一)STM32标准库在线修改串口波特率(二)STM32HAL库-485-modbus-rtu通信在线修改串口波特率1、STM32F103ZET6芯片(1)HAL库下参考标准库形式修改波特率(2)直接修…

SNARK+深度神经网络

1. 引言 SNARK深度神经网络,相关开源实现有: 1)Ezkl(Rust):借助Halo2证明系统,实现了50层的MobileNetV2的执行证明。具体见Daniel Kang等人2022年论文Scaling up Trustless DNN Inference with…

4种I/O模型简介

目录 1、同步阻塞IO(BIO) 2、同步非阻塞IO(NIO) 3、多路复用IO 3.1、select(轮询) 3.2、poll(轮询) 3.3、epoll(事件驱动) 3.4、select、poll、epoll总结 4、异步IO模型(AIO) 网络IO涉及的两个对象:用户线程 系统内核。 当一个read发生时,会经…

Kotlin中嵌套类、数据类、枚举类和密封类的详解

博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家 👉点击跳转到教程 一、嵌套类 如果一个类只对另一个类有用,那么将其嵌入到该类中并使这两个类保持在一起是合乎逻辑的&#xf…

【Deepstream学习】TX1 跑demo

大家好,我是虎哥,使用NVIDIA Jeston TX1 也有很长一段时间了,由于这是基本停产的一个模块,其实自己也担心有很多官方的demo无法适配跑起来了,所以花了点时间,进一步研究发挥其GPU性能,使用各种硬…

STM8S207时钟管理库函数

STM8S207时钟树 //STM8S207时钟管理库函数 //CLK_DeInit();//将相关的时钟寄存器恢复到默认值 //CLK_HSECmd(ENABLE);//启用外部高速振荡器HSE //CLK_HSECmd(DISABLE);//关闭外部高速振荡器HSE //CLK_HSICmd(ENABLE);//启用内部高速振荡器HSI //CLK_HSICmd(DISABLE)//关闭内部高…

Spring Cloud Sentinel(限流、熔断、降级)、SpringBoot整合Sentinel、Sentinel的使用-60

一:Sentinel简介 Sentinel就是分布式系统的流量防卫兵 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 1.1 官方文档 官方文档&#…

哪里可以找到电子版的大学课本?

第一个:中国高校课件下载网站网址:http://download.cucdc.com/这是一个可以下载各个大学课本的网站,基本上所有的大学课本都能在这里找到PDF版本。可以按学校学科搜。 第二个:淘链客网址:https://www.toplinks.cc/s/PD…

MySQL_存储引擎

存储引擎 MySQL体系结构 连接层 最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。 服务层 第二层架构主要完成大多数的核心服务功能,如SQL接口&…

读书:《如何想到又做到》

全书最有用的内容是下面这张图:持久改变的SCIENCE模型。 作者为了方便读者记忆,找了7个单词,首字母拼在一起就是SCIENCE,对应着7种武器: S 阶梯(Stepladders):小而又小的迭代 C 社群…

高性能零售IT系统的建设09-Spring Boot2.4.2+Spring Cloud+Nacos+Feign+Hystrix的生产级应用实例

开篇 通过前面8篇我们已经感受到了我接手时这个项目有多“烂”,当然喽如果只是一味的承认它的烂这不是积极乐观主义。 我在接触管理早期听过一次四大厂的报告,报告中说到:从来没有屎一样的团队只有屎一样的“带队”。 这也符合我们一直接受的…

SpringMVC @RequestHeader @CookieValue 处理获取请求参数的乱码问题

SpringMVC RequestHeader CookieValue 处理获取请求参数的乱码问题RequestHeaderCookieValue什么是cookie通过POJO获取请求参数通过CharacterEncodingFilter处理获取请求参数的乱码问题get请求的乱码post请求乱码处理获取请求参数的乱码问题)RequestHeader 1.RequestHeader是将…

实时计算业务介绍实时日志分析

4.1 实时计算业务介绍 学习目标 目标 了解实时计算的业务需求知道实时计算的作用应用 无 4.1.1 实时计算业务需求 实时(在线)计算: 解决用户冷启动问题实时计算能够根据用户的点击实时反馈,快速跟踪用户的喜好 4.1.2 实时计算…

编译与优化

第10章 前端编译与优化 10.2.1 Javac的源码与调试 从Javac代码的总体结构来看,编译过程大致可以分为1个准备过程和3个处理过程,它们分别如下 所示。 1)准备过程:初始化插入式注解处理器。 2)解析与填充符号表过程&…

【C++】异常

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉C语言传统…

精神财富 物质财富

今天聊到别的家庭每天都制定好计划的,补习班 party 冬令营什么之类的,这个是我们达不到的。有人提前开启了认知,赚到了人生的第一桶金。懂得付出,和执行输出差了好多数量级。 今天看了杂技表演,男人和女人配合的好好 …

C++ 初阶 :stackqueue

文章目录1 stack的介绍2 stack的模拟实现3 queue的介绍4 queue的模拟实现5 priority_queue(优先级队列)介绍6 priority_queue 模拟实现7 仿函数8 deque的简单介绍8.1 deque与vector list的比较8.2 为什么选择deque作为stack和queue的底层默认容器1 stack的介绍 ①stack是一种容…