---
title: "专题串讲：可编程网元 — 从软件加速到硬件可编程"
type: series
nation: programmable-plane
created: "2026-08-20"
memory_coords: "2022-01 ~ 2022-02 · 34 篇笔记 · 原分类：2.7.1 可编程网络 / 2.7.4 DPU / 2.7.5 SDN-NFV"
---

# 专题串讲：可编程网元 — 从软件加速到硬件可编程

> **记忆坐标**：你于 2022-01 ~ 2022-02 集中学习过这个专题（34 篇）。
> 起点是 zartbot 的软硬融合博客（2021-12-31），爆发在 2022-02-10 的 P4 与 eBPF 系列。
> 这篇串讲把你当年散落在 3 个分类的笔记重新打散、按一条逻辑主线重组。

---

## 引言：一个命题

网卡从 10M 走到 100G，只用了二十年；而 CPU 处理一个报文所消耗的周期数，依然要经过几十层函数调用。

内核协议栈是为"通用性"设计的，不是为"每秒钟一百万次转发"设计的。于是网络世界分化出两条路：**绕过它**，或者**重新发明它**。可编程网元，就是后一条路上所有尝试的总和——eBPF、P4、Smart NIC、DPU。

本篇用你笔记里的 34 篇，讲清楚五件事：**压力从哪来 → 演进地图 → 软件路线(eBPF) → 硬件路线(P4) → 终点站(DPU)**。

---

## 第一章：压力从哪来 — 内核协议栈的瓶颈

你的笔记里，eBPF 那篇给出了最清晰的诊断：netfilter 框架有三大问题。

| 问题 | 表现 |
|------|------|
| **路径太长** | netfilter 挂在 L3，丢一个包也要先走完 L2 再进 IP 层，CPU 白耗 |
| **规则太多** | 规则像专家系统，从不合并优化；规则数 n 指数增长 |
| **O(N) 复杂度** | 极端情况下报文要遍历所有规则才被匹配 |

![netfilter 规则匹配的 O(N) 困境](2.开发大类-常用/2.7.网络云计算/2.7.5.sdn_nfv/XDPeBPF — eBPF/image_1.png)

结论很直接：**TCP/IP 栈为通用场景而生，不针对高性能转发**。100G 时代，大量报文堵在内核里。解法只有一个思路——**Bypass Kernel（绕过内核）**，两条路径：

- **Upload（用户态栈）**：DPDK/VPP、XDP/eBPF —— 把处理搬到用户态或内核前置点
- **Offload（智能网卡）**：FPGA、P4、Smart NIC —— 把处理搬到网卡上

> 这一章是你整个「数据面加速技术」大洲的起点，也是「可编程网元」专题的入口。

---

## 第二章：演进地图 — 七代转发 × 四阶可编程

你两篇 P4 笔记拼起来，是一张完整的演进地图。

### 2.1 转发架构的七代（《P4 可编程网元 — 数据面转发技术发展史》）

| 代际 | 架构 | 关键变化 |
|------|------|----------|
| 第一代 | 集中转发、总线交换 | 普通计算机 + 网卡 |
| 第二代 | 集中+分布、接口模块化 | 接口卡 Cache 路由表，降 CPU/总线负担 |
| 第三代 | 分布转发、总线交换 | 主控板算路由，业务板独立转发（路由转发分离） |
| 第四代 | ASIC 分布转发 | 流量指数增长，软件路由顶不住，硬件 ASIC 登场 |
| 第五代 | NP（网络协处理器） | 流水线 + 并行处理，24 倍于单核 CPU |
| 第六代 | SDN/NFV、DPDK/VPP | 软件定义、用户态转发 |
| 第七代 | **P4、SmartNIC** | 数据面本身可编程 |

![数据面转发技术发展史](2.开发大类-常用/2.7.网络云计算/2.7.5.sdn_nfv/P4 可编程网元 — 数据面转发技术发展史/image_1.png)

### 2.2 可编程能力的四阶（《P4 可编程网元 — 全可编程网元的发展》）

同一张地图还有第二个维度——**可编程到什么程度**：

```
转发/控制合一 → 可配置（软件定义网管）→ 控制面可编程（OpenFlow SDN）→ 全可编程（P4 硬件 / 软件方案）
```

