zoukankan      html  css  js  c++  java
  • 数据链路层(2) 差错控制

    一、差错控制

      数据在传输过程中,由于信道受到噪声干扰的影响,信号波形传到接收方就可能会发生错误,为了把这些错误减到预期要求,就需要进行差错控制。

      差错控制的原理很简单,就是在被传送的K位信息后附加r位的冗余位,接收方对收到的信息应用同一算法,将结果与发送方的结果进行比较,若不相等则数据出现了差错。如果接收方知道有差错发生,但不知道是怎样的差错,然后向发送方请求重传,这种策略称为检错;如果接收方知道有差错,而且知道是怎样的差错,这种策略称为纠错

      差错控制有两种,分别是位出错和帧出错

      位出错:就是传输的比特位出错,如1变为0,0变为1。

      帧出错:有三种可能分别是丢失,重复,失序。实例如下:

        发送方:发送 帧1、帧2、帧3 三个帧。

        接收方(丢失):只收到帧1、帧3,这就是丢失。

        接收方(重复):收到帧1、帧2、帧2、帧3,就是重复了。

        接收方(失序):收到帧1、帧3、帧2,这就是帧失序。

      出现了相关的错误,那我们就需要从数据链路层向网络层提供的服务上去询求解决问题的办法,数据链路层向网络层提供三种基本功能:1、无确认无连接服务,2、有确认无连接服务,3、有确认面向连接服务

    二、数据链路层的差错控制

       如图:

      

       比如PCA要与PCB进行通信,那么需要一条通信的链路及一系列的通信设备,如果整条通信线路没有差错控制机制,那么PCA的数据帧要发送到PCB之后,才发现数据是错误的;如果在通信链路上的路由器上有差错控制机制,那么从PCA向PCB发送的数据,就会在距PCA最近的路由器处被检测出错有数据帧出错,需要PCA重新发送,正确的数据帧可以先发向PCB端,那么这整条链路就可以节省资源,这就是数据层的差错控制方式。

      数据链路层的差错控制主要针对在链路上传输的比特位出错,主要有两种控制方法,分就是检错编码和纠错编码上面提到过相关的概念。检错编码包含奇偶校验码和循环冗余码CRC,而纠错编码包含海明码。

      

      数据链路层的编码与物理层编码的区别:

      数据链路层编码与物理层编码和调制不同,物理层编码针对的是单个比特,解决传输过程中比特的同步问题,如曼彻斯特编码。数据链路层的编码针对的是一组比特数据,它通过冗余码的技术实现一组二进制比特数据在传输过程的差错控制。

      

    三、检错编码(奇偶校验码) 

      奇偶校验码由N-1位信息元和1位校验元组成。N-1位的信息元就是我们发送信息里的有效数据,而1位校验元就是用于检错的冗余码。

      奇偶校验码可以分为奇校验码和偶校验码

      奇校验:这串序列1的个数如果为偶数则在前面加个1,使1的个数变成奇数,否则加0。

      偶校验:这串序列1的个数如果为奇数则在前面加个1,使1的个数变成偶数,否则加0。

      实例:

      (1)1111 奇校验就是 11111 偶校验就是 01111。
      (2)1110 奇校验就是 01110 偶校验就是 11110。

      奇偶校验码的特点:

      只能检查出奇数个比特错误,检错的能力为50%,无法纠错

      

      怎么理解这个特点呢?

      我们来看一个实例:比如PCA向PCB发送一串比特位是1101010,采用奇校验码,那么通过奇校验加入冗余位的比特位是11101010,当PCB收到比特位是11101011,那么通过奇校验,我们就知道了在传输过程中有数据发生错误,因为此时1的个数变成了偶数。当如果PCB收到的比较位是11101001,1的个数任然是奇数,此时采用的奇校验是无法检测出错误的,所以,采用奇检验只有50%的检错能力。

    四、检错编码(CRC循环冗余检验码)

      CRC循环冗余检验码是一种通过多项式除法检测错误的方法,将每个比特串看作一个多项式,采用模2运算。下面是一个简单的CRC循环冗余检验码的原理图:

      

      

      然后,我们再来做一个实例,就很容易的可以理解CRC循环冗余检验码,当发送方要发送的帧为1101011011,生成多项式 G(x)= x4 + x + 1,则 r = 4,r为何是4,其实就是生成多项式最大的x4 ,此时  r = 4 ,所以则在帧后附加4个0。

      帧为:1101011011 

      生成多项式 G(x)= x4 + x + 1 = 10011 (对应x位写1,没有对应的位填0,就成为相应的生成多项式G(x))。

      发送端计算的过程是:要发送的数据帧 + r 位的校检序列 得到要发送的数据帧然后与生成多项式进行模2除法运算,取余数,这个余数就是需要增加的FCS帧检验序列

        

      通过计算,可以得到余数为1110,那么实际发送的帧为11010110111110。

      接收端计算的过程是:当接收端收到帧11010110111110 与 生成多项式进行模2除法运算,然后检查得到的余数,如果余数为0,则表示传输过程是正常的则接收数据,则否是存在错误的则丢弃数据

      注:在数据链路层仅使用CRC循环冗余检验码差错控制技术,只能做到对帧的无差错接收,有错误的帧会被丢弃。链路层使用的CRC循环冗余检验码差错控制技术,能实现比特帧的无差错传输,但这还不是可靠传输。

    五、纠错编码(海明码)

      海明码是奇偶校验码的另一种扩充。和奇偶检验码的不同之处在于海明码采用多位校验的方式,在这些多个校验位中的每一位都对不同的信息数据位进行奇偶校验,通过合理地安排每个检验位对原始数据进行的校验的组合,可以达到发现错误、纠正错误的目的。

      假设数据位有m位,如何设定校验位(冗余位)k的长度才能满足纠正一位错误的要求呢?这里做一个推导。

      k位的检验码可以有2k个值。显然,其中一个值表示数据是正确的,而剩下的 2k -1 个值意味着数据中存在错误,如果能够满足2k -1个值意味着数据中存在错误,如果能够满足 2k -1 > m + k ( m + k为编码后的数据总长度),则在理论上 k 个校验码就可以判断是哪一位(包括信息码和校验码)出现了问题。

      当 m = 4 时,计算得 K  = 3 。

      注:海明码可以同时发现两位比特错误,纠正一位比特错误错误

       注意:检错编码与纠错编码的区别:检错编码可以发现错误,但是它并不能具体到哪一位发生错误,而纠错编码则不同,它不仅可以发现错误,还可以知道是那一位发生了错误,并纠正错误。

      

  • 相关阅读:
    python--将jenkins配置的任务导出到Excel
    python--终端工具之subprocess
    jquery-触底加载无限滚动
    python-比较字典value的最大值
    Linux-查看cpu核数和个数、查看内存的命令
    python读取本地正在运行的docker容器
    关于get 和post 方法的比较
    git相关的一篇不错的文章
    Java 函数调用是传值还是传引用? 从字节码角度来看看!
    Unity3D移动平台动态读取外部文件全解析
  • 原文地址:https://www.cnblogs.com/PBDragon/p/14912252.html
Copyright © 2011-2022 走看看