第34周:P4 可编程数据平面入门
目标:理解 P4 编程语言模型,能够编写 P4 程序实现自定义包处理,并使用 BMv2 模拟器运行验证。
1. P4 概述
1.1 P4 是什么
1 | P4(Programming Protocol-independent Packet Processors): |
1.2 P4 vs OpenFlow
1 | OpenFlow: |
1.3 P4 架构(v1model)
1 | ┌──────────────────────────────────────────┐ |
2. P4 语言基础
2.1 程序结构
1 | // basic.p4 — P4 程序的基本结构 |
2.2 数据类型
1 | // === 基础类型 === |
2.3 解析器详解
1 | parser MyParser(packet_in pkt, out headers hdr, inout metadata meta, |
2.4 Match-Action 详解
1 | control MyIngress(inout headers hdr, inout metadata meta, |
3. 搭建 BMv2 环境
3.1 安装
1 | # 方式 1:使用 Docker(推荐) |
3.2 安装 P4Runtime
1 | # P4Runtime shell |
3.3 验证安装
1 | simple_switch --help |
4. basic.p4 示例
4.1 完整代码
1 | // basic.p4 — 简单的 P4 程序:转发 IPv4 包 |
4.2 编译
1 | # 编译为 JSON(BMv2 目标) |
4.3 运行 BMv2
1 | # 启动 simple_switch |
4.4 下发流表
1 | # 通过 simple_switch_CLI |
4.5 测试
1 | # 准备发送包 |
5. 实践:P4 IPv4 路由器
1 | // router.p4 — 完整的 IPv4 路由器 |
1 | # 编译 |
6. P4Runtime
6.1 P4Runtime 概念
1 | P4Runtime = P4 程序的运行时 API |
6.2 Python 控制示例
1 | # p4runtime_client.py — 简单的 P4Runtime 客户端 |
7. 主流 P4 目标
1 | BMv2(Behavioral Model): |
8. 调试工具
8.1 simple_switch_CLI
1 | simple_switch_CLI --thrift-port 9090 |
8.2 抓包分析
1 | # 启动 BMv2 时开启日志 |
8.3 nanomsg 日志
1 | # 启动时输出 nanomsg |
9. 实践:编写和测试 P4 程序
9.1 实验环境
1 |
|
9.2 完整 P4 工具链
1 | # === 工具链命令 === |
10. 进阶主题
10.1 P4-14 vs P4-16
1 | P4-14(已废弃): |
10.2 PSA(Portable Switch Architecture)
1 | PSA = P4 标准架构(取代 v1model) |
10.3 性能调优
1 | // 表大小 |
10.4 P4 与 P4Runtime 集成
1 | # 安装 P4Runtime shell |
11. 主流 P4 工具/产品
| 工具/产品 | 用途 | 备注 |
|---|---|---|
| BMv2 | 软件模拟 | 学习首选 |
| P4C | 编译器 | p4lang/p4c |
| PI | P4Runtime 实现 | P4Runtime server |
| Stratum | SDN 操作系统 | ONF 项目 |
| ONOS | SDN 控制器 | 支持 P4 |
| Tofino | Barefoot ASIC | 6.5Tbps |
| SDE | Switch Development Env | Intel 配套 |
| Netronome | 智能网卡 | P4 编程 |
| Xilinx P4 | FPGA 目标 | 适合原型 |
12. 学习路径
1 | 入门路径: |
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/05/31/第34周:P4 可编程数据平面入门/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!