FPGA工程师必备技能Ethernet接口千兆以太网以太帧详
FPGA工程师必备技能Ethernet接口千兆以太网以太帧详解以太网帧结构版权声明以太网帧结构头部数据上层协议报文校验和校验和计算1、前导码和帧开始符:2、帧后面的校验码(FCSCRC)以太网单个最大帧:以太网最小帧:常见的以太网帧类型:以太网帧结构版权声明
版权声明:本文为CSDN博主牛牛来了的原创文章,遵循CC4。0BYSA版权协议,转载请附上原文出处链接及本声明。本人针对原博主文章进行了少许原创性改动。
原文链接:https:blog。csdn。netweixin44081384articledetails126707216以太网帧结构
以太网帧发送数据时都是从8个字节的前导码开始的。前导码是1和0的交互。前导码:作用是通知接收方有数据到来。要与其的时钟保持同步。在物理层加进去的。不属于帧这部分SPD:是一个字节10101011,最后使用11,来通知接收方下一个字段就是目的主机的位置。DA:目的节点的MACSA:源节点的MACTypelength:2字节,根据数值的不同代表不同的封装格式。字段length:0x00000x50DC范围内,该帧为802。3raw封装字段type:0x06000xFFFF范围内,该帧为EthernetII封装Payload:上层协议有效载荷。最小为46个字节,最大为1500字节,对于Type封装格式,上层协议必须保证该字段的值大于46字节;对于Length封装,对于有效载荷不够46字节的报文链路层必须进行填充。FCR:4字节的校验和。(在vlan头中有trailer字段(尾部标记):trailer是CRC校验和:对应报文的最后4个字节)1234567891011121314151617181920
在以太网中,数据通信的基本单位是以太网帧(frame),由头部(header)、数据(data)以及校验和(checksum)三部分构成:
头部
以太网帧头部包含3个字段,依次是:
1、目的地址:长度是6字节,用于标记数据由哪台机器接收;
2、源地址:长度也是6字节,用于标记数据由哪台机器发送;
3、类型:长度是2字节,用于标记数据该如何处理,0x0800表示该帧数据是一个IP包(后续章节介绍)。数据
数据可以是任何需要发送的信息,长度可变,46至1500字节均可。上层协议报文
例如IP包,可以作为数据封装在以太网帧中,在数据链路层中传输。
因此,数据还有另一个更形象的称谓,即负荷(payload)。校验和
由于物理信号可能受到环境的干扰,网络设备传输的比特流可能会出错。
一个以太网帧从一台主机传输到另一台主机的过程中,也可能因各种因素而出错。
那么当主机收到以太网帧时,如何确定它是完好无损的呢?
答案是:校验和。
我们可以用诸如循环冗余校验(CRC)算法,为以太网帧计算校验和。
如果以太网帧在传输的过程出错,校验和将发生改变。
注意到,以太网帧最后面有一个4字节字段,用于保存校验和。
发送者负责为每个以太网帧计算校验和,并将计算结果填写在校验和字段中;
接收者接到以太网帧后,重新计算校验和并与校验和字段进行对比;
如果两个校验和不一致,说明该帧在传输时出错了。校验和计算
校验和,校验和应该叫16进制反码求和,就是将所有的字节加起来,再由ffff来减得到的值。
我这来计算ipheader的checksum,其他的校验和计算方式一样的。
从报文中看到headerchecksum为0X495c
整个ipheader去除495c,为4500001d6d5e8001c0a801d4c0a801012B6A1(至于为什么0000不加不解释)
2B6A1B6A12b6a3
ffffb6a3495c
看结果出来了吧,校验和是个很粗糙的计算方式(与md5相比),如果你source与destination调换一下,结果相同,在链路层计算正确后到达网络层,经过ip头部校验可能还会出错,到达tcp或者udp也还可能出错,只是方便了网络设备的计算。当然你从source发往destination与destination发往source校验和肯定不会相同,应该里面的ttl与标识符会有差别。
对我们来说能抓到的或者能看到的报文帧,基本上是在目标MAC地址到IP数据包。1、前导码和帧开始符:
主要做一些底层的数据传输和编码流的二进制流,
它们本身不会被网卡捕获,网卡一般抓包的时候就已经将前导码跟帧开始符解析掉了。2、帧后面的校验码(FCSCRC)
其主要是通过CRC校验判断帧是否有效或者发生篡改或错误,当网卡能收到数据帧并通过抓包工具可以抓到的,就说明该帧没有问题,是有效的,当帧是有效的后,就说明CRC就已经解析掉了。
所以,在整个以太网帧中,能看到的就是目标MAC地址、源MAC地址、帧类型以及IP数据包,当然IP数据包中还会细分许多协议,每个帧之间也是跟CAN类似有,有一定的距离,不可能一帧挨着一帧传输的。
IP数据包里面,有461500字节的长度约束。这不是由ECU决定的。在我们使用的设备中,会有一个最大传输单元(MTU)、MTU一般默认是1518个字节,这就导致IP数据包最多只有1500个字节。以太网单个最大帧:
6(目的MAC)6(源MAC)2(帧类型)1500(IP数据包(IP头(20)DATA(1480)))4(CRC校验)1518字节,
如果带VLAN就是1522字节(VLAN会多出四个字节的帧类型描述)以太网最小帧:
6(目的MAC)6(源MAC)2(帧类型)46(IP数据包(IP头(20)DATA(26)))4(CRC校验)64字节常见的以太网帧类型:0x0800:IPv40x0806:ARP0x8100:VLANTag(TPID)0x86DD:IPv60x88F7:PTPgPTP0x22F0:AVTP1234567891011
下图是用工具抓的两个报文,以方便我们来理解以太网帧结构。上图报文以太网帧如果小于64字节,那么会填充00。
接下来我们对以太网帧进行更详细的分析
接下来我们看一个DoIP的报文。下图为用工具抓的一个DoIP报文。
上图整个DoIP报文整个一个帧是69个字节(142020843),
其实还要再增加4个字节的CRC,总共73个字节。
只不过当网卡识别它是一个有效帧后,就把CRC解析掉了。
当然,图中也描述了
1、以太帧头:它的源MAC地址(6个字节)和目的MAC地址(6个字节),再加上2个字节的帧类型,共14个字节。
2、IP头:最小是20个字节。
3、TCP头:DoIP报文是一个UDS的报文,而UDS报文都是通过TCP传输的,因此,会有个TCP的头部,包括Src
Port(源端口):13400(这是DoIP的一个端口号)以及DstPort(目的端口):50090。TCP的长度是20个字节;
4、DoIP协议头部是8个字节的长度;需要注意的是,DoIP的头部并不包括源DoIP地址和目标DoIP地址这4个字节;
5、Payload:3个字节,