以太网协议
接口名支持速率数据宽度时钟方式引脚数量典型应用MII4-bit单沿,独立收发时钟多(16~18)旧 MCU/FPGARMII2-bit共享 50MHz时钟少(9~10)嵌入式/低引脚MCUGMII8-bit独立时钟,单沿传输很多(>24)旧千兆PHYRGMII4-bit双沿传输,降低位宽中(约12)现代主流千兆PHYSGMII串行(1对差分线)串行 SERDES极少(4线)交换机、芯片内连接QSG
一、定义:
以太网通信是以数据包的形式传输, 其单包数据量达到几十, 甚至成百上千个字节。
二、网络模型:

也有将TCP/IP分为四层的模型
而我们在使用FPGA设计以太网传输时,基本只需要考虑数据发送,即只需要考虑设计物理层,也就是生成比特流。
如果是进行网络系统设计,就需要考虑各种接口(应用层),方便用户等调用。
三、以太网数据包格式

可以看到,我们一帧能发送的真正的数据内容为:18-1472 Byte;然后将用户数据添加UDP首部,形成UDP层;再加上IP首部,形成IP层;最后加上前导码、SFD(帧起始界定符)、以太网帧头、以及FCS(帧检验序列),构成了MAC层(物理层,包括源MAC地址和目的MAC地址),也就是最终需要在通信线路上传输的数据。
在设计物理层时,只需要计算得到各个首部、前导码、起始界定符、以及校验,就可以得到物理层,然后进行传输。
以太网帧格式:

前导码( Preamble) : MAC物理层使用7个字节同步码( 0和1交替( 55-55-55-55-55-55-55))实现数据的同步。
帧起始界定符( SFD, Start Frame Delimiter):使用1个字节的SFD(固定值为0xd5)来表示一帧的开始,后面紧跟着传输的就是以太网的帧头。
目的MAC地址: 即接收端物理MAC地址,占用6个字节。 MAC地址从应用上可分为单播地址、组播地址和广播地址。单播地址:第一个字节的最低位为0,比如00-00-00-11-11-11,一般用于标志唯一的设备;组播地址:第一个字节的最低位为1,比如01-00-00-11-11-11,一般用于标志同属一组的多个设备;广播地址:所有48bit全为1,即FF-FF-FF-FF-FF-FF,它用于标志同一网段中的所有设备。
源MAC地址:即发送端物理MAC地址,占用6个字节。
长度/类型: 上图中的长度/类型具有两个意义,当这两个字节的值小于1536(十六进制 为0x0600)时,代表该以太网中数据段的长度;如果这两个字节的值大于1536,则表示该以太网中的数据属于哪个上层协议,例如0x0800代表IP协议( 网际协议) 、 0x0806代表ARP协议(地址解析协议)等。
数据:以太网中的数据段长度最小46个字节, 最大1500个字节。最大值1500称为以太网的最大传输单元( MTU, Maximum Transmission Unit),之所以限制最大传输单元是因为在多个计算机的数据帧排队等待传输时,如果某个数据帧太大的话,那么其它数据帧等待的时间就会加长,导致体验变差,这就像一个十字路口的红绿灯,你可以让绿灯持续亮一小时,但是等红灯的人一定不愿意的。另外还要考虑网络I/O控制器缓存区资源以及网络最大的承载能力等因素, 因此最大传输单元是由各种综合因素决定的。为了避免增加额外的配置, 通常以太网的有效数据字段小于1500个字节。
帧检验序列( FCS, Frame Check Sequence) : 为了确保数据的正确传输, 在数据的尾部
加入了4个字节的循环冗余校验码( CRC校验) 来检测数据是否传输错误。 CRC数据校验从以太
网帧头开始即不包含前导码和帧起始界定符。 通用的CRC标准有CRC-8、 CRC-16、 CRC-32、 CRCCCIT,其中在网络通信系统中应用最广泛的是CRC-32标准。
帧间隙( IFG,Interpacket Gap) :就是以太网相邻两帧之间的时间间隔,帧间隙的时间就是网络设备和组件在接收一帧之后,需要短暂的时间来恢复并为接收下一帧做准备的时间, IFG的最小值是96 bit time,即在媒介中发送96位原始数据所需要的时间,在不同媒介中IFG的最小值是不一样的。

三、TCP/IP协议簇
TCP( 传输控制协议) /IP(网际协议)协议簇,虽然看上去TCP/IP协议簇只有两个协议,其实TCP/IP协议簇包含了上百种协议,最常用的有TCP、IP、UDP等。其中TCP协议和UDP协议应用最广泛。
1、IP协议
IP协议是TCP/IP协议簇中的核心协议,所有的TCP、 UDP及ICMP数据都以IP数据报格式传输。
从以太网数据包格式中可以看出,IP数据报 包括IP首部和数据段。

