ethernet
这里主要记录以太网协议相关的知识,包括以太网帧格式、校验、封装、解析、传输和传输控制。
1. 概述
网卡(Network Interface Card,简称NIC),也称网络适配器。网卡主要包括了物理层、数据链路层。
因特网协议栈
七层OSI模型
协议栈 | 说明 | 举例 |
---|---|---|
应用层 | 提供网络服务给应用程序 | HTTP, FTP, SMTP, Telnet |
表示层 | 数据表示和转换 | MIME, TLS/SSL加密 |
会话层 | 管理会话(连接)的建立、同步和终止 | RPC, SQL |
传输层 | 负责数据的可靠传输和流量控制 | TCP, UDP |
网络层 | 负责数据包的路由和转发 | IP, ICMP, IGMP, ARP, RARP |
数据链路层 | 负责数据帧的封装、传输和差错控制 | PPP, Ethernet, Wi-Fi |
物理层 | 处理物理连接和数据传输 | 电缆、光纤、无线电波 |
- 物理层(Physical Layer - PHY)定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口。物理层的芯片称之为PHY
- 数据链路层则提供寻址机构、数据帧的构建、数据差错检查、传送控制、向网络层提供标准的数据接口等功能。数据链路层的芯片称之为MAC(Media Access Control)控制器
当我们的PHY芯片发送数据,接受到MAC层发送过来的数字信号,然后转换成模拟信号,通过MDI接口传输出去。
但是我们的网线传输的距离又很长,有时候需要送到100米甚至更远的地址,那么就会导致信号的流失。
而且外网线与芯片直接相连的话,电磁感应和静电,也很容易导致芯片的损坏,所以就要使用网络变压器,其主要作用是:
- 传输数据,它把PHY送出来的差分信号用差模耦合的线圈耦合滤波以增强信号,并且通过电磁场的转换耦合到不同电平的连接网线的另外一端
- 隔离网线连接的不同网络设备间的不同电平,以防止不同电压通过网线传输损坏设备
- 使芯片端与外部隔离,抗干扰能力大大增强,而且对芯片增加了很大的保护作用,保护PHY免遭由于电气失误而引起的损坏(如雷击)
2. 以太网协议
IEEE802.3 规定了以太网协议,它定义了以太网帧格式、校验和封装、解析、传输和传输控制。
以太网协议(Ethernet Protocol)是一种广泛应用于局域网(LAN)和广域网(WAN)的计算机网络通信协议。它是一种基于共享介质的局域网技术,最早由Xerox、Intel和Digital Equipment Corporation(DEC)于1970年代开发,并在1980年代初由IEEE标准化为IEEE 802.3。以太网根据最大传输速率的不同可以分为标准的以太网(10Mbit/s)、快速以太网(100Mbit/s)、千兆以太网 (1000Mbit/s)和万兆以太网(10Gbit/s)。
3. 以太网帧格式
以太网帧格式如下:
字段名称 | 长度(字节) | 描述 | 层次 |
---|---|---|---|
前导码(Preamble) | 7 | 用于同步接收方和发送方的时钟,物理层连续使用7个字节的0x55实现数据同步 | PHY |
帧开始定界符(SFD) | 1 | 标志着以太网帧的开始,固定为0xD5 | PHY |
目的地址(Destination Address) | 6 | 接收方的MAC地址 | 数据链路层 |
源地址(Source Address) | 6 | 发送方的MAC地址 | 数据链路层 |
类型/长度字段 | 2 | 标识数据字段中封装的上层协议类型或数据字段长度 | 数据链路层 |
数据字段(Data) | 46-1500 | 实际传输的数据 | 数据链路层 |
填充字段(Padding) | 可变 | 如果数据字段长度不足时,用于补充至最小长度 | 数据链路层 |
帧校验序列(FCS) | 4 | 用于校验整个以太网帧的完整性(CRC校验。从目的地址开始算起) | 数据链路层? |
请注意,表格中的“数据字段”长度范围是46-1500字节,这是因为以太网帧有一个最小长度限制(通常是64字节),而标准以太网帧的最大长度限制为1518字节。因此,数据字段的最小长度需要达到46字节(6字节目的地址 + 6字节源地址 + 2字节类型字段 + 46字节数据字段 + 4字节FCS = 64字节)以符合最小长度要求。
此外,以太网帧还可能包含其他可选字段,如VLAN标签等,这些字段的长度和位置会根据具体的应用和网络配置而有所不同。上表仅展示了以太网帧的基本格式。
类型/长度字段
从Type/Length字段值可以区分两种帧类型:当Type值小于等于1500(0x05DC)时,帧使用的是IEEE 802.3格式。当Type字段值大于等于1536(0x0600)时,帧使用的是Ethernet II格式。
类型字段 | 描述 |
---|---|
0x0800 | IPv4 |
0x0806 | ARP |
0x86DD | IPv6 |
0x8100 | VLAN |
# --------------------------------------
# stm32 打印
# MAC.........02-00-00-48-00-45
# IP..........192.168.10.160
# netmask.....255.255.255.0
# gateway.....192.168.10.1
# --------------------------------------
# 192.168.10.109 -> 192.168.10.160 ICMP 74 Echo (ping) request
-> 02 00 00 48 00 45 2c f0 5d 25 23 f7 08 00 45 00 00 3c 99 4b 00 00 40 01 4b 18 c0 a8 0a 6d c0 a8 0a a0 08 00 4c fe 00 01 00 5d 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 61 62 63 64 65 66 67 68 69
# 02:00:00:48:00:45 Broadcast ARP 60 Who has 192.168.10.109? Tell 192.168.10.160
<- ff ff ff ff ff ff 02 00 00 48 00 45 08 06 00 01 08 00 06 04 00 01 02 00 00 48 00 45 c0 a8 0a a0 00 00 00 00 00 00 c0 a8 0a 6d
# MicroStarINT_25:23:f7 02:00:00:48:00:45 ARP 42 192.168.10.109 is at 2c:f0:5d:25:23:f7
-> 02 00 00 48 00 45 2c f0 5d 25 23 f7 08 06 00 01 08 00 06 04 00 02 2c f0 5d 25 23 f7 c0 a8 0a 6d 02 00 00 48 00 45 c0 a8 0a a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
# 192.168.10.160 192.168.10.109 ICMP 74 Echo (ping) reply
<- 2c f0 5d 25 23 f7 02 00 00 48 00 45 08 00 45 00 00 3c 99 4b 00 00 ff 01 00 00 c0 a8 0a a0 c0 a8 0a 6d 00 00 00 00 00 01 00 5d 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 61 62 63 64 65 66 67 68 69
# ping ...
-> 02 00 00 48 00 45 2c f0 5d 25 23 f7 08 00 45 00 00 3c 99 4c 00 00 40 01 4b 17 c0 a8 0a 6d c0 a8 0a a0 08 00 4c fd 00 01 00 5e 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 61 62 63 64 65 66 67 68 69
<- 2c f0 5d 25 23 f7 02 00 00 48 00 45 08 00 45 00 00 3c 99 4c 00 00 ff 01 00 00 c0 a8 0a a0 c0 a8 0a 6d 00 00 00 00 00 01 00 5e 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 61 62 63 64 65 66 67 68 69
# ...... ping 4 times in total
# MicroStarINT_25:23:f7 02:00:00:48:00:45 ARP 42 Who has 192.168.10.160? Tell 192.168.10.109
-> 02 00 00 48 00 45 2c f0 5d 25 23 f7 08 06 00 01 08 00 06 04 00 01 2c f0 5d 25 23 f7 c0 a8 0a 6d 02 00 00 48 00 45 c0 a8 0a a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
# 02:00:00:48:00:45 MicroStarINT_25:23:f7 ARP 60 192.168.10.160 is at 02:00:00:48:00:45
<- 2c f0 5d 25 23 f7 02 00 00 48 00 45 08 06 00 01 08 00 06 04 00 02 02 00 00 48 00 45 c0 a8 0a a0 2c f0 5d 25 23 f7 c0 a8 0a 6d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
4. MAC控制器
IEEE802.3定义了相关以太网行业标准
MII接口
MII(Media Independent Interface)即媒体独立接口,MII接口是MAC与PHY连接的标准接口。[IEEE803.2-2022 : 22.2.1]
以下是一个通用的MII接口描述:
信号名 | 数量 | 全称 | 功能描述 | 状态 |
---|---|---|---|---|
TXD[3:0] | 4 | Transmit Data | 从MAC层到物理层的发送数据总线 | 数据信号 |
TX_EN | 1 | Transmit Enable | 表示MAC层正在发送有效数据的信号 | 控制信号 |
TX_ER | 1 | Transmit Error | 当MAC层检测到发送错误时发送的信号 | 错误信号 |
TX_CLK | 1 | Transmit Clock | PHY芯片提供并传递给MAC层的连接时钟信号,用于同步发送数据 | 时钟信号 |
RXD[3:0] | 4 | Receive Data | 从物理层到MAC层的接收数据总线 | 数据信号 |
RX_DV | 1 | Receive Data Valid | 表示物理层正在向MAC层发送有效数据的信号 | 状态信号 |
RX_ER | 1 | Receive Error | 当物理层检测到接收错误时发送的信号 | 错误信号 |
RX_CLK | 1 | Receive Clock | PHY芯片提供并传递给MAC层的连接时钟信号,用于同步接收数据 | 时钟信号 |
COL | 1 | Collision Detect | 碰撞检测信号,表示在物理层检测到网络碰撞 | 状态信号 |
CRS | 1 | Carrier Sense | 载波检测信号,表示物理层检测到网络载波 | 状态信号 |
MDIO | 1 | Management Data Input/Output | 用于MAC层和物理层之间的控制和状态信息交换的数据线 | 数据信号 |
MDC | 1 | Management Data Clock | 用于MDIO接口的时钟信号 | 时钟信号 |
- 在 100Mbps 传输速率下,时钟频率为 25Mhz
- 在 10Mbps 传输速率下,时钟频率为 2.5Mhz
RMII接口
RMII(Reduced Media Independent Interface)是MII接口的简化版本,主要用于低成本的以太网应用。以下是一个简化的RMII接口的MAC层定义接口:
信号名 | 数量 | 全程 | 功能描述 | 状态 |
---|---|---|---|---|
CLKREF | 1 | Clock Reference | 由外部时钟源提供的50MHz参考时钟,用于RMII接口的同步 | 时钟信号 |
TXD[1:0] | 2 | Transmit Data | 从MAC层到物理层的发送数据总线,数据位宽为2,是MII接口的一半 | 数据信号 |
TXEN | 1 | Transmit Enable | 数据发送使能信号,与MII接口中的该信号线功能一样 | 控制信号 |
RXD[1:0] | 2 | Receive Data | 从物理层到MAC层的接收数据总线,数据位宽为2,是MII接口的一半 | 数据信号 |
RXER | 1 | Receive Error | 数据接收错误提示信号,与MII接口中的该信号线功能一样 | 错误信号 |
RCS_DV | 1 | Receive Carrier Sense Detect | 载波检测信号 | 状态信号 |
MDIO | 1 | Management Data Input/Output | MAC层和物理层之间数据管理的接口,用于控制和状态信息的交换 | 数据信号 |
MDC | 1 | Management Data Clock | MDIO接口的时钟信号,用于同步MDIO的数据传输 | 时钟信号 |
在RMII接口中,发送和接收的数据线(TXD和RXD)的数据位宽为2,这是MII接口的一半,从而简化了接口设计。CLKREF是外部提供的参考时钟,用于RMII接口的同步,与MII接口不同,MII接口的发送和接收时钟是由物理层芯片提供的。MDIO和MDC用于MAC层和物理层之间的控制和状态信息的交换。
- 在 100Mbps 传输速率下,时钟频率为 50Mhz
- 在 10Mbps 传输速率下,时钟频率为 5Mhz
GMII接口
GMII(Gigabit Media Independent Interface)是千兆位介质无关接口,它支持高达1000Mbps的数据传输速率。GMII接口在MAC层和物理层之间提供了连接,并定义了它们之间的信号交互。以下是GMII接口的MAC层定义接口的表格,包括信号名、数量、全程、功能描述以及状态:
信号名 | 数量 | 全程 | 功能描述 | 状态 |
---|---|---|---|---|
TXD[7:0] | 8 | Transmit Data | 从MAC层到物理层的发送数据总线,数据位宽为8 | 数据 |
TXEN | 1 | Transmit Enable | 数据发送使能信号,与MII接口中的该信号线功能一样 | 控制信号 |
TXCLK | 1 | Transmit Clock | MAC层发送时钟,用于同步千兆位发送数据 | 时钟信号 |
GTXCTL | 1 | Gigabit Transmit Control | MAC层发送控制信号,用于控制发送操作 | 控制信号 |
RXD[7:0] | 8 | Receive Data | 从物理层到MAC层的接收数据总线,数据位宽为8 | 数据 |
RXER | 1 | Receive Error | 数据接收错误提示信号,与MII接口中的该信号线功能一样 | 错误信号 |
RXCLK | 1 | Receive Clock | 物理层接收时钟,用于同步千兆位接收数据 | 时钟信号 |
RXDV | 1 | Receive Data Valid | 表示物理层正在向MAC层发送有效数据的信号 | 状态信号 |
COL | 1 | Collision Detect | 碰撞检测信号,表示在物理层检测到网络碰撞 | 状态信号 |
CRS | 1 | Carrier Sense | 载波检测信号,表示物理层检测到网络载波 | 状态信号 |
MDIO | 1 | Management Data Input/Output | MAC层和物理层之间数据管理的接口,用于控制和状态信息的交换 | 数据信号 |
MDC | 1 | Management Data Clock | MDIO接口的时钟信号,用于同步MDIO的数据传输 | 时钟信号 |
请注意,GMII接口的具体实现可能因不同的网络硬件和芯片而有所不同。上述表格是基于GMII接口的一般特性。在实际应用中,需要参考相关的硬件文档和规范以获取准确的信息。
GMII接口通过GTXCLK和GRXCLK提供发送和接收的时钟信号,以确保数据的同步传输。GTXCTL和GRXCTL是发送和接收的控制信号,用于控制和报告发送和接收的状态。GTXD和GRXD是发送和接收的数据总线,数据位宽为8,支持千兆位的数据传输速率。GMDIO和GMDC则用于MAC层和物理层之间的控制和状态信息的交换。
这些信号的状态根据网络操作的情况而变化。例如,当MAC层发送数据时,GTXCTL信号将包含相应的发送控制信息;当物理层接收到数据时,GRXCTL信号将反映接收状态。GTXCLK和GRXCLK则保持稳定的时钟信号,以确保数据的正确传输。GMDIO和GMDC信号的状态取决于正在进行的控制和状态信息交换。
- 在 1000Mbps 传输速率下,时钟频率为 125Mhz
- 在 100Mbps 传输速率下,时钟频率为 25Mhz
- 在 10Mbps 传输速率下,时钟频率为 2.5Mhz
RGMII接口
RGMII(Reduced Gigabit Media Independent Interface)是GMII接口的简化版本,主要用于低成本的以太网应用。以下是一个简化的RGMII接口的MAC层定义接口:
信号名 | 数量 | 全程 | 功能描述 | 状态 |
---|---|---|---|---|
TXD[3:0] | 4 | Transmit Data | 从MAC层到物理层的发送数据总线,数据位宽为 | 数据信号 |
TXEN | 1 | Transmit Enable | 数据发送使能信号,与MII接口中的该信号线功能一样 | 控制信号 |
GTXCLK | 1 | Transmit Clock | MAC层发送时钟,用于同步千兆位发送数据 | 时钟信号 |
RXD[3:0] | 4 | Receive Data | 从物理层到MAC层的接收数据总线,数据位宽为4 | 数据信号 |
RXER | 1 | Receive Error | 数据接收错误提示信号,与MII接口中的该信号线功能一样 | 错误信号 |
RXCLK | 1 | Receive Clock | 物理层接收时钟,用于同步千兆位接收数据 | 时钟信号 |
RXDV | 1 | Receive Data Valid | 表示物理层正在向MAC层发送有效数据的信号 | 状态信号 |
COL | 1 | Collision Detect | 碰撞检测信号,表示在物理层检测到网络碰撞 | 状态信号 |
CRS | 1 | Carrier Sense | 载波检测信号,表示物理层检测到网络载波 | 状态信号 |
MDIO | 1 | Management Data Input/Output | MAC层和物理层之间数据管理的接口,用于控制和状态信息的交换 | 数据信号 |
MDC | 1 | Management Data Clock | MDIO接口的时钟信号,用于同步MDIO的数据传输 | 时钟信号 |
- 在 1000Mbps 传输速率下,时钟频率为 125Mhz,在时钟上下沿同时采样数据
- 在 100Mbps 传输速率下,时钟频率为 25Mhz,单个时钟采样
- 在 10Mbps 传输速率下,时钟频率为 2.5Mhz,单个时钟采样
XGMII接口
10Gbps的以太网接口
SMI接口
SMI(Serial Management Interface)是一种串行接口,是MII(Media Independent Interface)接口中的管理接口。它包含两根信号线:MDC(管理接口的时钟)和MDIO(双向的数据线)。通过SMI接口,MAC层芯片(或其他控制芯片)可以访问物理层芯片的寄存器,并通过这些寄存器来对物理层芯片进行控制和管理。
MDC是一个非周期信号,它的最小周期(即正电平时间和负电平时间之和)为400ns,最小正电平时间和负电平时间为160ns,最大的正负电平时间则无限制。MDC与TX_CLK和RX_CLK没有任何关系。而MDIO则用来传送MAC层的控制信息和物理层的状态信息,这些数据与MDC时钟同步,在MDC上升沿有效。
此外,MDIO原本是为MII总线接口定义的,MII用于连接MAC和PHY,它包含两种信号接口:一个数据接口用于MAC和PHY之间接收和发送以太网帧数据;另一个就是PHY管理接口,即MDIO,用于读写每个PHY的控制寄存器和状态寄存器,以控制PHY的行为或获取PHY的状态。MDIO是双向的,只支持一个MAC连接最多32个PHY的连接方式,且MAC作为master,PHY作为slave。
总的来说,SMI接口在以太网通信中扮演着重要的角色,为MAC层芯片和物理层芯片之间的控制和状态信息交换提供了便捷的通道。SMI接口的帧格式通常包括几个关键的字段,用于在MAC层和物理层之间传输控制信息和状态信息,简单示例如下:
字段名 | 长度 | 描述 |
---|---|---|
START | 2b | 帧起始标识:01 |
OPCODE | 2b | 操作码,10=读,01=写 |
PHYAD | 5b | 物理层芯片地址,用于标识要访问的物理层芯片 |
REGAD | 5b | 寄存器地址,用于选择物理层芯片中特定的寄存器 |
TA | 2b | if op_read: Z0, if op_wirte: 10 |
DATA | 16b | 数据字段 |
IDLE | Z高阻态 |