1. 搞清楚交换机的本职工作二层转发只要机房里放着网络设备就肯定绕不开交换机。很多朋友一开始接触网络听到交换机就觉得无非是一个能多插几根网线的盒子插上就能通。等你真的调试过一台中大型网络的接入层设备就会发现真实情况远没有那么简单——交换机的核心价值在于它是一台有脑子的二层转发设备而这个脑子就是MAC地址表。1.1 交换机在网络里到底扮演什么角色从网络分层模型的角度看交换机主要工作在数据链路层也就是第二层。它处理的对象是以太网帧Ethernet Frame转发的依据不是IP地址而是帧头里的目标MAC地址。你可以把整个局域网的通信想象成一个大写字楼里的信件分发系统IP地址是房间号但真正能把信件送到对应工位前的是每个工位上的工牌号——MAC地址。交换机就是这个楼层的快递分拣员它的手里有一份详细的通讯录记录着每个工牌号具体出现在哪个房间门口。这份通讯录就是MAC地址表。和集线器最大的不同在于交换机不是无脑地把数据复制给所有人。它能听懂帧里的目标MAC地址然后只从对应的端口送出去。这种按需转发的行为极大降低了网络的冲突域提高了带宽利用率。可以说没有MAC地址表的交换机就和一根被强行塞进铁盒子的网线没什么区别。1.2 二层交换和三层路由的分工很多新手会混淆交换和路由。简单来说二层交换解决的是同一个局域网里谁找谁的问题三层路由解决的是不同局域网之间怎么走的问题。两台电脑在同一个VLAN里互访数据帧不需要经过路由器的决策交换机靠MAC地址表就能完成端到端的送达。但这里要强调一个容易被忽略的事实交换机在第一次见到某个数据帧时它其实并不知道目标设备在哪里。MAC地址表不会天生就填好内容它是在通信过程中不断学习出来的。这个从不知道到知道的过程恰恰是理解交换机转发的钥匙。掌握了这把钥匙你后面看生成树协议、端口安全、MAC地址漂移排障都会轻松很多。2. MAC地址表设备内部的通讯录2.1 MAC地址表到底记录了什么MAC地址表不是一张只有MAC地址-端口两列的简单清单它通常至少包含四个关键字段字段作用举例MAC地址记录终端网卡的物理地址00:1e:8f:00:12:34VLAN ID标识该MAC所属的虚拟局域网VLAN 10出接口从哪个物理端口可以到达该MACGigabitEthernet0/0/1表项类型动态学习还是静态配置动态/静态为什么需要VLAN字段因为交换机内部是逻辑隔离的同一个端口可能通过Trunk承载多个VLAN的流量。如果不区分VLAN两个VLAN里出现相同MAC地址时就无法决定该从哪里转发。所以严格来说MAC地址表的索引是MAC地址VLAN ID的组合而不是单纯的MAC地址。这个细节在排查问题时非常重要尤其是当不同VLAN里配置了相同MAC的虚拟服务器时交换机只会为它们建立多条表项转发决策时靠完整匹配来命中。2.2 CAM表为什么叫CAM而不是RAMMAC地址表在交换机内部实际上存储在一种叫CAMContent Addressable Memory内容寻址存储器的硬件里。普通内存RAM是靠地址来读取内容而CAM可以直接把数据内容本身作为检索条件一次性地并行查找匹配项。你可以理解为RAM就像图书馆里要先查书号再去书架找书CAM则像是直接把书名报给图书管理员他脑子里同步扫描所有书架瞬间告诉你位置。这种并行查找能力对转发性能至关重要。交换机每秒钟要处理几百万个帧如果每个帧都用软件去遍历一张大表延迟和CPU消耗都扛不住。所以中高端交换机的转发芯片里都集成CAM表专门用来加速二层的地址匹配。这也是为什么一台交换机的MAC地址表容量会成为硬件规格里的重要参数容量越大能直接记录的终端就越多超出容量后新MAC就只能被泛洪处理性能会明显下降。2.3 动态表项和静态表项的区别MAC地址表的表项来源一般分两种。动态表项是交换机通过分析收到的数据帧源地址自动学习出来的它有过期时间默认通常300秒终端关机或迁移后表项会老化消失。静态表项是管理员手动敲命令指定这个MAC从某个端口进来不会老化除非手动删除。静态表项的最大价值是防欺骗和保安全。比如服务器区的数据库服务器MAC是固定的你可以把它静态绑定到接入端口上这样其他设备即使伪造了这个MAC地址也无法从别的端口进入网络。但静态表项也有麻烦一旦硬件更换导致MAC变了你得同步去改配置否则这台设备就彻底失联了。所以生产环境里静态绑定通常只用在重要的服务器或网络设备互联口上普通办公终端还是以动态学习为主。3. 地址学习从泛洪到建立表项3.1 没有表项怎么办先泛洪前面说到交换机转发前要查表但表不是天然存在的。当交换机收到一个目标MAC地址在表里找不到的数据帧时它只能采取一种笨办法把这个帧从这个VLAN所有端口转发出去除了收到这个帧的端口。这种转发行为称为泛洪Flooding。泛洪可以类比成快递员拿着一个没有门牌号的包裹挨家挨户敲门问这个收件人在你们家吗只有真正的目标设备会应答其他设备虽然收到了这个帧但因为目标MAC和自己不一致网卡会直接丢弃。泛洪虽然是无奈之举但它保证了在没有表项信息的情况下通信依然能够建立起来。需要注意的是泛洪只针对未知单播帧和广播帧不是所有帧都会这样处理。如果泛洪出现在接入层大范围局域网里往往意味着广播包很多或者是有人在进行MAC扫描类的行为网络卡顿往往从这里埋下伏笔。3.2 三步建立一条完整动态表项动态MAC学习的过程核心是三步。第一步接收帧。交换机的端口收到一个以太网帧先检查它的源MAC地址看看这个地址是不是空的、是不是组播MAC如果是非法地址就丢弃。第二步学习源MAC。交换机把源MAC地址 帧进入的VLAN 端口号组合记录下来更新到CAM表里同时刷新老化计时器。这里有个理解关键交换机学习的是谁在哪个端口这是通过观察帧的来源推断出来的和目标MAC无关。第三步查目标MAC并转发。记录完源MAC之后交换机再去查这个帧的目标MAC在不在表里。如果存在就定向转发到对应端口如果不存在就走泛洪路径。我经常跟朋友用一句话概括交换机先看帧从哪来记到本子上再看帧往哪去决定从哪走。3.3 老化时间为什么MAC表不会无限膨胀既然交换机会持续不断学习MAC地址为什么表不会一直增长到爆炸因为动态表项都有老化时间Aging Time默认一般是300秒。终端在300秒内如果一直有流量经过它的表项就会被刷新保持有效如果超过300秒没有任何通信交换机就会认为该设备可能已经下线主动把这条表项清除。这个机制能应对终端的移动性。比如你的笔记本从端口A换到了端口B如果老的表项一直不老化交换机就会坚持把发往你笔记本的帧送到端口A那通信必然失败。老化机制保证了换端口后能在较短时间内重新学习到新位置。配置老化时间时要注意时间太短会频繁触发泛洪增加网络负担时间太长会导致MAC迁移不灵敏影响终端漫游。一般办公网络用默认300秒就够但如果有大批无线终端短期内频繁漫游可以适当调到120秒左右。我记得有一次帮某公司调无线网络因为默认老化时间在快速漫游场景下显得太长导致一批终端在切换AP后出现几秒到几十秒的丢包把老化时间调短后问题明显缓解。3.4 手工写静态表项的正确姿势静态MAC配置通常用在关键设备上操作方式很简单但有几个细节要注意。# 以华为设备为例在系统视图下为GigabitEthernet0/0/1配置一条静态MAC表项 [Huawei] mac-address static 00:1e:8f:00:12:34 gigabitethernet 0/0/1 vlan 10配置后可以用display mac-address查看确认。需要注意的点静态表项必须指定VLAN和端口不能只写MAC。如果端口上已经动态学到了这个MAC需要先清除或等待老化否则可能因为表项冲突配置失败。静态表项无法通过reset mac-address全部清除只能逐条删除这在批量调整时要格外小心。提示如果只是为了防止终端随意更改IP端口安全里也有MAC和IP绑定的方式不一定要用静态MAC表项。两种方案各有适用场景静态MAC表项侧重固定转发出接口端口安全侧重接入控制。4. 查表转发一台交换机每秒都在做的事4.1 转发决策的完整路径理解了地址学习的来源之后再来看转发决策就简单多了。交换机每收到一个帧会经历一个标准化的处理流程接收帧校验帧长和帧格式不合规的直接丢弃。剥离或添加VLAN标签取决于端口类型是Access还是Trunk。用目标MAC VLAN作为关键词查MAC地址表。查表结果分三种情况命中出接口、查不到、目标MAC是广播地址。根据查表结果执行对应的处理单播转发、泛洪、广播。这个过程是硬件完成的速度和线速转发直接挂钩。一台交换机的转发性能好不好就看它能不能在满载端口流量下依然做到这个流程不丢包。这也是为什么很多交换机参数表里的包转发率会比背板带宽更能反映实际处理能力。4.2 三种查表结果的处理已知单播转发。这是最理想的情况MAC表里能查到对应条目交换机把帧从条目的出接口转发出去其他端口不受影响。这也是交换机能实现冲突域隔离的根本原因。未知单播泛洪。查不到目标MAC表项时交换机会在同VLAN内除接收端口外的所有端口转发这个帧。之前说过这种方式的效率低但它是建立学习的必要过程。等目标设备回包时交换机就会学到它的MAC位置后续帧就走定向转发了。广播帧。目标MAC是全FFF:FF:FF:FF:FF:FF的帧交换机无条件泛洪因为它本身就意味着发给所有人。ARP请求就是最典型的广播帧。组播帧则看情况如果端口开启了IGMP Snooping交换机只会把组播帧转发给有需求的端口否则也是泛洪处理。4.3 一个重要坑MAC地址表不是越大越好很多初次接触交换机选型的同学会觉得MAC地址表容量越大越好。这个想法不完全对。容量大确实能让更多终端离线时依然保留表项减少泛洪但更大的表也意味着CAM芯片成本更高、功耗更大。实际选型时符合网络规模就行比如一个几百终端的办公网络一张8K容量的MAC表已经绰绰有余上万人园区网的核心交换机才需要考虑几百K的大表。还有一个容易被忽视的问题是MAC表项溢出后的行为。表满了之后新的MAC无法被学习交换机对这个新MAC的流量只能持续泛洪。这会带来两个问题一是泛洪流量挤占带宽二是可能导致某些依赖单播转发的应用出现丢包。运维时如果发现交换机CPU占用异常升高或者网络中频繁出现诡异的重传顺便看一眼MAC表容量是不是满了往往能找到答案。5. 实战运维MAC地址表的查看与排障5.1 怎么看一台交换机的MAC表不同厂商命令略有差别但思路一致。# 华为查看全部MAC地址表 display mac-address # 华为查看指定VLAN的MAC表 display mac-address vlan 10 # 思科/锐捷查看全部MAC表 show mac address-table # 思科查看指定端口的MAC表 show mac address-table interface GigabitEthernet0/1看表的时候我一般关注三点。第一是表项数量是否符合预期如果一个大VLAN里活跃设备有300台但表里只有50条很可能是泛洪过多或者表项被反复清除。第二是看有没有异常端口集中出现大量MAC这往往是下面接了一个傻瓜交换机或者AP的桥接模式。第三是看静态表项是否被误配置曾经遇到过有人把虚拟机的一个内部MAC静态绑到了错误端口导致那台虚拟机在迁移后彻底断网排查了很久才发现是表项里的出接口没更新。5.2 MAC地址漂移一个让网络工程师头疼的问题MAC地址漂移MAC Flapping指的是同一个MAC地址在短时间内反复出现在交换机的不同端口上导致MAC表项不停更新。常见原因有三种一是终端在下行链路上接了两个交换机中间形成了环路二是终端的网卡开启了网卡捆绑或虚拟机热迁移流量从多个口交替进入三是有人故意伪造MAC进行攻击。对于第一种情况必须靠生成树协议STP来收口。检查漂移的方法是用命令看MAC表项的变化记录。华为设备可以用display trapbuffer查看是否有MAC地址漂移的日志也可以开启MAC地址漂移检测。# 开启MAC漂移检测并设置动作 [Huawei] mac-address flapping detection [Huawei] mac-address flapping detection action error-down把action设置成error-down后交换机检测到漂移会直接把相关端口置为错误关闭状态。这在防环路时特别有效但也会带来误伤风险——如果正常的服务器双网卡捆绑被误判为漂移端口可能会被强制关闭。所以生产环境建议先观察确认漂移源确实是环路再启用自动关断。5.3 端口安全和MAC绑定给接入层加把锁接入层交换机是终端进入网络的第一道口很多安全问题发生在这一层。端口安全Port Security可以限制一个端口能学习到的MAC地址数量超过限制就丢弃帧或关闭端口。# 华为开启端口安全并限制最大学习数量为5 [Huawei-GigabitEthernet0/0/1] port-security enable [Huawei-GigabitEthernet0/0/1] port-security max-mac-num 5这个功能在开放办公区非常实用。一个工位如果只有一个面板理论上只会出现一两个MAC地址。如果某天这个口上疯狂学习到几十个MAC很可能下面被人私自接了一个家用路由器或小交换机这时候限制MAC学习数能直接切断这种违规接入。但也要注意端口安全不能过度依赖。如果公司有大量访客临时接入过小的MAC限制会导致正常终端无法接入。更合理的做法是配合802.1X认证控制接入把MAC绑定的控制粒度做得更细。5.4 常见MAC地址表问题速查现象可能原因处理建议某终端换端口后不通老MAC表项未老化清除对应MAC或等待老化全网频繁泛洪MAC表容量满/药老化时间过短优化表项容量、调整老化时间同一MAC在两个端口跳变存在二层环路启用STP并检查链路静态绑定后终端失联出接口或VLAN配错核对绑定信息并修改表项接入层端口大量MAC私接小交换机或AP启用端口安全或802.1X6. 最后分享两个实操中的小经验聊到这就快接近尾声了再分享两个我在实际维护中踩过的坑。第一个是关于清除MAC表的操作。很多人知道用reset mac-address可以清空动态表项但忘了这条命令在网络割接时可能会瞬间引发大量泛洪。如果你正准备对一台核心交换机进行链路切换建议先把老化时间临时调短比如调到60秒等切换完成后再恢复回300秒。这样旧表项快速淘汰新表项能更快适应切换后的拓扑比一次性清除要温和得多。第二个经验是关于多厂商环境下表项字段的差异。不同厂商的display mac-address输出中端口的表示方式不太一样有时候同一个端口在不同命令里会显示成不同的名字。排障时一定要先确认自己看的字段是什么含义。我之前在跨厂商的对接调试中就因为把VLANMAC的复合表项误当成纯MAC表项导致判断错了一台设备的学习位点浪费了整整半天时间。交换机虽然是个老生常谈的基础设备但MAC地址表的学习、老化、转发逻辑里藏着的细节一点都不少。把这些底层机制真正吃透了再去看生成树、VRRP、环路防护这些高级特性都会觉得顺理成章。希望这篇梳理能对正在啃交换机的朋友有点帮助。