ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

H3CNE交换机工作原理:MAC地址表学习、泛洪与转发全解析

H3CNE交换机工作原理:MAC地址表学习、泛洪与转发全解析 H3CNE学到交换机工作原理这一章很多人都有一种奇怪的感觉实验照着做PC一接上交换机就能Ping通拓扑图也画得明明白白但真让你关掉图形界面解释一下“交换机会不会把一个PC1发来的帧又从另一个口扔出去”大部分人就开始含糊了。这种含糊不是不努力而是交换机的工作原理和你平时看到的“通了”之间隔着一张看不见的MAC地址表。这张表怎么来、怎么用、怎么老化几乎是H3CNE交换部分所有选择题的核心题眼也是你以后排障时最先要怀疑的东西。这篇文章就围绕交换机转发一个帧的完整过程来写把MAC地址学习、泛洪、精准转发、表项老化、H3C命令行验证和实验复现一次讲清楚。正在备考GB0-192这类H3C认证、刚上手华三交换机或者只会用模拟器点鼠标、想真正搞懂转发的朋友都可以照着往下看。1. H3CNE为什么要揪着交换原理不放1.1 考试里交换原理的真实考法先说一个很多人会踩的误区H3CNE的交换部分不是让你背“交换机是二层设备”这句话而是给你一个具体场景问交换机到底会干什么。比如“一台交换机收到目的MAC未知的单播帧正确的处理是什么”“同一个MAC地址在两个端口上反复出现可能是什么问题”“广播帧会不会从收到它的那个端口再发出去”。这些题如果你只背概念大概率会错因为细节太多泛洪是除了入端口以外所有端口都发不是所有端口都发未知单播泛洪和广播泛洪表面一样但成因完全不同。我在备考的时候把交换原理相关的题反复刷了几遍发现真正答错的人不是不知道定义而是没有在脑子里把“帧到达交换机”之后的每一步走一遍。交换机不是把帧从A口收进来、从B口放出去就完事了它要先查端口状态、打VLAN标签、学源MAC、查目的MAC最后才决定是转发、泛洪还是丢弃。这一步一步的决策链就是H3CNE真正想考你的东西。1.2 交换机和路由器到底差在哪理解交换机之前先得把交换机和路由器的“脑筋”分清楚。路由器查的是路由表它关心的是IP地址和下一跳每经过一个三层设备源MAC和目的MAC都会被重写。交换机不一样它查的是MAC地址表关心的是MAC地址和出端口二层转发时帧头里的源MAC、目的MAC一概不改。打个比方路由器像快递分拣中心它看的是邮政编码决定你这包裹下一站该去哪个城市交换机像小区物业它看的是门牌号决定你这封信该送到哪栋楼哪个房间。你在自己的小区里递东西物业只需要认门牌号不需要知道你是从哪个城市来的。所以二层交换机转发数据帧时根本不看IP地址同一个广播域内的通信IP地址只是给PC自己用的交换机全程只认MAC。很多初学者把三层交换机和普通交换机搞混其实三层交换机说白了就是“能干活的路由器能快速转发的交换硬件”它查路由表时干的还是路由器的活但在同一VLAN内部转发时用的依然是MAC地址表。搞清楚这一层后面看VLAN、看三层网关思路都会顺很多。1.3 学完这章你手里能多出什么工具学会交换机工作原理不是让你去背命令而是让你在现网里能回答几个非常实际的问题为什么PC1第一次Ping PC2好像会慢一点为什么交换机上明明配了IPPC就是不通为什么同一个MAC会在两个端口之间跑来跑去这三个问题光靠“通了就是好的不通就是坏了”这种思路是解决不了的。你需要用display mac-address去看表项是不是学全了用reset mac-address去清理可疑的表项用“先清表再复现”的方式去区分是二层学习问题还是三层转发问题。这些才是学完交换原理之后真正长在你身上的东西。2. 一个帧穿过交换机其实要过好几道关2.1 入端口先“验明正身”端口状态和VLAN Tag很多人讲交换机会直接从“查MAC表”开始但实际上帧进了端口之后第一件事不是查目的MAC而是先确认这个端口能不能收包。如果端口被STP阻塞、端口down了、或者收包速率超出限制帧到这里就被丢了后面的一切都不存在。接下来交换机要决定这个帧属于哪个VLAN。Access口收到无Tag帧会打上这个端口的PVID标签Trunk口收到带Tag帧会拿帧里的VLAN Tag去和允许通过的VLAN列表比对允许就收不允许就丢。这一步很多人不在意但它是后面一切的起点因为MAC地址表的每一条表项里都有一个VLAN ID字段交换机查表不是拿“MAC地址”单维度去查而是拿“VLANMAC”组合去查。同一个MAC地址在不同VLAN里可能是完全不同的两条表项这在配置了多个业务VLAN的交换机上非常常见。2.2 顺序不能反先学源MAC再查目的MAC这是最容易理解错的一个点。交换机收到一个帧马上要做两件事第一用帧里的源MAC去刷新或建立MAC表项把这个源MAC、入端口、VLAN ID绑定在一起第二用帧里的目的MAC去查MAC表决定从哪个口送出去。为什么先学源MAC道理很简单帧是从哪个口进来的交换机是确定的而源MAC就是在这个方向上被看见的。把“看见的MAC”和“看见它的端口”绑定这是最可靠的自学习逻辑。至于目的MAC交换机目前只知道它的地址并不知道它在哪里必须去表里查。所以“学习”和“查找”发生在同一个帧的处理流程里不是先把整张表学好再转发。这里要纠正一个常见误区交换机不是靠目的MAC来“学习”位置的。你看到表项是动态学习的但学习用的是源MAC。也就是说交换机想知道PC2在哪个口不取决于PC2发出的目的MAC而是取决于PC2发出去的帧的源MAC。只要PC2往网络里发过一个帧交换机就能把PC2的MAC登记到对应端口上。2.3 查表结果只有三种转发、泛洪、丢弃用目的MAC去查MAC地址表结果就三种加上广播和组播一共五种情况我列个表一次说清情况交换机的处理目的MAC命中且出端口与入端口不同从出端口转发目的MAC未命中未知单播在所属VLAN内泛洪除入端口外所有端口都发目的MAC命中但出端口就是入端口丢弃过滤目的MAC是广播地址FF-FF-FF-FF-FF-FF在所属VLAN内泛洪除入端口外所有端口都发目的MAC是组播地址根据IGMP Snooping/组播表决定未开启时通常泛洪重点说下“丢弃”这种情况。很多人不理解为什么帧的目的MAC查到以后发现出端口和入端口是同一个交换机反而把帧丢了举个例子交换机GE1/0/1下面接了一个傻瓜交换机傻瓜交换机下面挂了两台PCPC A给PC B发帧。这个帧从GE1/0/1进入交换机交换机查目的MAC发现PC B也是从GE1/0/1学到的——因为它俩在同一个下级交换机下面MAC表会把你这个上游端口当成唯一的出口。那交换机还需要把这个帧再从GE1/0/1送出去吗不需要。因为PC B已经在链路对内了交换机如果再把帧从GE1/0/1发出去等于把帧往回送毫无意义。所以“入端口出端口”时交换机会直接过滤掉这个帧这也是正常转发行为的一部分不是故障。2.4 二层转发不改MAC头只改队列路由器转发三层包时每经过一跳源MAC和目的MAC都会被重写所以抓包时你会发现MAC地址每一跳都在变。交换机不会这样它做的是透明二层转发帧在进交换机之前是什么样出交换机之后还是什么样源MAC、目的MAC、以太网类型通通不变。你抓包时看到的MAC就是从源设备发出来时的MAC。那交换机在转发时“改”了什么呢它改的是内部的处理方式根据802.1p优先级把帧放进不同的出端口队列可能做限速、做镜像、做ACL过滤。这些行为不影响帧内容但会影响帧的转发时机和是否被转发。H3CNE初级阶段不需要你深入队列调度只要记住“转发不改变帧头”这个结论它已经足够帮你区分交换机和路由器了。3. MAC地址表的建立、刷新和老化是个动态过程3.1 表不是配出来的是设备自己“学”出来的继续拿小区物业类比。物业一开始手里没有住户名单但每当你从大门进来一次他就记一次“这个人住3号楼”。交换机也一样出厂时MAC地址表是空的只要收到合法帧它就自动从源MAC里学习表项不需要你手工逐条录入。这就是二层交换机所谓的“自学习”。但要注意这个学习是有条件的。不是所有收到的帧都能学比如帧校验错误、长度错误、端口的MAC地址学习功能被关闭这些情况下交换机不会学习源MAC。正常业务流量下设备只要一发帧交换机就会把它的MAC和入端口绑定起来。所以在H3C模拟器里你会发现刚开机时display mac-address可能一条都没有但只要两台PC互相Ping一次表项立刻就有了。还有一个容易忽略的细节动态表项和静态表项是分开管理的。动态表项是设备自己学的静态表项是你手工配的。考试里如果把一张输出表摆在你面前问你哪些条目是动态的、哪些是静态的你要能从Type字段一眼看出来。H3C的显示里动态表项通常标DYNAMIC静态表项标STATIC。3.2 默认老化300秒活跃的表项会被自动“续命”动态表项不是永久存在的。H3C交换机默认的动态表项老化时间是300秒也就是5分钟。每当你收到一个帧它的源MAC正好命中一条已有表项这条表项的老化计时器就会被刷新相当于“续命”。反过来如果一台设备5分钟内没发过任何帧交换机会认为它可能已经不在这个端口下了于是把表项删除。这个设计的原因有两个一是MAC表容量有限不能让垃圾表项一直占着空间二是终端会移动、会下线如果表项不老化交换机就会一直把发给旧设备的帧送往错误端口。老化时间可以调全局配置是system-view mac-address timer aging 300查看老化配置用display mac-address aging-time实际项目中老化时间设太短会有什么后果设备明明在线但流量一停超过老化时间下次通信时交换机的表项已经被清了又要重新经过一轮未知单播泛洪流量才能恢复精准转发。在网络规模比较大的二层环境里这种周期性泛洪会被放大。老化时间设太长也有问题比如一台服务器从一个端口迁移到另一个端口如果表项迟迟不重新学习交换机就还会往旧端口发一阵子。这种情况与其被动等老化不如手动清一下表。3.3 静态表项和黑洞表项考试经常冷不丁出一下动态学习之外H3C还支持手工配置静态MAC表项命令是mac-address static 0011-2233-4455 interface GigabitEthernet1/0/1 vlan 10静态表项不老化适合用在服务器的固定接入端口上能防止因为设备掉电、表项老化导致的短暂泛洪。但配置静态MAC也有代价如果这台设备后来真换了位置你必须手工改配置交换机不会自己纠正。另一个更特殊的是黑洞MAC表项mac-address blackhole 0011-2233-4455 vlan 10凡是目的MAC等于黑洞MAC地址的帧交换机收到后直接丢弃等价于一条“二层黑名单”。这个功能常用于隔离某个已知的恶意MAC或问题终端。H3CNE阶段对静态和黑洞的要求不高但既然考试爱拿输出表当题干你至少得知道这三种表项类型分别长什么样。4. 广播、未知单播和组播“泛洪”这件事要分清场景4.1 广播泛洪是定义不是故障目的MAC是全F的帧就是广播帧它要发给同一个广播域里的所有设备。交换机拿到广播帧后不可能像单播一样精准转发因为它根本不需要精准它的语义就是要“所有人都收到”。所以交换机会把广播帧从除了入端口以外的、同VLAN的所有端口发出去这就是泛洪。很多新手一听到泛洪就觉得是异常其实在广播帧这里泛洪就是它的正常工作方式。也正因如此广播帧多大会影响整片网络这就引出了广播域的概念。VLAN可以把一个物理交换机切成多个逻辑广播域广播帧只在同一个VLAN内泛洪出了VLAN就被挡在边界上。这也是VLAN最核心的价值之一。4.2 未知单播泛洪不是广播但行为上跟广播一样未知单播泛洪是大家最容易误解的地方。一个帧的目的MAC是单播地址但交换机在MAC表里查不到它不知道应该往哪个口送这时候交换机只能“死马当活马医”像广播一样把这个单播帧泛洪到同一个VLAN内的所有端口。注意帧本身还是单播帧只是交换机的行为变成了广播式的。为什么会出现未知单播最常见的原因是表项老化交换机本来学过这个目的MAC但设备安静了超过老化时间表项被清了。下一次这台设备主动发帧时交换机已经忘了它的位置只能泛洪一轮。其次是设备刚上线、第一次通信或者MAC表被清空过。还有一个隐含原因MAC表容量满了交换机学不进新表项也会导致大量未知单播泛洪。排障时看到网络里单播泛洪突然变多别只怀疑环路先看看是不是有设备在频繁迁移、表项老化时间设置不合理或者有攻击流量占满了MAC表。4.3 ARP请求和MAC学习是“第一次Ping慢”的真相你在一台新接的PC上Ping同网段的另一台PC第一次包有时候会感觉“卡”一下第二次就飞快。这个现象很多人的第一反应是网络有问题但如果你懂交换原理就会知道这大概率是正常的。PC1要Ping PC2第一步不是直接发ICMP而是先发ARP请求问“10.1.1.2的MAC地址是多少”。ARP请求的目的MAC是广播地址所以交换机必须泛洪PC2收到这个广播后回一个ARP应答这是一个单播帧交换机在这个过程中把PC1和PC2的MAC地址分别学到了对应端口。从这之后ICMP Echo Request和Reply都走精准转发再也没有广播的参与。所以“第一次慢、第二次快”的本质是系统里多了一次ARP广播和MAC学习的过程。当然这个“慢”通常是毫秒级的体感不一定明显但如果你抓包看协议一定会看到第一个包是ARP后面才是ICMP。这个知识在排障里非常有用当你怀疑“二层有问题”时先看看表项有没有学齐而不是反复去Ping。4.4 组播帧没开Snooping就当广播处理IPv4组播MAC地址以01-00-5E开头它对应的是一组接收者不是单台设备。如果交换机上看不到组播相关的二层转发表默认情况下会把组播帧在VLAN内泛洪和广播一样的待遇。只有启用了IGMP Snooping或者类似机制交换机才会记录哪个端口下游有组播接收者然后把组播帧只送往这些端口。H3CNE对组播的要求不深但结论要记住交换机默认不智能处理组播想要组播精准转发必须开二层组播监听。这个知识点等以后学H3CSE时会被放大现在先埋个伏笔。5. 看完这几条H3C命令你就能亲手“审问”交换机5.1 display mac-address先学会读表学完工作原理第一件该做的事不是配VLAN、配链路聚合而是学会用display mac-address去查看交换机究竟学了什么。命令很简单在用户视图执行display mac-address输出大体是这样MAC Address VLAN ID State Port Aging 0011-2233-4455 1 DYNAMIC GE1/0/1 258 0066-7788-99aa 1 DYNAMIC GE1/0/2 300每一列的信息都很有用MAC Address是设备的真实MACVLAN ID说明这个MAC是在哪个VLAN里学到的State是DYNAMIC就是动态学的STATIC就是手工配的Port是它最后一次被看见的端口Aging是剩余老化秒数。实际排障时我很少一口气看全表因为表项可能几百条。常用的过滤查询是display mac-address vlan 10 display mac-address interface GigabitEthernet1/0/2 display mac-address 0011-2233-4455比如“PC2接在GE1/0/2但Ping不通网关”先拿PC2的MAC去查看交换机的表里有没有这一条。如果没有说明交换机压根没学到PC2的MAC那就别急着查三层网关问题很可能出在二层链路或PC的网卡驱动上如果有再看表项指向的端口是不是GE1/0/2如果指向别的端口那就是端口漂移或配错了。5.2 清表不是万能的但能帮你缩小问题范围reset mac-address是排障时很顺手的一个命令。它可以不带参数清空全部动态表项也可以精确清理某VLAN或某接口下的表项reset mac-address reset mac-address vlan 10 reset mac-address interface GigabitEthernet1/0/2注意这命令只是把表清空不是把交换机关了重来。清空之后只要有流量经过交换机会立刻重新学习。所以我在排障时经常用这个命令做“复现测试”怀疑某个终端二层学习有问题就先清表再让终端主动发一个Ping然后立刻查表。如果表项还是没出现那基本可以断定终端到交换机之间的链路有问题如果表项出现了但流量不通再往上查三层。这一步能让你的排查方向更加清晰。5.3 MAC漂移和环路端口反复横跳怎么定位如果你执行两次display mac-address发现同一个MAC一会儿在GE1/0/1、一会儿在GE1/0/2这就是MAC漂移。最常见的成因有两个一是物理环路比如有人把一根网线同时插在了交换机的两个口上或者下接了一个没开STP的傻瓜交换机导致同一个帧从两个方向到达交换机每次学习到的端口都不一样二是终端确实在移动比如无线AP漫游、虚拟机迁移。排查漂移有个笨但高效的办法拔线。先把怀疑成环的那根线拔掉再执行几次display mac-address如果表项稳了那基本就是环路。想要证据更严谨H3C的Comware平台上有端口移动检测功能可以记录MAC漂移日志不同版本命令略有差异但思路一致让交换机自己告诉你哪个MAC在漂移、漂到哪个口、一共漂了多少次。这一点在现网运维里非常实用。5.4 三条“背了就错”的典型认知最后清一遍最容易出错的三个点第一“交换机收到广播帧后会从所有端口发出去”是错的正确的是除了入端口以外的同VLAN端口都会收到交换机不会把帧原路返回。第二“交换机用目的MAC学习地址”是错的学习永远用源MAC查表才用目的MAC。第三“交换机和路由器都是查表转发所以本质一样”也是错的。交换查的是MAC表转发不改帧头范围不出广播域路由器查的是路由表转发会重写MAC能跨越广播域。这三条你要是考前能闭眼说清楚交换原理的选择题基本就不会再翻车了。6. 用HCL模拟器复现一遍比背十遍教材都管用6.1 搭一个最简单的拓扑H3C官方的HCL模拟器里拓扑最简单也能说明问题一台交换机两台PC。连接关系是PC1的网卡接到交换机的GE1/0/1PC2的网卡接到交换机的GE1/0/2。PC1配10.1.1.1/24PC2配10.1.1.2/24网段相同。启动后别急着Ping。先在交换机上查一下表display mac-address这时候大概率什么都查不到因为PC还没发过任何帧交换机没有素材可学。这个“空表”状态本身就很有教学意义MAC地址表不是一开机就有的。6.2 第一次Ping看着MAC表“长”出来从PC1执行Ping PC2。为了能观察到过程Ping的次数可以多设一点比如在Windows下ping -t 10.1.1.2然后立刻回到交换机上执行display mac-address你大概率会看到两条动态表项一条是PC1的MAC绑定GE1/0/1一条是PC2的MAC绑定GE1/0/2。注意观察出现的先后PC1先发ARP广播所以PC1的MAC会先被学到PC2收到广播后回ARP应答PC2的MAC才被学到。如果你手速够快完全可以在第2章讲的“先学源、后查目的”在实际输出里得到验证。再执行几次Ping然后查表你会发现Aging时间变了。因为每次收到PC1发出的帧它的表项老化时间就会被刷新这就是“活跃表项续命”的直观体现。6.3 清空表项再看一次“泛洪前奏”回到用户视图执行reset mac-address再一次display mac-address刚才学到的两条表项全没了。这时再从PC1 Ping PC2仍然能通但这一次通信的最开端还是会重复一轮广播学习的流程。如果你把抓包软件打开肯定能在ICMP出现之前看到一个ARP广播包随后才是正常的Ping流量。这个“一次泛洪、立刻精准”的过程比任何教材里的流程图都直观。6.4 加一个VLAN验证广播域隔离学到这还能顺手验证VLAN的作用。在交换机上创建一个VLAN 10把GE1/0/2划进去GE1/0/1保持在VLAN 1system-view vlan 10 port GigabitEthernet1/0/2 quit这时候PC1和PC2虽然都是10.1.1.x网段但Ping不通了。原因就是VLAN隔离了广播域PC1发出的ARP请求到了交换机后只会在VLAN 1内泛洪交换机不会把它从GE1/0/2送出去PC2根本收不到ARP请求。这正好复习了4.1节的内容。再把GE1/0/1也划进VLAN 10两台PC恢复通信因为广播域又重合了。我在实际排障时有个小习惯遇到“刚开始不通等一下又通”的故障先display mac-address看表项有没有学齐不够就先reset mac-address再复现一次。这是最快区分“二层学习问题”和“三层转发问题”的办法。学会交换机工作原理后你会发现90%的二层故障都能用一张MAC地址表解释清楚剩下的10%多半也还要先从这张表开始查。
返回列表