3. VLAN与隧道报文处理
在数据中心交换芯片中,VLAN 与隧道处理是报文进入流水线后最先被“改写身份”的环节。理解这一环节,关键不是记住某个命令,而是看清芯片内部对报文的标签栈做了什么:哪些字段被读取、哪些被压入或弹出、查表键值如何构造、封装头如何生成。本节围绕 VLAN 标签操作、QinQ、VXLAN/Geneve 隧道终结与发起、隧道表项查找以及封装解封装流程展开,并结合典型 Overlay 场景说明其工程含义。
一、VLAN 标签操作:从“识别”到“改写”
交换芯片对 VLAN 的处理通常分为识别、决策和改写三个阶段。识别阶段,入端口根据端口配置判断报文是 Untagged、Priority-Tagged 还是 Tagged,并确定其所属的 VLAN 或端口默认 VLAN。决策阶段,芯片用 VLAN、目的 MAC、入端口等字段查 MAC 表或 VLAN 表,得到出端口和出方向标签动作。改写阶段,芯片按动作对标签栈执行 push、pop、swap 或保留。
常见的标签动作可归纳为:
- Push:在报文最外层插入一个 802.1Q 标签,常用于接入端口向汇聚/核心转发时打上业务 VLAN。
- Pop:剥离最外层标签,常用于向终端或 Untagged 端口转发。
- Swap:替换最外层标签的 VID,常用于 VLAN 转换或跨域映射。
- Keep:保持标签不变,直接透传。
需要特别注意的是,芯片内部通常以“标签栈”形式维护报文头,动作作用于栈顶或指定层。若报文本身已带标签,再执行 Push 会形成双层标签,这正是 QinQ 的基础。
二、QinQ:双层标签与业务隔离
QinQ 在原有 802.1Q 标签外再压入一层外层标签(S-VLAN),内层标签(C-VLAN)由用户或接入设备携带。其价值在于:运营商或数据中心可用 S-VLAN 区分不同租户或不同接入点,而 C-VLAN 在租户内部保持独立,从而实现大规模二层隔离。
在芯片实现上,QinQ 通常有两种模式:
- 基本 QinQ:入端口对 Untagged 或单标签报文统一压入指定 S-VLAN,内层标签保留。
- 灵活 QinQ:根据内层 C-VLAN、入端口或流分类结果,映射到不同的 S-VLAN,支持更细粒度策略。
例如,某接入端口配置 S-VLAN 100,收到 C-VLAN 10 的报文后,芯片在栈顶压入 100,形成 S=100, C=10 的双层标签。出方向若为 Trunk 口则透传;若为 Untagged 口,则需按策略弹出外层甚至内层标签。这里的关键判断依据是出端口的链路类型与标签操作表项,而不是简单“有标签就剥”。
三、VXLAN/Geneve 隧道终结与发起
Overlay 场景中,VLAN 解决的是本地二层隔离,而 VXLAN/Geneve 解决的是跨三层网络的二层扩展。VXLAN 将原始二层帧封装在 UDP 中,外层 IP 头用于三层转发,VNI 标识租户或虚拟网络。Geneve 结构类似,但头部可选字段更灵活,常用于云平台策略携带。
隧道终结(Decapsulation)发生在报文从隧道进入本地网络时:芯片识别外层 UDP 目的端口(VXLAN 默认 4789,Geneve 默认 6081),解析外层 IP、UDP、VXLAN/Geneve 头,取出 VNI,剥离外层封装,恢复内层原始帧,再根据内层目的 MAC 和 VNI 查本地表项转发。隧道发起(Encapsulation)则相反:本地帧经桥接或路由后,需要进入隧道时,芯片根据目的地址查隧道表,得到外层源/目的 IP、源/目的 UDP 端口、VNI 等参数,构造外层头并封装发送。
四、隧道表项查找与封装解封装流程
隧道处理的核心是“查表”。终结方向,芯片用外层目的 IP、VNI、UDP 目的端口等作为键,查隧道终结表,得到对应的本地 VNI 映射、内层转发域以及是否需要进行标签操作。发起方向,芯片用内层目的 MAC、VLAN 或 VNI 查隧道映射表,得到外层封装参数。若查不到表项,通常按配置丢弃或送 CPU 处理。
下面这张图给出了一次典型的 VXLAN 报文在交换芯片中的处理路径,重点表现“外层解析—VNI 查表—内层恢复—本地转发”与反向“本地查表—封装—外层转发”的对称关系。
五、典型数据中心 Overlay 场景
以一个典型 Spine-Leaf 架构为例:Leaf 交换机作为 VTEP,连接物理服务器;服务器发出的原始帧带 C-VLAN 10,进入 Leaf 后,芯片查隧道映射表,得到目的 VTEP 的 IP 和 VNI 5000,封装为 VXLAN 报文,经 Spine 三层转发到达对端 Leaf。对端 Leaf 收到后,解析外层头,用 VNI 5000 查隧道终结表,剥离封装,恢复 C-VLAN 10 的原始帧,再按内层目的 MAC 转发给目标服务器。
在这个过程中,VLAN 与隧道是协同关系而非替代关系:VLAN 负责本地接入侧的隔离与标识,VNI 负责跨三层网络的租户隔离。芯片需要在同一流水线中完成“内层 VLAN 识别—隧道查表—外层封装”或“外层解析—VNI 查表—内层 VLAN 恢复”的连续动作。若中间任一表项缺失或键值不匹配,报文就会被丢弃或上送控制面,因此工程上必须保证 VNI、VTEP 地址、UDP 端口和本地 VLAN 映射的一致性。
总结来看,VLAN 与隧道报文处理的核心是“标签栈操作 + 表项查找 + 封装解封装”三件事。芯片并不理解业务语义,它只按表项和动作执行。工程人员的任务,就是让这些表项与动作在终结和发起两个方向上保持对称、一致、可验证。