以太网硬件
太网结构
从硬件角度来看,以太网由 CPU、MAC、PHY 三部分组成,如下图示意:
上图中 DMA 集成在 CPU,CPU、MAC、PHY 并不是集成在同一个芯片内,由于 PHY 包含大量模拟器件,而 MAC 是典型的数字电路,考虑到芯片面积及模拟/数字混合架构的原因,通常,将 MAC 集成进 CPU 而将 PHY 留在片外。更灵活、密度更高的芯片技术已经可以实现 MAC 和 PHY 的单芯片整合。可分为下列几种类型:
- CPU 集成 MAC 与 PHY。目前来说并不多见
- CPU 集成 MAC,PHY 采用独立芯片。比较常见
- CPU 不集成 MAC 与 PHY,MAC 与 PHY 采用集成芯片。比较常见
在 OSI 模型中的地位
MAC 及 PHY 工作在 OSI 七层模型的数据链路层和物理层。具体如下:
IEEE802.3标准文档下载地址:https://ieeexplore.ieee.org/browse/standards/get-program/page/。它分为很多个section。
标准文档贼长,大概第一部分是 10Mb/s 以太网(其中有关于 MAC 的规范),第二部分是 100BASE-T 100Mb/s 基带网络介绍,第三部分是 1000 Mb/s 基带网络介绍,第四部分是 10 Gb/s 基带网络介绍。但是,并不是说每部分都是独立的。
大框架
下图是网络接口内部结构图,虚框表示 CPU,MAC 集成在 CPU 中,PHY 芯片通过 MII 接口与 CPU 上的 MAC 连接:
以上是以太网结构大框架,下面分别介绍各个部分
MAC
MAC (Media Access Control) 即媒体访问控制层协议。MAC 由硬件控制器及 MAC 通信协议构成。该协议位于 OSI 七层协议中数据链路层的下半部分,主要负责控制与连接物理层的物理介质。MAC 硬件框图如下图所示:
在发送数据的时候,MAC 协议可以事先判断是否可以发送数据,如果可以发送将给数据加上一些控制信息,最终将数据以及控制信息以规定的格式发送到物理层。
在接受数据的时候,MAC 协议首先判断输入的信息是否发生传输错误,如果没有错误,则去掉控制信息发送至 LLC (逻辑链路控制)层。
该层协议由 IEEE802.3 标准定义。
以太网数据链路层其实包含 MAC (介质访问控制)子层和 LLC (逻辑链路控制)子层。一块以太网卡 MAC 芯片的作用不但要实现 MAC 子层和 LLC 子层的功能,还要提供符合规范的 PCI 界面以实现和主机的数据交换。
MAC 芯片 = MAC 子层 + LLC 子层 + PCI 界面
MAC 从 PCI 总线收到 IP 数据包(或者其它网络协议的数据包)后,将之拆分并重新打包成最大 1518 字节、最小 64 字节的帧。这个帧里面包括了目标 MAC 地址、自己的源 MAC 地址和数据包里面的协议类型(比如 IP 数据包的类型用 80 表示,最后还有一个DWORD(4Byte) 的 CRC 码。
IP 地址和 MAC 地址之间的关联关系保存在主机系统里面,叫做 ARP 表。由驱动程序和操作系统完成。在 Microsoft 的系统里面可以用arp -a 的命令查看 ARP 表。收到数据帧的时候也是一样,做完 CRC 校验以后,如果没有 CRC 效验错误,就把帧头去掉,把数据包拿出来通过标准的接口传递给驱动和上层的协议栈。最终正确的达到我们的应用程序。
一般,MAC 芯片的一端连接 PCI 总线,另一端通过 MII 接口连接 PHY 芯片。
PHY
PHY (Physical Layer) 是 IEEE802.3 中定义的一个标准模块,MAC 或 CPU 通过 MIIM (MII Manage Interface) 对 PHY 的行为、状态、进行管理和控制,具体是通过读写 PHY 内部的寄存器实现的。PHY 基本结构如下图:
PHY 收到 MAC 发过来的数据(对 PHY 来说,没有帧的概念,都是数据)后,把并行数据转化为串行流数据,再按照物理层的编码规则把数据编码,再变成模拟信号把数据发送出去。收数据时的流程反之。
PHY 还有个重要功能就是实现 CSMA/CD 的部分功能,它可以检测到网络上是否有数据在发送,如果有数据在传送中就等待,一旦检测到网络空闲,再等待一个随即时间后将发送数据出去。如果碰巧两张网卡同时送出了数据,那必然造成冲突,这时候冲突检测机构可以检测到冲突,然后各等待一个随机的时间重新发送数据。
PHY 寄存器的地址空间为 5 位,从 0 到 31 最多可以定义 32 个寄存器(随着芯片功能不断增加,很多 PHY 芯片采用分页技术来扩展地址空间以定义更多的寄存器),IEEE802.3 定义了地址为 0-15 这 16 个寄存器的功能,地址 16-31 的寄存器留给芯片制造商自由定义,如下表所示:
注:
- 上图 B 和 E 表示在特定接口下,寄存器是基本的还是扩展的。例如:MII 接口下只有 0 和 1 寄存器是基本的,其它的是扩展的。所为扩展是指留给 IEEE 以后的扩展特性用,不是给 PHY 厂商的扩展,PHY 厂商自定义的只能是 16~31 号寄存器 。
- 在 IEEE 标准文档及某些 PHY 手册中,某寄存器的比特(bit)用 X.y 表示,如 0.15 表示第 0 寄存器的第 15 位。
Control Register(Register 0)
寄存器 0 是 PHY 控制寄存器,通过 Control Register 可以对 PHY 的主要工作状态进行设置。应该保证控制寄存器每个位的默认值,以便在没有管理干预的情况下,上电或复位时 PHY 的出时状态为正常操作状态。Control Register的每一位完成的功能见下。
Status Register(Register 1)
寄存器 1 是 PHY 状态寄存器,主要包含 PHY 的状态信息,大多数 bit 的值都是由芯片厂家确定的,每一个 bit 的功能如下表所示
PHY Identifier Register(Register 2、3)
寄存器 2 和 3 存放 PHY 芯片的型号代码,寄存器 2(PHY ID1) 为高 16 位,而寄存器 3(PHY ID2) 为低 16 位。由芯片制造商自行定义,实际应用中软件通过读取这两个寄存器的内容可以识别PHY的型号和版本。
MII
MII(Media Independent Interface)介质无关接口,它是 IEEE802.3 定义的行业标准,是 MAC 与 PHY 之间的接口。它包括一个数据接口(16 个信号)和一个 MAC 和 PHY 之间的管理接口(两个信号:时钟(MDC) + 数据(MDIO)),如下图所示:
信号定义如下:
信号名称 | 描述 | 方向 |
---|---|---|
TX_CLK | 发送时钟 | MAC ⬅ PHY |
TX_ER | 发送数据错误 | MAC → PHY |
TX_EN | 发送使能 | MAC → PHY |
TXD0 | 发送数据位0(最先传输) | MAC → PHY |
TXD1 | 发送数据位1 | MAC → PHY |
TXD2 | 发送数据位2 | MAC → PHY |
TXD3 | 发送数据位3 | MAC → PHY |
RX_CLK | 接收时钟 | MAC ⬅ PHY |
RX_DV | 接收数据有效 | MAC ⬅ PHY |
RX_ER | 接收数据错误 | MAC ⬅ PHY |
RXD0 | 接收数据位0(最先传输) | MAC ⬅ PHY |
RXD1 | 接收数据位1 | MAC ⬅ PHY |
RXD2 | 接收数据位2 | MAC ⬅ PHY |
RXD3 | 接收数据位3 | MAC ⬅ PHY |
CRS | 载波监测 | MAC ⬅ PHY |
COL | 冲突碰撞监测 | MAC ⬅ PHY |
MDIO | 管理数据 | 双向 <–> |
MDC | 管理数据时钟 | MAC → PHY |
MAC 通过 MIIM 接口读取 PHY 状态寄存器以得知目前 PHY 的状态。例如连接速度、双工的能力等。
也可以通过 MIIM 设置 PHY 的寄存器达到控制的目的。例如流控的打开关闭、自协商模式还是强制模式等。
MII 以 4 位半字节方式传送数据双向传输,时钟速率 25MHz。其工作速率可达 100Mb/s。当时钟频率为 2.5MHz 时,对应速率为10Mb/s。MII 接口虽然很灵活但由于信号线太多限制多接口网口的发展,后续又衍生出 RMII、SMII、GMII 等。
RMII
RMII (Reduced Media Independant Interface),精简 MII 接口,节省了一半的数据线。RMII 收发使用 2 位数据进行传输,收发时钟均采用 50MHz 时钟源。信号定义如下:
信号名称 | 描述 | 方向 |
---|---|---|
REF_CLK | 参考时钟 | MAC → PHY 或 由外部时钟源提供 |
TX_EN | 发送数据使能 | MAC → PHY |
TXD0 | 发送数据位0(最先传输) | MAC → PHY |
TXD1 | 发送数据位1 | MAC → PHY |
RX_ER | 接收错误 | MAC ⬅ PHY |
RXD0 | 接收数据位0(最先传输) | MAC ⬅ PHY |
RXD1 | 接收数据1 | MAC ⬅ PHY |
CRS_DV | 载波和接收数据有效 | MAC ⬅ PHY |
MDIO | 管理数据 | 双向 <–> |
MDC | 管理数据时钟 | MAC → PHY |
其中 CRS_DV 是 MII 中 RX_DV 和 CRS 两个信号的合并,当物理层接收到载波信号后 CRS_DV 变得有效,将数据发送给 RXD。当载波信号消失后,CRS_DV 会变为无效。在 100M 以太网速率中,MAC 层每个时钟采样一次 RXD[1:0] 上的数据,在 10M 以太网速率中,MAC 层每 10 个时钟采样一次 RXD[1:0] 上的数据,此时物理层接收的每个数据会在 RXD[1:0] 保留 10 个时钟。
SMII
SMII(Serial Media Independant Interface),串行MII接口。它包括TXD,RXD,SYNC三个信号线,共用一个时钟信号,此时钟信号是125MHz,信号线与此时钟同步。信号定义如下:
信号名称 | 描述 | 方向 |
---|---|---|
REF_CLK | 参考时钟 | 外部时钟源提供125MHz |
TXD | 发送数据 | MAC → PHY |
RXD | 接收数据 | PHY → MAC |
SYNC | 同步信号 | - |
MDIO | 管理数据 | 双向 |
MDC | 管理数据时钟 | MAC → PHY |
GMII
GMII(Gigabit Media Independant Interface),千兆 MII 接口。GMII 采用 8 位接口数据,工作时钟 125MHz,因此传输速率可达1000Mbps。同时兼容 MII 所规定的 10/100Mbps 工作方式。GMII 接口定义见IEEE 802.3-2000。信号定义如下:
信号名称 | 描述 | 方向 |
---|---|---|
GTX_CLK | 1000M发送时钟 | MAC → PHY |
TX_CLK | 100/10M发送时钟 | MAC → PHY |
TX_ER | 发送数据错误 | MAC → PHY |
TX_EN | 发送使能 | MAC → PHY |
TX_[7:0] | 发送数据8bit | MAC → PHY |
RX_CLK | 接收时钟 | PHY → MAC |
RX_DV | 接收数据有效 | PHY → MAC |
RX_ER | 接收数据错误 | PHY → MAC |
RX_[7:0] | 接收数据8bit | PHY → MAC |
CRS | 载波监测 | PHY → MAC |
COL | 冲突碰撞监测 | PHY → MAC |
MDIO | 管理数据 | 双向 |
MDC | 管理数据时钟 | MAC → PHY |
RGMII
RGMII(Reduced Gigabit Media Independant Interface),精简 GMII 接口。相对于 GMII 相比,RGMII 具有如下特征:
- 发送/接收数据线由8条改为4条
- TX_ER和TX_EN复用,通过TX_CTL传送
- RX_ER与RX_DV复用,通过RX_CTL传送
- 1 Gbit/s速率下,时钟频率为125MHz
- 100 Mbit/s速率下,时钟频率为25MHz
- 10 Mbit/s速率下,时钟频率为2.5MHz
信号定义如下:
信号名称 | 描述 | 方向 |
---|---|---|
TXC | 发送时钟 | MAC→PHY |
TX_CTL | 发送数据控制 | MAC → PHY |
TXD[3:0] | 发送数据4bit | MAC → PHY |
RXC | 接收时钟 | PHY → MAC |
RX_CTL | 接收数据控制 | PHY → MAC |
RXD[3:0] | 接收数据4bit | PHY → MAC |
MDIO | 管理数据 | 双向 |
MDC | 管理数据时钟 | MAC → PHY |
虽然 RGMII 信号线减半,但 TXC/RXC 时钟仍为 125Mhz,为了达到 1000Mbit 的传输速率,TXD/RXD 信号线在时钟上升沿发送接收 GMII 接口中的 TXD[3:0]/RXD[3:0],在时钟下降沿发送接收 TXD[7:4]/RXD[7:4],并且信号 TX_CTL 反应了 TX_EN 和 TX_ER 状态,即在TXC 上升沿发送 TX_EN,下降沿发送 TX_ER,同样的道理试用于 RX_CTL
参考
以太网详解(一)-MAC/PHY/MII/RMII/GMII/RGMII基本介绍