以太网是网络世界里最基础也最常被忽略的东西,很多做了两三年的运维或嵌入式工程师,能熟练配置交换机、能看懂抓包,但被问到“交换机的MAC地址表是怎么建起来的”“PHY芯片的寄存器到底在调什么”时,反而容易卡壳。这篇文章不打算泛泛讲OSI七层模型,而是从帧、交换机转发的底层逻辑、eNSP实操、PHY寄存器定位、车载以太网与嵌入式场景这几个维度切入,把这些年实际接触过的坑和经验一并拿出来聊聊。
1. 以太网到底在交换什么:从物理层到报文格式一次理清
1.1 接口、PHY和MAC:三者分工必须分清
很多人会把“网口”“PHY芯片”“MAC控制器”混为一谈,这是后面所有排查困难的总根源。实际上一块标准的以太网设备,硬件上有三个角色:
- MAC(媒体访问控制):负责组帧、解帧、地址识别、差错校验,通常集成在CPU/SOC内部,或者像W5500这种网络芯片内部。
- PHY(物理层收发器):负责把MAC传来的并行数据变成串行差分信号,通过网线或光纤发出去;反过来把收到的模拟信号解码成数字电平。PHY决定了协商速率、双工模式、MDI/MDIX极性等。
- 连接器与变压器:RJ45插座、网络隔离变压器、共模电感,作用是阻抗匹配、共模抑制和电气隔离。
从数据流看,CPU或MCU通过MII/RMII/RGMII接口把帧交给PHY,PHY完成编码(比如100BASE-TX的4B/5B编码、1000BASE-T的8B/10B编码)、扰码、并串转换后送到线缆上。也就是说,PHY是纯模拟与数字边界上的翻译官,MAC才是真正“懂以太网帧协议”的那一位。
我见过不少新人调试W5500不通,第一反应是去查SPI初始化,后来发现W5500内部其实已经把MAC和PHY都集成了,真正要关注的反而在硬件原理图上的变压器绕线方向和PHY地址配置。这一点后面单独展开。
1.2 以太网帧的每一段都有明确用途
以太网帧格式看着简单,但越基础的字段越容易被忽略。拿最常见的Ethernet II帧来说:
| 字段 | 长度 | 作用 |
|---|---|---|
| 前导码(Preamble) | 7字节 | 同步时钟,101010...交替 |
| SFD(帧起始定界符) | 1字节 | 10101011,标志帧开始 |
| 目的MAC(DA) | 6字节 | 接收方地址,单播/组播/广播 |
| 源MAC(SA) | 6字节 | 发送方地址 |
| EtherType / 长度 | 2字节 | 0x0800表示IPv4,0x86DD表示IPv6,0x8100表示带VLAN Tag |
| Payload | 46~1500字节 | 上层数据,不足46字节要填充 |
| FCS(帧校验序列) | 4字节 | CRC32,校验从DA到Payload |
之前热搜词里有人问“以太网帧中DA是啥意思”,DA就是Destination Address,目的地址。它决定了交换机是精确转发、泛洪还是丢弃。举个例子:DA是全F(FF-FF-FF-FF-FF-FF)时是广播帧,交换机会把它从除了接收端口以外的所有端口复制出去;DA是组播地址(第一字节最低位为1)时要看该端口是否有组播组成员;DA是单播地址时查MAC地址表转发。
EtherType和Length的区别也是高频考点:当该字段值大于等于0x0600(1536)时表示上层协议类型;小于等于0x05DC(1500)时表示负载长度,这是802.3原始帧的用法。一个简单的抓包就能看出差异,实网里基本全是Ethernet II帧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 交换机的核心逻辑:MAC地址表、广播域和环路
2.1 MAC地址表是怎样“自学”出来的
交换机比Hub高级的本质在于它有一张MAC地址表,这张表不是配置出来的,而是通过接收帧学习出来的。
学习流程可以三步讲完:
- 收到一个帧,记录源MAC与入端口的对应关系。
- 查目的MAC是否在表里。
- 存在则按表中端口转发(单播精确转发);不存在则向除入端口外的所有端口泛洪(Flooding)。
老化机制很重要。MAC表项有时间戳,华为交换机默认老化时间是300秒(可在接口视图用mac-address aging-time修改)。老化是为了适应设备移动、拓扑变化和MAC地址复用。如果设备频繁断网或出现“Ping不通但ARP能学到”的怪象,很多时候就是老化时间与终端休眠机制冲突,或者表项被错误刷新。
有个容易忽略的点:MAC表的学习不是只有“收到帧”这一个来源,三层交换机在解析ARP、处理组播时也可能生成对应的表项。比如设备发了一个ARP请求,交换机就能从ARP请求里学到一个源IP和MAC的对应关系(如果开了IP-MAC绑定或ARP表项联动),但普通二层表仍然只看帧头里的源MAC。
2.2 广播域与交换机泛洪的本质
交换机天然隔离冲突域,但同一个VLAN内的所有端口共享一个广播域。广播帧、未知单播帧在VLAN内泛洪,这就是广播风暴能瞬间打垮整台交换机的原因。
泛洪不是“全端口发一遍”那么简单。华为设备对未知单播泛洪有专门的“未知单播抑制”配置,但默认情况下,只要MAC表未学到,帧就会在所有同VLAN端口复制。一个常见的坑是:下面挂了一个抓包工具或存在环路,导致交换机CPU和背板带宽被打满,所有VLAN的转发都变慢。因为广播报文会占用每个端口的接收队列,并非只影响故障端口。
用eNSP模拟时,最简单的拓扑是两台PC接一台交换机,PC1 Ping PC2,第一次Ping会经历ARP广播和未知单播泛洪,第二Ping才开始精确转发。你在Wireshark里能看到同一时刻交换机向所有端口发出了同一帧,这就是广播域的真实行为。
2.3 环路是交换网络最大的敌人
为什么要讲生成树协议(STP/ RSTP),因为不堵住环路,MAC表就会在多个端口之间反复横跳。环路发生时,一个广播帧会被交换机从一个端口发出去,又从另一个端口收回来,然后再次泛洪,指数级复制,直到占满所有带宽。
MAC表“抖动”是环路的一个早期信号。你用display mac-address会看到某个MAC一会儿在G0/0/1,一会儿在G0/0/2,这就是同一设备有多条路径可达,交换机的学习逻辑被“绕晕”了。
STP的核心是选举根桥、根端口、指定端口,阻塞冗余口。RSTP则把收敛时间从30~50秒降到秒级。对普通企业网,建议直接用RSTP或MSTP;对只有两台交换机堆叠的场景,甚至可以考虑关闭STP以减少收敛抖动,但前提是物理上保证无环。
3. eNSP实操:从零搭一张最简单的交换网络并验证转发流程
3.1 拓扑设计与基础连通性测试
eNSP里搭最简单交换网络,我推荐这样设计:一台S5700交换机,三台PC(PC1、PC2、PC3),PC分别接入Ethernet0/0/1、Ethernet0/0/2、Ethernet0/0/3。PC的IP规划为192.168.10.1/24、192.168.10.2/24、192.168.10.3/24。
启动后先不做任何配置,PC1 Ping PC2,正常情况下能通。原因是交换机初始MAC表为空,Ping的第一轮通过ARP广播学表、泛洪,第二轮就开始单播转发。这个细节建议在PC1上开启Wireshark抓包,可以看到:
- 第一个ARP请求的目的MAC是全FF。
- 交换机把这个广播帧从E0/0/2和E0/0/3都发出去。
- PC2回ARP单播应答后,E0/0/1重新收到源MAC为PC2的帧,更新MAC表。
- 后续ICMP Echo帧的目的MAC已经变成PC2,不再泛洪。
很多人搭完环境发现“为什么我只在PC3也看到了PC1发来的ARP请求”,这就是广播域的效果,不用奇怪。
3.2 VLAN隔离与Trunk配置
接着做VLAN实验。把PC1放到VLAN 10,PC2放到VLAN 20,PC3放到VLAN 10。配置命令:
bash复制system-view
vlan batch 10 20
interface Ethernet0/0/1
port link-type access
port default vlan 10
interface Ethernet0/0/2
port link-type access
port default vlan 20
interface Ethernet0/0/3
port link-type access
port default vlan 10
此时PC1 Ping PC3能通,PC1 Ping PC2不通,因为不同VLAN的二层广播域被隔离了。如果是真实网络需要跨VLAN通信,就得加网关、三层交换机做VLANIF,再配置VLAN间路由。E0/0/1和E0/0/2之间的隔离是端口级隔离,不影响同一个接入交换机上其他VLAN的转发效率。
两台交换机对接时必须用Trunk接口,并且放通相关VLAN:
bash复制interface GigabitEthernet0/0/1
port link-type trunk
port trunk allow-pass vlan 10 20
Trunk口默认会打上802.1Q Tag,去掉后是Native VLAN(默认VLAN 1)。一个经典问题是:Trunk链路两端Native VLAN不一致,导致相同VLAN的帧在直连两台交换机时被错误剥离或错误打标,MAC表错乱,整个VLAN不通。排查时用display vlan和display interface trunk确认两端允许列表和PVID。
3.3 链路聚合与生成树配合
多链路冗余时不要直接接两根线,否则必然成环。正确做法是配置Eth-Trunk,把多条物理链路捆绑成一个逻辑链路,既增加带宽又消除环路:
bash复制interface Eth-Trunk1
trunkport GigabitEthernet0/0/1
trunkport GigabitEthernet0/0/2
interface Eth-Trunk1
port link-type trunk
port trunk allow-pass vlan 10 20
配置完用display eth-trunk 1可以看到成员端口的状态是“Selected”。如果出现“Unselected”,多半是两端成员口数目不一致或物理口shutdown,此时只有部分链路能用,带宽不会累加。
另一种情况是手头没有Eth-Trunk,只能用STP堵环。实际配置RSTP的步骤:
bash复制stp mode rstp
stp enable
要让核心交换机成为根桥,最好手动指定优先级:
bash复制stp priority 4096
注意RSTP的端口角色与状态:根端口(Root)、指定端口(Designated)、备份端口、替代端口。排查环路时输入display stp brief,如果发现某个接口长时间停留在Listening/Learning,说明拓扑不稳定,很可能有环路或优先级配置不合理。
4. 实战排查:从交换机运维到PHY寄存器级定位
4.1 华为交换机运维常用命令清单
日常维护华为交换机,最重要的不是会敲所有命令,而是知道故障时先看什么。我常用的排查顺序:
display interface brief:先看所有端口物理状态和协议状态,Up表示物理层正常,Down则先查网线和光电模块。display mac-address:看MAC表是否正常,是否在多个端口间跳变。display vlan:确认端口所属VLAN和Trunk允许列表。display stp brief:确认生成树状态,看是否有接口被阻塞。display logbuffer:看设备日志有没有端口UP/DOWN震荡、MAC地址迁移告警。
端口一直在Up/Down抖动,优先怀疑物理层。对于光模块,可以查display transceiver interface GigabitEthernet0/0/1 verbose,看光功率是否在正常范围。电口则检查网线线序、长度是否超过100米、对端是否强制协商。有一类特别隐蔽的问题是两个设备一端协商成千兆,另一端协商成百兆,此时display interface能看到Speed和Duplex异常。
如果你观察到的现象是“某台PC频繁掉线”,但交换机端口本身Up,很可能是MAC地址表抖动。可以开启mac-address flapping detection,华为设备默认会检测并告警,配合日志能快速定位是否有环路。
4.2 PHY芯片和寄存器读取:故障定位最后一公里
PHY寄存器是整个以太网物理层最“硬核”的排查入口。标准PHY寄存器有32个,每个16位,其中寄存器0~6是IEEE定义的基本寄存器,比如:
- 寄存器0(BMCR):控制复位、速度、全双工、回环、自动协商开关。
- 寄存器1(BMSR):读取能力,是否支持10/100/1000M、是否支持全双工、是否已建立链路。
- 寄存器4(ANAR):本端自动协商广告能力。
- 寄存器5(ANLPAR):对端通过协商后回送的广告能力。
我调过的一款国产PHY芯片,在系统启动后读寄存器1,发现Bit2(Link Status)一直是0,但示波器看差分信号有波形。最后定位到是PHY芯片的复位时序问题:CPU在PHY时钟稳定前就释放了复位,导致PHY内部PLL没有锁定。把复位信号延时100ms再拉高后,Link正常。这类硬件时序问题,抓包根本看不到,只能通过读寄存器1和PHY的Clock/Data信号来排查。
通用寄存器读取方式取决于接口:如果你用MDIO总线,可以直接用主控的MDIO控制器读写;如果是调试阶段,可以在Linux下用mii-tool或ethtool间接读。比如:
bash复制ethtool eth0
这条命令里的Speed、Duplex、Link detected信息就是内核读PHY寄存器后得到的。要进一步看PHY内部扩展寄存器,可以用mdio-tools(mdio读写工具):
bash复制mdio mdio0 phy_addr 5
实际应用时还要注意不同厂家的PHY扩展寄存器定义不同,Marvell和Broadcom的“直通寄存器”映射差异很大,参考手册务必找对版本。
4.3 复杂二层的抓包分析方法
如果说交换机命令行是外科手术刀,那Wireshark就是显微镜。排查二层问题时,抓包重点看这几个点:
- 帧头目的MAC是不是对的单播地址?如果是广播或组播,说明发送方可能没学到正确的MAC表项。
- EtherType是不是0x0806(ARP)?大量ARP请求加上大量Dup ACK,多半是IP地址冲突或网关问题。
- 帧长度有没有超过1518字节?如果出现“巨型帧”,要检查两端MTU是否一致。
- FCS错误频繁出现,说明物理层有干扰或网线质量差,很多交换机接口计数器里也有“CRC error”。
我自己遇到过最典型的一种“假不通”:把PC直连到交换机后,Ping网关能成,但Ping一个跨网段服务器就是不通。抓包发现PC已经发出ARP请求询问网关MAC,网关也回了ARP应答,但PC的ARP表一直不更新。后来定位到是PC和交换机之间的STP状态还没收敛完,交换机丢掉了前几个ARP广播帧。重启交换机或手动undo stp enable后立即恢复。这说明二层转发正常不代表控制平面正常,STP收敛期的丢包是很多“时通时不通”的根源。
5. 扩展场景:车载以太网、W5500与别样“交换”
5.1 W5500模块:硬件接线和寄存器配置避坑
W5500是一个集成MAC+PHY+TCP/IP协议栈的嵌入式以太网芯片,常用于单片机项目。它的28个寄存器组通过SPI接口访问,地址划分为Common寄存器、Socket寄存器和TX/RX buffer。设计原理图时有几个关键点:
- TX/RX Buffer大小:W5500内部TX/RX Buffer共32KB,默认按Socket0~3平均分配(8KB/8KB)。如果只开一个Socket,可以把Buffer调大来提升吞吐,但要注意
Sn_RXBUF_SIZE与Sn_TXBUF_SIZE设置必须和实际接收/发送逻辑一致,否则会出现数据错位。 - PHY地址:W5500的PHY地址固定为0,区别于外置PHY芯片可配置地址。SPI主设备访问时,控制字节里的PHY地址位要写0。
- 网络变压器:W5500芯片的TXOP/TXON、RXIP/RXIN引脚必须经过隔离变压器和RJ45连接,不能直连网线。变压器中心抽头的接法要看模块参考设计,很多自制板子通不过是因为中心抽头的偏置电压没处理好。
- 寄存器初始化顺序:先写Common寄存器(比如网关、MAC、IP),再设置Socket的模式、端口和Buffer大小,最后打开Socket监听。顺序反了会导致连接失败且找不出原因。
调试W5500时,我习惯第一步读VERSIONR寄存器,正常值是0x04。若读出全FF或全00,说明SPI时序或硬件连接有问题,根本不用去看网络层。再将PHY状态通过PHYCR寄存器确认开启自动协商,确保Link状态为Up。
5.2 车载以太网和传统以太网有什么不同
车载以太网(Automotive Ethernet)在热搜里出现不是偶然。现在智驾域控制器、激光雷达、摄像头之间大量使用100BASE-T1或1000BASE-T1,它和传统以太网的重要区别是:
- 物理层编码和线缆:100BASE-T1只用一对双绞线,双向同时传输,而普通100BASE-TX需要两对线(一对发、一对收)。T1接口用PAM3调制,在窄带线缆上实现全双工。
- 没有RJ45和隔离变压器传统接法:连接器是专用的H-MTD或MATEnet,线束更细、更轻,适合整车布线。
- 报文格式仍是标准以太网帧:这点很关键,DoIP(Diagnostic over IP)、SOME/IP服务发现、AVB/TSN时间同步都是建立在标准以太网帧之上的,所以抓包、VLAN、802.1Q、优先级处理的经验依然适用。
- VLAN在这里不是可选项:车载以太网通常用VLAN划分安全域和功能域,比如ADAS域、车身域、娱乐域,域间靠网关做二层隔离或三层路由。
如果你之前的经验都在企业网交换机上,转车载以太网时的思维切换是:不再关注STP、Eth-Trunk这些企业组网特性,更多关注TSN的时钟同步(802.1AS)、流量整形(802.1Qbv)、帧抢占(802.1Qbu)和SOME/IP的报文格式。底层交换原理仍然一致,学过的MAC表和泛洪知识能无缝迁移。
5.3 MII、RMII、RGMII接口:PCB级交换的取舍
讨论“MIPI接口与以太网接口的优缺点”其实是两种域的不同对比,MIPI主要用于显示屏、摄像头数据,以太网用于远距离和网络协议栈通信。但嵌入式系统里做交换功能时,CPU和PHY之间用什么接口确实要仔细选:
| 接口 | 数据位宽 | 时钟频率(100M) | 引脚数 | 适用场景 |
|---|---|---|---|---|
| MII | 4位 | 25MHz | 16根左右 | 老设计,功耗大 |
| RMII | 2位 | 50MHz | 10根左右 | 引脚紧张,简化设计 |
| RGMII | 4位DDR | 125MHz(千兆) | 12根左右 | 千兆主流 |
选择RMII时特别要注意REF_CLK的提供方式。REF_CLK可以由MAC提供,也可以由外部晶振提供,但两边必须一致。很多工程师在MAC(比如STM32)的RMII模式下选了“外部50MHz时钟”,却在PHY的XTAL输入上接了25MHz晶振,结果PHY完全无法工作。排查RMII问题时,先看时钟相位和数据建立时间,不要只怀疑代码。
如果要做多端口交换,一般不能简单地把多个PHY的RMII都接到同一个MAC上,需要靠外部交换芯片(如Marvell Link Street系列)把多个MAC口收敛成一个MII/RGMII接口上接主控。这也是“以太网交换”概念在嵌入式领域的延伸——不管接口多花哨,核心还是要维护MAC地址表、处理泛洪和VLAN Tag,和交换机芯片做的事如出一辙。
6. 交换机组网设计里的几个反直觉经验
6.1 泛洪比想象中更容易发生
很多人以为交换机只有收到广播帧才泛洪,其实未知单播帧也泛洪。一个应用场景是一台PC频繁更换IP或MAC,或者虚拟机漂移导致交换机端口不断学习新MAC,MAC表项不够用,老表项被踢出,于是交换机会出现大量未知单播泛洪,表现为整个VLAN内所有PC都在收到无关流量。
对付这种问题,除了提高老化时间,还可以手动配置静态MAC表项给关键服务器:
bash复制mac-address static 0011-2233-4455 interface GigabitEthernet0/0/1 vlan 10
但静态表项只适用于固定接入的服务器,对经常移动的终端不友好。合理规划VLAN规模、控制广播域大小,才是正解。一个VLAN里设备超过500台,广播帧带来的CPU消耗就很明显了。
6.2 VLAN规划不是“越多越好”
VLAN隔离了广播域,但带来了三层路由的复杂性。每个VLAN需要一个网关接口或VLANIF,每台主机的默认网关都要对应。如果规划得太碎,交换机路由表、ARP表、DHCP地址池都会增加不少负担。
我建议普通园区网VLAN划分按照“功能+物理位置”两个维度:
- 办公室终端一个VLAN,打印机一个VLAN。
- 监控、门禁等IoT设备单独VLAN,并且要单独限制访问外网。
- 服务器区单独VLAN,接入核心交换机,最好开DHCP Snooping和动态ARP检测。
在华为交换机上,给既有VLAN加三层接口只需:
bash复制interface Vlanif10
ip address 192.168.10.254 255.255.255.0
加上DHCP和IP-MAC绑定后,终端零配置接入。注意VLANIF必须对应一个存在的VLAN,且VLAN里至少有一个Up端口,否则VLANIF状态为Down,网关不可达。
6.3 广播域隔离还有一个“隐形”手段:端口隔离
有时候不想把一个交换机的所有终端彻底拆到不同VLAN,比如同一个办公室需要共享打印机,但又不想让终端之间互相直接访问。华为交换机上可以用端口隔离实现同VLAN内互访隔离:
bash复制interface Ethernet0/0/1
port-isolate enable
interface Ethernet0/0/2
port-isolate enable
配置后Ethernet0/0/1和Ethernet0/0/2之间即使同VLAN也不能互访,但都能访问网关、打印机和上行口。这个功能非常实用,一个“楼栋接入交换机”划分的VLAN可以很少,安全性却依然在线。
7. 故障排查实战记录:一个典型的“二层不通但抓包有回包”案例
最后分享一个最近处理的真实案例,完整链路能帮你把前面的知识点串起来。
现场:某分部有三台华为S5700堆叠,PC在VLAN 10,服务器在VLAN 20,中间通过核心交换机做VLANIF路由。现象是PC能Ping通网关,但Ping不通服务器。
排查过程:
- 先看VLANIF在核心交换机上是否Up:
display interface Vlanif20,显示Up,排除网关层问题。 - 查看三层路由:
display ip routing-table,发现有10.20.0.0/24的直连路由,排除缺路由。 - 在核心交换机上Ping服务器地址:
ping -a 192.168.20.254 192.168.20.10,结果是通的。说明核心到服务器没问题。 - 回到接入交换机和核心交换机之间的Trunk,
display port vlan,发现Trunk口没有放通VLAN 10。 - 放通VLAN 10后,PC Ping服务器立刻通了。
为什么“PC能Ping通网关”?因为网关VLANIF在核心上,核心向PC回ARP应答时从Trunk口出去的是VLAN 10的Tag,但方向是“核心→接入”。回程时由于接入交换机Trunk口没有放通VLAN 10,帧实际是被丢弃的。PC的“Ping通网关”可能只是指“收到了ICMP Echo Reply”,而实际上ARP阶段就失败了,这取决于核心的VLANIF是否学到了PC的MAC。
这类问题用抓包最直观:在核心交换机端口抓包会发现ARP请求到了,但应答发不出去;在PC端抓包能发现“发送了ARP请求但收不到应答”。所以排查二层问题时,一定要把“交换机端口是否放通该VLAN”这个最基础的配置放在前面,而不是先怀疑物理链路和STP。实际上,多数“看起来特别诡异”的二层故障,最后都指向VLAN不一致、MAC表溢出、Trunk两端PVID不一致这三大类。
经过这些案例,我越来越觉得以太网交换基础值得反复回归。你不需要背下每个厂商的每条命令,但理解了帧结构、MAC学习、泛洪、广播域、VLAN和STP的内在逻辑后,遇到任何品牌设备都能快速套用。尤其是PHY寄存器级别的排错能力,在设计板卡、调试嵌入式网络时是直接生产力,这点在企业网环境中往往被人忽视,却是很多“疑难杂症”的最终答案。
