
1. 从一根网线说起为什么需要拆解以太网如果你拆开过一根网线会发现里面是几对双绞线。但数据是怎么从你电脑的CPU变成网线里流动的电信号最终到达另一台电脑的这个过程远比你想象的要复杂。很多人一提到以太网就想到IP地址、TCP/UDP协议这没错但那是“上层建筑”。真正决定你的网络能不能通、稳不稳、快不快的是底下那套硬件和接口标准也就是PHY、MAC、MII和Switch。搞嵌入式、FPGA开发或者做网络设备运维的兄弟如果只停留在“插上网线就能用”的层面一旦遇到“网口灯不亮”、“ping不通”、“丢包严重”这类问题基本就是两眼一抹黑只能凭感觉瞎试。我见过太多项目硬件画好了驱动也调了但就是连不上网。一查不是PHY芯片的配置寄存器没写对就是MAC和PHY之间的MII接口时序没匹配或者是Switch的VLAN没划分明白。这些问题软件工程师觉得是硬件问题硬件工程师觉得是驱动问题最后互相扯皮。所以今天我就把这套最底层、最核心的“黑话”掰开揉碎了讲清楚。这不是一篇照本宣科的教科书而是我这些年调板子、查问题攒下来的实战理解。我们会从数据流的视角看一个网络数据包是如何“披荆斩棘”从内存走到网线里的。2. 核心角色拆解MAC与PHY一个管脑子一个管手脚理解以太网硬件首先要分清两个核心芯片MAC和PHY。你可以把它们想象成公司里的两个部门职责清晰分工明确。2.1 MACMedia Access Control流量调度与规则制定者MAC层中文叫媒体访问控制层。它工作在OSI七层模型的数据链路层的下半部分。它的核心职责不是处理物理信号而是制定规则和管理数据流。MAC具体干什么成帧与解帧这是MAC的老本行。上层比如IP层递下来的是一堆数据称为“分组”或“Packet”。MAC负责给这堆数据“打包”在头部加上目标MAC地址、源MAC地址、类型字段在尾部加上帧校验序列FCS组装成一个标准的“以太网帧”。反过来收到一个帧后MAC要剥掉头和尾把净荷数据提取出来交给上层。CSMA/CD载波侦听多路访问/冲突检测这是经典以太网半双工的“交通规则”。MAC要监听网络是否空闲载波侦听空闲才能发送。发送过程中还要持续监听万一和别人“撞车”了冲突检测就要执行一套“退避算法”等个随机时间再重发。虽然全双工交换网络普及后冲突基本消失但这个机制是刻在MAC骨子里的。流量控制当接收方处理不过来时可以通过发送“暂停帧”告诉对方“哥们儿慢点发”MAC要能识别和处理这种帧实现流量控制。MAC地址管理每个MAC控制器都有一个全球唯一的48位物理地址烧死在芯片里或可配置。MAC要能识别发给自己的帧目标MAC地址匹配或为广播/组播并过滤掉不是发给自己的帧。注意我们常说的“网卡”或“网络控制器”通常指的就是MAC控制器。在SoC如STM32、Zynq或FPGA里它往往是以一个IP核的形式存在。2.2 PHYPhysical Layer物理信号的翻译官PHY层就是物理层。它负责处理最“脏活累活”的部分把MAC层传来的数字信号转换成能在特定介质双绞线、光纤上传输的模拟信号反之亦然。PHY具体干什么编解码MAC给过来的信号是简单的0/1数字信号比如NRZ编码。PHY要对其进行线路编码例如在百兆以太网中使用4B/5B编码在千兆以太网中使用8B/10B编码。编码的目的是为了在物理线路上实现直流平衡、便于时钟恢复等。接收时PHY再把复杂的线路编码还原成简单的0/1信号。数模/模数转换对于铜缆双绞线PHY内部有DA转换器把编码后的数字信号变成模拟电压差分信号驱动到网线上。同时接收端有AD转换器把从网线上感应到的微弱差分模拟信号转换回数字信号。这就是为什么PHY芯片附近总有一堆模拟器件变压器、电容、电阻。时钟恢复与对齐发送和接收双方没有共同的时钟线。PHY必须从接收到的数据流中提取出时钟信号并用这个时钟来采样数据确保不会采错位。这是PHY最核心的技术之一。链路协商当你插上网线网口灯开始闪烁那就是两端的PHY在“握手”。它们通过交换特定的脉冲序列Auto-Negotiation协商出双方都支持的最高速率10M/100M/1000M、双工模式全双工/半双工等。协商成功链路才真正“UP”。信号调理对信号进行放大、滤波、均衡以补偿长距离传输带来的损耗和失真。实操心得调PHY最常踩的坑就是时钟和复位。PHY芯片通常需要一颗25MHz或125MHz的外部晶振。如果这个时钟不稳链路可能时通时断或者协商速率不对。另外PHY的复位时序必须满足数据手册要求复位不彻底会导致PHY内部寄存器状态异常表现为“找不到PHY”读PHY ID失败。它们的关系MAC是“大脑”负责逻辑和协议PHY是“手脚和感官”负责与物理世界交互。MAC说“把这一帧数据发出去目标地址是XX。”PHY就负责把这帧数据变成电信号怼到网线上去。没有MACPHY不知道发什么没有PHYMAC的信号出不了芯片。3. 沟通的桥梁MII及其家族MAC与PHY的“接线协议”MAC和PHY是两个独立的芯片它们之间必须通过一组标准的接口来通信。这组接口定义了数据线、控制线、时钟线的数量和时序。这就是MII以及它的各种变体。你可以把它理解为连接CPU和内存的DDR总线是一种芯片间互联标准。3.1 经典MII最初的“宽车道”MII是Media Independent Interface的缩写意为“介质无关接口”。这个名字很贴切它让MAC的设计可以独立于具体的PHY无论是铜缆PHY还是光纤PHY。数据线TXD[3:0]4位发送数据线由MAC驱动PHY接收。RXD[3:0]4位接收数据线由PHY驱动MAC接收。为什么是4位因为经典10M/100M以太网数据位宽就是4位半字节。在25MHz时钟100M模式或2.5MHz时钟10M模式下吞吐量达到100Mbps或10Mbps。控制线TX_EN发送使能MAC告诉PHY“我正在发送数据”。RX_DV接收数据有效PHY告诉MAC“我给你的数据是有效的”。TX_CLK/RX_CLK分别由PHY提供给MAC的发送和接收时钟。这一点非常重要意味着时序是以PHY为基准的。CRS载波侦听和COL冲突检测用于半双工模式。管理接口MDIO/MDC这是一个低速、两线的串行接口类似I2C。MAC作为管理者Master通过它来读写PHY芯片内部的大量配置寄存器例如设置速率、双工模式、软复位、查看链路状态等。没有这个接口你就无法配置PHY。MII的问题需要16根信号线不算MDIO/MDC引脚数量较多在追求高密度集成的设计中是个负担。3.2 RMII精简的“经济型车道”RMIIReduced MII应运而生它将信号线数量减少了一半。核心变化数据线减为2位TXD[1:0]和RXD[1:0]。为了在100Mbps下保持速率时钟频率必须加倍到50MHz。收发共用时钟REF_CLK。这个50MHz时钟可以由外部晶振提供也可以由MAC或PHY中的一方提供并供给另一方。这是RMII布线中最容易出错的地方必须根据芯片数据手册确定时钟源。简化控制去掉了CRS和COL。RMII的优势与挑战引脚少了布线简单了。但50MHz的时钟对信号完整性要求更高时钟源的方案选择需要仔细设计。3.3 GMII/RGMII千兆时代的“高速公路”到了千兆以太网1000Mbps数据吞吐量翻了10倍接口也必须升级。GMII可以看作是MII的千兆版。数据线位宽变为8位TXD[7:0],RXD[7:0]。时钟频率为125MHz。需要24根信号线比MII还多。RGMII这才是主流Reduced GMII在GMII基础上精简。数据线减为4位TXD[3:0],RXD[3:0]。采用DDR双倍数据速率技术在时钟的上升沿和下降沿都采样数据。这样在125MHz时钟下4位数据线就能实现1000Mbps的速率125MHz * 2边沿 * 4位 1000Mbps。时钟TXC发送时钟和RXC接收时钟由PHY提供频率125MHz。关键点时钟偏移RGMII规范定义数据信号应该相对于时钟信号有一定的延迟约1~2ns以确保在接收端能正确采样。很多PHY和MAC芯片支持在内部调整这个延迟通过寄存器配置如果没调好会导致千兆链路不稳定或根本无法建立。接口选择总结表接口标准适用速率数据位宽时钟频率关键时钟源引脚数约主要特点MII10/100M4位25MHz (100M) / 2.5MHz (10M)TX_CLK, RX_CLK (PHY提供)16经典引脚多RMII10/100M2位50MHzREF_CLK (需指定源)8引脚少时钟设计关键GMII10/100/1000M8位125MHzGTX_CLK, RX_CLK24千兆标准引脚多RGMII10/100/1000M4位 (DDR)125MHzTXC, RXC (PHY提供)12千兆主流需处理时钟延迟踩坑实录在一次Zynq-7000项目中使用RGMII连接PHY。硬件设计时PCB走线等长处理得很好但千兆链路就是频繁丢包。最后用示波器看眼图发现数据与时钟对齐得太“好”了几乎没有延迟。查阅PHY芯片手册发现有一个寄存器位可以控制“在内部对时钟进行延迟”。将其使能后数据相对时钟产生了符合规范的延迟链路立刻变得无比稳定。所以RGMII调不通先查时钟延迟配置。4. 网络的枢纽Switch不止是“一分多”当网络中有多于两个设备时就需要Switch交换机。家用路由器里通常集成了一个4口或8口的Switch。它的核心功能是根据MAC地址在端口间智能转发数据帧。4.1 Switch的核心工作原理MAC地址表学习与转发Switch内部维护着一张MAC地址表记录了哪个MAC地址连接在它的哪个物理端口上。学习当一个帧从端口X进入SwitchSwitch会查看该帧的源MAC地址然后在MAC地址表中记录一条“MAC地址 A 位于端口 X”。这个过程是自动的、持续的。转发/过滤接着Switch查看该帧的目的MAC地址。如果目的MAC地址在地址表中且对应的端口是Y那么Switch就将这个帧仅从端口Y转发出去单播。如果目的MAC地址不在表中或者是一个广播地址FF:FF:FF:FF:FF:FF那么Switch会将这个帧从除了接收端口X之外的所有其他端口转发出去泛洪。如果目的MAC地址对应的端口就是接收端口X即发给本端口已连接设备的Switch会丢弃这个帧过滤避免不必要的流量。通过这个过程Switch将原本一个共享的、会发生冲突的“总线型”网络用Hub变成了多个独立的、并发的“点对点”连接极大地提升了网络效率和安全性。4.2 交换机的关键特性与配置VLAN虚拟局域网这是Switch最重要的功能之一。它可以将一个物理交换机在逻辑上划分成多个独立的广播域。属于不同VLAN的端口即使接在同一台交换机上二层流量也是完全隔离的除非通过三层路由。配置VLAN是管理中型以上网络的基本功。端口模式Access口通常用于连接终端设备电脑、IP摄像头。该端口只属于一个VLAN发出的帧不带VLAN标签。Trunk口用于交换机之间的互联。该端口允许多个VLAN的流量通过帧会带上802.1Q VLAN标签来区分所属VLAN。链路聚合将多个物理端口捆绑成一个逻辑端口增加带宽并提供冗余。STP生成树协议在复杂的网络拓扑中防止出现环路导致广播风暴。实操心得在嵌入式设备中集成Switch芯片如Marvell 88E6xxx系列时除了连接好MII/RGMII接口一定要仔细配置Switch的VLAN和端口状态。默认情况下Switch芯片所有端口可能都在同一个VLAN里且处于转发状态。如果你的设备有多个网口例如一个WAN口多个LAN口必须通过MDIO接口或SPI/I2C管理接口将端口划分到不同的VLAN并设置好端口角色如哪个是CPU口哪个是上行口。否则会出现网络环路或者无法隔离流量的问题。很多“设备接上交换机后网络就卡”的问题根源就在这里。5. 实战串联一个数据包的完整旅程现在我们把所有角色串联起来看一个从STM32发送到局域网上另一台电脑的UDP数据包到底经历了什么。发送端STM32 PHY应用层你的程序调用socket.sendto()数据从应用层缓冲区交给协议栈。协议栈处理UDP层加上UDP头IP层加上IP头包含目标IP。ARP查询协议栈发现不知道目标IP对应的MAC地址于是发一个ARP广播请求。MAC层接手协议栈将封装好的IP数据包Packet交给MAC驱动。MAC控制器比如STM32内部的ETH模块在这个Packet前面加上目标MAC地址通过ARP获得、源MAC地址STM32的MAC地址、类型字段0x0800表示IPv4末尾计算并加上FCS。现在它成了一个完整的以太网帧。通过MII接口MAC控制器通过MII/RMII接口的TXD线和TX_EN信号在TX_CLK的节拍下将帧数据一位一位或半字节、字节地发送出去。PHY加工PHY芯片通过MII接口收到数字比特流。它先进行线路编码如4B/5B然后通过DA转换器变成模拟差分信号再经过变压器耦合将信号送到RJ45网口最终进入双绞线。网络中间Switch数据帧到达Switch的某个端口。Switch的PHY将模拟信号还原成数字比特流。Switch的MAC层解析帧头提取源MAC地址学习到“这个MAC在端口1”。查看目的MAC地址去MAC地址表里查找。如果找到在端口3就将帧只转发到端口3如果没找到就泛洪到所有其他端口。端口3的PHY再将帧转换成电信号发送出去。接收端目标电脑网卡的PHY收到信号进行时钟恢复、解码、AD转换通过MII接口将数字比特流送给MAC。MAC检查帧的FCS确认无误后检查目的MAC地址是否与自己的地址匹配或为广播/组播。如果匹配则剥掉帧头和帧尾将里面的IP数据包Packet提交给上层协议栈。协议栈层层解包最终将UDP数据 payload 递交给目标应用程序。6. 常见问题排查思路从现象倒推根源当你遇到网络问题时按照这个层次化的思路去排查会高效很多。现象1网口指示灯不亮Link灯不亮问题定位这几乎是纯粹的PHY层或物理层问题。Link灯由PHY芯片直接控制表示它和对端PHY成功完成了自动协商。排查步骤硬件检查网线是否完好是否交叉线/直连线用错现代设备大多支持自动翻转但老设备可能不支持。PHY的电源、复位、晶振是否正常用示波器量25MHz/125MHz时钟是否有、是否稳定。软件检查通过MDIO读取PHY的基本控制寄存器和状态寄存器。重点看是否设置了软复位后没有等待足够时间是否错误地禁用了自动协商强制设置了某种模式链路伙伴对端设备支持的能力是什么协商结果是什么寄存器中有详细字段PHY的ID能否正确读取读不出来说明MDIO通信有问题。现象2Link灯亮但Ping不通无法发送/接收问题定位链路层已通问题可能出在MAC层、MII接口或上层协议栈。排查步骤MAC基础配置确认MAC控制器的初始化正确。包括MAC地址是否已正确配置到寄存器中很多SoC需要手动设置速度和双工模式是否与PHY协商的结果一致例如PHY协商成千兆全双工MAC也要配置成千兆模式DMA描述符环是否正确设置这是数据搬运的通道配置错误会导致数据无法存入内存或从内存取出。MII接口信号用逻辑分析仪或带协议解码功能的示波器抓取MII/RMII/RGMII接口的波形。看时钟有没有频率对不对发送时TX_EN是否伴随数据一起有效接收时RX_DV是否有效数据线上有没有乱码对于RGMII重点看数据与时钟的相位关系。协议栈与驱动确认驱动的中断服务程序是否正常触发发送完成、接收中断。检查接收到的帧的FCS是否正确MAC地址过滤是否过于严格误过滤了该收的帧。用抓包工具如Wireshark在软件层面看是否能抓到发出的ARP请求等广播包这能帮助定位问题是出在硬件发送之前还是之后。现象3能Ping通但传输速度慢、丢包严重问题定位这通常是性能瓶颈或稳定性问题涉及各个层面。排查步骤DMA与中断这是嵌入式网络性能的关键。检查是否因为DMA描述符环太小或处理不及时导致数据被覆盖接收丢包或发送卡顿。可以考虑增大描述符环数量或者使用接收中断合并、发送完成轮询等优化策略。时钟与信号完整性高速接口尤其是RGMII对信号质量非常敏感。用示波器看眼图是否张开有没有过冲、振铃时钟和数据线的长度是否做了等长处理电源是否干净交换机配置如果设备连接了交换机检查交换机的端口统计信息是否有大量的CRC错误、冲突、丢包端口的流控是否打开VLAN配置是否正确是否意外形成了环路PHY高级功能有些PHY支持节能模式EEE、线缆诊断等功能如果配置不当可能影响稳定性。尝试在PHY寄存器中关闭这些高级功能看是否改善。理解PHY、MAC、MII和Switch就像是拿到了网络硬件层的“地图”。当网络出现问题时你不会再像无头苍蝇一样乱撞而是可以冷静地分析“Link灯不亮是PHY没协商成功查时钟和配置寄存器。”“能Ping但丢包可能是DMA吞吐不够或者RGMII时序有问题。”这种从底层原理出发的排查能力是区分普通应用开发者和资深嵌入式/网络开发者的关键。下次当你再面对一个网口时希望你能清晰地看到数据在其中流动的轨迹以及每一个环节可能潜藏的陷阱。