2026-06-12
今日主题
- WebAssembly 本质理解
- 云网关转发平面
- OVS 隧道抽象
- IPIP 与多租户
新增认知
WebAssembly 本质理解
-
WASM 是跨平台虚拟指令集:不是模拟器也不是解释器,而是一套抽象的二进制指令集(类似 JVM 字节码但更底层)。
浏览器加载 .wasm 后 JIT/AOT 编译成本地机器码直接执行,所以性能接近原生。核心价值是"一次编译,到处跑"的可移植二进制格式。 -
WASM 比 JVM 字节码更底层:JVM 指令集内置对象、类继承、虚方法、GC 引用等 Java 概念,假设运行时一定有托管堆。
WASM 只有 i32/i64/f32/f64 四种数值类型和一块线性内存,没有对象、没有 class、没有 GC。
高级概念全靠编译器在 4 个类型之上模拟(如指针变 i32 偏移、struct 变内存布局),因此不绑定任何特定语言,C/Rust/Go 都能编译过来。 -
WASM 运行时不止浏览器:独立运行时包括 Wasmtime(Rust,最成熟)、WasmEdge(C++,云原生)、WAMR(C,嵌入式);
JS 运行时 Node.js/Bun/Deno 内置支持;边缘计算 Cloudflare Workers/Fastly 也跑 WASM;
甚至 Envoy 用 WASM 写 filter 插件、Docker 实验性支持 WASM 替代容器。 -
ffmpeg.wasm 解决的核心矛盾:浏览器只认识 JS,但视频处理需要 FFmpeg(C 写的几十万行代码)。不用 WASM 只有两条路——
纯 JS 重写(性能差几个数量级)或上传服务端(失去离线能力)。WASM 是唯一能在浏览器沙箱里以接近原生性能跑 C/C++ 的方案,实现全部离线视频处理。 -
WASM 命名由来:Web + Assembly(汇编),意为"Web 上的汇编语言"。2013 年 Mozilla 从 asm.js 起步,
2015 年联合 Google/Microsoft/Apple 成立 W3C Community Group 正式定名,2017 年四家浏览器同步发布 MVP,
2019 年成为 W3C 推荐标准。后缀 .wasm 取 WebAssembly 关键音节拼成。
云网关转发平面
-
共享转发平面:大规模公网 SLB 或 vGateway 不适合按每个 VPC 创建独立 Linux vxlan device 与 bridge,
因为设备对象、FDB、namespace、路由表和控制面同步会随租户数量爆炸。更可扩展的做法是共享 datapath,
通过 VIP/后端/VPC/VNI/目标宿主机 VTEP 等表项决定每个包如何封装并送入 overlay。前置条件是讨论的是云厂商级多租户网关,
而不是小规模实验环境。 -
vGateway 是逻辑网关:vGateway 通常表示 virtual Gateway,即由共享物理资源池承载的虚拟网关能力。
用户看到的是 NAT、SLB、VPC Router、Transit Gateway 等逻辑资源,
底层可能由 x86 转发集群、智能网卡、交换芯片或自研 datapath 实现。关键理解是 v 前缀强调逻辑网络对象与物理承载解耦。
OVS 隧道抽象
-
key 映射 VNI:在 OVS 中 VXLAN 的 VNI 被抽象成通用 tunnel key/tun_id,
所以配置写 options:key=100 而不是 options:vni=100。
原因是 OVS 同一套 datapath 要描述 VXLAN、GRE、Geneve 等多种隧道;当端口类型是 vxlan 时,
key=100 最终会编码进 VXLAN header 的 VNI 字段。 -
flow 动态赋值:
options:key=flow 或 remote_ip=flow 表示 VNI 和远端 VTEP 不固定写死在 tunnel port 上,
而是由 OpenFlow 流表按包设置。这样一个共享 vxlan 端口可以承载多个 VNI 和多个远端 VTEP,避免为每个租户或 VPC 创建独立隧道设备。
前置条件是 datapath 有流表规则为每个包补齐 tunnel metadata。
IPIP 与多租户
- IPIP 缺少租户标识:IPIP 也是隧道,但它只是把 inner IP packet 外面再套一层 IP header,
没有 VXLAN VNI 这种 overlay 网络标识。因此它天然不适合承载允许地址重叠的多租户虚拟网络;若要多租户隔离,
需要额外依赖 VRF、network namespace、独立 endpoint IP 或路由表等外部上下文。