引用https://blog.csdn.net/wenqiang1208/article/details/71641414

为什么引入CRC

现实的通信链路都不会是理想的。这就是说,比特在传输的过程中可能会产生差错:1可能会变成0,0可能会变成1,这就叫做比特差错。在一段是时间内,传输错误的比特占所传输比特总数的比率成为误码率BER(Bit Error Rate)。误码率与信噪比有很大的关系,在实际通信中不可能使误码率下降到零。 
因此,为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。 
目前在数据链路层广泛使用了循环冗余检测CRC的检测技术

CRC的原理

CRC运算实际上就是在数据长为k的后面添加供差错检测用的n位冗余码,然后构成帧k+n位发送出去。

首先来介绍几个概念 
(1)模2运算:实际上是按位异或运算,即相同为0,相异为1,也就是不考虑进位、借位的二进制加减运算。如:1111+1010 = 0101 
(2)FCS:其实就是冗余码,帧检验序列(Frame Check Sequence) 
(3)生成多项式:其实就是除数,比如下面将要用到的除数p = 1101

计算n位冗余码

现假定待传输的数据M = 101001(k = 6),除数p = 1101 (n = 3)比n多一位 
这n位冗余码可以用下面的方法得出。 
(1)用二进制的模2运算进行(2^n)乘M的运算,相当于在M后面添加n个0。 
即M后面添加3个0 
(2)现在得到M = 101001000(k+n = 9)位的数除以除数p(n = 3)位, 
得到商是Q(不关心),余数R =001(n位)R就是冗余码FCS

现在加上FCS后发送的帧是101001001 

在接收端把接收到的数据M = 101001001以帧为单位进行CRC检验:把收到的每一个帧都除以相同的除数p(模2运算),然后检查得到的余数R。 
如果在传输过程中没有差错,那么经过检验后得到余数R肯定是0。 
(读者可以自己检验下,被除数现在是M = 101001001,除数P= 1101,看余数是否为0) 
总之,在接收端对接收到的每一个帧经过CRC检验后,有两种情况: 
(1)余数R = 0,则判断这个帧没有问题,就接受 
(2)余数R != 0,则判断这个帧有差错,就丢弃。

总结一下:

在数据链路层若仅仅使用CRC差错检验技术,则只能做到对帧的无差错接收。

数据链路层差错检测之循环冗余检验CRC的更多相关文章

  1. 循环冗余检验 (CRC) 算法原理

    Cyclic Redundancy Check循环冗余检验,是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误. 算法原理 假设数据传输过程中需要发送15位的二进制信息g=10100 ...

  2. crc循环冗余检验

    CRC(Cyclic Redundancy Check):循环冗余检验.在链路层被广泛使用的检错技术. CRC原理: 1.发送端 1.1.在发送端先将数据分组,每组k个数据.假定要传送的数据是M. 1 ...

  3. C#,Java,C -循环冗余检验:CRC-16-CCITT查表法

    C#代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...

  4. 循环冗余检验算法CRC

    http://blog.csdn.net/liyuanbhu/article/details/7882789 首先要了解多项式乘法,除法 了解模2运算的含义,多项式除法后合并同类项时..系数%2处理 ...

  5. 数据链路层--PPP协议

    数据链路层使用的信道主要有两种类型:点对点信道和广播信道. 点对点 路由器在转发分组时只使用了下面的三层. 链路是从一个结点到相邻结点的一段物理线路,中间没有其他交换结点. 必须有一些必要的通信协议来 ...

  6. 计算机网络--差错检测(帧检验序列FCS计算方法)

    我们知道数据链路层广泛使用循环冗余检验CRC的检验技术 现在我们知道要发送的数据M=101001(长度为k=6)  在我们每次发送数据的时候需要在M后面添加一个N位的冗余码,一共发送(k+N)位数据 ...

  7. 计算机网络-3-5-以太网MAC层及交换机

    MAC层的硬件地址 在局域网中,硬件地址又称为物理地址或者MAC地址(因为这种地址用在MAC帧中) IEEE 802标准为局域网规定了一种48位(6字节)的全球地址,固化在适配器的ROM中. 如果计算 ...

  8. CRC循环冗余校验算法

    现实中通信链路都不会是理想的,比特在传输的过程中可能会出现差错,0变成1,1变成0.这就叫做比特差错.因此为了保证数据传输的可靠性,在计算网络传输数据时,必须采用各种检验措施来处理比特差错.在数据链路 ...

  9. CRC检错技术原理

    一.题外话 说来惭愧,一开始是考虑写关于CRC检错技术更深层次数学原理的,然而在翻看<Basic Algebra>后,我果断放弃了这种不切实际的想法.个人觉得不是因为本人数学水平差或者能力 ...

随机推荐

  1. CSS基础知识:常见选择器示例

    CSS(Cascading Style Sheet),中文译为层叠样式表,可以让设计者方便灵活地控制Web页面的外观表现.CSS是1996年由W3C审核通过并且推荐使用的.CSS的引入,就是为了使HT ...

  2. C#多线程学习(三) 生产者和消费者

    前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. ...

  3. 数据库_mysql多表操作

    多表操作        实际开发中,一个项目通常需要很多张表才能完成.例如:一个商城项目就需要分类表(category).商品表(products).订单表(orders)等多张表.且这些表的数据之间 ...

  4. 1. Python2 ,Python3区别

    Python2: 1. 源码都含有PHP,Java,C等语言的规范陋习. 2.重复代码比较多. Python3: 源码很规范,清晰,简单,符合Python的宗旨.

  5. linux 修改主机名 【root@主机名 ~】

    centos 7修改方式: hostnamectl  set-hostname   hostuser reboot 或者直接vi /etc/hostname 添加内容: hostuser 检查修改效果 ...

  6. [Swift]字符串(String类、NSString类)常用操作

    NS是Cocoa类对象类型的前缀,来源于乔布斯建立的另一家公司--NeXTNSString的使用方法,和Swift语言中的String有很多相似之处. 1.字符串的定义String类 var str1 ...

  7. CentOS安装搭建zookeeper

    原文连接:https://www.cnblogs.com/rwxwsblog/p/5806075.html zookeeper集群搭建(三台) 注意关闭机器防火墙! 配置ip别名:编辑文件  # /e ...

  8. [译文]casperjs使用说明-测试

    capserjs自带了一个测试框架,它提供了一个使你能够更容易的测试你的web应用的工具集. 注意: 1.1版本变更 这个测试框架,包括它的所有API,仅能使用在casperjs test子命令下 如 ...

  9. P5108 仰望半月的夜空

    题目链接 题意分析 给你一个字符串 让你求\(1-n\)长度下的字符串的中字典序最小并且最靠左的字符串的开头位置 我们考虑先建出\(SA\) 然后考虑对于一个字符串后缀排序之后 baba 后缀排序之后 ...

  10. 面试笔试(C++部分)

    1.define 和const,inline的区别 define的缺点: 1.边界效应(必须加括号,才能避免边界效应) #define MUL(A,B) A*B 而在使用的时候,这样的调用: ,b=, ...