学习:三层交换机

三层交换机本质上是"二层交换机的线速转发能力"与"路由器的三层选路能力"的结合体。理解它的关键在于搞清楚控制平面(CPU/软件)与数据平面(ASIC/硬件)如何分工协作 ,以及 ARP 表、路由表、硬件转发表三者如何联动。下面分层次拆解。


一、核心原理:一次路由,多次交换

传统路由器做三层转发时,每个包都要经过 CPU 查路由表、重写帧头,软件处理导致延迟高、吞吐低。三层交换机用 ASIC 硬件把三层转发"硬化"。

核心思想是 "Route Once, Switch Many"(一次路由,多次交换)

  • 首包(第一个数据包):上交 CPU,走完整的三层路由流程(查路由表 → ARP 解析 → 生成转发条目),这个包由软件/CPU 处理。
  • 后续包(同一条数据流) :CPU 把转发条目下发给 ASIC,后续同流报文直接在硬件层完成帧头重写和转发,不再经过 CPU,达到线速。

一条"流"通常由 <源IP、目的IP、源端口、目的端口、协议> 五元组标识;硬件表项中保存了已经解析好的二层封装信息。


二、硬件转发架构:FIB + 邻接表

三层交换机在硬件里维护两张关键表,它们由控制平面的路由表和 ARP 表"编译"而来:

来源 内容 作用
**RIB(路由表)**​ 直连/静态/动态路由协议 目的网段 → 下一跳IP + 出接口 控制平面选路(软件)
**FIB(转发信息库)**​ RIB 下发 目的前缀 → 下一跳 + 出接口 硬件转发时查"去哪"
ARP 表 ARP 学习 IP → MAC + 出接口/VLAN 提供二层封装信息
**邻接表(Adjacency)**​ ARP 表 + FIB 生成 目的IP → 目的MAC、源MAC、VLAN、封装类型 硬件直接用来重写帧头

关键点:硬件转发时不需要现查 ARP,邻接表里已经"预封装"好了目的 MAC 和源 MAC。所以后续包只需一次查表 + 帧头重写,TTL 减 1、校验和硬件重算,直接转发出去。

  • FIB 查表用 TCAM(三态内容寻址存储器),一次命中,速度不受表项数量影响。
  • 源 MAC 改写为"出接口(SVI)的 MAC",目的 MAC 改写为"下一跳的 MAC",这是三层转发与二层交换最本质的区别(二层转发不改 MAC)。

三、ARP 报文的处理机制

三层交换机在不同场景下对 ARP 的处理方式不同:

1. ARP 请求的目的 IP = 交换机自身三层接口 IP

(比如请求网关 SVI 接口的 IP,或路由接口 IP)

→ 交换机直接回复 ARP Reply,用自己的接口 MAC 应答。这是最常见的"PC 找网关"场景。

2. ARP 请求的目的 IP = 其他网段(跨网段 ARP)

→ 检查是否开启 Proxy ARP(代理 ARP)

  • 开启 且交换机有到该网段的路由:用自己的接口 MAC 回应,充当代理,后续流量由交换机做三层转发。
  • 未开启 或没有对应路由:不回应,直接丢弃(ARP 请求不会跨 VLAN/网段传播)。

3. 免费 ARP(Gratuitous ARP,目标 IP = 源 IP)

→ 用于 IP 冲突检测和主动刷新邻居的 ARP 缓存。交换机收到后会更新自己的 ARP 表项,并可能触发生成/更新邻接表。

4. ARP Miss(三层转发时 ARP 表中没有目的 MAC)

这是三层转发里的关键一环:

  1. 首包到达,硬件查 FIB 有路由,但邻接表无对应条目 → ARP Miss
  2. 报文上交 CPU,CPU 查路由表确认可达,然后在出接口所属网段/VLAN 发起 ARP 请求。
  3. 收到 ARP Reply,学到目的 MAC → 生成邻接表项并下发硬件
  4. 首包(或前几个包)可能在等待 ARP 期间被丢弃或缓存(不同厂商有差异,有的会用"ARP 抑制/首包缓存"机制缓解)。

5. ARP 表项老化与刷新

  • ARP 表项有老化时间(常见 20 分钟)。老化前会发单播 ARP 探测刷新。
  • 若探测失败则删除表项,同时联动删除邻接表项和硬件转发表项,后续报文重新触发 ARP Miss 流程。
  • 接口 down、VLAN 删除也会触发 ARP 和转发表项的批量清除。

四、路由表更新与转发表的联动

三层交换机同时运行二层(MAC 地址学习)和三层(路由协议)控制平面。路由表更新遵循"控制平面感知 → RIB 重算 → FIB 刷新 → 硬件表下发"的链条:

