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标志着以太网帧的开始,固定为0xD5PHY
目的地址(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格式。

类型字段描述
0x0800IPv4
0x0806ARP
0x86DDIPv6
0x8100VLAN
# --------------------------------------
# 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]4Transmit Data从MAC层到物理层的发送数据总线数据信号
TX_EN1Transmit Enable表示MAC层正在发送有效数据的信号控制信号
TX_ER1Transmit Error当MAC层检测到发送错误时发送的信号错误信号
TX_CLK1Transmit ClockPHY芯片提供并传递给MAC层的连接时钟信号,用于同步发送数据时钟信号
RXD[3:0]4Receive Data从物理层到MAC层的接收数据总线数据信号
RX_DV1Receive Data Valid表示物理层正在向MAC层发送有效数据的信号状态信号
RX_ER1Receive Error当物理层检测到接收错误时发送的信号错误信号
RX_CLK1Receive ClockPHY芯片提供并传递给MAC层的连接时钟信号,用于同步接收数据时钟信号
COL1Collision Detect碰撞检测信号,表示在物理层检测到网络碰撞状态信号
CRS1Carrier Sense载波检测信号,表示物理层检测到网络载波状态信号
MDIO1Management Data Input/Output用于MAC层和物理层之间的控制和状态信息交换的数据线数据信号
MDC1Management Data Clock用于MDIO接口的时钟信号时钟信号
  • 在 100Mbps 传输速率下,时钟频率为 25Mhz
  • 在 10Mbps 传输速率下,时钟频率为 2.5Mhz

RMII接口

RMII(Reduced Media Independent Interface)是MII接口的简化版本,主要用于低成本的以太网应用。以下是一个简化的RMII接口的MAC层定义接口:

信号名数量全程功能描述状态
CLKREF1Clock Reference由外部时钟源提供的50MHz参考时钟,用于RMII接口的同步时钟信号
TXD[1:0]2Transmit Data从MAC层到物理层的发送数据总线,数据位宽为2,是MII接口的一半数据信号
TXEN1Transmit Enable数据发送使能信号,与MII接口中的该信号线功能一样控制信号
RXD[1:0]2Receive Data从物理层到MAC层的接收数据总线,数据位宽为2,是MII接口的一半数据信号
RXER1Receive Error数据接收错误提示信号,与MII接口中的该信号线功能一样错误信号
RCS_DV1Receive Carrier Sense Detect载波检测信号状态信号
MDIO1Management Data Input/OutputMAC层和物理层之间数据管理的接口,用于控制和状态信息的交换数据信号
MDC1Management Data ClockMDIO接口的时钟信号,用于同步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]8Transmit Data从MAC层到物理层的发送数据总线,数据位宽为8数据
TXEN1Transmit Enable数据发送使能信号,与MII接口中的该信号线功能一样控制信号
TXCLK1Transmit ClockMAC层发送时钟,用于同步千兆位发送数据时钟信号
GTXCTL1Gigabit Transmit ControlMAC层发送控制信号,用于控制发送操作控制信号
RXD[7:0]8Receive Data从物理层到MAC层的接收数据总线,数据位宽为8数据
RXER1Receive Error数据接收错误提示信号,与MII接口中的该信号线功能一样错误信号
RXCLK1Receive Clock物理层接收时钟,用于同步千兆位接收数据时钟信号
RXDV1Receive Data Valid表示物理层正在向MAC层发送有效数据的信号状态信号
COL1Collision Detect碰撞检测信号,表示在物理层检测到网络碰撞状态信号
CRS1Carrier Sense载波检测信号,表示物理层检测到网络载波状态信号
MDIO1Management Data Input/OutputMAC层和物理层之间数据管理的接口,用于控制和状态信息的交换数据信号
MDC1Management Data ClockMDIO接口的时钟信号,用于同步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]4Transmit Data从MAC层到物理层的发送数据总线,数据位宽为数据信号
TXEN1Transmit Enable数据发送使能信号,与MII接口中的该信号线功能一样控制信号
GTXCLK1Transmit ClockMAC层发送时钟,用于同步千兆位发送数据时钟信号
RXD[3:0]4Receive Data从物理层到MAC层的接收数据总线,数据位宽为4数据信号
RXER1Receive Error数据接收错误提示信号,与MII接口中的该信号线功能一样错误信号
RXCLK1Receive Clock物理层接收时钟,用于同步千兆位接收数据时钟信号
RXDV1Receive Data Valid表示物理层正在向MAC层发送有效数据的信号状态信号
COL1Collision Detect碰撞检测信号,表示在物理层检测到网络碰撞状态信号
CRS1Carrier Sense载波检测信号,表示物理层检测到网络载波状态信号
MDIO1Management Data Input/OutputMAC层和物理层之间数据管理的接口,用于控制和状态信息的交换数据信号
MDC1Management Data ClockMDIO接口的时钟信号,用于同步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层和物理层之间传输控制信息和状态信息,简单示例如下:

字段名长度描述
START2b帧起始标识:01
OPCODE2b操作码,10=读,01=写
PHYAD5b物理层芯片地址,用于标识要访问的物理层芯片
REGAD5b寄存器地址,用于选择物理层芯片中特定的寄存器
TA2bif op_read: Z0, if op_wirte: 10
DATA16b数据字段
IDLEZ高阻态