以太网交换机原理:MAC表、VLAN、STP与三层转发实战

发布时间:2026/10/22 10:38:55
以太网交换机原理:MAC表、VLAN、STP与三层转发实战 很多人可能跟我一样第一次真正接触以太网不是从教材开头啃起而是拿着一条网线往笔记本上一插看到屏幕右下角的小图标从红叉变成正常然后就开始选课、看视频、刷新闻了。我当年也是这样直到后来有段时间蹲在机柜旁边看交换机指示灯闪烁才意识到以太网能跑起来背后其实是大量设备在不停地“做决定”。这个系列的第一篇聊了以太网的起源、冲突检测和集线器时代的半双工这篇就顺着往下走重点说说从交换机出现之后数据帧在二层网络里到底是怎么流转的顺便把VLAN、生成树、跨VLAN路由这几件绕不开的事讲透。1. 从冲突域到交换域以太网的关键转折1.1 集线器时代的“车多路窄”上篇聊过最早期的以太网一根同轴电缆串联所有设备谁要发数据先在总线上听一听有没有其他人在发载波侦听没人发才开口一旦同时开口就撞车撞完车需要退避一段时间再重发。这套机制叫CSMA/CD本质就是一条“公共走廊”上大家自觉排队。到了后来用集线器组网情况也没好到哪去——集线器本质上是把收到的信号复制给所有端口发数据的人占用的还是那一整段带宽。举个直观的例子一台24口的集线器如果每个端口接的都是一台电脑整台设备只有100Mbps的带宽24台电脑必须分着用。更要命的是所有设备都在同一个冲突域里A往B发数据C、D、E的网卡也会收到这个信号只是根据目标MAC地址判断不是自己需要的帧然后丢进垃圾堆而已。效率有多低想想办公室里二十几个人合用一部电话就明白了。所以集线器时代网络经常出现“一用起来就很慢”的现象不是因为带宽真不够而是因为大量的冲突退避占用了时间。CSMA/CD的“碰撞后等待随机时间重发”机制在设备少、流量小的时候还行设备一多、包一密集重传就会像滚雪球一样涌过来。1.2 交换机让每条路都变成独立车道交换机的出现是从根上改变了这个局面。交换机转发数据不是靠广播而是靠内部的交换矩阵和MAC地址表每个端口都可以同时收发数据而且互不干扰。也就是说A和B在通信的时候C和D也可以同时通信大家用的是各自的独立带宽。这个改变直接消灭了“所有设备抢一条公共走廊”的问题也把冲突域缩小到了“端口到网线另一端的设备”这一条线上。还有一个容易被忽略的变化全双工。同一根网线的两对线交换机端和终端设备可以同时发、同时收于是100Mbps端口的理论速率直接变成双向各100Mbps不存在“发的时候必须等收完”这种事了。既然全双工模式下不存在碰撞CSMA/CD在这个场景里基本退役所以后来千兆、万兆以太网里你几乎听不到“冲突”这个词。我自己一直觉得理解以太网的关键不在于记IEEE 802.3标准里那一堆缩写而在于搞清楚“数据在哪一层被决定怎么走”。集线器时代设备是佛系转发节点广播到底交换机时代分工明确精确投递这背后靠的就是下面要讲的MAC地址表。1.3 MAC地址表交换机的“通讯录”交换机刚开机时MAC地址表是空的。它怎么知道往哪个端口转发数据答案是学。交换机每收到一个帧都会做三件事记录帧的源MAC地址以及这个帧是从哪个端口进来的写入MAC地址表同时刷新老化计时器查找目的MAC地址看这张表里有没有匹配项有匹配项就只从对应端口转发出去没有匹配项就把帧向除接收端口以外的所有端口转发这叫泛洪。整个过程看起来简单但非常关键。MAC地址表默认老化时间通常300秒也就是说如果一个设备长时间不发数据交换机就会忘了它下次再来数据就得重新学习。你可能会问那网络里那么多设备这张表不是要爆炸并不会因为MAC表是存在交换芯片的硬件表项里正常情况下几千条表项对一台几十口交换机的芯片来说完全不是压力。这里有个值得注意的细节交换机会把源MAC学习到“接收端口”上但如果你私自改了电脑网卡的MAC地址交换机会在同一个端口上学到不同的MAC表项会更新这在排查“是不是有人冒用了我的IP/MAC”时是很好的线索。在网络设备管理后台看到MAC表异常跳动往往是链路环路的早期信号这一点在后面的章节还会细说。2. 一个帧的旅程MAC寻址与转发决策2.1 以太网帧布局数据开口前要做的事讨论工作原理前先得把以太网帧本身看清楚。标准以太网帧从前往后大致是这几个部分前导码和帧起始定界符、目的MAC地址、源MAC地址、类型/长度字段、数据负载、帧校验序列。前导码算物理层的引导信号很多书会把它们放在帧外面真正转发时关注的是后面这几项。这里最需要注意的是帧里面从头到尾没有任何“IP地址”字段目的和源MAC地址才是二层的“门牌”。IP地址在三层报文里被当作数据负载的一部分打包在以太网帧里。所以当你抓到包看到一个ARP请求里面全是FFFF.FFFF.FFFF这种广播地址时别怀疑网卡是不是坏了这只是因为在二层向所有人提问“谁是某个IP”。帧尾部是FCS通常是CRC32校验值。FCS的作用是让接收方知道这个帧在传输过程中有没有被篡改或损坏。接收方收到帧后会重新算一遍校验码跟帧尾的FCS对比不一致就丢弃。所以网络上的“噪声”干扰对以太网并不是毫无影响只是被FCS这一层防线过滤掉了你只会看到丢包率上升而不会直接看到收到“错的内容”。2.2 单播、广播、未知单播的三种命运一个帧到了交换机根据目的MAC地址的不同处理方式完全不同。大致分成三种情况目的MAC是某个具体设备的单播地址且MAC表里有记录交换机精确转发只从对应端口出去这是最理想的情况效率最高。目的MAC是广播地址FF:FF:FF:FF:FF:FF交换机必须向除了接收端口以外的所有端口转发。这是以太网虽然高效但带着的一个“历史包袱”后面广播域的问题就出在这里。目的MAC是单播地址但MAC表里没有记录未知单播交换机没法判断该往哪走只能先泛洪让目标设备收到后回一个帧交换机才能学到它的位置。很多人第一次看交换机转发原理时会觉得“未知单播也泛洪太蠢了”但换个角度想如果交换机不泛洪而直接丢弃那这个帧就永远送不到了。泛洪是二层网络保证可达性的兜底手段代价就是浪费一部分带宽。这也是为什么“二层网络规模不能无限扩大”——人越多未知单播和广播越多交换机消耗在这些无谓帧上的资源就越多。2.3 ARPIP地址与MAC地址之间的翻译官好了现在最关键的来了。网络层关心的是IP地址但以太网帧只认MAC地址那“我跟你用IP通信”和“我在以太网上发给MAC”这两件事是怎么衔接的答案就是ARP地址解析协议。ARP工作流程描述起来非常简单。假设PC1要跟同一网段的PC2通信PC1的IP协议栈先判断出目标IP和自己在同一个网段于是需要把目标IP“换算”成MAC地址。PC1先查自己的ARP缓存表没有对应表项就发一个ARP请求目标MAC是广播地址内容是“谁是192.168.1.2请把MAC地址告诉我”。这个请求会被交换机泛洪到全网段。PC2收到后发现问的正是自己回一个ARP响应目的MAC是PC1内容是“我是192.168.1.2我的MAC是XX:XX:XX:XX:XX:XX”。PC1收到响应把映射关系写进ARP缓存之后就可以封装以太网帧发送了。我建议新手都去看一次这个完整交互方法很简单在PC1上ping一下PC2同一时间在PC2上开抓包工具过滤“arp”你几乎每次都能看到这个请求-响应成对出现。看完你会发现很多抽象概念一下子落地了广播、单播、二层寻址、三层寻址的分工全都在这两个包里体现得淋漓尽致。另外还有一个概念叫免费ARPGratuitous ARP设备在IP地址配置成功时会主动向全网发一个ARP请求问“这个IP是谁的”。它有两个作用一是检测IP冲突如果有人回应说明这个IP已经被占用二是让网络中所有交换机快速学习到这台设备的MAC地址。如果你在抓包里看到自己网段里有设备在发免费ARP说明那台设备刚开机或者刚换了IP属正常现象。3. 当二层网络变大广播域膨胀与VLAN隔离3.1 广播风暴一张大网里的“噪音污染”前面说过广播帧到达交换机之后会被复制到所有端口。一个二层网络里只要有两个以上设备就不可避免地存在广播比如ARP查询、DHCP的Discover请求、还有一些服务协议的发现报文。设备少的时候没关系但一旦网络里接了几百台终端广播帧的总量会非常可观。举个例子我曾经在办公区接过一次“全员网络卡顿”的工单所有终端ping网关都丢包但测速又不是全零。最后查下来是某个设备网卡故障一直在快速轮询每秒钟发出几百个广播帧整张网的交换机都在转发CPU负载升高正常数据的转发就被拖慢了。这种场景就像大家在一条安静的马路上正常开车突然有人按着喇叭超速来回冲所有车都得给他让路。广播风暴之所以难查是因为发起者往往不是某一台核心设备而是某个不起眼的终端或者网卡的Bug。要限制它的影响范围就要把网络从物理意义上拆分——拆出来的那一块块区域就叫广播域。VLAN虚拟局域网就是干这件事的。3.2 VLAN用逻辑方式给广播域砌墙VLAN的思路非常朴素在同一台物理交换机上通过配置把端口划分成多个逻辑网络每个VLAN内部是一个独立的广播域VLAN之间的广播不会互相穿透。比如一栋楼里财务部门、技术部门、行政部门你可以让它们在物理上接同一台交换机但分属VLAN 10、VLAN 20、VLAN 30这样财务部门发个广播技术部门根本感知不到。VLAN ID理论上范围是0到4095可用的一般是1到4094。为什么上限是4094因为802.1Q标准里VLAN标签字段占了12个bit2的12次方就是4096其中0和4095保留。这个数字现在看起来没什么但在设计当年已经算很大后来网络设备又搞出各种双标签、运营商QinQ都是在原始限制下的扩展。划分VLAN不只是为了隔离广播它同时解决了网络管理的问题同一VLAN里的设备可以用同一个子网规划IP移动终端时只要端口配置对重新插上就能通信。还有一个很现实的原因——安全。两个部门物理上共享一台交换机时VLAN隔离能防止未授权的访问二层访问被天然切断连数据包都过不去。3.3 802.1Q标签与Access/Trunk的配合划分VLAN之后帧在交换机之间传递时必须携带VLAN信息否则对端的交换机就不知道该把它划到哪个广播域里。这就是802.1Q干的事在以太网帧的源MAC地址和类型字段之间插入4字节的VLAN标签其中包含12位VLAN ID。加了标签之后帧的最大长度从传统1518字节变成1522字节这个细节在考虑MTU和巨型帧时非常重要。说到端口类型最常用的两种是Access口和Trunk口。第三方接入终端用的通常配成Access口这个口进来的帧默认打上某个VLAN的标签往交换机之间互连用的通常配成Trunk口它允许承载多个VLAN的帧每个帧都带着标签。有人会把Trunk口叫“主干口”从名字也能理解链路本身对VLAN是透明的它只是负责搬运各种标签的帧。配置VLAN时有一个隐藏难点是不带标签的帧落到Trunk口上到底算哪个VLAN这就要提Native VLAN本征VLAN了。802.1Q规定Trunk口上的帧如果不打标签默认属于本征VLAN。两台交换机必须把本征VLAN配成一致否则一个打标签一个不打标签两边谁也认不出谁。我见过不少跨交换机VLAN不通的故障最后都出自这个小小的本征VLAN配置不一致。配置逻辑大致是这样先创建VLAN编号再把终端接入的物理端口划到对应VLAN里最后把交换机的上联互端口配置成Trunk并放行需要跨交换机传递的VLAN号。很多人容易漏最后一步结果本端VLAN配好了对端也配好了中间Trunk口只放了默认的VLAN 1跨交换机的业务一直不通。网上各种配置教程很多但我想强调的还是那句不管用什么厂商的设备先把“这个口是Access还是Trunk、Trunk又允许了哪些VLAN、本征VLAN是谁”这三件事搞清楚VLAN这块基本就稳了。4. 环路与生成树二层网络的自我防卫4.1 冗余链路是双刃剑实际组网中没人敢只留一条链路连接交换机——设备断电、网线被老鼠咬断、光模块自然老化、甚至某个接口因为灰尘接触不良任何一种故障都会让整段网络瘫痪。所以稍微正经一点的组网设计都会在两台交换机之间布置两条甚至更多条物理链路实现冗余。想法很美好一条断了另一条顶上网络几乎无感知。问题是这么做的后果往往不是“高可用”而是“高事故”。二层网络并没有TTL生存时间这种“包只活N跳”的机制帧在环路里会被无限转发。如果网络里存在物理环路一个广播帧从交换机A的端口1进来会被从端口2转发出去到了交换机BB又从它的端口2转回来给A然后A又把这一帧复制到所有端口……循环往复广播帧像滚雪球一样越滚越多最终把交换机的CPU和背板带宽淹没这就是环路导致的广播风暴。同时交换机的MAC表也会因为“同一个MAC一会儿在端口1一会儿在端口2”而反复震荡。很多人以为环路只出现在两台交换机之间看着像“环”的连接里其实一台交换机自己的两个端口用一根网线对接也成环三层设备下挂两台交换机之间互联同样是环。所以组网完第一件事不是关心速率而是确认有没有未受保护的环路。4.2 STP选举根桥、根端口与指定端口生成树协议STP解决的正是这个问题。它的思路听起来有点“霸道”物理环路照常存在但在逻辑上把网络修剪成一棵无环的树多余的端口被放入阻塞状态。等某条正常链路断掉后被阻塞的端口再苏醒切换到转发状态保证冗余的作用还在。STP的算法核心是一次分布式选举。整个交换网络会先选出一个根桥Root Bridge标准是比较BIDBID由优先级和MAC地址组成优先级低数字小的优先优先级相同看MAC地址小。根桥是整个树逻辑上的“根”所有数据路径都以它为起点规划。然后每台非根桥上选出一个根端口Root Port这个端口是这台交换机通往根桥的最短路径。接下来每条链路上选一个指定端口Designated Port负责在这段链路上转发帧。剩下的端口就是阻塞端口Blocking Port只接收BPDU不转发数据帧。这里有个经验之谈如果你有多个交换机希望某个性能更好的交换机成为根桥却不能随便改MAC正确做法是把它的STP优先级数值调小通常推荐调到比默认32768小很多的值比如4096让其余交换机保持默认或更大的优先级。不同厂商命令行不一样但逻辑都一样无非是一个优先级数值的配置。4.3 RSTP把50秒收敛压缩到秒级传统STP最被人诟病的就是收敛速度。从链路故障到端口切换到转发状态需要先经过阻塞、监听、学习这几个计时器阶段加起来最大可能要50秒。在现代网络里50秒的网络中断对应用来说完全不可接受所以RSTP快速生成树协议出现了。RSTP对端口角色做了扩展分为根端口、指定端口、替换端口和备份端口同时改进了协商机制指定端口在接入时会主动向对端发送一个提议报文对端如果同意立即回一个同意报文链路状态直接进入转发省掉了等待时间。正常情况下RSTP在链路故障后可以在几秒内完成收敛。我实际测过单条链路断开到备用链路接上去RSTP的收敛时间通常在2-3秒以内很多场景甚至低于1秒这对普通办公网络和数据中心都够用了。重点提醒一下如果你在交换机上看到端口状态长时间停留在learning或listening而不是直接跳到forwarding那多半是STP配置有问题或者设备之间参数不匹配。查看生成树状态时我更关心两列端口角色和端口状态。角色应该是根/指定/替换之一状态应该是转发或阻塞一旦看到“不明角色”或者端口全部阻塞先查环路和优先级配置。5. 跨VLAN通信与三层交换从二层走向三层5.1 物理路由器与单臂路由方案VLAN把广播域隔开了代价是不同VLAN之间默认完全不能通信。但实际业务里财务部门要访问服务器、技术部门要连开发环境跨VLAN通信是刚需这就需要三层设备来路由。最早的经典做法叫“单臂路由”把一台路由器的物理接口分成多个逻辑子接口每个子接口绑定一个VLAN ID再给每个子接口配上对应VLAN的网关IP。交换机上把连接路由器的口配成Trunk口允许相关VLAN的帧通过。数据到达路由器后路由器看到目的IP不在同一子网查路由表从对应子接口发出去。整个过程相当于路由器一条胳膊伸进VLAN世界里挨家挨户收投递。单臂路由原理清晰、配置简单但瓶颈很明显所有跨VLAN流量都在同一条物理链路上转发链路带宽就是天花板流量一多就成瓶颈。5.2 三层交换机里的虚拟网关现代的方案几乎都用三层交换机。三层交换机的本质是“二层交换引擎三层路由引擎”合体只不过它把路由做得非常快常见做法是通过VLANIF接口也叫SVI、逻辑虚拟接口来实现网关。给VLANIF接口分配IP地址这个IP就是该VLAN内终端的网关地址交换机内部能直接按三层的思路转发不再需要外部路由器。对比一下单臂路由和三层交换单臂路由依赖物理链路带宽受限三层交换在三层报文进来时可以在交换芯片内部完成后查表转发走了高速通道不仅延迟低还能做到硬件线速转发。关键点在于VLANIF接口只是逻辑上的三层路由接口它本身没有物理端口但每个VLAN内的终端只要网关指向它就能在三层交换机内部完成路由。配置上也很直白给每个VLAN的虚拟接口配上IP让终端把网关指到这个IP上三层交换机自己就会处理VLAN间的转发。5.3 一次完整ping背后的完整数据流向这部分是我最想让你掌握的因为理解了它就理解了“局域网内数据包到底怎么走”。假设有两台PCPC1在VLAN 10IP是192.168.10.2/24网关是192.168.10.1PC2在VLAN 20IP是192.168.20.2/24网关是192.168.20.1。两台设备接在同一台三层交换机上。现在PC1去ping PC2。第一步PC1检查目标IP和自己的IP是否同网段。发现在192.168.20.0/24不在本地网段于是不直接ARP询问PC2而是先查ARP缓存表获取网关192.168.10.1的MAC地址。如果缓存没有就发一个ARP请求“谁是192.168.10.1”。第二步交换机收到这个ARP请求判断目的MAC是广播把这请求泛洪到整个VLAN 10内最终答应的不是别的设备而是交换机自己因为它就是VLAN 10的网关。交换机回一个ARP响应告诉PC1网关的MAC是VA-VA-VA-VA-VA-VA。第三步PC1把ICMP请求报文封装成IP包目的IP是192.168.20.2然后封装成以太网帧目的MAC写的是网关的MAC。这帧到达三层交换机后交换机看到目的MAC是自己的网关MAC就知道这是“要出三层”的包于是剥离二层帧头走到三层路由流程。第四步三层交换机查路由表发现192.168.20.0/24就在自己身上对应VLAN 20的VLANIF接口。于是把这个IP包重新封装进一个新的以太网帧目的IP还是192.168.20.2但目的MAC呢现在PC2的MAC未知那得先ARP一下交换机在VLAN 20里发ARP请求找出192.168.20.2对应的MACPC2回应后交换机就能发出目的MAC为PC2的帧。第五步PC2收到帧去掉MAC头、IP头看到ICMP请求构造ICMP回显按同样的流程返回PC1。整个流程走完ping才显示通。你会发现一个很核心的规律整个过程中源和目的IP从未改变但源和目的MAC每一跳都在变三层设备负责重新封装二层头二层设备只看MAC做转发这就是计算机网络分层设计最精妙的地方。我在给团队新人讲的时候经常用一句人话总结“IP是门牌号MAC是身份证门牌号决定你去哪栋楼身份证决定快递员把包裹送到哪个人手上。”6. 实战排查用表驱动的方法定位二层故障6.1 第一件事永远是看MAC地址表网络出了问题比如某台终端突然ping不通网关很多人第一反应是重启终端、重启交换机我恰恰不建议这样。重启会清空设备的运行状态很多有用的线索MAC表、ARP缓存、端口统计就没了。正确做法是先从管理后台拿到这台终端对应的交换机端口信息看看MAC地址表里还有没有这台终端的MAC表项。MAC表的查看命令在不同厂商那写法不太一样但逻辑无外乎看三列VLAN、MAC地址、端口命令的大致形式是show mac address-table。如果你在交换机上查不到某终端的MAC说明二层链路就有问题比如网线没通、端口down、VLAN没放通如果查到了但对应端口不是终端实际接入的端口或者同一MAC在两个端口上都出现那基本可以断定出现了环路或有人改MAC。我自己总结的检查列表按优先级排首先端口状态有没有up其次MAC表里有没有目标设备然后看端口所属VLAN和终端实际VLAN是否一致最后看端口收发包计数是否在增长。这套组合拳能解决大部分看似玄学的联通性问题。6.2 ARP异常抓包能看到那些“奇怪”的包当链路正常但网络还是很慢时就需要抓包了。抓包工具建议过滤三个方向的内容只过滤ARP看ARP包的数量只过滤ICMP看数据延迟过滤广播看广播占比。有一次我在一个二层域里排查“周期性卡顿”抓包过滤ARP后发现平均每秒钟有几十个广播ARP请求而且都来自不同主机不是某一台在捣乱。再深挖才发现是有人把IP配错了让两台终端用同一个IP双方都在不停发免费ARP抢地址。这种现象一旦发生整网都会受影响。通过抓包定位后把重复IP的其中一台改成正确IP问题立刻消失。所以遇到网络“又卡又没断”的情况ARP计数和重复地址是必查项。6.3 常见故障速查与我的排障顺序最后整理一张简洁的速查表方便你对照症状找方向。故障现象优先检查方向通常原因单台终端ping不通网关端口状态、MAC表网线/端口down、VLAN配置不一致同一VLAN内能通跨VLAN全不通三层VLANIF、网关地址VLANIF没配或IP不匹配、路由缺失全网偶尔丢包/延迟大STP状态、广播占比环路存在但被STP部分隔离、广播风暴交换机之间链路只有部分VLAN通Trunk放通列表、Native VLANTrunk没放通某些VLAN、本征VLAN不一致刚配置完VLANAccess口终端互不通Access口的PVID、物理端口类型Access口PVID配错、端口被设成Trunk这是基本的排障思路。但在实战里我更推荐的顺序是四步走第一步画拓扑把设备、端口、VLAN、IP标注清楚第二步从源设备开始沿着数据路径逐跳看ARP缓存和MAC表哪个环节断了就去修哪第三步链路层全部正常后才开始看三层网关和路由表第四步所有正常但性能差抓包统计广播和异常流量。这四步看着简单但尤其适合网络基础还不牢的人因为它逼着你始终掌握“数据往哪走”“应该走哪条路”这两个核心概念不靠猜不靠重启解决一切。我自己后来带人排查网络问题时一直强调同一个观点二层的问题别在三层找MAC表看明白了再看ARP、再看路由一层一层往下剥。真正的网络原理不是你背了多少协议名字而是从一张MAC表里能看出这台设备几秒钟之前发生过什么。这篇文章写到这里其实也只完成了从集线器到三层交换这半段旅程后面还有链路聚合、QinQ、大二层这些东西等下一篇再继续踩坑。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询