IP数据报内容
版本:4位版本号,IPv4(0100),IPv6(0110),目前在以太网使用IPv4多,但是在计算机系统中,IPv6也已经流行起来,因为IPv4仅用32个bit来表示地址,IPv4 地址的总数为 4294967296,到现在,已经快用光了;而IPv6使用128bit来表示地址,理论来说根本用不完。
首部长度:4位,表示IP首部一共有多少个32位(4Byte),假设无可选字段(一般来说没有),IP首部有20个Byte,则首部长度为5;最大为15,即60个Byte。
服务类型:8位,普通服务的话,设置为0。可以参考:IP首部中的服务类型(TOS)
总长度:16位,包括IP首部和IP数据部分,以字节为单位。我们利用IP首部长度和IP数据报总长度,就可以计算出IP数据报中数据内容的起始位置和长度。
标识:16位,通常每发一份报文,就加1。
标志:3位,用来表示分片还是不分片,第一位(最高位)保留,第二位(1-不分片,0-允许分片),第三位为1即表示后面“还有分片”的数据报。为0表示这已是若干数据报片中的最后一个。
叶偏移:13位,在接收方进行数据报重组时用来标识分片的顺序。
生存时间:8位,防止丢失的数据包在无休止的传播,一般被设置为64或者128。IPv6 地址有两个生存期:首选生存期和有效生存期,而首选的生存期总是小于等于有效的生存期。具体可以参考官方文档。
协议:8位,表示此数据报所携带上层数据使用的协议类型,TCP为6, UDP为17。可以参考:IP协议号 IP首部中有8位协议号,用于指明IP的上层协议
首部校验和:这部分需要自己计算,用来校验IP数据报头部是否被破坏、篡改和丢失等,不校验数据。
源MAC地址,目的MAC地址:就是发送和接收IP地址。
可选字段:是数据报中的一个可变长度的可选信息,选项字段以32bit为界,不足时插入值为0的填充字节,保证IP首部始终是32bit的整数倍。
首部校验和计算
1、将16位校验和字段置为0,将IP首部分为多个16位的单元;
2、对各个单元采用反码加法运算
3、假如得到的结果有溢出,则将结果再次分为两个16位相加,直到不出现进位
如下例:

2、UDP协议
在以太网数据包中,我们可以看到,TCP协议(IP层)比UDP层复杂,更为可靠,但是UDP运用场景也非常多。
那为什么不所有传输都用更可靠的TCP协议呢,这就像卖手机,不可能都上最好的配置,毕竟有人不需要这么好的配置,我只需要打电话,一个骁龙835就够了,如果你叫我多花2000块,买一个865,那我没必要。所以这就是需求不同,所以UDP也常用。
TCP与UDP的区别:TCP为可靠传输协议,而UDP为不可靠传输协议;TCP协议可以保证数据的完整和有序,而UDP不能保证;UDP由于不需要连接,故传输速度比TCP快,且占用资源比TCP少;
应用场景:TCP适用于对数据完整性要求很高的场合,比如文件传输;而UDP适用于对数据完整性要求不高的场合,比如说视频直播,毕竟直播的时候少传输几个像素点,影响也不大,而且视频直播要求数据传输很快。而文件数据要是少一个byte或者更多,可能会造成很大的问题。
UDP格式数据:

其中的UDP校验和和TCP协议的校验和计算方式一样,但是需要计算三个部分:UDP伪首部、UDP首部、UDP数据部分。
伪首部的数据是从IP数据报头和UDP数据报头获取的,包括源IP地址,目的IP地址,协议类型和UDP长度,其目的是让UDP两次检查数据是否已经正确到达目的地,只是单纯为了做校验用的。在大多数使用场景中接收端并不检测UDP校验和。
到此部分内容转载自:
接口协议(四):以太网(Ethernet)学习(一):协议_ethernet接口-CSDN博客

