
先说句实在话很多朋友学网络对着教材背了一堆“MAC地址表”“泛洪”“转发决策”的概念背得滚瓜烂熟可真到了设备前面看着指示灯和命令行还是一头雾水。原因很简单脑子里没有建立起“数据包在交换机内部到底怎么走”的画面感。这次我搭了一个模拟实验用三步走的思路把交换机从加电到精准转发数据的完整逻辑跑了一遍。整个过程不需要真机用模拟器就能复现适合刚入行的网络工程师、准备考证的学生还有那些想搞懂家里交换机为什么“插上就能用”的爱好者。看完这篇文章你就能明白交换机那些看似神奇的行为背后其实只有一套非常朴素的规则。1. 实验设计与整体思路拆解讲原理之前先说说这次实验为什么这么设计。交换机的核心工作可以概括成四个动作学习、泛洪、转发、丢弃。听起来简单但四者之间的触发条件才是真正容易搞混的地方。我见过太多人把“泛洪”和“广播”当成一回事或者以为交换机每收到一个包都会发给所有端口这是典型的没做过实验的表现。这个实验的核心思路是故意制造“第一次通信”和“第二次通信”的差异。同一个源主机第一次去 ping 同一个目标主机交换机会把流量发给所有无关端口第二次再 ping它就只发给目标端口。通过抓包对比这两种场景就能把交换机的学习机制和转发逻辑看得明明白白。这比单纯看一百页原理文档都管用。1.1 用模拟器而不是真机的原因实验环境我选用了 GNS3配了三台虚拟 PC 和一台普通二层交换机。有人可能会问用真机不是更真实吗真机确实真实但对于验证“转发原理”这件事真机反而不方便。主要原因有三个真机默认配置里往往开了很多辅助功能比如端口安全、风暴控制、各种生成树优化这些都会干扰对基础行为的观察。真机上抓包需要配置端口镜像对于没接触过镜像功能的新手来说又多了一道门槛。模拟器可以随时清空 MAC 地址表、一键重启设备、任意抓包这些操作在真机上要么很麻烦要么有风险。另外我特意把三台 PC 都划分到一个 VLAN 里。可能有人觉得既然要讲原理直接用默认的 VLAN 1 不就行了我这么做是有意的。VLAN 本身就是交换机工作原理的一部分提前把它引入后面讲“广播域隔离”的时候你已经有基础认知了不会觉得突兀。而且现在的网络环境里很少有人真的让所有设备裸奔在同一个广播域里。1.2 实验拓扑与参数规划拓扑非常简单一台交换机 SW1三台 PCPCA、PCB、PCC分别接在 GigabitEthernet0/0/1 到 0/0/3 三个端口上。IP 规划也按实际项目习惯来避免随手乱填。设备接口IP 地址子网掩码所属 VLANPCAGigabitEthernet0/0/1192.168.10.10255.255.255.0VLAN 10PCBGigabitEthernet0/0/2192.168.10.20255.255.255.0VLAN 10PCCGigabitEthernet0/0/3192.168.10.30255.255.255.0VLAN 10所有设备都在 192.168.10.0/24 这个网段里这样数据包从 PCA 到 PCB 的过程中根本不涉及路由寻址纯粹是交换机的二层行为。这也是实验能干净利落地展示交换原理的关键——如果引入了网关和路由你会分不清到底是交换机干的活还是路由器干的活。实验开始前先在交换机上做基础初始化把接口划入对应的 VLANHuaweisystem-view [Huawei]sysname SW1 [SW1]vlan 10 [SW1-vlan10]quit [SW1]port-group group-member GigabitEthernet0/0/1 to GigabitEthernet0/0/3 [SW1-port-group]port link-type access [SW1-port-group]port default vlan 10 [SW1-port-group]quit配置完以后可以在交换机上查看 VLAN 和接口的状态[SW1]display vlan [SW1]display interface brief确认三台 PC 的接口都处于 UP 状态VLAN 归属正确实验环境就算准备好了。准备工作并不复杂但这一步千万别跳过去。很多人后面实验现象不对回头一查结果发现是接口处于 DOWN 状态或者 VLAN 划错了白白浪费时间。2. 第一次通信实验亲眼看清泛洪是怎么发生的环境准备好以后先把交换机的 MAC 地址表清空确保它处于“什么都不记得”的状态。模拟器里可以这样操作[SW1]undo mac-address如果是在真机上通常是clear mac-address-table不同厂商命令略有差异但思路一样。清空后再查看一次[SW1]display mac-address正常情况下输出会提示没有 MAC 地址表项或者只有几条交换机自己产生的表项。这个动作很关键因为它保证了接下来的所有现象都是从一张白纸开始的。2.1 PCA ping PCB第一轮数据包的完整旅程现在从 PCA 上执行ping 192.168.10.20同时在交换机上开启抓包。先别急着看结果想一下 PCA 发出第一个 ICMP 请求包之前发生了什么PCA 的 IP 是 192.168.10.10要 ping 的是 192.168.10.20。PCA 会发现目标和自己处于同一个网段不需要找网关直接构造一个 ICMP Echo Request 报文。但这里有个细节以太网帧在 IP 包外面还要封装一个二层头里面包含源 MAC 和目标 MAC。PCA 怎么知道 192.168.10.20 对应哪个 MAC 地址呢它不知道。所以 PCA 先发一个 ARP 广播询问“谁是 192.168.10.20请告诉我你的 MAC 地址”。这个 ARP 请求报文的目的 MAC 是全 F也就是广播地址FF-FF-FF-FF-FF-FF。交换机收到这个广播帧以后干了两件事记录源 MAC它看到这个帧从 GigabitEthernet0/0/1 口进来源 MAC 是 PCA 的 MAC于是把PCA-MAC → GigabitEthernet0/0/1这条映射记到 MAC 地址表里。处理目的 MAC它查表发现目的 MAC 是广播地址这种帧不需要查表直接向除了接收端口以外的所有端口转发。于是这个 ARP 请求被同时转发给了 PCB 所在的 0/0/2 口和 PCC 所在的 0/0/3 口。PCB 收到以后发现 ARP 请求问的正是自己于是回复一个 ARP 应答告诉 PCA“我的 MAC 地址是这个”。这里还有一个容易忽略的细节PCB 在回复之前也会把 PCA 的 MAC 地址和端口关系学到自己的 MAC 表里。也就是说ARP 一来一回交换机至少学到了两条表项。2.2 抓包结果里的关键证据直接看抓包结果会更直观。我把三台 PC 的流量都镜像出来以后能在抓包里清楚看到第一个 ARP 请求不仅出现在了 PCA 和 PCB 之间的链路上也出现在了 PCC 那台完全无关的主机上。这就是泛洪。所谓泛洪简单来说就是交换机在没有明确转发目标的时候把帧复制一份发给所有其他端口。你可以把它理解成小区物业刚搬来不知道每家每户住的是谁有什么信件就先挨家挨户喊一遍谁应的就给谁。紧接着PCB 回完 ARP 应答之后PCA 才知道目标 MAC 地址于是开始发送真正的 ICMP Echo Request。但这个 ICMP 请求发出以后呢我第一次做实验的时候以为既然 MAC 地址已经知道了交换机应该能直接转发给 PCB。结果抓包发现这个 ICMP 请求依然被交换机泛洪给了 PCC。原因很简单。虽然 PCA 知道了 PCB 的 MAC 地址但交换机还不知道啊。交换机只从 ARP 应答中学习到了“PCB 的 MAC 地址从 0/0/2 口进来”这个信息但它把 PCA 发来的 ICMP 请求拆开一看目的 MAC 是 PCB 的 MAC查表发现没有对应表项于是又是一个未知单播只能继续泛洪。这一轮实验最核心的收获就是交换机的转发行为不取决于源设备知不知道目标地址而取决于交换机自己的 MAC 表里有没有对应表项。只要没有表项不管这个帧是不是单播交换机都只能泛洪。2.3 别忘了查一下 MAC 表在第一轮 ping 结束以后立刻在交换机上查看 MAC 地址表[SW1]display mac-address你会看到类似下面的输出MAC Address VLAN Learned-From Type xxxx-xxxx-xxxx 10 GigabitEthernet0/0/1 dynamic yyyy-yyyy-yyyy 10 GigabitEthernet0/0/1 dynamic zzzz-zzzz-zzzz 10 GigabitEthernet0/0/2 dynamic你可能会奇怪PCA 和 PCB 通信为什么 0/0/1 口下面学了两个 MAC 地址这多半是 PCA 自己的 MAC 和它网卡虚拟出来的其他 MAC。至于 0/0/3 口下面现在还没有表项是因为 PCC 从头到尾一句话都没说交换机自然没机会学习它的地址。记住这个状态后面第二轮实验就会形成鲜明对比。3. 第二次通信实验验证精准转发与 MAC 表老化机制第一轮实验结束以后交换机其实已经“开窍”了。它的 MAC 表里现在有了 PCA 和 PCB 对应的端口信息。第二次再让 PCA ping PCB表现会和之前完全不同。我没有重启设备也没有清空 MAC 表直接在 PCA 上再次执行ping 192.168.10.20。这次抓包你会看到两个显著区别交换机不再把 ICMP 请求泛洪到 PCC 的端口了数据包只出现在 PCA 和 PCB 之间的链路上。ARP 请求也没有再出现因为 PCA 的 ARP 缓存里还留着上一次通信学到的映射关系。3.1 查表转发的完整过程分析当 PCA 的 ICMP 请求到达交换机时交换机会做这样的处理读取帧头部的目的 MAC 地址确认是 PCB 的 MAC。在 MAC 地址表里查找这个目的 MAC命中发现对应的出接口是 GigabitEthernet0/0/2。直接把帧从 0/0/2 口转发出去其他端口完全不参与。这个过程就是精准转发也是交换机名字里“交换”二字的真正含义。它的本质是用一张表换一次精确的端口选择避免了把流量撒得到处都是既节省带宽也减少无关主机的处理负担。回过头去看抓包会非常直观PCC 上完全看不到任何 ICMP 报文。如果 PCC 上装了抓包工具它甚至都不知道 PCA 和 PCB 之间刚刚进行了一次通信。这就是交换机和集线器HUB最大的不同。集线器是物理层的设备所有数据天然广播给所有人交换机是数据链路层的设备它能通过 MAC 表实现端口级别的隔离。3.2 MAC 地址表不是永恒不变的在第二轮实验之后可以等一段时间再执行display mac-address。如果等待时间超过了老化时间华为设备默认是 300 秒你会发现表项消失了。这就是 MAC 地址表的老化机制。交换机不会永远记住一个 MAC 地址和端口的对应关系因为它不知道终端什么时候会移动、关机或者换接口。老化时间到期后如果这个终端继续通信交换机会重新学习如果它再也不通信了那么这条表项就自动失效释放资源。用生活里的场景来类比MAC 表就像一个临时的访客登记本。访客进门时登记一下但过了几个小时没有新的活动保安就会把名字划掉。下次访客再来重新登记一遍。这个机制的好处是当一台 PC 从 0/0/1 口换到 0/0/3 口时交换机最多只需要等一个老化周期就能学会新的位置而不需要人工干预。3.3 一个值得做的变体实验手工移动终端这个变体实验我强烈建议你也做一次。把 PCB 从 0/0/2 口拔下来插到 0/0/4 口然后立刻从 PCA 去 ping PCB。你可以观察到一个有趣的现象最开始几次 ping 会不通或者丢包过一会儿才恢复。原因就是 MAC 表里还存着PCB-MAC → GigabitEthernet0/0/2这条旧表项。交换机收到目的 MAC 是 PCB 的帧以后依然往 0/0/2 口转发但 PCB 已经不在那里了帧被发到空端口上自然没有响应。直到 PCA 重新发出 ARP 请求因为 ping 不通触发了 ARP 缓存重建PCB 应答以后交换机才学习到新表项通信才恢复正常。有的交换机对此有优化机制一旦发现端口状态变化会主动清除该端口相关的 MAC 表项但原理上这个实验能让你深刻理解为什么企业和数据中心的交换机往往会把老化时间调得比较短就是为了在终端频繁移动的场景下尽快自愈。3.4 这轮实验要记住的核心结论这一轮实验你需要带走三个结论交换机学到的 MAC 表项是动态的不是配置出来的而是通过观察数据包的源 MAC 学来的。转发时交换机只关心目的 MAC 在不在表里命中就精准转发没命中就泛洪。老化机制是保护机制它让 MAC 表具备自我纠错能力但也决定了网络故障后的恢复速度。4. 广播、未知单播、已知单播一次分清三种转发行为做了两轮实验以后你已经亲眼看到了两种截然不同的转发行为。现在可以把交换机对数据帧的处理规则做一个完整的总结了。很多人学到这里还会混淆三个概念广播帧、未知单播帧、已知单播帧。我在实验里加了一个小环节专门把三种情况都触发一遍。4.1 三种帧的处理原则对比先上结论再用实验验证。帧类型目的 MAC 特征交换机处理方式广播帧FF-FF-FF-FF-FF-FF无条件泛洪到所有其他端口未知单播帧单播 MAC但 MAC 表中无对应表项也泛洪但心里没底属于“死马当活马医”已知单播帧单播 MAC且 MAC 表中有对应表项只从对应端口精准转发之前 PCA 第一次 ping PCB那个 ARP 请求就是广播帧ICMP 请求就是未知单播帧。第二轮 pingICMP 请求变成了已知单播帧。一个实验里三种行为全都出现了。所以严格来说泛洪并不等于广播。广播是目的 MAC 本身就是广播地址交换机没有选择只能泛洪而未知单播是交换机“不认识”这个单播地址只能先泛洪找找看。两者现象一样但成因完全不同。这就是我在开头说的很多人把这两者搞混的根源。4.2 一个测试ping 一个不存在的 IP为了加深理解我在 PCC 上执行了ping 192.168.10.99。这个 IP 在同一个网段里但没有对应的主机。实验结果是前几个包显示“请求超时”等待一段时间后才结束。抓包分析能看到原因。PCC 首先发出 ARP 广播询问 192.168.10.99 的 MAC 地址。这个广播被交换机泛洪给了所有其他端口。但因为没有主机认领这个 IPARP 请求始终得不到应答PCC 的 ARP 缓存里也就始终没有目标 MAC 地址ICMP 包根本发不出去。这个实验的典型意义在于很多人以为 ping 不通就是交换机或者线路有问题但其实问题可能出在目标主机根本不存在或者目标主机开启了防火墙屏蔽了 ICMP。交换机的 MAC 表里学不到目标地址再急也没用。4.3 广播域与 VLAN 的关系讲到这里就不得不提广播域这个概念了。所谓广播域就是一个广播帧能到达的所有端口的集合。在不划分 VLAN 的情况下一台交换机上的所有端口都属于同一个广播域广播帧会被转发到整台交换机上的所有端口。有心的读者可能已经意识到PC1 和 PC2 通信时那个 ARP 广播消息也转发给了 PC3。这种无差别的扩散在设备数量少的时候问题不大可一旦交换机上接了上百台设备广播流量就会占用大量带宽甚至影响所有主机的性能。VLAN 的作用就是把这个大的广播域切成若干个小的广播域。不同 VLAN 之间默认是隔离的广播帧不会跨越 VLAN 边界。这就是上一轮实验里为什么所有接口都在 VLAN 10 内的原因——我特意让它们处于同一个广播域你才能看到广播泛洪的完整路径。华为设备上查看某个 MAC 是否属于广播地址可以用这样的命令过滤[SW1]display mac-address | include FFFF实际工作里如果你在交换机的 MAC 表里看到大量广播相关的表项或者某个接口下的广播报文计数异常高那就要警惕网络里是不是出现了广播风暴或者有终端在疯狂发起 ARP 请求。4.4 真实网络中的监控思路与交换机转发行为的联系之所以把监控也提一嘴是因为很多做运维的朋友问过我Zabbix 和 Prometheus 到底能监控交换机的什么东西跟工作原理有什么关系。其实思路很简单。交换机本身就是一个“按规则转发的设备”它的运行状态全部体现在接口计数器和各种表项里。通过 SNMP 协议监控平台可以定期拉取交换机的接口流量、丢包计数、错误帧计数、MAC 表规模等信息。比如某个接口的广播报文数持续暴涨说明广播域里可能出了环路或者异常终端。MAC 表项数量接近上限说明可能遭受了 MAC 泛洪攻击。某个接口的 CRC 错误帧增多大概率是物理链路问题比如网线老化或接触不良。监控的本质就是不断向交换机提问“你最近收到了多少帧转发出去多少帧丢弃了多少帧”而交换机能回答这些问题靠的还是它内部那张不断学习和老化的 MAC 表。5. 常见问题与排查技巧实录实验做完以后再回到实际工作场景。很多新手在配置交换机或者排查网络故障时会碰到一些和 MAC 表、转发行为直接相关的问题我把最常见的几个拿出来结合实验中的现象说说背后的原理和排查思路。5.1 交换机 MAC 表满了会发生什么我见过不少初学者以为 MAC 表满了顶多就是不能学习新地址老地址还能正常通信。这个理解不完整。MAC 表有容量上限一旦满了交换机就无法学习新的 MAC 条目。对新来的未知单播帧来说它查不到表项又学不进去结果就是持续泛洪。如果泛洪的流量太大整个交换机的转发性能都会被拖垮。排查思路很简单登录交换机执行display mac-address看看表项数量是不是到了上限。遇到这种情况优先确认网络里有没有环路。环路会导致交换机在多个端口间反复学习同一个 MAC 地址产生 MAC 地址漂移迅速填满整张表。5.2 为什么交换机有时候会“转发错误”有一次我在项目现场客户反馈两个办公室之间网络时通时不通。我登录交换机以后发现同一个 MAC 地址在两个接口之间来回跳变。这种就叫 MAC 地址漂移几乎可以断定是二层环路。排查的时候执行[SW1]display mac-address move华为设备上可以看到 MAC 地址漂移的记录。或者直接在系统视图下开启告警[SW1]mac-address flapping detection等到告警日志出现再去定位是哪个接口之间发生了漂移。很多人遇到网络时通时不通第一反应是查 IP 地址冲突其实如果交换机 MAC 表都乱了数据帧根本不知道该往哪发表现就会非常诡异。5.3 抓包抓不到某些流量不一定是你技术不行实验里我是靠端口镜像把流量导出来的。很多朋友在实际交换机上抓包发现明明有通信可抓包里就是什么都没有十有八九是镜像配置的问题。华为设备上常用的远程镜像配置大致是[SW1]observe-port 1 interface GigabitEthernet0/0/24 [SW1]interface GigabitEthernet0/0/1 [SW1-GigabitEthernet0/0/1]port-mirroring to observe-port 1 both这里有个常见误区镜像口的带宽和入接口的带宽不匹配时会丢包。比如你镜像一个万兆口的流量到千兆口流量一大就会丢。这种情况下抓包里看到的现象就会误导你让你以为交换机转发有问题其实问题出在镜像链路上。5.4 不同厂商命令差异速查做运维的往往会同时接触到华为、锐捷、H3C 这些品牌命令细节上有些差异但不影响转发原理。我把实验中用到的主要查询和配置命令整理成一张速查表操作华为锐捷查看 MAC 地址表display mac-addressshow mac-address-table清空 MAC 地址表undo mac-addressclear mac-address-table dynamic接口划入 VLANport default vlan 10switchport access vlan 10开启 MAC 漂移检测mac-address flapping detection需确认型号部分在全局模式下开启原理是一样的只是语法不同。只要脑子里有转发模型换任何厂商的设备你都能很快上手。别死记命令要把命令和背后的行为对应起来。5.5 排查一句话口诀最后分享一个我自己常用的排查口诀很简单先看物理层再看 MAC 表最后才看 IP 和路由。很多人一遇到网络卡顿就直接查路由、查防火墙策略反而把最基础的二层问题忽略了。交换机的 MAC 表就像是网络转发的“记忆”记忆乱了上层的一切都无从谈起。这次实验里做的所有操作本质上都是在人为控制这张表的内容。理解了这张表怎么学、怎么用、怎么老化交换机的原理就拿下了。以后再去配 VLAN、做端口隔离、排查环路你会发现思路都会清晰很多。