
1. 为什么要用模拟器来验证交换机的工作原理1.1 纸上谈兵不够动手实验才是理解的关键交换机可能是整个网络体系里最基础也最容易“被想当然”的设备了。几乎每个人都能背出那句经典结论交换机是二层设备靠MAC地址表转发帧。可真要问一句“MAC地址表是怎么建立起来的”“一条未知目的MAC的帧进了交换机后到底会发生什么”“广播帧和未知单播帧都叫泛洪两者有什么本质区别”——能当场讲清楚的人其实不多。我在带新人的时候经常发现一个现象大家看PPT、看文档都能看懂但到了实际排查网络故障时一遇到“交换机为什么把这个帧发到了所有端口”就卡住了。原因很简单原理没有在脑子里形成“画面感”。而ENSP模拟器恰恰是解决这个问题的利器。它是华为官方的企业网络仿真平台可以在个人电脑上跑出完整的交换机、路由器、防火墙环境而且自带抓包功能能看到真实的帧结构。花一晚上做一个ENSP交换机工作原理实验比啃三章教科书都管用。1.2 为什么选ENSP而不是真机或其他模拟器先说说选型。有人可能会问为什么不直接用真机跟网络打交道的朋友应该都清楚实验室真机资源通常很紧张而且真机上做实验有风险。你在生产环境的交换机上执行一条reset mac-address清空MAC表影响面可能波及整个局域网。模拟器就没有这个心理负担随便折腾。再看模拟器之间的对比。GNS3功能很强但它更擅长模拟路由器和服务器的复杂拓扑对华为设备命令行细节的支持不如ENSP原汁原味Cisco Packet Tracer虽然也很好上手但它的底层逻辑过于简化很多真实的转发行为被屏蔽掉了用来做“理解原理”的实验反而不合适。ENSP的优势在于第一华为官方出品和真实华为交换机的命令体系高度一致第二自带报文抓取功能可以把每个端口进出的帧抓下来分析这对理解交换机转发逻辑来说太重要了第三整个拓扑搭建是图形化的拖拽设备、连线、启动几分钟就能搞定一套实验环境。一句话如果你要学的是企业级交换机华为、H3C这一系的真实工作过程而且想自己动手验证每一个转发细节ENSP是目前性价比最高的选择。下面我就把整套实验的完整过程拆开从原理铺垫到拓扑搭建再到抓包验证和VLAN隔离实验一步步说清楚。2. 实验前必须先搞懂的三个转发机制实验的意义不是“把命令敲一遍截图留档”而是通过现象去反推机制。所以在正式动手之前我建议大家先把交换机的三个底层机制在脑子里理顺。这三个机制是整个实验的“剧本”后面所有抓包结果都是它们的直接体现。2.1 MAC地址学习交换机的“记忆”从哪来交换机不像路由器那样靠IP地址路由表做决策它的本职工作是把数据帧从一个端口送到另一个端口。问题是它怎么知道某个设备在哪个端口后面呢答案是靠持续不断的学习。当一个数据帧从某个端口进入交换机时交换机会拆开这个帧的二层头部读取其中的源MAC地址然后记录下来这个MAC地址是从哪个端口学到的。这就相当于酒店前台在客人入住时登记房间号一样——你从哪个门进来的我就把你记在那个门下。这个记录就是MAC地址表项在华为设备上用display mac-address可以查看。这个学习过程有一个关键特征它只关心源MAC不关心目的MAC。也就是说哪怕一个帧的目的MAC是广播地址FF:FF:FF:FF:FF:FF只要它从某个端口进来交换机照样会把它的源MAC学到表里。这一点在后面的广播实验中会看得很清楚。2.2 转发决策查表命中、泛洪与丢弃MAC地址表建好之后交换机如何决定一个帧往哪送流程非常简单就三步读取帧的目的MAC地址。在MAC地址表里查找这个目的MAC。如果找到了就从表项对应的端口转发出去如果没找到就从除了接收端口以外的所有端口把这个帧复制转发一遍。第三步这个“找不到就往所有口发”的动作就叫做“泛洪”。注意这里说的是未知单播泛洪——目的MAC是具体的某台机器只是交换机暂时不知道它在哪。打个比方酒店前台如果不知道某个客人的房间号为了不误事只能挨个敲门问“是你要的信吗”这种效率当然不高但它保证了一定能把信送到。至于丢弃指的是当交换机发现接收端口和表项中的出端口是同一个端口时说明这个帧从哪个口进来又该从哪个口出去直接在本地就被“消化”掉了交换机不会把它转发回去。这个细节很多教材一句话带过但实测抓包时你会发现这就是为什么有些端口上死活抓不到某些帧的原因。2.3 表项老化为什么“记忆”会过期MAC地址表不是永久有效的。华为交换机默认的动态表项老化时间是300秒也就是5分钟。如果某个MAC地址在5分钟内没有再出现交换机就会把这条表项删掉。这个机制非常有必要设备可能关机、可能从A端口挪到B端口重新接入如果表项永不过期交换机就会一直把发给它的帧从错误的老端口转发出去那才是真正的灾难。理解了这个老化机制实验中的很多现象就解释得通了。比如你清空MAC表后只发了一个数据包表项建立后如果一直没流量过一阵子再去看它就消失了。做实验时如果发现MAC表里的内容跟预期不一致先想想是不是“5分钟过期”这个因素在作怪。3. 最小验证拓扑三台PC加一台交换机的搭建细节原理铺垫完了下面开始动手。这个实验的核心目标是“用最小的代价、最清晰的变量验证交换机的学习和转发过程”。所以拓扑不必复杂三台PC连一台交换机足矣。3.1 设备选型与拓扑连接打开ENSP后在设备列表里拖出以下设备交换机S5700或S3700都可以二三层功能足够用了PC三台型号用普通的PC就行连线时将三台PC分别接到交换机的GigabitEthernet 0/0/1、GigabitEthernet 0/0/2、GigabitEthernet 0/0/3口。端口选GE口而不是E口的原因很简单GE口速率1000M模拟器里对报文处理更接近真实交换机的线速转发行为且后续扩展带宽类实验也更方便。很多人刚接触ENSP时会犯一个低级错误把PC接到交换机后直接配IP就开始ping结果发现ping不通。绝大多数原因是PC的网卡和交换机口之间的协商状态没有起来。你在拓扑图上看到连线变绿还不够要双击PC在命令行里确认网卡已经获取到了物理链路状态或者直接在交换机上执行display interface brief看到对应接口的PHY状态是up、协议状态是up再进行下一步。接口状态这块我在后面专门踩坑部分还会细说。3.2 IP规划与基础配置IP规划尽量简单直观我习惯用这样的表设备IP地址网关连接端口PC1192.168.10.1/24无需网关GE0/0/1PC2192.168.10.2/24无需网关GE0/0/2PC3192.168.10.3/24无需网关GE0/0/3这个实验里三台PC同网段只涉及二层转发所以网关留空即可。交换机上也不需要做任何VLAN划分默认所有端口都在VLAN 1里这是最简单的场景。配置PC的IP地址时先双击PC进入命令行敲ipconfig确认PC的IP配置方式然后手动配置PC ipconfig /ip 192.168.10.1 255.255.255.0注意ENSP里PC的命令格式跟Windows不完全一样PC的配置命令是ipconfig /ip 地址 掩码。如果这一步用错了命令后面所有实验都做不了。配置完成后先做一次基础连通性测试PC1 ping PC2、PC1 ping PC3确保两个方向都能通。这一步的目的不是别的而是让交换机的MAC表把三台PC的MAC地址都学习一遍为后面的“清场”操作做铺垫。3.3 实验前的“清场”操作让变量可控做实验最忌讳的就是变量不干净。你以为你在观察“未知单播泛洪”实际上交换机MAC表里本来就有对应记录那泛洪根本不会发生抓包结果一塌糊涂你还不知道问题出在哪。所以每次做转发行为实验之前我强烈建议养成一个习惯清空交换机的MAC表。在交换机上执行Huawei reset mac-address这条命令会清空所有动态学习的MAC地址表项。清完之后可以用display mac-address确认输出应该是空的或者只剩几条管理相关的表项。另外还有一个隐藏的干扰源PC自己的ARP缓存。如果PC1已经ping过PC2它的ARP缓存里就有了“192.168.10.2对应的MAC地址是XX”那么再次ping时ICMP请求帧的目的MAC直接就是PC2的MAC。这本身不影响实验但如果你想观察“交换机未知单播泛洪”就必须先用reset mac-address清掉交换机侧的表项而不是只清PC侧。反过来如果你想让PC先发ARP广播再发ICMP那就要在PC上清除ARP缓存。ENSP的PC支持类似命令arp -d但实测来看有时候这个命令不生效最稳妥的办法是重启PC设备。这个细节我在踩坑部分会重点展开。4. 实验一抓包观察MAC地址学习与定向转发这是整个实验的重头戏。我们要做的事很简单在两台PC互通的瞬间分别在交换机的两个端口上抓包同时观察MAC地址表的动态变化。通过这个对照把“学习”和“转发”两个动作直接可视化。4.1 实验步骤与命令第一步把所有设备启动等接口状态全部up。第二步在交换机上执行reset mac-address清空MAC表再执行display mac-address确认当前表为空或几乎没有用户表项。第三步打开交换机的抓包功能。在ENSP拓扑图上右键点击交换机选择“抓包”然后在弹出的抓包设置界面里勾选GigabitEthernet 0/0/1和GigabitEthernet 0/0/2两个端口点击开始。第四步让PC1 ping PC2只发4个ICMP Echo Request也就是在PC1上执行PC ping 192.168.10.2 -c 4重点来了抓包要“提前开”ping要在抓包已经启动之后再执行这样才不会漏掉第一个帧。第五步ping结束后先在抓包工具里停止抓包然后立刻返回到交换机命令行执行Huawei display mac-address把此刻的MAC地址表信息截图或记录一下。这个时候你应该看到类似下面的输出MAC address table of slot 0: Type VLAN MAC Address MAC age Learned from dynamic 1 00e0-fc12-3456 0 GE0/0/1 dynamic 1 5489-98e1-xxxx 0 GE0/0/24.2 抓包结果怎么看打开抓包文件后你会看到GE0/0/1和GE0/0/2两个端口的报文列表。用ICMP过滤一下分别看两个端口的报文。如果实验进行得足够干净你会看到这样一个规律GE0/0/1和GE0/0/2两个口上都有ICMP报文出现。进一步看每次ping发出的Echo Request在两个口上都能抓到而Echo Reply也是两个口都能抓到。这四个包长得几乎一模一样对这就是关键现象。第一次ping的时候PC1发出的ICMP请求帧目的MAC是PC2的MAC。此时交换机的MAC表是空的它不知道PC2在哪个端口所以只能把这个帧复制一份从GE0/0/2和GE0/0/3两个口转发出去。于是GE0/0/2上抓到了这个帧。而PC2收到后回复的ICMP应答帧目的MAC是PC1的MAC交换机同样不知道PC1在哪于是又复制一份所有非接收口都能抓到。这就是交换机的“最初状态”表是空的所有未知单播都泛洪。第二次及之后的ping情况就变了。因为在第一个往返过程中交换机已经从PC1发来的帧学到了PC1的MAC在GE0/0/1口从PC2发来的帧学到了PC2的MAC在GE0/0/2口。第二条ICMP请求帧发出后交换机查表命中PC2的MAC直接精确地从GE0/0/2口转发不再往GE0/0/3口复制。所以如果你把GE0/0/3口也抓上的话会看到只有第一条ICMP请求出现在GE0/0/3口后面的都消失了。4.3 表项变化如何印证理论看到这里原理就已经被完整验证了交换机先通过源MAC学习建立表项再用目标MAC查表决定转发路径。反映在display mac-address的输出上就是那两行“dynamic”表项。这里我多说一句关于MAC age字段。输出里的MAC age表示这条表项距离上次被刷新已经过了多少秒。如果你在ping完立刻查看这个值通常是0或者很小的数字如果你等了30秒再去看它会变成30左右如果在5分钟之后去看这条表项可能就消失了。这个细节可以顺手做一个“老化机制”的实验清空MAC表PC1 ping PC2一下然后等5分钟再执行display mac-address你会发现表项没了。非常直观地验证了“动态表项默认老化时间300秒”这个知识点。提示做这个实验时建议在ping完成后的10秒内就看MAC表因为一旦后续有广播报文比如其他PC的ARP请求某些表项的age就会被刷新干扰你判断哪些表项是这次ping建立的。5. 实验二未知单播泛洪的范围验证第一个实验其实已经顺带接触了“未知单播泛洪”但很多人会把“未知单播泛洪”和“广播泛洪”混为一谈。这一节我们专门把未知单播泛洪单独拎出来做一个更有控制性的验证。5.1 构造泛洪场景场景设计思路是让交换机处于“已知源、未知目的”的状态。具体操作如下保持三台PC都在线先让PC1 ping通PC2让交换机学到三台PC的MAC地址。在交换机上执行reset mac-address注意这次只清空MAC表不清PC的ARP缓存。此时PC1的ARP缓存里仍然有PC2的IP和MAC的对应关系所以PC1再ping PC2时发出的ICMP请求帧里目的MAC是PC2的MAC地址不是广播。但交换机侧已经不知道PC2在哪了所以这个帧就是一个“未知单播帧”。再一次强调PC的ARP缓存和交换机的MAC地址表完全是两回事。很多人这里转不过弯来总以为“PC1知道PC2的MAC那交换机也应该知道”———不是的PC知道的只是IP与MAC的映射交换机知道的是MAC与端口的映射一个是主机侧的信息一个是网络设备侧的信息两者独立维护。搞清楚这一点实验才不会做糊涂。5.2 关键现象重复实验一的抓包动作但这次只发一个ICMP Echo Request。你在GE0/0/2和GE0/0/3口上都会抓到这唯一的一条请求帧因为交换机的MAC表里没有PC2的MAC所以它必须从所有非接收端口复制转发。PC2回应之后交换机会学到PC2的MAC所以如果你紧接着再ping一次第二个请求帧就只出现在GE0/0/2口了。这个实验的演示效果比实验一更干净因为你把“未知”状态精确地控制在一个瞬间。我把这个实验命名为“泛洪的一锤定音”带新人时必做。5.3 泛洪机制存在的必要性与代价为什么要保留这个看起来“粗暴低效”的机制想想以太网的架构交换机本质上是在多个冲突域之间做二层桥接它并没有一个集中的“设备位置注册服务器”唯一的信息来源就是报文本身。当一台新设备接入网络后在它主动发出任何帧之前网络中没有任何设备知道它的存在。此时如果有一台主机要给这台新设备发数据交换机只能通过泛洪去“碰运气”。这就是典型的“用空间换确定性”泛洪保证了只要目的设备确实在网络中帧就一定被送达。代价是浪费了带宽也让其他无关端口上的一堆主机都收到了一份不是发给自己的副本。当网络里充斥着大量未知单播帧时比如某台服务器故障后大量客户端的ARP缓存都指向一个失效目的泛洪风暴就可能吃掉链路带宽。这也是为什么后来出现了组播表项、静态MAC表项等优化手段。理解了这一层你对“交换机查表失败的默认动作”就有了真正的工程认知。6. 实验三广播帧与VLAN隔离验证前面两个实验的研究对象都是单播帧。交换机的第三种核心行为是处理广播帧。广播帧的目的MAC是全FFF:FF:FF:FF:FF:FF交换机会无条件地把这种帧从除接收端口外的所有端口转发出去同一个VLAN内。这个行为本身不难理解但我希望大家通过实验看的不只是“广播会被泛洪”而是“广播泛洪的范围到底有多广”——这就牵扯出VLAN的核心价值了。6.1 先验证广播帧的泛洪范围在实验一的拓扑里保持所有PC在VLAN 1默认VLAN在交换机上清空MAC地址表然后在PC1上ping一个不存在的IP比如ping 192.168.10.100。等一下这一步的目的不是看ICMP而是看ARP。PC1要发送数据给192.168.10.100但它的ARP缓存里没有这个IP的MAC地址所以会先发一个ARP广播报文“谁是192.168.10.100请告诉192.168.10.1”。这个ARP请求帧的目的MAC是FF:FF:FF:FF:FF:FF。你在GE0/0/2和GE0/0/3口上抓包会看到一模一样的ARP请求出现在这两个端口。这就验证了交换机的广播泛洪规则广播帧不看MAC表只要不是接收端口一律转发。这里可以顺带做一个细节观察你会在GE0/0/2和GE0/0/3的抓包里看到广播帧的目的MAC是FF:FF:FF:FF:FF:FF但源MAC是PC1的MAC。这正是“学习源MAC”机制的又一次体现——连广播帧都不会被交换机放过它依然会从中提取源MAC并更新MAC表。你看一个简单的抓包实验能同时验证两个机制这就是动手实验的价值。6.2 用VLAN切割广播域进阶验证现在把实验升级一下在交换机上创建VLAN 10和VLAN 20把PC1、PC2划到VLAN 10PC3划到VLAN 20。配置命令如下Huawei system-view [Huawei] vlan 10 [Huawei-vlan10] quit [Huawei] vlan 20 [Huawei-vlan20] quit [Huawei] interface GigabitEthernet 0/0/1 [Huawei-GigabitEthernet0/0/1] port link-type access [Huawei-GigabitEthernet0/0/1] port default vlan 10 [Huawei-GigabitEthernet0/0/1] quit [Huawei] interface GigabitEthernet 0/0/2 [Huawei-GigabitEthernet0/0/2] port link-type access [Huawei-GigabitEthernet0/0/2] port default vlan 10 [Huawei-GigabitEthernet0/0/2] quit [Huawei] interface GigabitEthernet 0/0/3 [Huawei-GigabitEthernet0/0/3] port link-type access [Huawei-GigabitEthernet0/0/3] port default vlan 20 [Huawei-GigabitEthernet0/0/3] quit [Huawei] quit配置完成后重新在PC1上ping 192.168.10.3PC3。这时候结果应该是不通的因为PC1和PC3不在同一个VLAN二层广播域被隔离开了。在PC1上ping一个不存在的IP比如192.168.10.100然后在GE0/0/3口抓包你会发现PC1发出的ARP广播请求根本不会出现在GE0/0/3口上因为它被VLAN 20的边界挡住了。VLAN隔离出的独立广播域就这样被一个抓包动作直观地展示出来了。6.3 广播域、冲突域与VLAN的关系到这里我想帮大家把几个基础概念串一下。交换机每个接口都是一个独立的冲突域但默认情况下所有接口共享一个广播域。如果网络里接入的主机很多任何一台主机的ARP广播比如反复ping一个不存在的IP都会“打扰”到所有主机大量广播报文还会挤压正常流量的带宽。VLAN存在的核心意义就是把一个大的广播域切割成多个小的广播域。同一个VLAN内部的广播不会跨越VLAN边界。不同VLAN之间如果想通信必须借助三层设备路由器或三层交换机进行路由。所以你会看到企业网络的设计里VLAN划分往往跟部门、业务、安全域强相关这不只是管理上的整洁需求更是一个物理层面的流量隔离手段。做这个实验时强烈建议大家把VLAN划分前、划分后的抓包结果放在一起对比。划分前PC1的广播请求出现在GE0/0/3划分后广播请求在GE0/0/3上完全消失。这个反差会比你背十遍“VLAN隔离广播域”都要深刻。7. 实验中的常见坑与排查思路到这里核心实验已经全部跑通了。但我把这一节单独拿出来写是因为自己刚做ENSP实验那会儿几乎每个坑都踩过。现在回过头看很多“实验现象不对”的根因其实都是些小细节。我把自己踩过的几个高频问题整理出来给大家排雷。7.1 ARP缓存干扰最容易忽视的隐形变量很多人做完“未知单播泛洪”实验后发现GE0/0/2和GE0/0/3口的抓包里第一条不是ICMP请求而是ARP请求。这是正常的吗要分情况。如果PC1的ARP缓存是空的它本来就需要先通过ARP广播解析目的IP的MAC地址然后再发ICMP帧。那你去抓“未知单播泛洪”抓到的其实是“广播泛洪”实验目的就错位了。解决方法很简单在做泛洪实验之前先让PC1 ping通PC2一次让PC1的ARP缓存里填上PC2的IP与MAC映射然后再清空交换机的MAC表。这样下一次ping时PC1直接封装目的MAC为PC2的MAC的帧发出交换机的表却已经空了才能精确观察“未知单播”的行为。如果你发现PC1身上没有类似arp -d的可用命令最简单的做法是在ENSP里把PC1这个设备删除、重新部署IP重新配一遍ARP缓存自然就空了。7.2 接口状态与协议状态不一致ENSP里经常出现一种诡异情况拓扑图上连线明明变绿了但交换机上display interface brief显示某个GE口是up另一个显示down。这时PC之间往往不通但你又不知道问题出在哪。我的排查顺序是先看交换机所有接口的状态确认每个PC对应的接口都是up。如果某个接口是down在交换机上执行undo shutdown把接口打开如果接口已经up但协议往下掉十有八九是VLAN配置把PC的默认VLAN改掉了导致PC帧进来后交换机打上的VLAN标签和PC不在同一个广播域。这种情况在高版本ENSP里还挺常见的所以做完VLAN配置实验后我有一次发现PC1怎么都ping不通PC2了查了半天才发现GE0/0/1的port default vlan被我改成了20。所以配置完VLAN后一定要用display vlan统查一遍所有端口的归属。7.3 ENSP抓包的常见两个坑第一个坑是忘了开抓包就发报文。等你想起要开抓包关键的第一条帧早就过去了后面所有现象都串不起来。我的做法是先开抓包再确认抓包软件界面里能看到“已监控”的状态然后再让PC发ping命令ping完立刻停止抓包保存。第二个坑是抓包过滤规则设置太窄。比如只勾了ICMP过滤条件结果丢了ARP广播就会漏掉广播泛洪的验证环节。建议做实验时先不过滤全量抓下来然后再在软件里用显示过滤器筛选这样最保险。7.4 ENSP启动问题的通用排查思路不少人在ENSP里启动路由器或交换机时报错报错代码五花八门网上说法也很多。我个人的经验是这四个方向按顺序排查能覆盖八成问题。第一确认VirtualBox版本与ENSP兼容。ENSP底层依赖VirtualBox版本不匹配是最常见的启动失败原因。第二检查电脑的CPU虚拟化是否已开启BIOS里的Intel VT-x或AMD-V选项如果没打开所有设备都会启动失败。第三以管理员身份运行ENSP否则虚拟网卡创建容易失败。第四如果某个设备反复启动失败右键该设备选择“删除”后重新拖一个新设备到拓扑里有时候就是设备配置文件损坏了重置就好。8. 实验做完之后把知识串成自己的网络地图做完上面这些实验你至少应该能回答这几个问题了交换机收到一帧时先看源MAC还是目的MAC看源MAC是为了什么看目的MAC又是为了什么未知单播帧和广播帧最终都会被泛洪但它们的区别在哪VLAN到底在物理上做了什么让广播帧“过不去”我个人带人做实验的习惯是做完一个实验就要求对方不看任何笔记把这个实验的场景、步骤、预期结果、实际现象完整讲一遍。如果中间有卡壳重新把实验再做一次直到能“预言”现象的每一个细节。因为只有当你拿到一个空MAC表的交换机能用嘴说出“第一条ICMP请求会出现在所有端口第二条起只出现在目的端口第三条起连PC1的MAC表项都会老化”的时候你才算是真正理解了交换机的工作原理。如果你还有余力我建议在ENSP里继续扩展几个方向第一在交换机上配置静态MAC地址表项观察静态表项和动态表项在老化行为上的差异第二把实验拓扑里的PC换成两台服务器用port link-type trunk配置干道链路观察VLAN标签在Trunk链路上的封装变化第三在交换机上开启storm-control广播风暴抑制然后故意制造广播洪流看看交换机的抑制动作反映在报文统计上是什么规律。这几个实验做下来你对二层交换的掌握就完全不是一个层次了。最后分享一个我自己的习惯每次实验结束我都会把抓包文件用Wireshark打开挨个报文看一遍二层头的源MAC、目的MAC、EtherType再对照交换机的display mac-address输出做一次交叉验证。这一件事看起来很重复但做上几遍之后你对“帧是活的”这种感觉会非常强烈——现在看到任何网络故障报文脑子里都能自动浮现出它经过每一台交换机时发生的变化排查效率完全不可同日而语。