计算机网络——数据链路层-差错检测(奇偶校验、循环冗余校验CRC)

本文主要是介绍计算机网络——数据链路层-差错检测(奇偶校验、循环冗余校验CRC),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

奇偶校验 

循环冗余校验CRC

发送方操作

接收方操作

生成多项式

举例-1

举例-2


我们知道,

  • 实际的通信链路都不是理想的,比特在传输过程中可能会产生差错;1可能变成0,而0也可能变成1,这称为比特差错

如下图所示:

比特流在传输过程中由于受到各种干扰就可能会出现比特差错,或称为误码。

  • 在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BERBit Error Rate)。
  • 使用差错检测码来检测数据在传输过程中是否产生了比特差错,是数据链路层所要解决的重要问题之一。

例如以太网版本2的MAC帧格式和点对点协议PPP的帧格式,他们帧尾中都包含了帧检验序列FCS字段,其作用就是让接收方的数据链路层检查帧在传输过程中是否产生了误码。

奇偶校验 

接下来我们介绍基偶校验这种比较简单的检测方法。

在待发送的数据后面添加1位奇偶校验位,使整个数据(包括所添加的校验位在内)中“1”的个数为奇数(奇校验)或偶数(偶校验)。

举例说明:

  • 采用奇偶校验,如果有奇数个位发生误码,则奇偶性会发生变化,也就是奇变偶或者是偶变奇,这样就可以检查出误码
  • 而如果有偶数个位发生误码,则奇偶性不会发生变化,不能检查出误码(漏检)

这是因为:每个误码对奇偶性的影响相互抵消了,这样就无法检查出误码,也称为漏检。

由于奇偶校验的漏检率比较高,因此计算机网络的数据链路层一般不会采用这种检测方法。

循环冗余校验CRC

CRC(Cyclic Redundancy Check)

接下来我们介绍循环冗余校验CRC,这是一种具有很强检错能力的检测方法,漏检率极低。

  • 收发双方约定好一个生成多项式G(x)
  • 发送方基于待发送的数据和生成多项式计算出差错检测码,称为冗余码,并将其添加到待传输数据的后面一起传输;
  • 接收方通过生成多项式来计算收到的数据是否产生了误码。

发送方操作

使用除法(模二除法)来计算冗余码,

  • 待发送的数据作为被除数的一部分,后面添加生成多项式最高次数个0以构成被除数
  • 生成多项式各项系数构成的比特串作为除数
  • 进行模二除法得到商和余数
  • 余数就是所计算出的冗余码,将其添加到待发送数据的后面一起发送 。

需要注意的是,冗余码的长度与生成多项式最高次数相同,而商仅作为标记防止计算过程中对错位

对模二除法不太了解的同学可以前往:模2除法——用非常直观的例子解释_模二除法-CSDN博客 

——作者:

猫咪钓鱼

接收方操作

被除数就是接收到的数据,除数仍是生成多项式各项系数构成的比特串,进行模二除法得到商和余数,如果余数为0,可判定传输过程没有产生误码,否则可判定传输过程产生了误码 。

生成多项式

下面我们对生成多项式举例说明,这是一个生成多项式:

这是该生成多项式的完整形式:

生成多项式各项系数构成的比特串就是我们做除法时所用到的除数

这是常用的生成多项式:

使用这些生成多项式进行CRC校验可以达到较好的检测效果,也就是漏检率比较低。

需要注意的是,CRC算法要求生成多项式必须包含最低次项

举例-1

待发送的信息为101001,生成多项式为G(x)=x^3+x^2+1,计算余数。

该题给定了待发送的信息和一个生成多项式,要求计算余数:

第一步构造被除数。在待发送信息后面添加生成多项式最高次数个0,就可以构造出被除数。

这是待发送信息:

这是添加生成多项式最高次数个0:

第二步构造除数。生成多项式各项系数构成的比特串就是除数:

第三步做模二除法,得到余数为1:

第四步检查余数。余数的位数应与生成多项式最高次数相同,如果位数不够,则在余数前补0来凑足位数,将余数添加到待发送信息的后面就可以发送了 :

 

举例-2

再来做一个练习

接收到的信息为101101001,生成多项式为G(x)=x^3+x^2+1,判断传输是否误码?

该题给定了接收方收到的信息和一个生成多项式,要求判断传输过程是否产生了误码:

需要说明的是,

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

 


END


学习自:湖科大——计算机网络课程

这篇关于计算机网络——数据链路层-差错检测(奇偶校验、循环冗余校验CRC)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/461262

相关文章

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro

Python脚本轻松实现检测麦克风功能

《Python脚本轻松实现检测麦克风功能》在进行音频处理或开发需要使用麦克风的应用程序时,确保麦克风功能正常是非常重要的,本文将介绍一个简单的Python脚本,能够帮助我们检测本地麦克风的功能,需要的... 目录轻松检测麦克风功能脚本介绍一、python环境准备二、代码解析三、使用方法四、知识扩展轻松检测麦

Python实现数据可视化图表生成(适合新手入门)

《Python实现数据可视化图表生成(适合新手入门)》在数据科学和数据分析的新时代,高效、直观的数据可视化工具显得尤为重要,下面:本文主要介绍Python实现数据可视化图表生成的相关资料,文中通过... 目录前言为什么需要数据可视化准备工作基本图表绘制折线图柱状图散点图使用Seaborn创建高级图表箱线图热