精华内容
下载资源
问答
  • fcs帧校验序列
    万次阅读
    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码计算及原理(FCS帧校验序列生成)

    千次阅读 多人点赞 2019-11-12 20:06:36
    我们知道在以太网的末尾有一个叫FCS的东西。 全称: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的探究,喜欢的话点一个赞呗!
    有什么问题也欢迎与我讨论!

    展开全文
  • FCS校验工具

    2014-08-13 14:45:58
    FCS校验码计算工具。通信用的,小巧灵珑
  • crc 的核心计算 方法 模二除法

    举例子 CRC16 CCITT
    被除数是 0x11021 最高位不参与运算 被除数就是 0x1021 (16bit,0x11021 已经是17bit) 不懂原理之前
    懂原理之后 只是计算的时候 异或运算将 最高位 消灭掉了 就成了 0x1021

    模二除法运规则 (来源网络整理)
    当余数位数与除数位数相同时,才进行异或运算,余数首位是1,商就是1,余数首位是0,商就是0。当已经除了几位后,余数位数小于除数,商0,余数往右补一位,位数仍比除数少,则继续商0,当余数位数和除数位数一样时,商1,进行异或运算,得新的余数,以此至被除数最后一位。

    crc 检验码位 计算后的余数
    除数是0 << 16
    商为 0
    被除数是 0x11021
    余数是 0

    除数是1 << 16
    商为 1
    被除数是0x11021
    余数是0x1021

    除数是 2 << 16
    被除数是 0x11021
    余数是0x2042

    实际发送的数据=( 原数据<<(CRC的冗余计算的宽度)) | (CRC)

    现在百度查的资料一出来文字描述的方法, 和实际的用法有出入
    文字描述的过程是人的计算过程
    计算机的计算过程 和人的计算方式不一样, 请注意

    crc table 的生成代码 ccitt 标准 生成方法
    libcrc github 中找到的

    在这里插入图片描述
    在这里插入图片描述

    CRC thread safe xmodem 计算方法 (来源网络整理)

    在这里插入图片描述

    展开全文
  • C#学习之帧校验序列FCS

    千次阅读 2017-04-24 09:38:18
    在上位机与PLC通信中,为了更好的校验发送与接收的数据的准确性,一般都会加一位校验位,校验码的算法有多种,帧校验序列FCS就是其中的一种。  帧校验序列FCS ( Frame Check Sequences)是为提高通信的可靠性...

      在上位机与PLC通信中,为了更好的校验发送与接收的数据的准确性,一般都会加一位校验位,校验码的算法有多种,帧校验序列码FCS就是其中的一种。


       帧校验序列码FCS ( Frame Check Sequences)是为提高通信的可靠性设置的。将每一帧中的第一个字符@到该帧中正文的最后一个ASCII 字符作“异或”运算(这里可能这样说更容易理解:从每一帧的第二位开始(第一位就是原始值),将后一位与前一位的异或值进行异或运算,得到的异或值就是异或结果), 并将异或的结果转换为两个ASCII码, 便得到了FCS , 它作为帧的一部分发送到接收端。接收端计算出收到的帧的FCS , 如果与发送端传送过来的FCS 不同, 可以判定通信有误。

       由于近段一直在做上位机与PLC有关的通信,了解了一种FCS算法,在此提供代码供大家交流学习:

       public static string tobcc(string s)  //帧校验函数FCS

            {

                //获取s对应的字节数组
                byte[] b = Encoding.ASCII.GetBytes(s);
                // xorResult 存放校验结果。注意:初值去首元素值!
                byte xorResult = b[0];
                // 求xor校验和。注意:XOR运算从第二元素开始
                for (int i = 1; i < b.Length; i++)
                {
                    //**进行异或运算,^=就是异或运算符,具体可查阅异或运算
                    //**异或运算:两个二进制数的每一位进行比较,如果相同则为0,不同则为1,如下面2个10进制数37、     48的二进制值异或结果为21
                    //**  37(10)       100101(2)
                    //**  48(10)       110000(2)
                    //**  21(10)       010101(2)
                    //**这里的意思是:如a^=b,就是a与b先进行异或比较,得出的结果赋值给a;
                    xorResult ^= b[i];             
                }
                //**Convert.ToString(xorResult, 16):将当前值转换为16进制;ToUpper():结果大写;
                //**这里的意思是:将xorResult转换成16进制并大写;

               //**(//**返回的结果为一个两个ASCII码的异或值
                return Convert.ToString(xorResult, 16).ToUpper();

             }   

          (注:1、本案例是C#与松下PLC通信,采用TCP/IP通信方式;

              2、松下通信协议可查看MEWTOCOL)

    展开全文
  • 帧校验序列

    2011-12-07 22:51:09
    帧校验序列详细说明,FCS,网络常校验方式。
  • 本文依据HDLC规程的原始定义给出了HDLC帧校验序列FCS的计算方法及硬件实现系统码字编码的方案。根据文中给出的方法所做的计算与RUP1-44系列单片机串行接口单元SIU实际发送与接收的数据流进行了比较,经检验,实验...
  • 一、以太网 所有的以太网(802.3)都基于一个共同的格式。在原有规范的基础上,格式已被改进以支持额外功能 以太网格式 下图显示了当前的以太网格式,以及它与IEEE提出的一个相对新的术语IEEE分组(一个...
  • 本研究对FCS的几种主要实现方式及其检错性能进行了数学分析及研究。并对数据比特长度与检验比特长度的关系进行了讨论。
  • static uint8 calcFCS(uint8 *pBuf, uint8 len){uint8 rtrn = 0;...}FCSFCS訊框檢查序列(Frame Check Sequence, FCS)為 32 位元 CRC 檢查碼。所謂的CRC錯誤就是指訊框(Frame->網路中傳輸的資料,在連結層中的最小...
  • 帧校验序列FCS

    千次阅读 2010-09-10 22:32:00
    在上位机与PLC通信中,为了更好的校验发送与接收的数据的准确性,一般都会加一位校验位,校验码的算法有多种,帧校验序列FCS就是其中的一种。 帧校验序列FCS ( Frame Check Sequences)是为提高通信的可靠性...
  • 基本原理 CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列:附加在数据序列之后的这个检验码与数据序列的内容之间存在着 ... TCP/IP网络...
  • python crc-16 crc-16校验码 crc-16校验算法 ppp(MAC)检验序列FCS 想弄明白这里要看多几遍,配合下面的例子能更快理解。 第一、CRC-16校验码计算方法: 常用查表法和计算法。计算方法一般都是: (1)、预置1个...
  • 循环冗余检验算法(CRC)与检验序列(FCS)

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

    2022-04-14 19:29:07
    以太网尾部为4字节CRC校验(帧校验序列(FCS)).如果长小于64字节,则要求"填充",以使这个的长度达到64字节。 --------------------------------- 2.2 IP(网络协议)首部 接下来是IP首部,它共有20个字节,它的...
  • 发现以太网这个东西真的涉及到太多了,我没有系统地学过网络通信,所以欠缺的东西还很多,越学发现越...FCS检验序列)是在以太网数据的尾部的4个字节的序列,而CRC是循环冗余校验码,也就是说FCS是真正位于以太
  • 为什么wireshark抓不到尾的FCS 4字节和以太网V2的前序8字节 这是wireshark的ARP包(通过type:0x0806可以知道) 这里可以看到没有8字节的前序和4字节的FCS,而且大部分的数据链路层都是Ethernet II. 因为...
  • 循环冗余检验(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 ...
  • 检测序列错误(FCS

    千次阅读 2014-05-19 15:08:07
    帧校验序列FCS)是指特别的检测码字符被添加到在一个通信协议中的中进行检错和纠错。发送主机在整个中有一个检测码随着发送。接收主机在整个中的检测码使用相同的运算法则,并将它与接收到的 FCS 相比较。...
  • CRC校验码的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的...在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(检错序列)采用的是CRC. CCIT...
  • CRC,全称Cyclic Redundancy Check,中文名称为循环冗余校验,是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。...
  • 差错检验:发送端 环冗余检验CRC FCS帧校验序列 接收端亦CRC运算# 点到点信道的数据链路 ????P2P封装成:PPP协议的特点;更换默认HDLC协议传输 ????P2P透明传输:同步单位、零比特填充;异步字符单位、字节填充...
  • 以太网结构以及CRC校验

    万次阅读 多人点赞 2017-05-27 14:25:57
    MAC报文结构 ...以太由一个32位冗余校验码结尾。它用于检验数据传输是否出现损坏。 结构图:说一下各个字段的作用: 前同步码:第一个字段是7个字节的前同步码,1和0交替,作用是用来使接收端的适配器在接
  • /*FCS检验序列*/ int FCS ( int D , int G ) { int Dw ; /*D的位数*/ const int Gw = log ( G ) / log ( 2 ) + 1 ; /*计算G的位数,是定值*/ int temp ; /*中间变量*/ int...
  • JavaCRC校验原理

    2021-03-15 12:25:42
    1、基本原理ideCRC检验原理实际上就是在一个p位二进制数据序列以后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列;附加在数据序列以后的这个...2、几个基本概念code一、检验序列FCS(F...
  • FCS是什么?

    万次阅读 多人点赞 2019-09-07 11:43:52
    FCS帧校验序列尾)) FCS:Frame Check Sequence(帧校验序列),俗称尾,即计算机网络数据链路层的协议数据单元()的尾部字段,是一段4个字节的循环冗余校验码。 源节点发送数据时,由头和数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,025
精华内容 1,610
关键字:

fcs帧校验序列