干了十几年网络,带过不少新人,我经常遇到一个很有意思的现象:很多人把路由器配置得滚瓜烂熟,但一提到三层交换机,总觉得隔了一层纱——好像知道它能路由,又说不清它到底是怎么路由的。甚至有人以为三层交换机就是把路由器功能塞进交换机里,转发流程和路由器一模一样。这个理解不能说错,但确实偏了。三层交换机的转发原理,核心就一句话:一次路由,多次交换。这句话背后的机制,决定了它在园区网里能扛住远超路由器的转发压力。这篇文章我就把这个原理拆开揉碎讲清楚,再带大家完整做一遍跨VLAN通信的实验,把一个数据包从PC1到PC2的全过程剖析清楚。适合刚接触三层交换机的网工,也适合想系统补一遍转发细节的老手。
1. 三层交换机和路由器到底差在哪
1.1 二层交换机的天花板在哪里
先把二层交换机的边界划清楚。二层交换机工作在OSI第二层,转发依据是目的MAC地址。收到一个帧以后,查MAC地址表,有匹配条目就从对应端口转发出去,没有匹配条目就泛洪到所有同VLAN端口。整个过程中,帧头里的MAC地址不会被改写,IP头更是完全不关心。所以二层交换机对同网段通信是高效的,硬件查表、端口线速转发,时延可以压到微秒级。
但一旦出现不同VLAN之间的通信需求,二层交换机就立刻失灵了。VLAN本身就是广播域的隔离手段,不同VLAN的主机在二层上是互相隔离的,它们的MAC地址表互相看不到对方,同一个广播域里也收不到对方的ARP广播。你让VLAN 10的主机去ping VLAN 20的主机,二层交换机只会干瞪眼:它既不认识目的MAC,也不允许把帧从这个VLAN转到另一个VLAN。这就是二层交换机的天花板——它只能交换,不能路由。
1.2 三层交换机凭什么能路由
三层交换机在二层交换的基础上增加了路由能力。核心区别在于,它引入了控制平面和数据平面分离的硬件架构。控制平面由CPU负责,跑路由协议、处理ARP、维护路由表;数据平面则由ASIC(专用集成电路)和TCAM(三态内容寻址存储器)负责,专门干硬件查表和转发。
这就带来一个和路由器最本质的差异:传统路由器收到一个数据包后,通常要交给CPU去查路由表、封装转发,CPU的工作量决定了整机的吞吐上限;而三层交换机的大部分转发决策在ASIC里一次性完成,CPU只在建表阶段介入。说直白一点,路由器是"每一步都要计算",三层交换机是"算一次,后面照着抄"。
所以在实际部署里,园区网的汇聚层和核心层几乎都是三层交换机的主场。大量东西向流量(比如终端互相访问服务器、办公终端之间跨网段交互)需要高速转发,如果交给路由器处理,CPU很快就扛不住千兆甚至万兆线速转发了。路由器更适合做边界设备,跑复杂的路由策略、做NAT、连接运营商,这些事情对转发性能的要求没有园区内部那么极端,但对策略灵活性的要求更高。
1.3 VLAN间路由的三种实现方案对比
这里补充一个方案选型的背景。VLAN间路由不是只有三层交换机一种做法,常见的有三种,理解它们的差异,你就明白三层交换机的定位了。
第一种是路由器单臂路由。把路由器的一个物理口配置成trunk口,子接口收VLAN 10和VLAN 20的流量,路由器在子接口上做路由转发。这种方案配置简单,也符合直觉,但瓶颈非常明显:所有跨VLAN流量都挤在这一条物理链路和一个物理接口上,链路带宽是天花板,CPU转发也是天花板,最多撑个小办公室的场景。
第二种是三层交换机配VLANIF(也叫SVI,交换虚拟接口)。每个VLAN对应一个三层接口,接口IP就是该VLAN内主机的网关,VLAN间通信由交换机ASIC硬件转发。这是园区网的标准解法,转发带宽不受单条链路限制,查表在硬件里完成,性能高得不是一点半点。
第三种是把三层交换机的物理口直接切换成三层路由口(很多设备默认支持undo portswitch),和路由器、上层设备做三层互联。这个场景多用在核心层、汇聚层设备互联,以及连接重要服务器或者防火墙的时候。
所以结论很明确:园区内部VLAN间路由,首选三层交换机配VLANIF;对外互联、策略部署,才轮到路由器出场。这个选型逻辑搞清楚了,后面理解转发原理就有依托了。
2. 转发原理:一次路由,多次交换是怎么跑通的
2.1 转发前必须搞懂三张表:MAC表、FIB表、邻接表
三层交换机转发数据包,核心是查表,但查的不是一张表,而是三张表协同工作。
第一张是MAC地址表,负责二层转发。这张表在三层转发里依然有作用,因为同一个VLAN内部、以及从三层接口进入交换机后,硬件还要借助MAC表把帧送到正确的物理端口上。
第二张是FIB表(转发信息库)。FIB是由路由表(RIB)转换而来的一张专门给硬件查询的表,里面包含了目的网段、出接口、下一跳地址等信息。为什么不用路由表直接给ASIC查?因为路由表里包含很多ASIC不关心的细节,比如路由协议的优先级、度量值、管理距离,这些是控制平面决定路由用的,数据平面只需要"目的网段去哪个接口、交给哪个下一跳"这种精炼信息。FIB就是把路由表翻译成硬件能快速匹配的格式。
第三张是邻接表。它负责解决"下一跳IP对应的MAC地址是什么"这个问题。因为三层转发需要重新封装二层帧头,你必须知道下一跳的MAC,否则数据包没法从出接口发出去。邻接表本质上就是ARP缓存和其他二层解析信息在硬件里的整合版本,只是表现得更紧凑、更符合硬件查表的逻辑。
当ASIC收到一个需要三层转发的IP包时,它会用目的IP去查FIB,命中以后,用FIB里记录的出接口和下一跳信息,去邻接表里取出下一跳MAC,然后把帧头重写一遍,从出接口原样送出。整个过程只花几十纳秒,完全没有CPU参与。这就是硬件转发的核心路径。
2.2 第一个包走慢路径,后续包走快路径
那"第一次"这个开销出现在哪?答案是:当FIB或者邻接表里缺少对应条目时。
比如核心交换机刚刚开机,VLANIF接口刚配上IP,ARP缓存是空的,FIB表里虽然有了直连网段,但目的主机的MAC还没学到。这个时候PC1的第一个ping包打过来,目的IP查FIB是能命中的——直连网段在表里,但下一跳(也就是PC2)的MAC地址查不到,邻接表缺失。这个包不能简单丢弃,交换机把它上送CPU,CPU发出ARP请求,询问PC2的MAC,同时把数据包暂时缓存或直接丢弃等重传。ARP回应回来以后,CPU把"PC2的IP对应PC2的MAC"写进邻接表,再下发到硬件,后续所有去往PC2的包就能在ASIC里直接完成转发。
这个机制有两个典型现象。第一个现象是,很多人在模拟器里做完实验,用PC1连续ping PC2,发现第一个包超时,后面全部正常,这不是配置错了,而是慢路径把第一个包"耽误"了。第二个现象是,如果你抓包,会在第一个包前后抓到一组ARP请求和应答,之后的所有ICMP包都是干净利落的点对点通信。
这就是"一次路由,多次交换"的本质:CPU只需要处理第一个包,建立好硬件表项之后,后面的千千万万个包全部由ASIC接管。和路由器每个包都要CPU查表相比,这个架构在转发能力上的优势是数量级的。
2.3 一个跨VLAN数据包的完整旅程
光讲理论还是飘,我用一个具体例子把完整旅程走一遍。
假设核心交换机上有VLANIF 10,IP是192.168.10.1/24,VLANIF 20,IP是192.168.20.1/24。PC1在VLAN 10里,IP是192.168.10.10,PC2在VLAN 20里,IP是192.168.20.10。PC1要ping PC2。
PC1首先发现,目的IP 192.168.20.10跟自己不在同一个网段,于是把报文发给默认网关192.168.10.1。这一步很关键,封装的时候,PC1发出的ICMP请求帧,目的MAC写的是网关192.168.10.1的MAC,而不是PC2的MAC,因为PC1在二层上根本够不到PC2。
核心交换机从属于VLAN 10的二层端口收下这个帧,硬件把帧头剥开,发现这是一个IP包,目的IP是192.168.20.10。查FIB,命中直连网段192.168.20.0/24,出接口为VLANIF 20。接着查邻接表,找到192.168.20.10对应的MAC地址(这个MAC就是前面说的ARP学习结果)。然后重写二层帧头:源MAC从VLANIF 10的MAC改成VLANIF 20的MAC,目的MAC从PC1的MAC改成PC2的MAC,同时TTL减1,重新计算校验和,从VLAN 20对应的物理端口转发出去。整个过程发生在ASIC的流水线里,几乎不占用CPU资源。
PC2收到这个帧,发现目的MAC是自己,剥开IP头看到目的IP是192.168.20.10,确认是给自己的ICMP请求,于是封装ICMP应答,目的地址写192.168.10.10。因为不在同一网段,它也发给自己的网关192.168.20.1,也就是VLANIF 20的MAC。核心交换机收到后,走同样一趟流程:查FIB、查邻接表、重写MAC、从VLAN 10侧转发。PC1收到应答,一轮ping结束。
从这个例子里你能清楚看到三层交换机做的事:它不是一个"路由器 + 交换机"的简单物理叠加,而是把"路由决策"和"二层交换"在硬件里整合成了一条转发流水线。MAC重写、TTL递减、FIB和邻接表查询,全部是ASIC按固定流水线完成的动作。
3. 实验:两台PC跨VLAN通信实战
3.1 实验拓扑与地址规划
理论必须落到设备上。下面这个实验我建议大家在模拟器里跟着敲一遍,拓扑不复杂,但每个点都踩在转发原理上。
实验由三台设备组成:一台三层交换机(核心交换机),一台二层交换机(接入交换机),两台PC。实际拓扑是这样的:
- 核心交换机上联口接接入交换机,链路做成trunk,放行VLAN 10和VLAN 20;
- 接入交换机的1口划入VLAN 10,接PC1;2口划入VLAN 20,接PC2;
- 核心交换机上创建VLAN 10和VLAN 20,分别配置VLANIF接口IP:VLANIF 10为192.168.10.1/24,VLANIF 20为192.168.20.1/24;
- PC1设置IP 192.168.10.10/24,网关192.168.10.1;
- PC2设置IP 192.168.20.10/24,网关192.168.20.1。
地址规划表我列一下,方便后面复盘:
| 设备 | 接口/角色 | IP地址 | 网关 |
|---|---|---|---|
| PC1 | 接入交换机口1,VLAN 10 | 192.168.10.10/24 | 192.168.10.1 |
| PC2 | 接入交换机口2,VLAN 20 | 192.168.20.10/24 | 192.168.20.1 |
| 核心交换机 | VLANIF 10 | 192.168.10.1/24 | 无 |
| 核心交换机 | VLANIF 20 | 192.168.20.1/24 | 无 |
| 接入交换机 | 口1 access VLAN 10,口2 access VLAN 20 | 二层设备,无IP | 无 |
这里要注意,接入交换机的上联口是trunk口,必须放行VLAN 10和VLAN 20,否则核心交换机的VLANIF就算配置了,VLAN 10的流量也进不来。另外,接入交换机不需要也不能给VLANIF配IP,它的职责就是二层透传。
3.2 接入交换机配置:划VLAN和放行Trunk
先配置接入交换机。我用的是某厂商的命令行风格,各家命令有些差异,但VLAN、access口、trunk口这些概念是通用的,看到对应关键词就能迁移。
接入交换机取名SW-A,登录后进入系统视图,先创建VLAN再划接口:
<SW-A> system-view [SW-A] sysname SW-A [SW-A] vlan batch 10 20 [SW-A] interface gigabitethernet 0/0/1 [SW-A-GigabitEthernet0/0/1] port link-type access [SW-A-GigabitEthernet0/0/1] port default vlan 10 [SW-A-GigabitEthernet0/0/1] quit [SW-A] interface gigabitethernet 0/0/2 [SW-A-GigabitEthernet0/0/2] port link-type access [SW-A-GigabitEthernet0/0/2] port default vlan 20 [SW-A-GigabitEthernet0/0/2] quit这里有个容易忽略的细节:很多模拟器里,新加设备的接口默认是shutdown状态,或者默认VLAN是1。你敲完配置后最好挨个接口看一眼状态,如果端口down了,要在接口视图下执行undo shutdown,否则后面排查会绕弯路。
然后是上联口。接入交换机和核心交换机互连的口要配成trunk,并且放行这两个VLAN:
[SW-A] interface gigabitethernet 0/0/24 [SW-A-GigabitEthernet0/0/24] port link-type trunk [SW-A-GigabitEthernet0/0/24] port trunk allow-pass vlan 10 20不用手动设置PVID,默认PVID是VLAN 1。这里要说明一个易错点:trunk口放行了VLAN 10和20,但默认还允许VLAN 1通过。接入交换机的管理VLAN在真实环境里往往也是VLAN 1,所以这个默认行为影响不大;但如果生产环境有安全要求,建议把管理VLAN单独剥离,这里实验就不展开。
配置完以后,在接入交换机上用display vlan确认一下,能看到VLAN 10和VLAN 20都已创建,对应端口分配正确,这才说明二层侧准备好了。
3.3 核心交换机配置:VLANIF就是网关
核心交换机是实验的重点。它的任务有两个:第一,让VLAN 10和VLAN 20的二层流量能从trunk口进入;第二,给两个VLAN分别提供三层网关接口,也就是VLANIF。
先创建VLAN并放行trunk。核心交换机连接入交换机的口,也配置成trunk,放行VLAN 10和VLAN 20:
<SW-Core> system-view [SW-Core] sysname SW-Core [SW-Core] vlan batch 10 20 [SW-Core] interface gigabitethernet 0/0/24 [SW-Core-GigabitEthernet0/0/24] port link-type trunk [SW-Core-GigabitEthernet0/0/24] port trunk allow-pass vlan 10 20 [SW-Core-GigabitEthernet0/0/24] quit然后配置两个VLANIF接口。这是三层转发真正生效的地方:
[SW-Core] interface vlanif 10 [SW-Core-Vlanif10] ip address 192.168.10.1 255.255.255.0 [SW-Core-Vlanif10] quit [SW-Core] interface vlanif 20 [SW-Core-Vlanif20] ip address 192.168.20.1 255.255.255.0 [SW-Core-Vlanif20] quit这里解释一下VLANIF的工作原理:VLANIF并不是一个真实存在的物理接口,它是一个"逻辑三层接口",内核里绑定到某个VLAN上。只要该VLAN下有任意一个物理二层接口处于up状态,这个VLANIF就会up;如果这个VLAN下没有任何物理接口up,VLANIF会直接down,怎么配IP都是白搭。所以实验里连接接入交换机的trunk口放行VLAN 10和20,意义不仅仅是二层透传,还保证了VLANIF 10和VLANIF 20的状态是up的。
配完后用命令确认状态:
[SW-Core] display ip interface brief正常情况下能看到Vlanif10和Vlanif20的IP地址,状态应该是up,协议也应该是up。如果这里显示down,先别急着配别的,回trunk口查放行配置,九成是这个原因。
插一句和真实网络的关联:在大型园区网里,核心交换机往往要承载十几个甚至几十个VLAN,每个VLAN配一个VLANIF是很常见的设计。我见过不少新人把VLANIF当成"虚拟路由器接口",这个理解方向是对的,但要记住它和物理路由口有一个关键差异——VLANIF必须依赖物理口承载VLAN才能起来。
3.4 抓包看转发链路:ARP和ICMP的完整过程
配置完成后,在PC1上ping PC2的IP:
PC1> ping 192.168.20.10不出意外的话,能看到第一个包超时或延时长,后面连续几个包响应正常。这个现象就是慢路径和快路径的直观体现。为了让原理看得更清楚,最好在PC1、接入交换机上联口、核心交换机这两个VLAN侧分别抓包。
抓包会看到什么?第一组是ARP请求和应答。PC1发起的第一个数据包,目的IP是192.168.20.10但不在同网段,所以它先发ARP广播请求,问"192.168.10.1的MAC地址是什么",也就是请求网关MAC。核心交换机收到广播后,从VLANIF 10接口回应自己的MAC。这个过程发生在第一个ping包之前。
第二组是ICMP请求和应答。第一个ICMP请求到了核心交换机之后,如果核心交换机还没有学到PC2的MAC,它需要再次发出ARP请求,问"192.168.20.10的MAC地址是什么"。PC2应答后,核心交换机把邻接关系写入FIB和邻接表,之后这个ICMP请求才会被真正转发到PC2。这中间的时延,就是第一个包丢失或超时的原因。从第二个请求包开始,核心交换机不再需要处理ARP,直接在硬件里查表重写MAC并转发,时延骤降。
在这个基础上,你还可以在核心交换机上执行几条命令做实锤验证:
[SW-Core] display fib看FIB表,能看到192.168.10.0/24和192.168.20.0/24两个直连路由条目,出接口分别是Vlanif10和Vlanif20。
[SW-Core] display arp看ARP表,正常情况下能看到192.168.10.10和192.168.20.10两条动态表项,分别对应PC1和PC2。实验做完以后,把核心交换机的ARP表抓出来看一眼,你会发现它不仅记录了网关自己的接口信息,还记录了每个VLAN里已经通信过的主机信息,这就是邻接表的来源。
这个实验做完,你对三层交换机的基本运作就有了切身体感:它不是"配置完就能自动转发",而是靠FIB表和邻接表一步步跑起来的,第一次建立表项是CPU的活,后续转发全是硬件的事。
4. 常见问题排查与避坑实录
4.1 跨VLAN能通,跨三层交换机不通怎么查
有一种场景在实际工作中很常见:同一个三层交换机下,VLAN 10能ping通VLAN 20,但去另一个三层交换机下挂的VLAN 30就是不通。这种问题十有八九出在路由层面。
排查的第一件事,是确认源端和目的端是否已经跨了三层设备互访。如果是,你需要检查两台三层交换机之间是否有三层链路,以及是否配置了路由。最简单的做法是在核心交换机上看路由表:
[SW-Core] display ip routing-table如果目的网段是192.168.30.0/24,而路由表里只有直连网段,没有静态路由或动态路由条目,那很明显:核心交换机根本不知道192.168.30.0/24怎么走,数据包直接被丢弃了。
解决办法很简单,在核心交换机上增加一条静态路由,指向对端设备:
[SW-Core] ip route-static 192.168.30.0 24 192.168.20.254这里192.168.20.254就是对端三层交换机用于互联的接口IP。同时,对端设备也要有回程路由指向你的网段,否则包过去了也回不来。排查回程路由是很多新人容易漏的环节,我见过不少案例是源端路由配好了,目的端回程没配,最后在同一台设备上反复折腾,浪费时间。
4.2 VLANIF接口为什么是DOWN的
VLANIF接口DOWN是另一个高频问题,而且最容易让人抓狂,因为配置看起来完全正确,IP地址也配了,路由也引入了,但接口就是起不来。
回忆一下VLANIF的特性:它必须依赖一个实际的二层口状态。如果VLAN 10下没有任何物理接口up,VLANIF 10就会处于DOWN状态。所以排查路径很明确:
第一,先看看该VLAN下有没有端口。执行display vlan 10,查看这个VLAN下关联了哪些端口,端口状态是否up。如果没有任何端口,或者端口被shutdown了,VLANIF必然上不来。
第二,检查trunk链路。VLAN 10的流量需要从接入交换机的access口进入到trunk上联口,再到核心交换机的trunk口。中间任何一环没有放行VLAN 10,都会导致核心交换机上"看不见"VLAN 10的活跃端口。
第三,注意PVID的坑。有些设备默认PVID是VLAN 1,如果你把接入交换机的上联口PVID改成了VLAN 10,而核心交换机上联口PVID还是1,两端PVID不一致,虽然不影响VLAN 10数据通过(只要都放行了),但会带来一些意想不到的广播域错乱,排查时容易误判。
我自己的习惯是,配置完trunk后,先在两台设备上分别display vlan,对比两边的VLAN列表和端口状态,确认两边完全对得上,再往下走三层的配置。
4.3 模拟器实验的3个隐藏坑
上面说的问题在模拟器里同样会遇到,但模拟器还有一些特殊坑,不写下来对不起大家踩过的坑。
第一个坑是设备没启动完全。有些模拟器开源免费、并发量大,设备刚拖进拓扑时,如果马上敲命令,会提示系统视图进不去或者命令不响应。原因多半是虚拟设备还在加载阶段。解决办法是等设备控制台出现"系统启动完成"的字样再开始配。别嫌我啰嗦,这个问题的出现频率远超你的想象。
第二个坑是接口默认shutdown。前面提到过,模拟器里新加入的交换机和路由器,很多接口是处于shutdown状态的,而且是Line protocol down。很多人在接口视图里配置了access、设置了default vlan,但忘了undo shutdown,结果VLANIF一直down,物理层就是过不去。
第三个坑是防火墙策略。有些模拟器默认开启了设备安全策略,PC之间ping不通不是路由错了,而是流量被安全策略拦了。遇到"配置完全正确但死活不通"的情况,先用display current-configuration看一眼有没有莫名策略,再考虑是不是模拟器版本问题。
最后分享一个比较好用的排查顺序:先查物理层和二层,再查VLAN和trunk,再查VLANIF接口状态,然后查路由表和FIB,最后查ARP。按这个顺序走,绝大多数问题十分钟内能定位。三层交换机的排障,难的不是命令,而是脑子里有没有这张检查层级地图——你把一个数据包从PC出发到对端PC的整条路径在脑子里走一遍,每一个环节该查什么都明确写下来,就再也不会被这类问题卡住了。