zoukankan      html  css  js  c++  java
  • 循环冗余检测(CRC)

    循环冗余检测(CRC)

    链路层通常会具有差错检测的功能,使用的方法是发送方 在数据字段D 后加上EDC字段,在接收方会检验EDC字段来查看D是否出错。而如今广泛应用的计数就是 循环冗余检测(CRC)。

    我们考虑d bit的数据D,发送结点要将它发送给接受结点。

    详解

    发送方

    • 发送方首先与接收方协商一个 r+1 bit的数字当除数,这个数字成为生成多项式,记为G——可以随机选择,也可按国际上通行的标准选择,但最高位和最低位必须均为“1”;
      • 生成多项式,若它给你的为 P(x) = x3+1,那么G = 1001
    • 在数据M后面添加供差错检测的 r 位冗余码,然后构成一帧发送出去,一共发送(d+r)位;
      • 虽然添加n位冗余码增大了数据传送的开销,但是可以进行差错检测,当传输可能出现差错时,付出这种代价是值得的。
    • 冗余码计算:
      • 用二进制模2运算进行D * 2r(相当于D左移r位)的运算。意思就是在D后面补r个0。现在D就变成了d+r位;
      • 用M除以收发双方事先商定的长度为r+1的除数G;
      • 得到的余数R,这个R就是FCS(帧检验序列)。将这个FCS序列加到M上然后发出去。

    接收方

    • 在接受端把接受到的数据以帧为单位进行CRC校验 ;
    • 把收到的每一个帧都除以同样的除数G,然后检查余数R;
    • 如果余数R为0,如果在传输过程中没有差错
    • 如果出现误码,那么余数R为零的概率是非常小的。

    例子

    D=101001 G=1101 r=3。

    发送端

    • M=D * 2r ;
      则:M=101001000;
    • 用M除以P

    • 得到余数R也就是FCS,将FCS加到M上,就得到了要发送的帧。
      D=101001000+FCS=101001001

    接收端
    接收到的每一帧都要进行差错检验,假设收到101001001,P=1101。

    最后余数R=0,则判定这个帧没有出错。

  • 相关阅读:
    WebSocket属性的简介及使用
    JAVA_基础逻辑运算符与位运算符使用
    JAVA_基础数据类型介绍与基本数据类型之间的运算规则
    ES6特性整理
    Vue-cli中的安装方法
    Kubernetes核心原理(一)之API Server
    Kubernetes核心原理(四)之Kubelet
    kubernetes-整体概述和架构详解
    Kubernetes dashboard认证访问
    kubeadm HA master(v1.14.0)离线包 + 自动化脚本 + 常用插件 For Centos/Fedora
  • 原文地址:https://www.cnblogs.com/TRY0929/p/14806309.html
Copyright © 2011-2022 走看看