- **可配置网元**：开放 SNMP/NETCONF/CLI 接口，内部是黑盒 —— SDN"演进派"（IETF 大本营）
- **控制面可编程**：OpenFlow 集中下发表项，控制面可编程但数据面仍受 ASIC 约束 —— SDN"革命派"（ONF 大本营，ONOS/ODL）
- **数据面可编程**：可编程交换芯片 + P4，转发逻辑可按业务动态改 —— P4 Runtime 代理（如 Stratum）
- **全可编程（软件）**：DPDK/VPP、eBPF/XDP —— 性能弱于硬件，但无需新芯片

![全可编程网元的演进](2.开发大类-常用/2.7.网络云计算/2.7.5.sdn_nfv/P4 可编程网元 — 全可编程网元的发展/image_6.png)

> 一句话记住：**控制面先软，数据面后软，最后数据面也硬生生可编程了。**

---

## 第三章：软件路线 — eBPF 深度

你的 eBPF 笔记是"六件套"式教科书（结构完整、可作索引）。

### 3.1 定位

- 2014 年 Alexei Starovoitov 实现，Kernel 3.18 起。原 BPF 称 cBPF，现已废弃
- eBPF 从"包过滤语言"升格为**内核顶级子系统**，可观测、安全、网络三用
- 与 cBPF 核心差异：**Map 机制**（内核/用户态共享 K-V 存储）、复杂指令集、LLVM/Clang 编译、安全校验

### 3.2 六件套（整体设计）

| 组件 | 职责 |
|------|------|
| **JIT Compiler** | C → BPF bytecode → 平台指令集，动态加载/卸载 |
| **Verifier** | 加载前安全检查：循环、越界、不可达指令 → 拒绝即沙箱 |
| **Maps** | K/V Store：用户态↔内核态通信、配置、状态共享（Hash/Array/LRU/RingBuf/LPM） |
| **Helpers** | 内核辅助函数：socket、栈、系统调用参数、时间、转发 |
| **Hooks** | 挂载点：kprobes/uprobes、tracepoints、tc/XDP、socket、拥塞算法 |
| **Tail/Function Calls** | 程序拆分组合、可复用、减小体积 |

![eBPF 整体设计](2.开发大类-常用/2.7.网络云计算/2.7.5.sdn_nfv/XDPeBPF — eBPF/image_5.png)

### 3.3 eBPF 与 DPDK 的定位差（你的笔记里隐含着这条线）

| | eBPF/XDP | DPDK |
|--|----------|------|
| 位置 | 内核（XDP 在网卡驱动旁） | 用户态 |
| 安全 | Verifier 沙箱，无内核崩溃风险 | 直接接管网卡，风险自担 |
| 编程 | C/LLVM，生态现代 | C，传统 |
| 场景 | 观测、过滤、负载均衡、DDoS 防护 | 极致转发、构建转发面 |
| 你的学习时间 | 2022-02（紧随 DPDK 之后） | 2021-08 ~ 2023-05 |

> 你当年是先啃完 DPDK（2021 下半年），再学 eBPF 的——eBPF 笔记里的对照视角，正是 DPDK 铺垫的。

---

## 第四章：硬件路线 — P4 与可编程交换机

P4（Programming Protocol-independent Packet Processors）解决一个痛点：ASIC 固定转发流水线，改业务要等新芯片。

- **Match-Action-Unit（MAU）**：匹配 + 动作的可编程流水线，取代固定 ASIC 逻辑
- **P4 Runtime**：控制面（如 ONOS/ODL）通过 gRPC 与设备侧代理（如 Stratum）交互，**动态切换转发逻辑**
- 可编程数据面硬件出现后，"软件定义网元"从控制面下沉到数据面

![P4 Runtime 数据面编程](2.开发大类-常用/2.7.网络云计算/2.7.5.sdn_nfv/P4 可编程网元 — 全可编程网元的发展/image_2.png)

你的笔记还记录了 P4 家族的争议观点（zartbot 篇）：**SRv6 开销太大，数据面该走源路由但别用 SRv6**——这类观点性笔记，串讲时标注为"作者立场"，留待对照。

---

## 第五章：终点站 — DPU 与数据中心税

### 5.1 为什么要有 DPU

