3. 网络虚拟化基础与卸载需求分析

在数据中心与云原生环境中,网络虚拟化把物理网络抽象成大量彼此隔离的虚拟网络,使租户可以自由定义地址空间、拓扑与策略,而不必关心底层交换机与网卡的物理连接。承载这些虚拟网络的关键技术就是 Overlay 隧道协议,其中 VXLAN、GENEVE 与 NVGRE 是最常见的三种。理解它们的封装格式、控制面差异以及 vSwitch/vRouter 的数据路径,是判断哪些功能可以卸载到 DPU、哪些必须留在主机侧的前提。

Overlay 协议:VXLAN、GENEVE 与 NVGRE

Overlay 的核心思想是"MAC in UDP/IP"或"L2 over L3":把原始的二层以太帧整体作为载荷,再套上一层外层 IP/UDP 头,通过底层三层网络转发。VXLAN 使用 UDP 目的端口 4789,外层头为 8 字节,包含 24 位 VNI(VXLAN Network Identifier),可支持约 1600 万个隔离网段,足以满足多租户需求。GENEVE 同样基于 UDP,但采用 TLV(Type-Length-Value)可变长选项,能携带更多元数据,例如安全组标签、流标识、策略上下文,因此被 OVN、部分云平台作为默认封装。NVGRE 则使用 GRE 协议(IP 协议号 47),以 24 位 TNI 标识租户,早期在 Hyper-V 环境中使用较多,但由于 GRE 对中间设备兼容性和 ECMP 哈希支持不如 UDP,如今部署比例已明显下降。

三者的共同点是:封装与解封装都需要计算校验和、查表、改写头部,这些操作在纯软件 vSwitch 中会消耗大量 CPU 周期。以 25Gbps 线速为例,若每个包都经过内核 OVS 的完整流水线,单核往往只能处理几 Gbps,因此把隧道封装/解封装卸载到具备硬件加速能力的 DPU 上,是提升吞吐、降低主机 CPU 占用的直接手段。

Overlay 封装结构与卸载路径 原始以太帧 内层 MAC + IP + Payload Overlay 封装后报文 外层 IP UDP/GRE VNI/TNI 内层帧 VXLAN: UDP 4789 | GENEVE: UDP 6081 | NVGRE: IP proto 47 DPU 硬件卸载边界 可卸载功能(DPU 硬件加速) 隧道封装 / 解封装 VXLAN/GENEVE/NVGRE 头部添加与剥离 校验和计算与验证 外层 IP/UDP 校验和、内层 TCP/UDP 校验和 VNI 查表与转发 基于 VNI 的隧道端点映射、ECMP 哈希 ACL / 安全组匹配 五元组匹配、连接跟踪、策略执行 典型收益:主机 CPU 占用下降 30%~60% 不可卸载 / 需主机参与 控制面协议 BGP EVPN、OVSDB、OpenFlow 控制器交互 复杂有状态服务 NAT 端口分配、负载均衡健康检查、防火墙会话 虚拟设备模拟 virtio-net 后端、vhost-user 协商 管理面与可观测性 流表统计、日志、告警、配置下发 典型策略:保留在主机或 DPU 控制核 分流

vSwitch 与 vRouter 模型

主机侧的虚拟交换通常由 Open vSwitch(OVS)实现,它既是 vSwitch 也是 vRouter:通过内部端口连接虚拟机、容器与物理网卡,通过隧道端口建立 Overlay 连接,通过流表实现转发、ACL、NAT 等功能。OVS 的数据路径分为内核态 datapath 与用户态 ovs-vswitchd,前者负责快速转发,后者负责慢路径与流表下发。当报文首次到达时,内核 datapath 未命中,会送到用户态查询 OpenFlow 流表,命中后把动作缓存回内核,后续同流报文直接在内核完成。这个"首包上送、后续缓存"的机制决定了:流表规模越大、首包越多,CPU 开销越高,而 DPU 卸载正是把这条路径整体下沉到硬件。

vRouter 则更强调三层转发与路由功能,常见于 NFV 场景,例如在主机内实现 VRF、动态路由、NAT 网关。它与 vSwitch 的边界并不绝对,OVS 也能做三层转发,但 vRouter 通常具备更完整的路由协议栈。理解这一模型有助于区分:哪些是纯转发面(适合卸载),哪些是控制面或复杂有状态处理(通常保留)。

OpenFlow 与 OVS 流水线

OVS 的转发逻辑由 OpenFlow 流表描述,典型流水线包括 ingress 处理、ACL 表、学习表、转发表、egress 处理等阶段。每个报文从 table 0 开始,按优先级匹配流表项,执行动作(output、drop、mod、resubmit 等),再跳转到下一张表。以 VXLAN 场景为例,一个简化流程是:table 0 识别隧道端口并解封装,table 10 做安全组匹配,table 20 查 MAC 学习表决定出端口,table 30 执行封装并输出到物理口。流表项数量、匹配字段宽度、动作复杂度直接决定软件转发性能。

在卸载设计中,需要把这条流水线映射到 DPU 的硬件表项。通常做法是:把高频、规则简单的流(如隧道封装、五元组 ACL、VNI 转发)编译为硬件表;把低频、复杂或需要上送控制器的流保留在软件慢路径。判断依据包括:匹配字段是否被硬件支持、动作是否可硬件实现、流表是否频繁变化、是否需要连接跟踪等。

可卸载与不可卸载功能的识别方法

识别过程可以按"数据面 vs 控制面""无状态 vs 有状态""高频 vs 低频"三个维度展开。隧道封装/解封装、校验和、VNI 查表、简单 ACL 属于典型可卸载项;BGP EVPN 路由学习、OVSDB 配置同步、OpenFlow 控制器交互属于控制面,通常不卸载;NAT 端口分配、负载均衡健康检查、防火墙会话属于有状态服务,是否卸载取决于硬件是否支持连接跟踪表;virtio-net 后端与 vhost-user 协商涉及主机与虚拟机的内存共享,一般保留在主机或 DPU 控制核。

判断一个功能能否卸载,最直接的方法是问三个问题:它是否只处理报文转发而不依赖外部协议交互?它的状态是否可以用有限表项表达?它的执行频率是否足够高,值得占用硬件资源?三个都满足,优先卸载;否则保留在软件路径。

卸载需求分析示例

假设某云平台单主机运行 40 个虚拟机,每台虚拟机平均产生 2Gbps 东西向流量,其中 70% 需要 VXLAN 封装。若全部由软件 OVS 处理,按每 Gbps 消耗约 1.5 个 CPU 核估算,仅隧道封装就需要约 84 个核,显然不可行。把 VXLAN 封装/解封装、校验和、VNI 转发卸载到 DPU 后,主机 CPU 仅需处理控制面与少量慢路径,预计可释放 60% 以上的计算资源。这个估算属于示例性假设,实际数值需以具体平台压测为准。

功能 数据面/控制面 状态性 建议
VXLAN/GENEVE 封装解封装 数据面 无状态 卸载到 DPU
外层校验和计算 数据面 无状态 卸载到 DPU
VNI 查表转发 数据面 有限状态 卸载到 DPU
五元组 ACL 数据面 无状态 卸载到 DPU
BGP EVPN 路由学习 控制面 有状态 保留主机/控制核
NAT 端口分配 数据面 有状态 视硬件能力而定
vhost-user 协商 控制面 有状态 保留主机