精华内容
下载资源
问答
  • 帧检验序列
    万次阅读
    2019-11-27 13:32:26

    在数据链路层要解决数据传输的三个问题:

    • 封装成帧
    • 透明传输
    • 差错检验

    这里,重点讨论一下差错检测里面最常用的一种检测算法,循环冗余算法(CRC)以及通过这个算法生成的帧检验序列(FCS)

    FCS802.3帧和Ethernet帧的最后一个字段(4字节).

    帧校验序列(FCS)是指特别的检测码字符被添加到在一个通信协议中的帧中进行检错和纠错。发送主机在整个帧中有一个检测码随着发送。接收主机在整个帧中的检测码使用相同的运算法则,并将它与接收到的 FCS 相比较。这样,它能够探测是否任何数据在运输中丢失或被改变。它可能当时丢失这个数据,和请求错误帧的重传。一个循环冗余码校验常被用来估算 FCS。

    FCS 字段 — 包含帧的 32 位循环冗余校验 (CRC), 数据链路层帧方式接入协议(LAPF)中的字段,是一个16比特的序列。它具有很强的检错能力,它能检测出在任何位置上的 3 个以内的错误、所有的奇数个错误、16个比特之内的连续错误以及大部分的大量突发错误。

    一个符合长度但FCS错误的信息包可能有几种可能的问题。问题可能是延迟碰撞,坏的网卡或驱动器,电缆,集线器或是噪声等。一般而言,主要是物理链路层的错误引起的。

    比如:1、阻容匹配不合适,电阻值偏大或偏小,电容型号的匹配都会造成FCS错误的产生。还有电阻电容的错焊或者漏焊以及虚焊都容易造成这种问题。2、PCB线路的设计问题,尤其是千兆以太网的PCB设计,千兆信号的对信号质量要求很高,如果线路排列不合理,会造成线间串扰,影响信号质量。3、FCS错误主要发生在PHY与RJ45接口之间的链路上,所以出现FCS错一定需要排查PHY与RJ45之间的错焊、漏焊、虚焊等问题。4、在一些设备生产厂遇到FCS错误出现的问题,也可能是由于使用的物理连接介质质量太差造成的(千兆以太网对网线的要求至少是超5类线缆),还包括RJ45的水晶头的制造(制作)工艺。5、FCS错误的出现,我们可以通过使用以太网测试仪来检测到,通过强压力的冲击,容易暴露一些错焊,虚焊的问题。

    如果有1%以上的帧是FCS错误就必须作为严重问题来对待。因为它严重影响网络的吞吐量。

    其他参考:https://blog.csdn.net/swang_shan/article/details/79303586

    更多相关内容
  • 我们知道数据链路层广泛使用循环冗余检验CRC的检验技术现在我们知道要发送的数据M=101001(长度为k=6) 在我们每次发送数据的时候需要在M后面添加一个N位的冗余码,一共发送(k+N)位数据这N位冗余码的计算方法如下:用...

    我们知道数据链路层广泛使用循环冗余检验CRC的检验技术

    现在我们知道要发送的数据M=101001(长度为k=6)  在我们每次发送数据的时候需要在M后面添加一个N位的冗余码,一共发送(k+N)位数据

    这N位冗余码的计算方法如下:

    用二进制的膜2运算进行2^N(这是2的N次方)乘M的运算 就是说在M这个数后面添加N个0  比如 初始M=101001   进行运算之后M=101001000(n=3)

    将的到的M除以收发双发实现约定的长度(n+1)位的数P  假定P=1101(n=3) 经模2除法运算的到的结果:商Q=110101 余数R=001(不满N位往前补0)Q没有什么用 ,但是这个余数R就是我们所求的冗余码

    我们将这个冗余码R添加到M之后 :M=101001001 (M是之前给的最原始的M)

    下面具体来说一下 具体怎么求R:

    在二进制进行运算的时候全部都用XOR(异或进行运算(就是相同为0 不同为1    1xor1=0 0xor0=0   1xor0=1 ))

    ee2c0a2834a22db12b20f2addee78093.png

    看图这样我们就能得到R

    来个例题:

    我们要发送的数据为M=101110 采用CRC的生成多项式是P(x)=X^3+1  所以我们的到的p=1001

    得到的R=110   (计算完毕,图画的有点丑见谅)

    132e1a12b65117fae60a9bc13d404551.png

    展开全文
  • 循环冗余检验算法(CRC)与帧检验序列(FCS)

    万次阅读 多人点赞 2018-01-22 13:04:25
    这里,重点讨论一下差错检测里面最常用的一种检测算法,循环冗余算法(CRC)以及通过这个算法生成的帧检验序列(FCS)首先,我们知道,数据在传输过程中可能会因为外界的电磁干扰从而使数据产生差错。使原来的0变为1...

    在数据链路层要解决数据传输的三个问题:

    • 封装成帧
    • 透明传输
    • 差错检验

    这里,重点讨论一下差错检测里面最常用的一种检测算法,循环冗余算法(CRC)以及通过这个算法生成的帧检验序列(FCS)

    首先,我们知道,数据在传输过程中可能会因为外界的电磁干扰从而使数据产生差错。使原来的0变为1,原来的1变为0。这叫做比特差错。在一段时间内,传输错误的比特占传输比特总数的比率称为误码率。所以说,正因为如此,我们开始采用各种检验差错的措施,而最广泛使用的就是循环冗余检验(CRC)

    通过一个例子来说明CRC的原理:

    首先在发送端,先把需要发送的数据划分为组,假定每组k个比特。现假定待传送的数据M为101001(k=6)。CRC运算就是在数据M的后面添加供差错检验用的n位冗余码,然后构成一个帧发送出去,一共发送了(k+n)位。

    这n位冗余码可以利用以下的这个方法得到:

    CRC

    首先我们在原来的数据后面加n个0,这样原来的数据就相当于左移了3位,也就是M*8,然后将加0之后得到的(k+n)位的数除以双方事先商定好的长度为(n+1)位的除数P,得出的商是Q而余数为R(n位)。接下来,让我们看看这个计算过程:

    • 1、数据前四位是1010,首位是1,除数为1101,所以我们先商1
    • 2、然后写在下面的就是1101,与1010进行不进位加法,结果为1110
    • 3、1110的首位依然是1,继续商1,然后进行不进位加法,结果为0111
    • 4、0111的首位为0,所以商0,然后同样不进位加法,结果为1110
    • 5、就这样一直往后算,直到最后求得余数R

    从图中可以看出,最后得出的余数R为001,这个余数R就作为数据M后面添加的n位冗余码。即,R就是所谓的帧检验序列(FCS)

    强调一下:循环冗余检验CRC是一种检验方法,而FCS是添加在数据后面的帧检验序列。检错方法有很多,我们也可以选用别的检错方法。

    然后,就是接收端接收的时候,对接收到的数据以帧为单位进行CRC检测:把收到的每一帧都除以同样的除数P,然后检测得到的余数R。

    如果传输过程中没有差错,那么经过CRC检验后得出的余数一定为0;如果R≠0,那么再传输过程中,肯定会有差错,则这个帧就丢弃。

    还有一种情况就是:如果出现误码,余数R仍然等于0。通过实际检测计算,出现这种情况的概率非常非常小。

    在数据链路层,发送端帧检验序列FCS的生成和接收端的CRC检验都是用硬件完成的,处理很迅速,因此并不会延误数据的传输。

    从上述我们也可以看出,如果想要进行差错检验,加入冗余码,就必须以帧为单位来传送数据,然后每一帧都加入冗余码,一帧一帧发送,接收端一帧一帧检验。

    注:CRC检验只能保证接收端接收到的帧没有差错,至于有没有出现帧丢失,帧重复,帧失序,是无法判断的。

    过去,由于通信链路质量不好引起差错的概率比较大,所以,我们要求数据链路层向网络层提供可靠传输,增加了帧编号,确认和重传机制。提供可靠传输的协议是高级数据链路控制(HDLC)。但是,现在由于通信链路的质量已经大大提高,误码率大大降低,所以对于现在的Internet采取了区别对待的方法:

    • 对于通信质量良好的有限传输链路,数据链路层不提供可靠传输,如果数据链路层的数据出了差错,则改正差错的的任务就由上层协议来完成。
    • 对于通信质量较差的无线传输链路,数据链路层使用确认和重传机制,向上层提供可靠的传输服务。

    通过实践证明,这样做可以提高通信效率。

    展开全文
  • CRC码计算及原理(FCS校验序列生成)

    千次阅读 多人点赞 2019-11-12 20:06:36
    全称:Frame Check Sequence,中文名:帧检验序列 这个东西是用来检验我们的数据是否在传输的过程中被破坏(不一定是收到攻击,也可能是一些物理干扰),以更好的安排重发。 而其中最常用的,也是检错能力很强的,...

    我们知道在以太网帧的末尾有一个叫FCS的东西。
    全称:Frame Check Sequence,中文名:帧检验序列
    这个东西是用来检验我们的数据是否在传输的过程中被破坏(不一定是收到攻击,也可能是一些物理干扰),以更好的安排重发。
    而其中最常用的,也是检错能力很强的,就是CRC,循环冗余校验码。

    操作流程

    一个小背景知识

    模二除法,或者说在数域{1,0}上的除法。
    与普通除法类似,它也可以列竖式计算,但是唯一不同的,是相减的那一步。
    我们这里的除法,在相减时,遵循一下规则:

    1. 1-1=0
    2. 1-0=1
    3. 0-1=1
    4. 0-0=0
    5. 不进位,也不借位

    举个例子。
    模2除法
    我相信应该很清楚了。(手画的,不容易)

    生成

    首先,我们需要一个除数,这个除数可以按照某个行业标准来,比如:

    IBM的SDLC(同步数据链路控制)规程中使用的CRC-16为:11000000000000101,在ISO HDLC(高级数据链路控制)规程、ITU的SDLC、X.25、V.34、V.41、V.42等中使用CCITT-16为:11000000000100001。

    当然这里做个实验,我们也可以随机生成,但是有一点要求,最高位和最低为必须为1,这一点需要注意。

    接下来,我们把数据左移(k-1)位,补零,这就是我们的被除数。
    然后用这个被除数和除数做模二除法得到余数。
    这个余数(k-1位,不足的话,左侧补零),就是加在数据末尾的FCS。
    然后我们把它加在数据末尾即可。

    校验

    那么我们如何校验呢?
    直接把我们得到的串(包含FCS),对除数再做一次模二除法,如果余数是零,则说明数据完好。如果不为0,则说明数据遭到破坏,需要安排重发。

    代码实现

    相信看了上面的内容,应该很容易实现代码,下面给出我写的代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #include<ctime>
    using namespace std;
    struct bin{//二进制数据 
    	int num[100000];
    	int len;
    	void init(){//初始化为0 
    		len=1;
    		memset(num,0,sizeof(num));
    	}
    	void read(){//读入数字 
    		char c[100000];
    		scanf("%s",c);
    		len=strlen(c);
    		for(int i=0;i<len;i++){
    			num[i]=c[len-i-1]-'0';
    		}
    	}
    	void clean(){//清除前导0 
    		for(int i=99999;i>=0;i--){
    			if(num[i]==1){
    				len=i+1;
    				return;
    			}
    		}
    		len=1;
    	}
    	void gen(int k){//随机生成 
    		len=k;
    		num[len-1]=num[0]=1;
    		for(int i=1;i<len-1;i++){
    			num[i]=rand()%2;
    		}
    	}
    	bin operator =(bin b){//赋值符号 
    		len=b.len;
    		for(int i=0;i<len;i++){
    			num[i]=b.num[i];
    		}
    		return *this;
    	}
    	bin operator +(bin b){//加法 
    		bin c;
    		c.init();
    		c.len=max(b.len,len);
    		for(int i=0;i<c.len;i++){
    			c.num[i]=num[i]+b.num[i];
    		}
    		return c;
    	}
    	bin operator <<=(int b){//左移 
    		for(int i=len-1;i>=0;i--){
    			num[i+b]=num[i];
    			num[i]=0;
    		}
    		len+=b;
    		return *this;
    	}
    	bin operator /(bin b){//除法取余数(返回值为余数) 
    		bin c;
    		c.init();
    		c=*this;
    		for(int i=c.len-1;i>=0&&i>=(b.len-1);i--){
    			if(!c.num[i]){
    				continue;
    			}
    			for(int j=i;j>i-b.len;j--){
    				c.num[j]-=b.num[j-i+b.len-1];
    				if(c.num[j]<0){
    					c.num[j]=1;
    				}
    			}
    		}
    		c.clean();
    		return c;
    	}
    	int operator ==(bin b){//等于号 
    		if(b.len!=len){
    			return 0;
    		}
    		for(int i=0;i<len;i++){
    			if(num[i]!=b.num[i]){
    				return 0;
    			}
    		}
    		return 1;
    	}
    	void print(){//打印 
    		for(int i=len-1;i>=0;i--){
    			printf("%d",num[i]);
    		}
    		printf("\n");
    	}
    };
    int main(){
    	//设定k值 
    	int k=5;
    	srand(time(0));
    	//定义各种量 
    	bin text,key,div,txt,zero;
    	//初始化 
    	div.init();
    	key.init();
    	txt.init();
    	zero.init();
    	text.init();
    	//生成 
    	text.read();//读入数据 
    	key.gen(5);//生成除数 
    	txt=text; 
    	txt<<=(k-1);//数据左移 
    	div=txt/key;//取余数 (FCS) 
    	txt=txt+div;// 合成 
    	//模拟破坏  
    //	txt.num[txt.len/2]^=1;
    	//校验
    	txt=txt/key;
    	if(txt==zero){
    		printf("The data are OK!");
    	} else{
    		printf("The data are fault!");
    	}
    	return 0;
    } 
    

    还可以完善的,我就不进一步完善了。

    一些数学原理

    之前有说数学背景,但是那只是为了能理解其过程,但并不能让我们明白为什么是这样。
    所以这里扩展了一块内容,根据兴趣阅读一下吧!

    生成多项式

    不知道怎么说,就举例说明吧。

    在这里插入图片描述
    其对应的除数分别为:

    1. 11000000000000101
    2. 10001000000100001
    3. 100000100110000010001110110110111

    我相信你应该明白了。

    为什么余数为0

    我们刚刚介绍了模二除法。
    这里我们再说一个模二加法。

    1. 1+1=0
    2. 1+0=1
    3. 0+0=0
    4. 不进位

    为什么是这样定义?
    因为模二。
    所以你只要让结果对2取模,你就知道为什么会这样了。
    我们设原数据左移后为t,除数为a,商为s,余数为r。
    所以有:t=as+r
    而我们传递的是t+r
    即t+r=a
    s+r+r
    有什么问题?
    我们看一下r+r
    注意这里是模二加法,不进位,且1+1=0+0=0,
    而r和r是一样的,所以模二相加后,就是0!
    所以式子变为:t+r=a*s
    这样的话(t+r)模二除以a,自然余数为0。
    这就是为什么我们可以这么做。

    校验成功一定没错吗?

    不一定!
    有可能会出现某几位错了,但是判断结果是对的。
    那么概率是多少呢?
    假设FCS为32位(4字节)
    数据我们取为8000位(1000字节,此处数据大小取了一个中值,以太网帧中的数据通常为46~1500字节)(当然了,其实从后面的结果可以知道此处并无影响)
    8000位数据,最大为8000个1,最小为1(7999个0)。
    进行二进制除法,商最大为7969位,总共有27969个可能的商。
    总共可能破坏的结果为28000.
    所以误判的概率为P=(27969-1)/28000
    也就约为1/231,即1/2,147,483,648
    这概率是多大呢?
    差不多是生一个六胞胎的概率吧。
    想一想,你身边有几个六胞胎?你听过几个六胞胎?
    因此,其检错能力是很强的。重点是算法也很简单,方便实际应用。

    结束语

    这就是今天对CRC的探究,喜欢的话点一个赞呗!
    有什么问题也欢迎与我讨论!

    展开全文
  • 循环冗余检验(CRC)求帧检验序列(FCS)

    千次阅读 2015-04-14 15:07:57
    * 循环冗余检验(CRC),求帧检验序列(FCS) * 参数:M是待传送的数据 * p是除数 * 返回:帧检验序列(FCS) * 说明:都是从0开始编号。 */ uint32_t getFCS(uint32_t M, uint32_t p) { uint32_t tmp; uint8_t ...
  • HDLC/SDLC数据通信链路规程是目前广泛采用的串行通信规程,但当前大多数文献资料就HDLC/SDLC规程校验序列的生成都未给出准确的定义,因而常常给用户造成一些概念上的模糊或误解。本文依据HDLC规程的原始定义给出...
  • 一、以太网 所有的以太网(802.3)都基于一个共同的格式。在原有规范的基础上,格式已被改进以支持额外功能 以太网格式 下图显示了当前的以太网格式,以及它与IEEE提出的一个相对新的术语IEEE分组(一个...
  • 本研究对FCS的几种主要实现方式及其检错性能进行了数学分析及研究。并对数据比特长度与检验比特长度的关系进行了讨论。
  • 教入门怎么获得你要检测序列头,还是以我的上一篇文章为例。这里直接贴出源码以供大家参考学习。 (1) 源码 module seq_rd( input clk, input rst_n, input data_in, output [7:0] out_data0, output...
  • 帧检测序列错误(FCS)

    千次阅读 2014-05-19 15:08:07
    帧检测序列错误(FCS)FCS是802.3和Ethernet的最后一个字段(4字节).校验序列(FCS)是指特别的检测码字符被添加到在一个通信协议中的中进行检错和纠错。发送主机在整个中有一个检测码随着发送。接收主机...
  • 察看到逐步进抓图的存储是按序列编排文件名,那么要修改好使得每个文件名都是以规则“文件名”+“帧序列”的形式存在。 (4)编写根据帧序列图生成帧率25的视频的代码 三、问题的解决: (1)解决一个字符串合并...
  • 利用多帧检测的绘图序列对低可观测目标进行跟踪的方法
  • Pdplayer 64位版(序列帧动画播放器)由Asynthetic创造的一款功能专业的图像文件序列帧播放程序。应用于3D,CG和视觉特效行业的专业图像序列播放器,功能全面,且快而轻。支持大多数文件格式如:EXR、HDR、DPX、CIN、...
  • 2. 在当前界面渲染完毕之后,因为粒子特效使用的是加法着色器,所以使用黑白摄像机渲染之间的差异来创建检测Alpha(创建的时候推荐用RenderTexture.GetTemporary,unity自带的一个RenderTexture对象池),把通过...
  • 校验序列码FCS

    千次阅读 2010-09-10 22:32:00
    在上位机与PLC通信中,为了更好的校验发送与接收的数据的准确性,一般都会加一位校验位,校验码的算法有多种,校验序列码FCS就是其中的一种。 校验序列码FCS ( Frame Check Sequences)是为提高通信的可靠性...
  • 基于噪声级估计的视频序列中运动补偿插值的检测
  • 为了解决数据量巨大的极光序列图像难于用人工划分的方法来进行变化监测的问题, 提出了一种基于极光序列图像特征和间信息的感兴趣极光变化区域ROI自动检测算法, 用计算机进行辅助分类。首先提取样本图像特征, 再...
  • 为了解决数据量巨大的极光序列图像难于用人工划分的方法来进行变化监测的问题, 提出了一种基于极光序列图像特征和间信息的感兴趣极光变化区域ROI自动检测算法, 用计算机进行辅助分类。首先提取样本图像特征, 再...
  • 利用zc序列进行简单的同步

    千次阅读 2021-04-26 14:11:19
    ,为了能正确分离各路时隙信号,在发送端必须提供每的起始标记,在接收端检测并获取这一标志的过程称为同步嵌牛鼻子:同步 zc序列嵌牛提问:怎么减少信噪比较低时同步的地板效应?嵌牛正文:zc序列的产生...
  • Python:ffmpeg视频转换为/图像序列

    千次阅读 2020-07-31 23:28:56
    前言 ffmpeg本是一套多媒体操作开源程序,能够对视频...视频转/图像序列 这个需求是因为需要做一个异常视频检测的任务所产生的。 在Linux命令行下: ffmpeg -i ./data/darendaxiaohai.mp4 -r 2 -s 200,112 -ss 00:00
  • 针对视频拷贝检测中检索速度问题,提出一种...然后根据视频关键帧序列建立了类局部敏感哈希索引,利用建立好的索引获得拷贝检测结果。实验结果表明,该方法在保证检测精度的同时,速度上也有很大提升,具有重要的应用价值。
  • 【实验目的】 (1)学会解决的同步和频偏校正问题; (2)理解的同步和频偏校正的原理; (3)实现基于训练序列的相关性的同步和基于Moose算法的频偏校正。
  • 主要给大家介绍了关于Java图片处理之获取gif图一图片的两种方法,分别是利用Java原生代码和使用im4java调用ImageMagick来实现,两种方法都给出来示例代码供大家参考学习,需要的朋友们下面来一起看看吧。
  • 针对自然环境中因摄像机抖动造成无法准确检测运动目标的问题, 提出一种结合分块灰度投影、背景差分与连续间差分法的运动目标检测算法。该算法通过将图像进行分块处理, 结合离散化决策机制去除灰度梯度变化低及...
  • CRC序列发生

    2012-12-01 13:14:36
    MATLAB程序,对序列添加CRC校验位输出的是带有校验位的CRC序列
  • 同时,设计一种双层查询的方法以获得最相似的图像,并对最相似图像进行一致性检验,确保闭环的准确性。在闭环检测主流公开数据集New College和City Centre上,所提算法在100%准确率下的召回率为83%,在99%准确率下的...
  • CRC 检验

    千次阅读 2020-08-19 20:22:32
    2019-09-07 现实的通信链路都不会是理想的。这就是说,比特在传输过程中可能会产生差错;...因此,为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。目前在数据链路层广泛

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,876
精华内容 17,150
关键字:

帧检验序列

友情链接: plus-program.zip