- **数据中心税**：大型数据中心约 **30% 的计算在作流量处理**（Fungible/AWS 统计）
- 根源在**内存墙**：CPU↔Memory 带宽成为瓶颈（冯诺依曼缺陷），计算应该"发生在最靠近数据的地方"
- 解法谱系：Offload Computing → In-Network-Computing → In-Memory-Computing → In-Storage-Computing

![数据中心五大问题](2.开发大类-常用/2.7.网络云计算/2.7.5.sdn_nfv/计算机组成原理 — DPU 网络协处理器/image_9.png)

### 5.2 三大流派（《再谈DPU》的批判视角）

| 流派 | 代表 | 思路 | 作者的批评 |
|------|------|------|-----------|
| 网络派 | Pensando | 从交换机延伸到主机，P4 占大量片上资源 | "做交换的爷爷，不是做路由器的，很多东西不懂" |
| 数据派 | Fungible | DataCluster + 片上网络，想站 C 位 | "忘了 DPU 本来就是打援的角色" |
| 通用 C 派 | QuantumFlow（作者 2004 年设计） | 通用 C 编程 + 完整 stack，40 核 24Mpps | 真正的标杆 |

作者的金句值得划重点：**"不碰内存的 DPU 都是扯淡"** —— 所有卸载（hash/加解密/压缩）都在搬运数据，不解决内存墙就只是噱头。

> **校准提示**：《再谈DPU》是强烈个人观点 + 商业吐槽文，论证多靠断言，但"内存墙是核心矛盾"的判断与其他笔记（数据中心税、冯诺依曼缺陷）相互印证，可信度较高。

---

## 第六章：对照与边界 — 什么时候用哪个

### 6.1 四选一决策表

| 需求 | 首选 | 理由 |
|------|------|------|
| 可观测、过滤、安全、负载均衡 | eBPF/XDP | 安全沙箱、内核原生、生态现代 |
| 极致转发吞吐、构建转发面 | DPDK/VPP | 用户态全接管、社区成熟 |
| 交换机数据面按业务重编程 | P4 | 硬件级可编程、协议无关 |
| 数据中心通用卸载（网络+存储+安全） | DPU | 把 30% 流量税从 CPU 挪走 |
| 预算有限、场景单一 | 先别买 | 卸载经济性差时不如优化软件路径 |

### 6.2 边界（你笔记里被点破的坑）

- DPU 不是万能药：卸载器大量浪费内存带宽，还会造成 CPU Stall
- 可 Offload 经济性高的只有：加密压缩、AI 推理
- 智能网卡缺的不是硬件，是"杀手锏应用"和"买单的人"
- 炒作识别法：**不提内存的 DPU 方案，直接降权**

---

## 尾声：一条主线记住它

```
内核太通用（netfilter O(N)）
   → Bypass Kernel（Upload: DPDK/eBPF | Offload: Smart NIC/P4）
   → 数据面可编程（P4 让硬件可编程）
   → 以数据为中心（DPU 治内存墙与数据中心税）
```

三个关键词：**Bypass → 可编程 → 以数据为中心**。这就是你 2022 年初那两周，从 DPDK 走向 DPU 的完整心路。

---

## 附：复习锚点（你的时间线）

| 时间 | 事件 | 来源笔记 |
|------|------|----------|
| 2021-12-31 | 软硬融合系列起点：Openflow → P4-DSA | 2.7.2.软硬融合 |
| 2022-01-24 | SRv6、DPU 深度讨论（zartbot） | 2.7.1.可编程网络 / 2.7.4.dpu |
| 2022-02-10 | P4 双篇 + eBPF 六件套（集中导入日） | 2.7.5.sdn_nfv |

> 复习建议：隔两周回看第三章六件套表，隔月重读《再谈DPU》的批判框架（比知识更值钱的是判断力）。

---

## 关联页面

- [[世界地图]]：`world/world-map.md`（本专题属「网络与数据面」大洲）
- 相邻国家：[[数据面加速技术]]（DPDK）、[[Linux 内核协议栈]]（对照）、[[硬件与算力]]
- 原始笔记：`2.开发大类-常用/2.7.网络云计算/2.7.1.可编程网络/`、`2.7.4.dpu/`、`2.7.5.sdn_nfv/`
