以太网的正式标准是IEEE802.3,它规定了以太网传输的帧结构。
以太网帧格式如下图所示:
以太网传输数据时,是按照上图的格式,自左到右依次传输的。需要注意的是前导码和SFD不属于以太网协议的内容,应该是属于物理层数据同步相关的内容。 具体解析如下:
名称 | 字节数 | 数值 | 含义 |
---|---|---|---|
前导码 | 7字节 | 0x55_5555_5555_5555 | 同步码,通过串行数据的“01”交替,实现数据的同步。 |
帧起始界定符 | 1字节 | 0xD5 | 表示一帧的开始。后面紧跟以太网的帧头 |
目的MAC地址 | 6字节 | / | 以太网协议的第一个字段。指示目标设备(接收端)的MAC地址。分为广播地址、单播地址和多播地址。广播地址的数值为0xFFFF_FFFF_FFFF,用于和所有设备进行通信。 |
源MAC地址 | 6字节 | / | 发送端的MAC地址。 |
长度/类型 | 2字节 | / | 当该字段的数值小于1536个字节时,表示的是数据的长度。 当为0x0800时,表示该数据包是IPv4协议包。 当为0x08DD时,表示该数据包是IPv6协议包。 当为0x0806时,表示该数据包是ARP协议包。 |
数据 | 46~1500字节 | / | 以太网中的数据长度最小是46字节,最大1500字节(正常情况下是这样的,但是存在巨帧等数据包)。最大值1500称为以太网的最大传输单元MTU。限制数据包大小的原因是担心单个数据包的发送时间太长,在计算机中排队的数据包队列太长,导致其他应用一直卡住,体验变差。 TCP、IP、UDP、ARP等协议数据,就包含在此部分里。 |
校验FCS | 4个字节 | / | 为了确保数据的正确性,在网络包尾部增加了一个CRC32的校验结果,用来检测数据传输是否正确。CRC校验的范围:目的MAC、源MAC、长度/类型、数据。 另外关于CRC校验计算部分,可以参考文章:CRC计算流程详解和FPGA实现_crc32 fpga实现-CSDN博客 |
这里需要注意的是,以太网两帧之间的时间间隔,IFG。
不管10M/100M/1000M的网络,两帧之间最少有96bits的间隔时间。也就是说:
10M的IFG=96*100ns=9600ns
100M的IFG=96*10ns=96ns
1000M的IFG=96*1ns=96ns