精华内容
下载资源
问答
  • 以太网(IEEE 802.3)格式: 1、前导码:7字节0x55,一串1、0间隔,用于信号同步 2、起始定界符:1字节0xD5(10101011),表示一开始 3、DA(目的MAC):6字节 ...5、类型/长度:2字节,0~1500保留为长度域值,...

    转载 https://blog.csdn.net/farmwang/article/details/64131318

    以太网(IEEE 802.3)帧格式:

    1、前导码:7字节0x55,一串1、0间隔,用于信号同步
    2、帧起始定界符:1字节0xD5(10101011),表示一帧开始
    3、DA(目的MAC):6字节
    4、SA(源MAC):6字节
    5、类型/长度:2字节,0~1500保留为长度域值,1536~65535保留为类型域值(0x0600~0xFFFF)
    6、数据:46~1500字节
    7、帧校验序列(FCS):4字节,使用CRC计算从目的MAC到数据域这部分内容而得到的校验和。

    据RFC894的说明,以太网封装IP数据包的最大长度是1500字节,也就是说以太网最大帧长应该是以太网首部加上1500,再加上7字节的前导同步码和1字节的帧开始定界符,具体就是:7字节前导同步吗+1字节帧开始定界符+6字节的目的MAC+6字节的源MAC+2字节的帧类型+1500+4字节的FCS。

    按照上述,最大帧应该是1526字节,但是实际上我们抓包得到的最大帧是1514字节,为什么不是1526字节呢?原因是当数据帧到达网卡时,在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和错,就丢弃此帧。如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交“设备驱动程序”做进一步处理。这时我们的抓包软件才能抓到数据,因此,抓包软件抓到的是去掉前导同步码、帧开始分界符、FCS之外的数据,其最大值是6+6+2+1500=1514。
     

    以太网规定,以太网帧数据域部分最小为46字节,也就是以太网帧最小是6+6+2+46+4=64。除去4个字节的FCS,因此,抓包时就是60字节。当数据字段的长度小于46字节时,MAC子层就会在数据字段的后面填充以满足数据帧长不小于64字节。由于填充数据是由MAC子层负责,也就是设备驱动程序。

     

    以CSMA/CD作为MAC算法的一类LAN称为以太网。CSMA/CD冲突避免的方法:先听后发、边听边发、随机延迟后重发。一旦发生冲突,必须让每台主机都能检测到。关于最小发送间隙和最小帧长的规定也是为了避免冲突。

    考虑如下的情况,主机发送的帧很小,而两台冲突主机相距很远。在主机A发送的帧传输到B的前一刻,B开始发送帧。这样,当A的帧到达B时,B检测到冲突,于是发送冲突信号。假如在B的冲突信号传输到A之前,A的帧已经发送完毕,那么A将检测不到冲突而误认为已发送成功。由于信号传播是有时延的,因此检测冲突也需要一定的时间。这也是为什么必须有个最小帧长的限制。

    按照标准,10Mbps以太网采用中继器时,连接的最大长度是2500米,最多经过4个中继器,因此规定对10Mbps以太网一帧的最小发送时间为51.2微秒。这段时间所能传输的数据为512位,因此也称该时间为512位时。这个时间定义为以太网时隙,或冲突时槽。512位=64字节,这就是以太网帧最小64字节的原因。

    512位时是主机捕获信道的时间。如果某主机发送一个帧的64字节仍无冲突,以后也就不会再发生冲突了,称此主机捕获了信道。

    由于信道是所有主机共享的,如果数据帧太长就会出现有的主机长时间不能发送数据,而且有的发送数据可能超出接收端的缓冲区大小,造成缓冲溢出。为避免单一主机占用信道时间过长,规定了以太网帧的最大帧长为1500。

    100Mbps以太网的时隙仍为512位时,以太网规定一帧的最小发送时间必须为5.12μs。

    1000Mbps以太网的时隙增至512字节,即4096位时,4.096μs。

    展开全文
  • 以太网帧长度大小限制

    万次阅读 2019-03-31 17:22:37
    表示以太网传输的最大帧长度。 为什么要有最大帧长度限制呢? 这是因为以太网采用的是CSMA/CD方法在介质上传输数据。CSMA/CD叫做带冲突检测的载波监听多路访问技术,在发送数据之前需要检测链路是否空闲,只有链路...

    最大长度限制

    网卡上一个参数是MTU值。一般都是1500。表示以太网传输的最大帧长度。
    为什么要有最大帧长度限制呢?
    这是因为以太网采用的是CSMA/CD方法在介质上传输数据。CSMA/CD叫做带冲突检测的载波监听多路访问技术,在发送数据之前需要检测链路是否空闲,只有链路空闲时才发送数据,并且边发送边检测。发送的过程中一旦检测到冲突则立即停止。所以也就是说,数据发送的过程中,整个链路是被独占的。所以需要限制一次传输数据的最大长度,如果一个人占用时间过长,这对其他人而言是不可接受的。
    而且限制最大长度还有以下好处:
    1)帧传输的过程中,一旦出错,需要全部重传,长度太长反而效率不高。(可能现在的传输介质已经不存在这种问题了)
    2)帧越长,需要的缓存越大,1979年在设计网卡时,缓存的价格非常昂贵,所以当时选用1500 bytes作为最大的长度。

    需要注意的是,以长帧长度限制是1518字节。减去18字节的以太网帧长度,所以ip层的报文长度限制为1500。

    最小长度限制

    最大长度还是比较直观易于理解,那么为什么又有最小长度限制呢?
    还是因为CSMA/CD。
    AB之间通信。
    当A检测到链路空闲,然后发送报文,巧的是B跟你一样,这不就冲突了嘛。
    最坏的情况,AB俩隔得最远。当A发送的报文刚好要到达B时,B开始发送报文。
    如果在B的报文到达A之前,A就已经发送完了,那么A就不知道冲突了。所以,需要限制发送的报文最小长度。
    最小长度是多少呢?
    显然,最小长度同时受两个节点最远距离和传输速度的影响。最远距离越长,传输速度越快,所需要的最小长度也就越大。

    针对不同带宽的网络,标准组织定义了不同的slot time。

    SpeedSlot timeTime Interval
    10 Mbit/s512 bit times51.2 microseconds
    100 Mbit/s512 bit times5.12 microseconds
    1 Gbit/s4096 bit times4.096 microseconds
    2.5 Gbit/s onwardno half-duplex operation

    所以,不同的网络,其实最小长度是不一定的,两个节点能相隔的最远距离也是不一样的。
    10Mbit/s的网络,报文最小长度为64字节。两个节点最远距离不能超过:
    51.210(-6)*(0.7*3*108)/2=5.376km
    在1Gbit/s的网络中,报文最小长度为512字节。最远距离不超过约0.43km

    不足的长度填充全0补齐。这些数据是不计算入ip层的。
    使用tcpdump抓包时,经常看见length=0的报文。其实这个长度指的是TCP层数据报文的长度。

    参考:
    以太网最小,最大字节长度 https://blog.51cto.com/19880206/890070
    https://en.wikipedia.org/wiki/Slot_time
    https://stackoverflow.com/questions/33039394/why-is-the-minimum-ethernet-frame-64-bytes

    展开全文
  • 在阅读NXP、ST等厂家提供的MCU的SDK代码时,经常会发现在提供的一些驱动库函数中,uart、i2c、spi等驱动的接收函数API,都需要传入一个参数,这个参数就是期望接收的数据长度(expected bytes),当sdk底层接收的数据...

    在阅读NXP、ST等厂家提供的MCU的SDK代码时,经常会发现在提供的一些驱动库函数中,uart、i2c、spi等驱动的接收函数API,都需要传入一个参数,这个参数就是期望接收的数据长度(expected bytes),当sdk底层接收的数据长度达到expected bytes时,触发用户注册的回调函数,通知用户数据接收完毕.

    sdk中的这种设计,在收发都是定长数据的使用场景中,非常方便使用。比如,通过spi、i2c进行寄存器的读写,因为传送的地址长度、数据长度通常情况下都是固定的(比如1个字节或者4个字节等)。但是,当我们需要使用这些外设总线传送变长数据时,这些sdk用起来就非常不方便了。

    比如,设计了一种应用协议,有一定的帧格式,但是 帧长度是变化的,那么这个协议使用uart或者spi进行链路层传输时,就会遇到sdk的接收函数无法使用的问题(发送函数当然可以继续使用,因为发送者知道数据长度)。

    那么这种情况如何解决呢?目前想到的方法有一下几种:

    1. 放弃使用sdk中的接收函数,在中断函数中一个字节一个字节的接收数据,放入自己的buffer中。
    2. 使用sdk中的接收函数,但expected bytes设置为1字节。
    3. 设计协议格式时需要注意:首先设置一个固定字节的帧头(比如5个字节),帧头信息里包含了接下来帧体的长度。在接收时,分两步进行,先接收固定长度的帧头(5字节),然后解析中后续数据长度,再接收帧体的数据。发送时,也分两次发送,先发送帧头,再发送帧体。
    展开全文
  • 基于cube生成的stm32f407 UART串口例程,带解析功能,支持接收和发送模式,其中接收模式可以接收任意长度的串口数据
  • 关于可变帧长度数据的解析

    千次阅读 2018-11-15 16:54:10
    在项目中需要解析另一主机的数据,而该主机数据是由积木式拼搭而成的可变的数据格式,每个积木所包含的数据长度不定,但是都小于10; 这里说明一下我在实际应用中的解决方法: 首先是和另一主机定义好数据格式...

    关于可变帧长度数据的解析
    在项目中需要解析另一主机的数据,而该主机数据是由积木式拼搭而成的可变的数据帧格式,每个积木所包含的数据长度不定,但是都小于10;
    这里说明一下我在实际应用中的解决方法:
    首先是和另一主机定义好数据帧格式协议,定义格式如下表:

    帧头命令字帧长度参数校验和
    0x5AInstructionLengthParameter1, Parameter2,Parameter3…….Check Sum

    帧头: 收到0x5A表示有数据到达;
    命令字:每个命令字代表本帧数据的含义;
    帧长度:表示本条帧数据的长度,Length = 参数长度;
    参数: 除了命令字外,补充其他更详细的信息,这里包括可变的积木数据;
    校验和:Check Sum = Instruction + Length + Parameter1 + Parameter2 + 。。。+ ParameterN
    下表是命令字的相关说明:
    命令字的相关说明

    参数说明:由于每个模块参数都有所不同,所以数据帧中不同ID,相同位置代表的含义也不同,在这里做个总结
    数据举例
    数据解析
    此表格不完全…

    具体的C代码解析
    串口中将数据转存,同时置一个标志位:

    CTRL_FLAG.BLOCK_FIRST_ROW_RECEIVE_OK_FLAG = TRUE ;///数据接收并校验完成标志位
    		CTRL_COUNT.BLOCK_CNT = UART_RX3_BUF[UART_RX3_BUF[2] + 2] ;///BB的个数
    		for(i=0;i<UART_RX3_CNT;i++)
    		{
    			UART_RX3_FIRST_ROW_DATA_BUF[i]=UART_RX3_BUF[i];///将接收的数据转存
    		}
    

    然后在程序中判断数据接收标志位是否进行解析,解析函数如下:

    if (CTRL_FLAG.BLOCK_FIRST_ROW_RECEIVE_OK_FLAG == TRUE)///数据接收并校验完成标志位
    {
    	block_data_receive_finish_ack(0x03);///数据接收完成  后告知开始模块   0822	   ;
    	for(i=0;i<CTRL_COUNT.BLOCK_CNT ;i++)///直到所有的数据都处理完成才退出
    	{
    		single_block_data_handle(i,UART_RX3_FIRST_ROW_DATA_BUF,block_sequence,1);///第1个BB,数据数组,数组起点(当前BB ID)
    		BLOCK_SEQUENCE[i] = UART_RX3_FIRST_ROW_DATA_BUF[block_sequence];	///第1个BB的ID
    		block_length_data = UART_RX3_FIRST_ROW_DATA_BUF[block_sequence-1];		///第1个BB 的数据长度
    		block_sequence = block_sequence + block_length_data + 1;		///计算下一个BB的ID数组位置(将这个BB长度+5)  供下一次传参使用
    	}
    

    }

    根据积木参数的数据进行解析,一个函数搞定:

    /*
    u8 sequence 			当前是第几个积木的数据
    u8 *UART_RX3_FIRST_ROW_DATA_BUF	接收到的数据区,待处理
    u8 number					当前处理的这个积木在数据区的开始
    u8 row 						是哪一行的数据
    
    */
    void single_block_data_handle(u8 sequence ,u8 *DATA_BUF , u8 number,u8 row)///处理当前单积木模块的数据
    {
    	u8 i = 0 ;
    //	PARAMETER	*PARAMETER_DATA ;
    	switch( DATA_BUF[number])///判断当前是那个模块
    	{
    //			case 1:///不存在1模块
    //				break;
    		case 2:				///模块2	---3参数
    		case 5:				///模块5	---3参数
    			for(i = 0 ; i< 3 ; i ++)
    			{
    				if(row ==1)
    					BLOCK_DATA[sequence][i] =  DATA_BUF[number+i+1];//
    				else if(row ==2)
    					BLOCK_SECOND_DATA[sequence][i] =  DATA_BUF[number+i+1];///
    				else if(row ==3)
    					BLOCK_THIRD_DATA[sequence][i] =  DATA_BUF[number+i+1];///
    			}
    			break;
    		case 3:				///模块3	---2参数
    		case 4:				///模块4	---2参数
    		case 7:				///模块7	---2参数
    			for(i = 0 ; i< 2 ; i ++)
    			{
    				if(row ==1)
    					BLOCK_DATA[sequence][i] =  DATA_BUF[number+i+1];///
    				else if(row ==2)
    					BLOCK_SECOND_DATA[sequence][i] =  DATA_BUF[number+i+1];///
    				else if(row ==3)
    					BLOCK_THIRD_DATA[sequence][i] =  DATA_BUF[number+i+1];///
    			}
    			break;
    		case 6:				///模块6			---1参数
    		case 8:				///模块8 左	---1参数
    			if(row ==1)
    				BLOCK_DATA[sequence][0] =  DATA_BUF[number+1];///
    			else if(row ==2)
    				BLOCK_SECOND_DATA[sequence][0] =  DATA_BUF[number+1];///
    			else if(row ==3)
    				BLOCK_THIRD_DATA[sequence][0] =  DATA_BUF[number+1];///
    			break;
    		case 9:				///模块9 右
    			break;
    		case 0x0B:				///舵机 抛球
    			if(row ==1)
    				BLOCK_DATA[sequence][0] =  DATA_BUF[number+1];///
    			else if(row ==2)
    				BLOCK_SECOND_DATA[sequence][0] =  DATA_BUF[number+1];///
    			else if(row ==3)
    				BLOCK_THIRD_DATA[sequence][0] =  DATA_BUF[number+1];///		
    			break;
    		
    		default:
    			break;			
    	}
    }
    

    致此,积木的数据解析已经完成,
    积木的数据存储在二位数组:BLOCK_DATA[][],
    积木顺序存储在BLOCK_SEQUENCE[];
    执行函数

    /*
    block_sequence	是第几个模块顺序
    返回值:当前模块是否执行完成
    */
    u8 block_data_deal(u8 block_sequence)///
    {
    	if((block_sequence!=last_block_sequence)&&(BLOCK_STATUS == 1))///数据回传,只回传一次  仅在是开始的时候执行
    	{
    		block_data_receive_finish_ack(0x02);
    		last_block_sequence = block_sequence;
    	}
    	if (BLOCK_STATUS == 3) ///暂停
    	{
    		Pause_Stop();
    	}
    	else if(BLOCK_STATUS == 1)///开始  
    	{
    		switch (BLOCK_SEQUENCE[block_sequence])///判断是哪个积木模块ID
    		{
    			case 2:
    				return (1);
    			case 3:
    				return (1);
    			case 4:
    				return (1);
    			case 5:///模块
    				return (1);
    			case 6:///模块
    				return (1);
    			case 7:
    				return (1);
    			case 8:
    				return (1);
    			case 9:
    				return (1);
    			case 10:
    				return (1);
    			case 11:
    				return (1);				
    			default:
    				break;
    		}
    	}
    }
    

    block_data_deal 负责执行数据中的命令,完成返回1,未完成返回0,用以顺序执行。
    第一次写稿,只是想表述一种思想,不知道表述清楚与否,欢迎交流扣:50944-2881

    展开全文
  • 串口接收一帧数据及解析

    万次阅读 多人点赞 2018-05-25 11:28:16
    3. 下位机中的数据接收和协议解析 下位机接收数据也有两种方式,一、等待接收,处理器一直查询串口状态,来判断是否接收到数据。二、中断接收。两种方法的优缺点在此前的一篇关于串口通信的文章中详细讨论过。得出...
  • IP协议的数据帧长度是多少?

    千次阅读 2019-04-11 22:07:26
    1、如果使用PPP协议,最大长度1510字节,其中数据长度(加载上层的协议数据)不超过1500字节; 2、如果在以太网中,的长度为:64~1518字节(10~100Mbps 的以太网),1G及以上的以太网,长度为512~1518字节...
  • 四、 "数据帧" 长度、 五、 "数据帧" 组装方法、 六、 透明传输、 七、 字符计数法、 八、 字符填充法 ( 加转义字符 )、 九、 零比特填充法 ( 5 "1" 1 "0" )、 十、 违规编码法、 十一、 透明传输常用方法、
  • 笔记-关于Modbus一数据长度

    千次阅读 2019-05-30 16:01:27
    Modbus一数据长度为:127.
  • TCP/IP协议数据在每层中的长度

    千次阅读 2017-08-28 17:37:42
    其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Data)在应用层 它们的关系是 数据帧{IP包{TCP或UDP包{Data}}}  不同的协议层对数据包有不同的称谓...
  • STM8S003F3P接收一帧数据,以#为帧头,|为帧尾,数组长度是200,可根据芯片型号和数据大小来调整,开发环境:STVD
  • 大小与帧长度

    万次阅读 2018-03-06 16:33:59
    几乎所有视频编码格式都可以简单的认为一就是编码...比如采样率为44.1kHZ,采样精度为16位的音频,你可以算出bps(比特率)是44100*16bps,每秒的音频数据是固定的44100*16/8= 88200 bytesamr比较简单,它规定...
  • 获取每一长度

    千次阅读 2012-02-08 17:14:19
    论坛搜索帮助导航 ...喝彩奥运bluebrowngraygreengreyish-...H.264乐园 » 如何从H264 ES流中获取每一长度?   返回列表发帖 ldf198312 新
  • 串口通信数据长度对传输数据的影响 2013-02-26 09:50 4989人阅读 评论(1) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载。 针对串口通信,关于设置数据长度对通信的影响...
  • STM32串口接收一帧数据的写法,数据包括帧头,功能帧,数据帧,校验位!
  • 并且通信数据严谨的时候,就需要严格的收发每一帧数据来保证可靠性。 本人自己写了一个简单协议,其核心思路如下: 先来说说发送协议: 为了让数据具有可靠性,我在加了帧头的基础上还加了长度校验。并且啃了好久的...
  • 以太网最小合法帧长度 64字节

    千次阅读 2019-04-17 16:04:50
    以太网最小合法帧长度为?( B ) A 32字节 B 64字节 C 100字节 D 不确定 解析: 以太网格式:目标 MAC 地址 6 字节,源 MAC 地址 6 字节,类型 2 字节,数据和填充 46-1500 字节,FCS(检验序列) 4 ...
  • 题中要想达到最大数据率应该在相同时间内发送尽可能多的,所以长应该尽可能小 在发送端的发送时延=的大小/数据传输率 =确认在接收端的发送时延 这样的话,对于数据帧长度范围是128~512字节的,...
  • 的最小长度 CSMA/CD

    千次阅读 2019-01-04 15:54:00
    ·使用 CSMA/CD 协议的以太网不能进行全双工通信而只能进行双向交替通信(半双工通信)。 ·每个站在发送数据之后的一小段... 最先发送数据帧的站,在发送数据帧后至多经过时间 2Tp(两倍的端到端往返时延)就可...
  • 关于最小发送间隙和最小长的规定也是为了避免冲突。以太网是不可靠的,这意味着它并不知道对方有没有收到自己发出的数据包,但如果他发出的数据包发生错误,他会进行重传。以太网的错误主要...
  • 80211格式--管理数据帧、控制 因为无线数据链路所带来的挑战,MAC被迫采用了许多特殊的功能,其中包括使用四个地址位。并非每个都会用到所有的地址位,这些地址位的值,也会因为MAC种类的不同而有所...
  • 关于CAN标准与扩展两种格式长度的解析 ■CAN总线的标准和扩展主要决定ID的长度 ■标准ID长度是11位,也就是ID的范围是000-7FF ■扩展ID长度是29位,也就是ID的范围是0000 0000-1FFF FFFF ...
  • CSMA CD)的最小长计算 ——总结 CSMA CD)的最小长计算 ——总结 CSMA CD)的最小长计算 ——总结
  • 以太网(IEEE 802.3)格式: 1、前导码:7字节0x55,一串1、0间隔,用于信号同步 ...5、类型/长度:2字节,0~1500保留为长度域值,1536~65535保留为类型域值(0x0600~0xFFFF) 6、数据:46~1500字节 7、
  • h264协议数据解析

    千次阅读 2016-06-21 14:35:29
    h264常见的数据为: 00 00 00 01 67 (SPS) 00 00 00 01 68 (PPS) 00 00 00 01 65 ( IDR ) 00 00 00 01 61 (P) 等等,那么他们代表的意思是什么呢? 二、start code ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 119,608
精华内容 47,843
关键字:

帧数据长度