路由表的来源(RIB 构建)

  1. 直连路由:三层接口(SVI / 路由口 / VLANIF)配置 IP 且链路 up 即自动生成,接口 down 则立即撤销。
  2. 静态路由:手工配置,可指定下一跳或出接口。
  3. 动态路由协议:交换机可运行 OSPF、RIP、IS-IS、BGP 等,与路由器建立邻居、交换 LSA/路由更新,由协议计算出最优路由写入 RIB。

更新触发与收敛过程

复制代码
拓扑变化(链路 down / 邻居失效 / 新网段)
   ↓
路由协议感知(OSPF SPF 重算 / BGP 更新)
   ↓
RIB 更新(增删改路由、下一跳变更、出接口变更)
   ↓
FIB 同步重算(最优路由下发、迭代下一跳)
   ↓
邻接表重建(若下一跳 MAC 未知则触发 ARP 解析)
   ↓
硬件转发表(ASIC/TCAM)更新 → 数据平面按新路径转发

几个重要机制

  • 路由迭代(递归查找):若路由的下一跳不是直连,需要迭代查到直连下一跳和出接口,才能确定 ARP 解析的范围。
  • ECMP(等价多路径):多条等价路由会在硬件表里生成多个表项,按流(五元组哈希)分担。
  • 快速收敛:高端三层交换机支持路由表→硬件表的"增量下发",部分场景配合 BFD 实现毫秒级故障检测与切换。
  • 路由与二层的联动:例如 VRRP 主备切换时,网关 MAC 会漂移到新主设备,通过免费 ARP 刷新全网 ARP,交换机同步更新邻接表,保证流量不中断。

五、完整案例:VLAN 间通信全流程

假设 PC-A(VLAN 10,192.168.10.2/24,网关 192.168.10.1)访问 PC-B(VLAN 20,192.168.20.2/24,网关 192.168.20.1):

  1. PC-A 判断跨网段 → 需要网关转发,先发 ARP 请求"谁是 192.168.10.1"。
  2. 交换机 SVI-10 应答 ARP(用 SVI-10 的 MAC),PC-A 学到网关 MAC。
  3. PC-A 发包 :目的 IP = 192.168.20.2,目的 MAC = SVI-10 的 MAC(注意目的 MAC 是网关,不是 PC-B)。
  4. 交换机收包:查目的 MAC 是自己 → 触发三层转发,查 FIB,命中直连路由(192.168.20.0/24 出接口 SVI-20)。
  5. ARP Miss:邻接表里没有 192.168.20.2 的 MAC → 上 CPU,从 SVI-20 发 ARP 请求。
  6. PC-B 应答 ARP,交换机学到 MAC,生成邻接表项(目的 MAC = PC-B MAC,源 MAC = SVI-20 MAC,出接口/VLAN 20)。
  7. 重写并转发:帧头源 MAC 改为 SVI-20 的 MAC,目的 MAC 改为 PC-B 的 MAC,TTL 减 1,重新计算校验和,从 VLAN 20 转发出去。
  8. 表项下发硬件 :后续 PC-A ↔ PC-B 的同流报文全部由 ASIC 硬件线速转发,CPU 不再参与(除非流表老化或拓扑变化)。

六、一句话总结三者关系

路由表(RIB)决定"往哪走"(下一跳 IP + 出接口),ARP 表提供"怎么封装"(下一跳 MAC),两者合成为 FIB + 邻接表下发给 ASIC,后续报文才能脱离 CPU、实现硬件线速三层转发。路由更新和 ARP 变化都会实时反向刷新硬件转发表。

相关推荐
笨鸟先飞的橘猫1 小时前
树结构在游戏行业中的应用
学习·游戏
yangmu32032 小时前
从显像管到Micro-LED:屏幕的光之进化
学习·显示器
半生过往3 小时前
前端工程师学习智能体开发(一)
前端·学习·状态模式
m4Rk_5 小时前
【论文阅读】Agent 记忆机制(67):MemPO——用记忆级信用分配训练 Agent 主动管理长程上下文
论文阅读·人工智能·学习·开源·github
下辈子不要当码农5 小时前
ARM学习(1)
学习·arm
東隅已逝,桑榆非晚5 小时前
vector(模拟实现)
c++·笔记·学习
鱼听禅6 小时前
C# 学习笔记-使用 类型化客户端搭建HTTP客户端服务
学习·http·c#·工厂方法模式
高亦真6 小时前
今天是学习嵌入式的第38天
linux·学习·算法
传奇开心果编程6 小时前
【Rust入门知识点学与练】第33课:异步编程入门(async/await)强化
开发语言·学习·rust