🔧 一、常见以太网接口概述对比表:
| 接口名 | 支持速率 | 数据宽度 | 时钟方式 | 引脚数量 | 典型应用 |
|---|---|---|---|---|---|
| MII | 10/100 Mbps | 4-bit | 单沿,独立收发时钟 | 多(16~18) | 旧 MCU/FPGA |
| RMII | 10/100 Mbps | 2-bit | 共享 50MHz 时钟 | 少(9~10) | 嵌入式/低引脚MCU |
| GMII | 10/100/1000 Mbps | 8-bit | 独立时钟,单沿传输 | 很多(>24) | 旧千兆PHY |
| RGMII | 10/100/1000 Mbps | 4-bit | 双沿传输,降低位宽 | 中(约12) | 现代主流千兆PHY |
| SGMII | 10/100/1000 Mbps | 串行(1对差分线) | 串行 SERDES | 极少(4线) | 交换机、芯片内连接 |
| QSGMII | 4个千兆通道复用 | 串行 | 高速串行 | 极少 | 高速背板/多PHY场景 |
📌 二、接口引脚定义(重点看 RMII、GMII、MII、RGMII)
✅ 1. RMII (Reduced MII)
-
使用共享50MHz时钟,节省引脚
-
数据总线仅2位,10/100 Mbps
-
常用于 STM32、ESP32、NXP MCU 等
| 信号名 | 方向(MCU -> PHY) | 说明 |
|---|---|---|
| TXD0 | 输出 | 发送数据位0 |
| TXD1 | 输出 | 发送数据位1 |
| TX_EN | 输出 | 发送使能 |
| REF_CLK | 输入 | 外部50MHz参考时钟 |
| CRS_DV | 输入 | 载波检测 + 接收有效(复用) |
| RXD0 | 输入 | 接收数据位0 |
| RXD1 | 输入 | 接收数据位1 |
| MDIO | 双向 | 管理数据 I/O |
| MDC | 输出 | 管理数据时钟 |
✅ 2. GMII (Gigabit MII)
-
支持 10/100/1000 Mbps(全三速)
-
数据总线 8-bit,时钟125 MHz,位宽大、引脚多
| 信号名 | 方向 | 说明 |
|---|---|---|
| TXD[7:0] | 输出 | 发送数据 |
| TX_EN | 输出 | 发送使能 |
| TX_ER | 输出 | 发送错误指示 |
| TX_CLK | 输入 | 发送时钟(125MHz) |
| RXD[7:0] | 输入 | 接收数据 |
| RX_DV | 输入 | 接收有效 |
| RX_ER | 输入 | 接收错误 |
| RX_CLK | 输出 | 接收时钟 |
| CRS / COL | 输入 | 载波 / 冲突检测 |
| MDIO/MDC | 双向/输出 | 管理接口 |
✅ 3. MII (原始标准)
-
类似 GMII,但数据总线为 4-bit,主要用于 10/100 Mbps
-
比 RMII 多出很多引脚
| 信号名 | 方向 | 说明 |
|---|---|---|
| TXD[3:0] | 输出 | 发送数据 |
| TX_EN | 输出 | 发送使能 |
| TX_CLK | 输入 | 发送时钟 |
| RXD[3:0] | 输入 | 接收数据 |
| RX_DV | 输入 | 接收有效 |
| RX_CLK | 输出 | 接收时钟 |
| CRS / COL | 输入 | 载波/冲突 |
| MDC/MDIO | 同上 |
✅ 4. RGMII (Reduced GMII)
-
速率支持三速(10/100/1000 Mbps)
-
数据总线 4-bit(但使用双沿)= 实际等效 8-bit
-
更少的引脚数,适用于现代千兆PHY
| 信号名 | 方向 | 说明 |
|---|---|---|
| TXD[3:0] | 输出 | 发送数据 |
| TX_CTL | 输出 | 合并 TX_EN 和 TX_ER |
| TXC | 输出 | 发送时钟(125MHz 双沿) |
| RXD[3:0] | 输入 | 接收数据 |
| RX_CTL | 输入 | 合并 RX_DV 和 RX_ER |
| RXC | 输入 | 接收时钟(双沿) |
| MDC/MDIO | 同上 |
🧠 三、几种接口的主要区别总结
| 项目 | MII | RMII | GMII | RGMII |
|---|---|---|---|---|
| 速率 | 10/100 | 10/100 | 10/100/1000 | 10/100/1000 |
| 数据位宽 | 4-bit | 2-bit | 8-bit | 4-bit(双沿) |
| 时钟频率 | 25MHz | 50MHz | 125MHz | 125MHz(双沿) |
| 引脚数量 | 高(16+) | 低(10) | 很高(24+) | 中(12~14) |
| 时钟方向 | MCU接收时钟 | MCU需提供时钟 | 双向 | 双向 |
| 典型芯片 | STM32+PHY | STM32/ESP32+PHY | FPGA+PHY | 千兆PHY |
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐
所有评论(0)