Files
dpdk-blog/roadmap.md
T
newbie 41531c19c2 init: DPDK → DPU learning blog (VitePress)
- VitePress static site for rendering all markdown documents
- Auto-discovers .md files from dpdk-roadmap-v3 and dpdk-study-kb
- Features: full-text search, dark mode, responsive design
- Pages: roadmap, notes (Phase 0-3), product docs, knowledge base
2026-08-09 15:42:47 +00:00

3164 lines
121 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# DPDK 全景路线 v3 — 18 个月日级学习与发展规划
> **版本**: v3 (升级自 `~/myshare/DPDK_DPU_GROWTH_PLAN.md` v2)
> **起算日**: 2026-06-29 (周一) = Day 1
> **截止日**: 2027-12-27 (周一) = Day 546
> **目标定位**: 18 个月内同时具备「大厂网络/DPU 厂商/晋升专家/开源品牌」四个出口能力
> **投入强度**: 工作日 2-3h + 周末 6-8h,约 25-30h/周,总投入 ~2000h
> **作者**: SONiC / SAI / DPDK 开发者
> **最后更新**: 2026-06-29
---
## 📜 目录
- [一、规划总览](#一规划总览)
- [二、当前能力盘点](#二当前能力盘点)
- [三、六阶段主线](#三六阶段主线)
- [四、日任务格式约定](#四日任务格式约定)
- [四点五、Linux 内核对照学习策略(横切式)](#四点五linux-内核对照学习策略横切式)
- [五、留白与节假日策略](#五留白与节假日策略)
- [六、出口与简历卖点映射](#六出口与简历卖点映射)
- [七、推荐资料总表](#七推荐资料总表)
- [P1 · M1-M3 · DPDK 内功 + 用户态协议栈](#p1--dpdk-内功--用户态协议栈-m1-m3)
- [P2 · M4-M6 · SONiC×DPDK 融合](#p2--sonicdpdk-融合-m4-m6)
- [P3 · M7-M9 · vSwitch / 云网关数据面](#p3--vswitch--云网关数据面-m7-m9)
- [P4 · M10-M12 · 网络安全数据面](#p4--网络安全数据面-m10-m12)
- [P5 · M13-M15 · DPU 数据面架构](#p5--dpu-数据面架构-m13-m15)
- [P6 · M16-M18 · 作品收口 + 出口](#p6--作品收口--出口-m16-m18)
- [附录 A · 项目仓库结构建议](#附录-a--项目仓库结构建议)
- [附录 B · 性能基线参考](#附录-b--性能基线参考)
- [附录 C · 周/月复盘模板](#附录-c--周月复盘模板)
---
## 一、规划总览
### 1.1 一句话目标
> **18 个月后**,我能够同时回答这三个问题:
> 1. 给我一张 100Gbps 网卡,我能写出**单核线速**的用户态数据面
> 2. 给我一颗 DPU/SmartNIC,我能设计它的**数据面架构**
> 3. 给我一套 SONiC,我能让它跑在**纯 DPDK 软件转发**上
### 1.2 路径设计逻辑
```
┌─────────────────────────────────────────────────────────────┐
│ P1 内功 (M1-3) │
│ └─ mempool/ring/PMD/NUMA + 用户态协议栈 │
│ ↓ │
│ P2 SONiC×DPDK (M4-6) │
│ └─ sonic-vs → SAI-DPDK 最小适配器 │
│ ↓ │
│ P3 vSwitch (M7-9) │
│ └─ OVS-DPDK + VPP + 自研 LB │
│ ↓ │
│ P4 安全数据面 (M10-12) │
│ └─ Suricata-DPDK + DDoS 清洗 │
│ ↓ │
│ P5 DPU 架构 (M13-15) │
│ └─ PCIe + vDPA + rte_flow offload │
│ ↓ │
│ P6 收口 (M16-18) │
│ └─ 开源 + 简历 + 答辩 + 面试 │
└─────────────────────────────────────────────────────────────┘
```
### 1.3 核心约束
- **不超纲**:每天任务不超过 3.5h(工作日)/ 8h(周末),超出即拆分到次日
- **可观测**:每天必须有一个产出物(代码 / 笔记 / 数据 / 图)
- **可中断**:每周第 7 天为复盘缓冲日,允许欠债结清
- **可演进**:每月最后一天为月度复盘日,可调整下月节奏
---
## 二、当前能力盘点
| 维度 | 现状 | 备注 |
|---|---|---|
| DPDK API | 中级,能写应用 | `dpdk-ws-client`、`dperf` 改造 |
| 用户态协议栈 | 中级 | `libmtcp` 多版本迭代中 |
| SONiC 架构 | 入门-中级 | 看过 OrchAgent / syncd / APPL_DB |
| SAI | 入门-中级 | 读过头文件,未写过适配器 |
| Linux 内核网络 | 入门 | 有书在读 |
| PCIe | 入门 | 概念知道,未亲手解码 BAR |
| ASIC / SDK | 入门 | T140 / X540 用过 |
| Go / 工程化 | 中级 | go1.21 + 服务端经验 |
| 学历 | 专升本在读 | 不构成阻塞 |
**核心资产(已有项目)**:
- `~/projects/dpdk-ws-client` — WebSocket over DPDK 客户端
- `~/myshare/libmtcp-*` — mTCP 改造分支
- `~/myshare/dperf-main` — 性能压测工具
- `~/myshare/dpu_dev` — PCIe / DPU 学习目录
- `~/myshare/dpdk-stable-24.11.6` — 主 DPDK 源码树
---
## 三、六阶段主线
| # | 阶段 | 月份 | Day 区间 | 主题 | 核心交付 |
|---|---|---|---|---|---|
| P1 | DPDK 内功 + 协议栈 | M1-M3 | Day 1-91 | mempool/ring/PMD 源码 + libmtcp 升级 | 单核 100Gbps echo + 性能报告 |
| P2 | SONiC×DPDK | M4-M6 | Day 92-182 | sonic-vs + SAI-DPDK 适配器 | 15 个 SAI API 跑通 L2/L3/ACL |
| P3 | vSwitch / 云网关 | M7-M9 | Day 183-273 | OVS-DPDK + VPP + 自研 LB | VPP plugin + LB 4-tuple hash |
| P4 | 安全数据面 | M10-M12 | Day 274-364 | Suricata-DPDK + DDoS 清洗 | 抗 5Mpps SYN flood |
| P5 | DPU 数据面 | M13-M15 | Day 365-455 | PCIe + vDPA + rte_flow offload | DPU 架构设计文档 |
| P6 | 收口 + 出口 | M16-M18 | Day 456-546 | 开源 + 简历 + 面试 | 简历 + 1 个高质量开源项目 |
---
## 四、日任务格式约定
每天的任务条目格式**严格统一**,方便 grep / 勾选 / 复盘:
```markdown
- [ ] **Day NNN (YYYY-MM-DD, 周X)** · 主题: <主题短句>
- 📖 学习: <读什么> (Xmin)
- 🔧 动手: <做什么> (Xmin)
- 📤 产出: <文件路径或结论>
```
**符号约定**:
- 📖 = 读源码 / 读书 / 看视频
- 🔧 = 写代码 / 跑实验 / 抓数据
- 📤 = 产出物(代码 commit / 笔记 / 图表 / 数据)
- 🎯 = 周/月里程碑
- ☕ = 复盘 / 缓冲 / 休息
- 🐧 = Linux 内核对照学习(与当周 DPDK 主题相互印证)
---
## 四点五、Linux 内核对照学习策略(横切式)
> **原则**: DPDK 工程师不懂 Linux 内核网络栈 = 只会调 API 的人。
> v3 把内核学习**横切**进每个阶段,与 DPDK 主题成对照关系——学 DPDK PMD 时对照内核 ixgbe 驱动,学 SAI host_if 时对照内核 netlink,学 PCIe 时对照内核 `drivers/pci/`。
### 4.5.1 时间分配
| 时段 | 内核学习方式 | 时长/周 |
|---|---|---|
| 工作日(周二/周三 注入子任务)| 🐧 子任务,30min × ~2 天 | ~1h |
| 周日复盘日下半场 | 集中读源码 + 写对照笔记 | 1-2h |
| **合计** | | **~2-3h / 周** |
| 18 个月总投入 | 78 周 × 2.5h | **~195h** |
### 4.5.2 学习地图(7 大模块,覆盖 P1-P5)
| 模块 | 子主题 | 主要文件 | 对应阶段 |
|---|---|---|---|
| K1. packet path | skb / 软中断 / napi / rcu | `net/core/dev.c`, `net/ipv4/` | P1 |
| K2. NIC 驱动 | net_device, ndo_*, XDP, AF_XDP | `drivers/net/ethernet/intel/ixgbe/` | P1 |
| K3. TCP/IP 栈 | tcp_v4_rcv, 状态机, cubic/bbr | `net/ipv4/tcp_*.c` | P1 |
| K4. netlink | rtnetlink, genetlink | `net/netlink/`, `net/core/rtnetlink.c` | P2 |
| K5. tc / nftables / flow_offload | qdisc, flower, hw offload | `net/sched/`, `net/netfilter/` | P3-P4 |
| K6. 虚拟网络设备 | tun/tap, veth, bridge, macvlan | `drivers/net/{tun,veth}.c`, `net/bridge/` | P3 |
| K7. PCI / IOMMU / VFIO | pci_driver, msi, vfio | `drivers/pci/`, `drivers/vfio/` | P5 |
### 4.5.3 推荐资料
- 📚 《Linux 内核网络协议栈从入门到精通》(你已有)
- 📚 《深入理解 Linux 网络》—— 张彦飞
- 📚 《Understanding Linux Network Internals》(O'Reilly)
- 📂 内核源码:`linux-stable` (建议 v6.6 LTS)
- 🎥 LWN.net 网络栈专栏
- 📝 论文:The Design and Implementation of Open vSwitch (NSDI'15) 对照内核 datapath
### 4.5.4 阶段对应表
| 阶段 | 内核重点 |
|---|---|
| P1 (M1-3) | K1 packet path + K2 NIC 驱动 + K3 TCP/IP 栈(核心,对照 DPDK PMD/libmtcp) |
| P2 (M4-6) | K4 netlink(对照 SONiC host_if / sairedis 通知)|
| P3 (M7-9) | K5 tc/flow_offload + K6 虚拟设备(对照 OVS-DPDK / VPP)|
| P4 (M10-12) | K5 nftables + conntrack(对照 DDoS 清洗)|
| P5 (M13-15) | K7 PCI/VFIO + virtio-net 驱动(对照 vDPA / DPU 数据面)|
| P6 (M16-18) | 综合复盘 + 简历面试中讲对照 |
### 4.5.5 注入位置
P1-P5 详细日计划中,每周选 1-2 天在原任务下注入一行 🐧 子任务(30min),格式:
```markdown
- 🐧 内核对照: <内核侧主题> 读 `<内核源码路径>` (30min)
```
阶段开头也会列出"本阶段内核对照清单"。
---
## 五、留白与节假日策略
### 5.1 每周节奏(7 天循环)
| 周几 | 类型 | 时长 |
|---|---|---|
| 周一 | 新主题启动 | 2-3h |
| 周二 | 主题深入 | 2-3h |
| 周三 | 主题深入 | 2-3h |
| 周四 | 整合实验 | 2-3h |
| 周五 | 整合实验 | 2-3h |
| 周六 | 大块动手 / 项目推进 | 6-8h |
| 周日 | ☕ 复盘 + 笔记整理 + 欠债补做 | 2-4h |
### 5.2 月度节奏
- 每月最后一天 = ☕ 月度复盘日(不安排新内容)
- 每月第一个周日 = 调整下月节奏
### 5.3 法定假期空窗(不安排任务)
| 假期 | 日期范围 | Day 区间 |
|---|---|---|
| 国庆 2026 | 10.01-10.07 | Day 95-101 |
| 元旦 2027 | 01.01-01.03 | Day 187-189 |
| 春节 2027 | 02.06-02.12 | Day 223-229 |
| 清明 2027 | 04.03-04.05 | Day 279-281 |
| 五一 2027 | 05.01-05.05 | Day 307-311 |
| 端午 2027 | 06.09-06.11 | Day 346-348 |
| 国庆 2027 | 10.01-10.07 | Day 460-466 |
假期空窗用途:补做欠债 / 长项目冲刺 / 休息。文档中这些 Day 留空 + 标注 ☕ 。
---
## 六、出口与简历卖点映射
| 出口 | 关键阶段 | 简历卖点 | 推荐时机 |
|---|---|---|---|
| 一线大厂网络团队(阿里云/腾讯云/字节/华为 2012) | P1+P3+P5 | "单核 100Gbps 用户态协议栈"、"自研 vSwitch plugin"、"DPU 架构设计" | M15 末投递 |
| DPU 厂商(云豹/中科驭数/Pensando) | P5 主 + P2 副 | "SAI-DPDK 适配器"、"rte_flow offload 验证"、"BlueField vDPA 调研" | M15 末投递 |
| 现公司晋升技术专家 | P2+P4 | "SONiC×DPDK 融合落地"、"DDoS 清洗 5Mpps" | M12 末申报 |
| 开源 / 个人品牌 | 全程 | GitHub libmtcp-v3 + sai-dpdk-mini + 技术博客 | M18 |
---
## 七、推荐资料总表
### 7.1 书籍
| 书 | 阶段 | 用途 |
|---|---|---|
| 《DPDK 应用开发实战》 | P1 | API 速通 |
| 《深入浅出 DPDK》 | P1-P3 | 原理理解 |
| 《Linux 内核网络协议栈从入门到精通》 | P1 | 内核对照 |
| 《计算机系统结构量化研究方法》 | P5 | DPU 架构 |
| 《PCI Express 体系结构导读》 | P5 | PCIe 必读 |
| 《SONiC 架构与实现》 | P2 | SONiC 入门 |
### 7.2 源码
| 仓库 | 阶段 |
|---|---|
| dpdk-stable-24.11.6 | 全程 |
| sonic-buildimage / sonic-swss / sonic-sairedis | P2 |
| openvswitch-3.x | P3 |
| vpp-master | P3 |
| suricata-master | P4 |
| f-stack / mtcp | P1 |
### 7.3 论文
- mTCP (NSDI'14)
- IX (OSDI'14)
- Snap (SOSP'19) — Google DPDK-like 框架
- AccelNet (NSDI'18) — Azure SmartNIC
- BlueField DPU Architecture Guide (NVIDIA)
---
# P1 · DPDK 内功 + 用户态协议栈 (M1-M3)
> **Day 1-91**, 2026-06-29 ~ 2026-09-27
> **核心目标**: 把 DPDK 的 mempool / ring / mbuf / PMD / NUMA / lcore 调度吃到骨头里,并把你的 `libmtcp` 升级为 v3(单核 100Gbps echo 线速)
## P1.0 阶段目标
1. 读完 DPDK 五大子系统源码并产出笔记:mempool / ring / mbuf / ethdev / eal
2. `libmtcp` 升级到 v3:支持多 RSS 队列 + 零拷贝 + 单核线速 echo
3. 性能 profile 报告:火焰图 + perf top + IPC 数据
4. 产出 5 篇深度笔记(每篇 3000 字+)
## P1.1 关键交付物
- [ ] `notes/P1/` 下 13 周笔记(每周 1 篇 + 总结 1 篇)
- [ ] `libmtcp-v3` 仓库可运行 + benchmark 数据
- [ ] `flamegraph/P1-final.svg` 性能火焰图
- [ ] `perf-data/P1-100G-echo.md` 性能数据表
## P1.2 推荐资料
- 📚 《深入浅出 DPDK》Ch.3-7
- 📂 `dpdk-stable-24.11.6/lib/{mempool,ring,mbuf,ethdev,eal}/`
- 🎥 DPDK Summit 历年 Talk(YouTube)
- 📝 mTCP NSDI'14 论文
## P1.2.5 🐧 本阶段内核对照清单(K1+K2+K3)
| 周 | 对照主题 | 内核源码路径 |
|---|---|---|
| W1 | 内核启动 + 模块加载 | `init/main.c`, `kernel/module.c` |
| W2 | slab / kmem_cache (对照 DPDK mempool) | `mm/slab.c`, `mm/slub.c` |
| W3 | 内核无锁 — RCU + atomic (对照 DPDK ring) | `kernel/rcu/`, `include/linux/rculist.h` |
| W4 | skb_buff 结构 (对照 DPDK mbuf) | `include/linux/skbuff.h`, `net/core/skbuff.c` |
| W5 | 内核 ixgbe 驱动 (对照 DPDK ixgbe PMD) | `drivers/net/ethernet/intel/ixgbe/ixgbe_main.c` |
| W6 | NUMA + 进程调度 | `mm/mempolicy.c`, `kernel/sched/` |
| W7 | RPS/RFS + napi (对照 DPDK RSS) | `net/core/dev.c::netif_receive_skb` |
| W8 | 内核 TCP 协议栈总览 (对照 mTCP) | `net/ipv4/tcp.c`, `tcp_input.c` |
| W9 | 内核 socket 层 | `net/socket.c`, `net/ipv4/af_inet.c` |
| W10 | 内核 RX 路径全链路 | `napi_poll → netif_receive_skb → tcp_v4_rcv` |
| W11 | 内核 TX 路径 + qdisc | `__dev_queue_xmit → qdisc → ndo_start_xmit` |
| W12 | XDP / AF_XDP (DPDK 替代品对照) | `net/core/filter.c`, `net/xdp/` |
| W13 | 总结:DPDK vs Kernel 全景对照表 | — |
## P1.3 周计划总览 (W1-W13)
| 周 | Day | 主题 | 里程碑 |
|---|---|---|---|
| W1 | 1-7 | DPDK 环境 + EAL 启动流程 | hello_world 改造 |
| W2 | 8-14 | mempool 源码 + cache 机制 | mempool benchmark |
| W3 | 15-21 | ring 源码 + 无锁队列 | ring 压测 |
| W4 | 22-28 | mbuf 源码 + 零拷贝 | mbuf 操作笔记 |
| W5 | 29-35 | PMD 框架 + ixgbe/i40e | PMD 阅读笔记 |
| W6 | 36-42 | NUMA + lcore 调度 | NUMA 性能对比 |
| W7 | 43-49 | RSS + Flow Director | 多队列 echo |
| W8 | 50-56 | mTCP 源码精读 | mTCP 跑通 |
| W9 | 57-63 | libmtcp v3 设计 | 设计文档 |
| W10 | 64-70 | libmtcp v3 实现 (1) | RX/TX 路径 |
| W11 | 71-77 | libmtcp v3 实现 (2) | 协议栈核心 |
| W12 | 78-84 | 性能调优 + 火焰图 | 100G 线速 |
| W13 | 85-91 | P1 总结 + 文档 | 阶段答辩 |
## P1.4 详细日计划
### Week 1 (Day 1-7) · DPDK 环境 + EAL 启动流程
- [ ] **Day 001 (2026-06-29, 周一)** · 主题: 环境校验 + 编译 DPDK 24.11
- 📖 学习: 通读 `dpdk.org/doc/guides/linux_gsg/` (60min)
- 🔧 动手: 用 meson 重新编译 `~/myshare/dpdk-stable-24.11.6` 并跑 testpmd (90min)
- 📤 产出: `notes/P1/W1-D1-env-setup.md` 包含编译命令、hugepage 配置、网卡绑定步骤
- [ ] **Day 002 (2026-06-30, 周二)** · 主题: hugepage / IOMMU / VFIO
- 📖 学习: hugepage 原理 + VFIO vs UIO 对比 (60min)
- 🔧 动手: 在本机配置 1G hugepage × 8,验证 `/proc/meminfo` (90min)
- 🐧 内核对照: 读 `arch/x86/mm/hugetlbpage.c` 大页分配路径 (30min)
- 📤 产出: `notes/P1/W1-D2-hugepage-vfio.md`
- [ ] **Day 003 (2026-07-01, 周三)** · 主题: EAL 启动流程上半段
- 📖 学习: `lib/eal/common/eal_common_options.c` + `eal_init()` 主线 (90min)
- 🔧 动手: 加 printf 跟踪 EAL 启动过程,画出函数调用图 (90min)
- 📤 产出: `notes/P1/W1-D3-eal-init-1.md` + 调用图
- [ ] **Day 004 (2026-07-02, 周四)** · 主题: EAL 启动流程下半段
- 📖 学习: lcore 创建、master/worker 线程、内存初始化 (90min)
- 🔧 动手: 写一个最小程序,启动 4 个 lcore 打印自己的 ID (90min)
- 📤 产出: `code/P1/eal-lcore-demo/`
- [ ] **Day 005 (2026-07-03, 周五)** · 主题: hello_world 改造
- 📖 学习: `examples/helloworld/main.c` (30min)
- 🔧 动手: 改造 helloworld,让每个 lcore 把自己绑定的 CPU、NUMA node、core_id 输出 (90min)
- 📤 产出: `code/P1/helloworld-plus/`
- [ ] **Day 006 (2026-07-04, 周六)** · 主题: 大块实验 — testpmd 模式全览
- 📖 学习: testpmd 各种 forward mode (60min)
- 🔧 动手: 用 X540 / X710 跑 io / mac / macswap / rxonly / txonly 五种模式,记录 PPS (240min)
- 📤 产出: `perf-data/P1/W1-testpmd-modes.md` 含 5 组数据 + 图表
- 📤 产出: `code/P1/testpmd-runner.sh` 自动化脚本
- [ ] **Day 007 (2026-07-05, 周日)** · ☕ 复盘
- 📤 产出: `notes/P1/W1-summary.md`(W1 学到什么、卡在哪、下周计划)
---
### Week 2 (Day 8-14) · mempool 源码 + cache 机制
- [ ] **Day 008 (2026-07-06, 周一)** · 主题: mempool 总览
- 📖 学习: `lib/mempool/rte_mempool.h` + 设计文档 (90min)
- 🔧 动手: 写 demo 创建 mempool、alloc、free 对象 (60min)
- 📤 产出: `notes/P1/W2-D1-mempool-overview.md`
- [ ] **Day 009 (2026-07-07, 周二)** · 主题: mempool cache 原理
- 📖 学习: per-lcore cache 数据结构 + flush_threshold (90min)
- 🔧 动手: gdb 进入 `rte_mempool_get` 看 cache 命中路径 (60min)
- 🐧 内核对照: 读 `mm/slub.c` 的 per-cpu cache (kmem_cache_cpu) (30min)
- 📤 产出: `notes/P1/W2-D2-mempool-cache.md`
- [ ] **Day 010 (2026-07-08, 周三)** · 主题: mempool ops (ring / stack / lf-stack)
- 📖 学习: `rte_mempool_ops` 抽象 + 三种后端实现 (90min)
- 🔧 动手: 用 `--mempool-ops=stack` 跑 testpmd 对比性能 (60min)
- 📤 产出: `notes/P1/W2-D3-mempool-ops.md`
- [ ] **Day 011 (2026-07-09, 周四)** · 主题: mempool 与 NUMA
- 📖 学习: `rte_mempool_create_empty` 的 socket_id 参数 (60min)
- 🔧 动手: 同 socket vs 跨 socket 测 alloc 延迟 (90min)
- 📤 产出: `perf-data/P1/W2-mempool-numa.md`
- [ ] **Day 012 (2026-07-10, 周五)** · 主题: mempool benchmark 工具
- 📖 学习: `app/test/test_mempool_perf.c` (60min)
- 🔧 动手: 跑官方 perf test,记录 cache on/off 的差异 (90min)
- 📤 产出: `perf-data/P1/W2-mempool-perf.md`
- [ ] **Day 013 (2026-07-11, 周六)** · 主题: 大块实验 — 自研 mempool benchmark
- 🔧 动手: 写一个工具,分别用 cache=0 / cache=128 / cache=512 测 8 核并发 alloc,输出火焰图 (360min)
- 📤 产出: `code/P1/mempool-bench/` + `flamegraph/W2-mempool.svg`
- [ ] **Day 014 (2026-07-12, 周日)** · ☕ 复盘
- 📤 产出: `notes/P1/W2-summary.md`
---
### Week 3 (Day 15-21) · ring 源码 + 无锁队列
- [ ] **Day 015 (2026-07-13, 周一)** · 主题: ring 基本 API
- 📖 学习: `lib/ring/rte_ring.h` + create/enqueue/dequeue (90min)
- 🔧 动手: 写 SPSC ring 通信 demo (60min)
- 📤 产出: `notes/P1/W3-D1-ring-api.md`
- [ ] **Day 016 (2026-07-14, 周二)** · 主题: ring 无锁实现 — head/tail 指针
- 📖 学习: `__rte_ring_move_prod_head` / `__rte_ring_move_cons_head` (120min)
- 🔧 动手: 手画 4 个线程并发 enqueue 的指针变化时序图 (60min)
- 🐧 内核对照: 读 `include/linux/rculist.h` 的 RCU 无锁链表 (30min)
- 📤 产出: `notes/P1/W3-D2-ring-lockfree.md`
- [ ] **Day 017 (2026-07-15, 周三)** · 主题: ring 的内存屏障
- 📖 学习: `rte_smp_wmb` / `rte_smp_rmb` + C11 atomic (90min)
- 🔧 动手: 在 ring 源码中标注每个屏障的作用 (60min)
- 📤 产出: `notes/P1/W3-D3-ring-barrier.md`
- [ ] **Day 018 (2026-07-16, 周四)** · 主题: ring 变体 — RTS / HTS
- 📖 学习: Relaxed Tail Sync / Head Tail Sync 模式 (90min)
- 🔧 动手: 对比 default / RTS / HTS 三种模式的延迟 (60min)
- 📤 产出: `notes/P1/W3-D4-ring-variants.md`
- [ ] **Day 019 (2026-07-17, 周五)** · 主题: ring 与 mempool 关系
- 📖 学习: mempool default ops = ring 的原因 (60min)
- 🔧 动手: 看 mempool 如何用 ring 实现 (90min)
- 📤 产出: `notes/P1/W3-D5-ring-mempool.md`
- [ ] **Day 020 (2026-07-18, 周六)** · 主题: 大块实验 — ring 压测对比
- 🔧 动手: 写 ring 压测工具,分别测 SPSC/MPSC/MPMC 在 1/2/4/8 producer 下的 throughput + latency (360min)
- 📤 产出: `code/P1/ring-bench/` + `perf-data/P1/W3-ring-perf.md`
- [ ] **Day 021 (2026-07-19, 周日)** · ☕ 复盘
- 📤 产出: `notes/P1/W3-summary.md`
---
### Week 4 (Day 22-28) · mbuf 源码 + 零拷贝
- [ ] **Day 022 (2026-07-20, 周一)** · 主题: mbuf 结构详解
- 📖 学习: `struct rte_mbuf` 字段分布 + cache line 布局 (90min)
- 🔧 动手: 写 demo 打印 mbuf 各字段地址,验证 cache line (60min)
- 🐧 内核对照: 读 `include/linux/skbuff.h` 的 `struct sk_buff` (30min)
- 📤 产出: `notes/P1/W4-D1-mbuf-layout.md`(含 mbuf vs skb 对照表)
- [ ] **Day 023 (2026-07-21, 周二)** · 主题: mbuf 链 + segments
- 📖 学习: chained mbuf / next 指针 / nb_segs (90min)
- 🔧 动手: 构造一个 3 段的 mbuf chain 并发包 (60min)
- 📤 产出: `notes/P1/W4-D2-mbuf-chain.md`
- [ ] **Day 024 (2026-07-22, 周三)** · 主题: mbuf headroom / tailroom
- 📖 学习: prepend / append / trim / adj (90min)
- 🔧 动手: 写一个 IP-in-IP 封装 demo,用 prepend 加外层 IP (90min)
- 📤 产出: `code/P1/mbuf-encap-demo/`
- [ ] **Day 025 (2026-07-23, 周四)** · 主题: 外部 mbuf (external buffer)
- 📖 学习: `rte_pktmbuf_attach_extbuf` (60min)
- 🔧 动手: 把用户内存挂到 mbuf 实现零拷贝 (90min)
- 📤 产出: `notes/P1/W4-D4-mbuf-extbuf.md`
- [ ] **Day 026 (2026-07-24, 周五)** · 主题: mbuf offload flags
- 📖 学习: TX/RX offload 标志位(checksum / TSO / VLAN)(90min)
- 🔧 动手: 用 testpmd 验证 TSO offload (60min)
- 📤 产出: `notes/P1/W4-D5-mbuf-offload.md`
- [ ] **Day 027 (2026-07-25, 周六)** · 主题: 大块实验 — 零拷贝 echo server
- 🔧 动手: 实现一个不分配新 mbuf 的 echo server(in-place swap MAC/IP)(360min)
- 📤 产出: `code/P1/zerocopy-echo/` + benchmark 数据
- [ ] **Day 028 (2026-07-26, 周日)** · ☕ 复盘
- 📤 产出: `notes/P1/W4-summary.md`
---
### Week 5 (Day 29-35) · PMD 框架 + ixgbe/i40e
- [ ] **Day 029 (2026-07-27, 周一)** · 主题: ethdev 抽象层
- 📖 学习: `lib/ethdev/rte_ethdev.h` + dev_ops (90min)
- 🔧 动手: 列出所有 dev_ops 函数指针并理解用途 (60min)
- 📤 产出: `notes/P1/W5-D1-ethdev.md`
- [ ] **Day 030 (2026-07-28, 周二)** · 主题: ixgbe PMD 总览
- 📖 学习: `drivers/net/ixgbe/ixgbe_ethdev.c` (120min)
- 🐧 内核对照: 读 `linux/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c` 的 probe + open (45min)
- 📤 产出: `notes/P1/W5-D2-ixgbe-overview.md`(含 DPDK vs Kernel 对照表)
- [ ] **Day 031 (2026-07-29, 周三)** · 主题: ixgbe RX 路径
- 📖 学习: `ixgbe_recv_pkts` + 描述符环 (120min)
- 🔧 动手: 在 RX 路径打点统计 burst 大小分布 (60min)
- 📤 产出: `notes/P1/W5-D3-ixgbe-rx.md`
- [ ] **Day 032 (2026-07-30, 周四)** · 主题: ixgbe TX 路径
- 📖 学习: `ixgbe_xmit_pkts` + TX descriptor (120min)
- 📤 产出: `notes/P1/W5-D4-ixgbe-tx.md`
- [ ] **Day 033 (2026-07-31, 周五)** · 主题: vector PMD (AVX)
- 📖 学习: `ixgbe_rxtx_vec_*.c` SIMD 优化 (90min)
- 🔧 动手: 对比 vector / scalar PMD 的 PPS (60min)
- 📤 产出: `notes/P1/W5-D5-ixgbe-vec.md`
- [ ] **Day 034 (2026-08-01, 周六)** · 主题: 大块实验 — PMD 替换实验
- 🔧 动手: 写一个跨 PMD 的 forward 程序(ixgbe ↔ virtio),对比性能 (360min)
- 📤 产出: `code/P1/cross-pmd-fwd/`
- [ ] **Day 035 (2026-08-02, 周日)** · ☕ 复盘
- 📤 产出: `notes/P1/W5-summary.md`
---
### Week 6 (Day 36-42) · NUMA + lcore 调度
- [ ] **Day 036 (2026-08-03, 周一)** · 主题: NUMA 拓扑探查
- 📖 学习: `lstopo` / `numactl` / `/sys/devices/system/node/` (60min)
- 🔧 动手: 画出本机 NUMA 拓扑图 (90min)
- 📤 产出: `notes/P1/W6-D1-numa-topo.md`
- [ ] **Day 037 (2026-08-04, 周二)** · 主题: 跨 socket 性能惩罚
- 🔧 动手: 同 socket / 跨 socket 跑 mempool + ring 测试 (120min)
- 🐧 内核对照: 读 `mm/mempolicy.c` 看内核 NUMA 分配策略 (30min)
- 📤 产出: `perf-data/P1/W6-numa-penalty.md`
- [ ] **Day 038 (2026-08-05, 周三)** · 主题: lcore 绑核机制
- 📖 学习: `--lcores` 参数解析 + pthread_setaffinity_np (90min)
- 🔧 动手: 测试不同绑核策略的性能差异 (60min)
- 📤 产出: `notes/P1/W6-D3-lcore-affinity.md`
- [ ] **Day 039 (2026-08-06, 周四)** · 主题: service core
- 📖 学习: `rte_service` 框架 (60min)
- 🔧 动手: 写一个 service core demo 处理统计任务 (90min)
- 📤 产出: `code/P1/service-core-demo/`
- [ ] **Day 040 (2026-08-07, 周五)** · 主题: lcore 间通信模式
- 📖 学习: pipeline / run-to-completion 两种模型 (90min)
- 🔧 动手: 各写一个 demo 对比 (90min)
- 📤 产出: `code/P1/lcore-models/`
- [ ] **Day 041 (2026-08-08, 周六)** · 主题: 大块实验 — pipeline forward
- 🔧 动手: 实现 RX → classify → fwd 三阶段 pipeline,测 PPS (360min)
- 📤 产出: `code/P1/pipeline-fwd/`
- [ ] **Day 042 (2026-08-09, 周日)** · ☕ 复盘
- 📤 产出: `notes/P1/W6-summary.md`
---
### Week 7 (Day 43-49) · RSS + Flow Director
- [ ] **Day 043 (2026-08-10, 周一)** · 主题: RSS 原理
- 📖 学习: Toeplitz hash + RETA table (90min)
- 📤 产出: `notes/P1/W7-D1-rss.md`
- [ ] **Day 044 (2026-08-11, 周二)** · 主题: RSS 配置实战
- 🔧 动手: testpmd 配置 RSS,观察队列分布 (120min)
- 🐧 内核对照: 读 `net/core/dev.c` 的 RPS/RFS 实现(`get_rps_cpu`)(30min)
- 📤 产出: `notes/P1/W7-D2-rss-cfg.md`
- [ ] **Day 045 (2026-08-12, 周三)** · 主题: Symmetric RSS
- 📖 学习: 对称 RSS key 设计 (90min)
- 🔧 动手: 用对称 key 让双向流落同队列 (60min)
- 📤 产出: `notes/P1/W7-D3-sym-rss.md`
- [ ] **Day 046 (2026-08-13, 周四)** · 主题: rte_flow 入门
- 📖 学习: `lib/ethdev/rte_flow.h` (90min)
- 🔧 动手: 写一条 flow rule 把特定 5-tuple 导到指定队列 (90min)
- 📤 产出: `code/P1/rte-flow-demo/`
- [ ] **Day 047 (2026-08-14, 周五)** · 主题: Flow Director vs RSS
- 📖 学习: 两者适用场景 (60min)
- 📤 产出: `notes/P1/W7-D5-fdir-vs-rss.md`
- [ ] **Day 048 (2026-08-15, 周六)** · 主题: 大块实验 — 多队列 echo
- 🔧 动手: 实现 16 队列 RSS echo,测单核 vs 16 核线速 (360min)
- 📤 产出: `code/P1/multiq-echo/` + `perf-data/P1/W7-multiq.md`
- [ ] **Day 049 (2026-08-16, 周日)** · ☕ 复盘
- 📤 产出: `notes/P1/W7-summary.md`
---
### Week 8 (Day 50-56) · mTCP 源码精读
- [ ] **Day 050 (2026-08-17, 周一)** · 主题: mTCP 论文精读
- 📖 学习: NSDI'14 mTCP 论文全文 (180min)
- 📤 产出: `notes/P1/W8-D1-mtcp-paper.md`
- [ ] **Day 051 (2026-08-18, 周二)** · 主题: mTCP 架构
- 📖 学习: `mtcp/src/core.c` + 主循环 (120min)
- 📤 产出: `notes/P1/W8-D2-mtcp-arch.md`
- [ ] **Day 052 (2026-08-19, 周三)** · 主题: mTCP TCP 状态机
- 📖 学习: `mtcp/src/tcp_in.c` / `tcp_out.c` (150min)
- 🐧 内核对照: 读 `net/ipv4/tcp_input.c::tcp_rcv_state_process` (45min)
- 📤 产出: `notes/P1/W8-D3-mtcp-tcp.md`(含 mTCP vs Linux TCP 状态机对照)
- [ ] **Day 053 (2026-08-20, 周四)** · 主题: mTCP epoll 实现
- 📖 学习: `mtcp/src/eventpoll.c` (120min)
- 📤 产出: `notes/P1/W8-D4-mtcp-epoll.md`
- [ ] **Day 054 (2026-08-21, 周五)** · 主题: mTCP IO 抽象
- 📖 学习: `mtcp/src/io_module.c` 如何对接 DPDK (90min)
- 📤 产出: `notes/P1/W8-D5-mtcp-io.md`
- [ ] **Day 055 (2026-08-22, 周六)** · 主题: 大块实验 — mTCP 跑通 epwget/epserver
- 🔧 动手: 编译 mTCP + 你已有的 `libmtcp` 跑 epserver/epwget benchmark (360min)
- 📤 产出: `perf-data/P1/W8-mtcp-bench.md`
- [ ] **Day 056 (2026-08-23, 周日)** · ☕ 复盘
- 📤 产出: `notes/P1/W8-summary.md`
---
### Week 9 (Day 57-63) · libmtcp v3 设计
- [ ] **Day 057 (2026-08-24, 周一)** · 主题: 现有 libmtcp 代码盘点
- 🔧 动手: 通读你之前的 `libmtcp-20260622` / `20260625` 改动 (120min)
- 📤 产出: `notes/P1/W9-D1-libmtcp-audit.md`
- [ ] **Day 058 (2026-08-25, 周二)** · 主题: v3 目标定义
- 🔧 动手: 写 v3 RFC(功能 / 性能目标)(120min)
- 🐧 内核对照: 读 `net/socket.c` 看 socket() / bind() / listen() 内核实现 (30min)
- 📤 产出: `docs/libmtcp-v3-rfc.md`
- [ ] **Day 059 (2026-08-26, 周三)** · 主题: v3 模块划分
- 🔧 动手: 画出模块图 + 数据流图 (120min)
- 📤 产出: `docs/libmtcp-v3-arch.md`
- [ ] **Day 060 (2026-08-27, 周四)** · 主题: v3 API 设计
- 🔧 动手: 写 `libmtcp_v3.h` 头文件(仅声明)(120min)
- 📤 产出: `code/libmtcp-v3/include/libmtcp_v3.h`
- [ ] **Day 061 (2026-08-28, 周五)** · 主题: v3 内存模型
- 🔧 动手: 设计 mempool / mbuf 复用策略 (90min)
- 📤 产出: `docs/libmtcp-v3-memory.md`
- [ ] **Day 062 (2026-08-29, 周六)** · 主题: 大块实验 — 搭脚手架
- 🔧 动手: 创建仓库、Makefile、单元测试框架、CI 配置 (360min)
- 📤 产出: `code/libmtcp-v3/` 仓库初始化
- [ ] **Day 063 (2026-08-30, 周日)** · ☕ 复盘
- 📤 产出: `notes/P1/W9-summary.md`
---
### Week 10 (Day 64-70) · libmtcp v3 实现 (1) — RX/TX 路径
- [ ] **Day 064 (2026-08-31, 周一)** · 主题: RX 路径骨架
- 🔧 动手: 实现 `mtcp_rx_burst` + ring 分发 (180min)
- 📤 产出: commit "rx burst skeleton"
- [ ] **Day 065 (2026-09-01, 周二)** · 主题: RX 路径解析
- 🔧 动手: 实现 ether/ip/tcp 头部解析 (150min)
- 🐧 内核对照: 读 `net/core/dev.c::__netif_receive_skb_core` 看内核 RX 主入口 (30min)
- 📤 产出: commit "parse headers"
- [ ] **Day 066 (2026-09-02, 周三)** · 主题: RX 路径连接查表
- 🔧 动手: 用 rte_hash 实现 4-tuple 查表 (150min)
- 📤 产出: commit "conn lookup"
- [ ] **Day 067 (2026-09-03, 周四)** · 主题: TX 路径骨架
- 🔧 动手: 实现 `mtcp_tx_burst` + 批量发送 (150min)
- 📤 产出: commit "tx burst skeleton"
- [ ] **Day 068 (2026-09-04, 周五)** · 主题: TX 路径优化
- 🔧 动手: prefetch + batch (120min)
- 📤 产出: commit "tx prefetch"
- [ ] **Day 069 (2026-09-05, 周六)** · 主题: 大块实验 — 端到端 echo
- 🔧 动手: 让 v3 跑通最简 echo,测初步 PPS (360min)
- 📤 产出: `perf-data/P1/W10-v3-echo-v0.md`
- [ ] **Day 070 (2026-09-06, 周日)** · ☕ 复盘
- 📤 产出: `notes/P1/W10-summary.md`
---
### Week 11 (Day 71-77) · libmtcp v3 实现 (2) — 协议栈核心
- [ ] **Day 071 (2026-09-07, 周一)** · 主题: TCP 状态机骨架
- 🔧 动手: 实现 LISTEN/SYN_RECV/ESTABLISHED (180min)
- 📤 产出: commit "tcp fsm 1"
- [ ] **Day 072 (2026-09-08, 周二)** · 主题: TCP 状态机 (FIN/CLOSE)
- 🔧 动手: 实现 FIN_WAIT/CLOSE_WAIT/TIME_WAIT (180min)
- 🐧 内核对照: 读 `net/ipv4/tcp_timer.c` 看内核 TIME_WAIT 处理 (30min)
- 📤 产出: commit "tcp fsm 2"
- [ ] **Day 073 (2026-09-09, 周三)** · 主题: 重传 / 拥塞控制
- 🔧 动手: 实现 RTO + cwnd 简化版 (180min)
- 📤 产出: commit "rto + cwnd"
- [ ] **Day 074 (2026-09-10, 周四)** · 主题: 收发缓冲区
- 🔧 动手: 环形 buffer + 零拷贝引用 (150min)
- 📤 产出: commit "sock buffer"
- [ ] **Day 075 (2026-09-11, 周五)** · 主题: API 封装
- 🔧 动手: 暴露 mtcp_socket/listen/accept/send/recv (150min)
- 📤 产出: commit "user api"
- [ ] **Day 076 (2026-09-12, 周六)** · 主题: 大块实验 — echo 完整版
- 🔧 动手: 写 echo server demo + 客户端,跑 1000 并发连接 (360min)
- 📤 产出: `code/libmtcp-v3/examples/echo/`
- [ ] **Day 077 (2026-09-13, 周日)** · ☕ 复盘
- 📤 产出: `notes/P1/W11-summary.md`
---
### Week 12 (Day 78-84) · 性能调优 + 火焰图
- [ ] **Day 078 (2026-09-14, 周一)** · 主题: perf top + IPC
- 🔧 动手: 用 `perf top` / `perf stat` 找热点 (150min)
- 📤 产出: `perf-data/P1/W12-perf-top.md`
- [ ] **Day 079 (2026-09-15, 周二)** · 主题: 火焰图
- 🔧 动手: 用 FlameGraph 生成 svg (120min)
- 🐧 内核对照: 读 `kernel/events/core.c` 看 perf 子系统入口 (30min)
- 📤 产出: `flamegraph/W12-v3.svg`
- [ ] **Day 080 (2026-09-16, 周三)** · 主题: cache miss 分析
- 🔧 动手: `perf c2c` / `perf mem` 找 false sharing (150min)
- 📤 产出: `perf-data/P1/W12-cache-miss.md`
- [ ] **Day 081 (2026-09-17, 周四)** · 主题: branch / prefetch 优化
- 🔧 动手: 加 likely/unlikely + rte_prefetch0 (150min)
- 📤 产出: commit "prefetch opt"
- [ ] **Day 082 (2026-09-18, 周五)** · 主题: 批量化
- 🔧 动手: 把单包路径改批量路径 (150min)
- 📤 产出: commit "batch path"
- [ ] **Day 083 (2026-09-19, 周六)** · 主题: 大块实验 — 100G 线速冲刺
- 🔧 动手: 反复调优 + 测试,目标单核 14.88 Mpps (480min)
- 📤 产出: `perf-data/P1/W12-100G-echo.md`(最终数据)
- [ ] **Day 084 (2026-09-20, 周日)** · ☕ 复盘
- 📤 产出: `notes/P1/W12-summary.md`
---
### Week 13 (Day 85-91) · P1 总结 + 文档
- [ ] **Day 085 (2026-09-21, 周一)** · 主题: 整理 P1 所有产出
- 🔧 动手: 把 notes / code / perf-data 重新组织 (180min)
- 📤 产出: `P1-final/` 目录
- [ ] **Day 086 (2026-09-22, 周二)** · 主题: 写 P1 技术博客 (1)
- 🔧 动手: "DPDK mempool/ring/mbuf 源码深读" 一文 (180min)
- 🐧 内核对照: 在博客里加 "DPDK vs 内核" 对照章节 (30min)
- 📤 产出: `blog/P1-internals.md`
- [ ] **Day 087 (2026-09-23, 周三)** · 主题: 写 P1 技术博客 (2)
- 🔧 动手: "从 0 写一个 100G 用户态 TCP 协议栈" 一文 (180min)
- 📤 产出: `blog/P1-libmtcp-v3.md`
- [ ] **Day 088 (2026-09-24, 周四)** · 主题: libmtcp-v3 README + 文档
- 🔧 动手: 完善 README、架构图、性能对比表 (180min)
- 📤 产出: `code/libmtcp-v3/README.md`
- [ ] **Day 089 (2026-09-25, 周五)** · 主题: 简历草稿 v1
- 🔧 动手: 把 P1 成果写进简历项目栏 (90min)
- 📤 产出: `career/resume-v1.md`
- [ ] **Day 090 (2026-09-26, 周六)** · 主题: 大块实验 — 公开发布准备
- 🔧 动手: 项目推 GitHub,写 release note v0.1 (240min)
- 📤 产出: GitHub release
- [ ] **Day 091 (2026-09-27, 周日)** · 🎯 P1 阶段答辩
- 📤 产出: `P1-final/answer.md`(自问自答 10 个核心问题)
- 📤 产出: `P1-final/retro.md`(阶段复盘 + P2 调整建议)
---
# P2 · SONiC×DPDK 融合 (M4-M6)
> **Day 92-182**, 2026-09-28 ~ 2026-12-27
> **核心目标**: 跑通 sonic-vs,并实现 SAI-DPDK 最小适配器(15 个核心 API),让 SONiC 控制面操作能落到 DPDK 数据面上
## P2.0 阶段目标
1. 完整跑通 sonic-vs(Virtual Switch)镜像,理解 SONiC 容器栈
2. 读懂 SAI 头文件 + sairedis 链路
3. 实现 `sai-dpdk-mini`:15 个 API(switch/port/fdb/vlan/route/neighbor/acl/pkt-io)
4. SONiC 上跑通 L2 forwarding + L3 routing + 基本 ACL
## P2.1 关键交付物
- [ ] `sonic-vs` 完整跑通 + 容器架构笔记
- [ ] `sai-dpdk-mini` GitHub 仓库 + 15 个 API 实现
- [ ] SONiC + sai-dpdk-mini 集成 demo 视频/截图
- [ ] `notes/P2/` 13 周笔记
## P2.1.5 🐧 本阶段内核对照清单(K4 + K6)
| 周 | 对照主题 | 内核源码路径 |
|---|---|---|
| W14 | 内核 namespace (容器隔离基础) | `kernel/nsproxy.c`, `kernel/pid_namespace.c` |
| W15 | cgroup + container | `kernel/cgroup/` |
| W16 | netlink 总览 | `net/netlink/af_netlink.c` |
| W17 | rtnetlink(端口/路由/邻居)| `net/core/rtnetlink.c` |
| W18 | netlink RTM_NEWLINK 流程 | `net/core/rtnetlink.c::rtnl_newlink` |
| W19 | FIB + 路由表 | `net/ipv4/fib_trie.c` |
| W20 | neighbour subsystem (ARP/ND) | `net/core/neighbour.c`, `net/ipv4/arp.c` |
| W21 | net_device + ndo_* | `net/core/dev.c`, `include/linux/netdevice.h` |
| W22 | bridge + FDB | `net/bridge/br_fdb.c` |
| W23 | VLAN (802.1Q)| `net/8021q/vlan_core.c` |
| W24 | nftables / iptables | `net/netfilter/nf_tables_core.c` |
| W25 | tun/tap (host_if 对照) | `drivers/net/tun.c` |
| W26 | 综合:SONiC kernel host_if 路径 | `tun/tap → netif_receive_skb` |
## P2.2 周计划总览 (W14-W26)
| 周 | Day | 主题 | 里程碑 |
|---|---|---|---|
| W14 | 92-98 | sonic-vs 跑通 | container up |
| W15 | 99-105 | SONiC 容器架构 | 画出全栈图 |
| W16 | 106-112 | APPL_DB → ASIC_DB 链路 | 抓 redis 流 |
| W17 | 113-119 | SAI 头文件全览 | 分类整理 |
| W18 | 120-126 | sairedis 源码 | RPC 链路 |
| W19 | 127-133 | syncd 源码 | dispatch 机制 |
| W20 | 134-140 | sai-dpdk-mini 设计 | RFC |
| W21 | 141-147 | sai_switch + sai_port | 编译通过 |
| W22 | 148-154 | sai_fdb + sai_vlan | L2 跑通 |
| W23 | 155-161 | sai_route + sai_neighbor | L3 跑通 |
| W24 | 162-168 | sai_acl + rte_flow | ACL 跑通 |
| W25 | 169-175 | sai pkt-io (host_if) | CPU 收发 |
| W26 | 176-182 | 集成 + 答辩 | demo + 文档 |
## P2.3 详细日计划
### Week 14 (Day 92-98) · sonic-vs 跑通
- [ ] **Day 092 (2026-09-28, 周一)** · 主题: SONiC 总览
- 📖 学习: SONiC 官方文档 Architecture 章节 (120min)
- 📤 产出: `notes/P2/W14-D1-sonic-overview.md`
- [ ] **Day 093 (2026-09-29, 周二)** · 主题: 拉取 sonic-vs 镜像
- 🔧 动手: 从 sonic-buildimage 拉 vs 镜像或直接 download (120min)
- 🐧 内核对照: 读 `kernel/nsproxy.c` + `Documentation/admin-guide/namespaces/` (30min)
- 📤 产出: `notes/P2/W14-D2-sonic-vs-image.md`
- [ ] **Day 094 (2026-09-30, 周三)** · 主题: 启动 sonic-vs 容器
- 🔧 动手: 用 docker 跑起来,登录 cli (120min)
- 📤 产出: `notes/P2/W14-D3-sonic-vs-up.md`
- [ ] **Day 095 (2026-10-01, 周四)** · ☕ 国庆假期 — 留白
- [ ] **Day 096 (2026-10-02, 周五)** · ☕ 国庆假期 — 留白
- [ ] **Day 097 (2026-10-03, 周六)** · ☕ 国庆假期 — 留白
- [ ] **Day 098 (2026-10-04, 周日)** · ☕ 国庆假期 — 留白
---
### Week 15 (Day 99-105) · SONiC 容器架构
- [ ] **Day 099 (2026-10-05, 周一)** · ☕ 国庆假期 — 留白
- [ ] **Day 100 (2026-10-06, 周二)** · ☕ 国庆假期 — 留白
- [ ] **Day 101 (2026-10-07, 周三)** · ☕ 国庆假期 — 留白
- [ ] **Day 102 (2026-10-08, 周四)** · 主题: SONiC 容器全家福
- 🔧 动手: `docker ps` 看所有容器,画交互图 (150min)
- 📤 产出: `notes/P2/W15-D4-containers.md`
- [ ] **Day 103 (2026-10-09, 周五)** · 主题: swss 容器内部
- 🔧 动手: 进 swss 容器看 orchagent 进程 (150min)
- 🐧 内核对照: 读 `kernel/cgroup/cgroup.c` 看容器资源限制 (30min)
- 📤 产出: `notes/P2/W15-D5-swss.md`
- [ ] **Day 104 (2026-10-10, 周六)** · 主题: 大块实验 — 容器交互全链路
- 🔧 动手: 从 CLI 下一条 vlan 命令,跟踪到 ASIC_DB (360min)
- 📤 产出: `notes/P2/W15-D6-fullpath.md`
- [ ] **Day 105 (2026-10-11, 周日)** · ☕ 复盘
- 📤 产出: `notes/P2/W15-summary.md`
---
### Week 16 (Day 106-112) · APPL_DB → ASIC_DB 链路
- [ ] **Day 106 (2026-10-12, 周一)** · 主题: Redis 数据库结构
- 📖 学习: 6 个 DB 的用途 (90min)
- 🔧 动手: `redis-cli -n 0/1/2/...` 各看一遍 (60min)
- 📤 产出: `notes/P2/W16-D1-redis-dbs.md`
- [ ] **Day 107 (2026-10-13, 周二)** · 主题: APPL_DB 表结构
- 🔧 动手: 抓 PORT/VLAN/ROUTE 表 (120min)
- 🐧 内核对照: 读 `net/core/rtnetlink.c::rtnl_newlink` 看内核如何创建网卡 (30min)
- 📤 产出: `notes/P2/W16-D2-appl-db.md`
- [ ] **Day 108 (2026-10-14, 周三)** · 主题: ASIC_DB 表结构
- 🔧 动手: 抓 ASIC_STATE 表 (120min)
- 📤 产出: `notes/P2/W16-D3-asic-db.md`
- [ ] **Day 109 (2026-10-15, 周四)** · 主题: Producer/Consumer Table
- 📖 学习: swss-common 表抽象 (90min)
- 📤 产出: `notes/P2/W16-D4-tables.md`
- [ ] **Day 110 (2026-10-16, 周五)** · 主题: KCO/SCO 通知
- 📖 学习: Key/Sub Change Object 机制 (90min)
- 📤 产出: `notes/P2/W16-D5-notify.md`
- [ ] **Day 111 (2026-10-17, 周六)** · 主题: 大块实验 — Redis 流量抓取
- 🔧 动手: `redis-cli monitor` 同步观察一次完整配置 (360min)
- 📤 产出: `perf-data/P2/W16-redis-trace.md`
- [ ] **Day 112 (2026-10-18, 周日)** · ☕ 复盘
- 📤 产出: `notes/P2/W16-summary.md`
---
### Week 17 (Day 113-119) · SAI 头文件全览
- [ ] **Day 113 (2026-10-19, 周一)** · 主题: SAI 总览
- 📖 学习: sai.h + sai_object_type (120min)
- 📤 产出: `notes/P2/W17-D1-sai-overview.md`
- [ ] **Day 114 (2026-10-20, 周二)** · 主题: SAI Switch / Port
- 📖 学习: saiswitch.h / saiport.h (120min)
- 🐧 内核对照: 读 `include/linux/netdevice.h` 看 `struct net_device` 与 ndo_* (30min)
- 📤 产出: `notes/P2/W17-D2-sai-switch-port.md`(含 SAI vs net_device 对照)
- [ ] **Day 115 (2026-10-21, 周三)** · 主题: SAI FDB / VLAN
- 📖 学习: saifdb.h / saivlan.h (120min)
- 📤 产出: `notes/P2/W17-D3-sai-l2.md`
- [ ] **Day 116 (2026-10-22, 周四)** · 主题: SAI Route / Neighbor / NextHop
- 📖 学习: sairoute.h / saineighbor.h / sainexthop.h (150min)
- 📤 产出: `notes/P2/W17-D4-sai-l3.md`
- [ ] **Day 117 (2026-10-23, 周五)** · 主题: SAI ACL
- 📖 学习: saiacl.h (120min)
- 📤 产出: `notes/P2/W17-D5-sai-acl.md`
- [ ] **Day 118 (2026-10-24, 周六)** · 主题: 大块实验 — SAI API 分类整理
- 🔧 动手: 把所有 SAI API 列表 + 标红 15 个 MVP API (360min)
- 📤 产出: `notes/P2/W17-D6-sai-api-matrix.md`
- [ ] **Day 119 (2026-10-25, 周日)** · ☕ 复盘
- 📤 产出: `notes/P2/W17-summary.md`
---
### Week 18 (Day 120-126) · sairedis 源码
- [ ] **Day 120 (2026-10-26, 周一)** · 主题: sairedis 总览
- 📖 学习: sonic-sairedis 仓库结构 (120min)
- 📤 产出: `notes/P2/W18-D1-sairedis-overview.md`
- [ ] **Day 121 (2026-10-27, 周二)** · 主题: ClientSai
- 📖 学习: `lib/ClientSai.cpp` (150min)
- 🐧 内核对照: 读 `net/netlink/af_netlink.c` 看 netlink socket 实现 (30min)
- 📤 产出: `notes/P2/W18-D2-clientsai.md`
- [ ] **Day 122 (2026-10-28, 周三)** · 主题: RedisRemoteSaiInterface
- 📖 学习: 如何把 SAI 调用转 Redis (150min)
- 📤 产出: `notes/P2/W18-D3-redis-interface.md`
- [ ] **Day 123 (2026-10-29, 周四)** · 主题: 序列化协议
- 📖 学习: meta + sai_serialize_* (120min)
- 📤 产出: `notes/P2/W18-D4-serialize.md`
- [ ] **Day 124 (2026-10-30, 周五)** · 主题: 通知反向链路
- 📖 学习: NotificationProducer/Consumer (120min)
- 📤 产出: `notes/P2/W18-D5-notify-back.md`
- [ ] **Day 125 (2026-10-31, 周六)** · 主题: 大块实验 — 抓一次 SAI 调用
- 🔧 动手: 在 orchagent 加日志,抓 sai_create_route 完整链路 (360min)
- 📤 产出: `perf-data/P2/W18-sai-trace.md`
- [ ] **Day 126 (2026-11-01, 周日)** · ☕ 复盘 + 月度复盘
- 📤 产出: `notes/P2/W18-summary.md` + `monthly/2026-10.md`
---
### Week 19 (Day 127-133) · syncd 源码
- [ ] **Day 127 (2026-11-02, 周一)** · 主题: syncd 启动流程
- 📖 学习: `syncd/syncd_main.cpp` (120min)
- 📤 产出: `notes/P2/W19-D1-syncd-main.md`
- [ ] **Day 128 (2026-11-03, 周二)** · 主题: syncd 主循环
- 📖 学习: `Syncd::run()` (150min)
- 🐧 内核对照: 读 `net/ipv4/fib_trie.c` 看内核 FIB 路由表实现 (30min)
- 📤 产出: `notes/P2/W19-D2-syncd-loop.md`
- [ ] **Day 129 (2026-11-04, 周三)** · 主题: dispatch 机制
- 📖 学习: ASIC_STATE 操作如何 dispatch 到 SAI (150min)
- 📤 产出: `notes/P2/W19-D3-dispatch.md`
- [ ] **Day 130 (2026-11-05, 周四)** · 主题: vendor SAI 加载
- 📖 学习: dlopen + sai_api_query (120min)
- 📤 产出: `notes/P2/W19-D4-vendor-load.md`
- [ ] **Day 131 (2026-11-06, 周五)** · 主题: warm/fast boot
- 📖 学习: redis snapshot + restore (120min)
- 📤 产出: `notes/P2/W19-D5-warm-boot.md`
- [ ] **Day 132 (2026-11-07, 周六)** · 主题: 大块实验 — 替换 SAI 库实验
- 🔧 动手: 把 vs 的 libsai 换成自己的 stub,看 syncd 怎么调用 (360min)
- 📤 产出: `code/P2/sai-stub/`
- [ ] **Day 133 (2026-11-08, 周日)** · ☕ 复盘
- 📤 产出: `notes/P2/W19-summary.md`
---
### Week 20 (Day 134-140) · sai-dpdk-mini 设计
- [ ] **Day 134 (2026-11-09, 周一)** · 主题: 项目目标 RFC
- 🔧 动手: 写 RFC 文档 (180min)
- 📤 产出: `docs/sai-dpdk-mini-rfc.md`
- [ ] **Day 135 (2026-11-10, 周二)** · 主题: 架构设计
- 🔧 动手: 画架构图:SAI API → DPDK 资源映射 (180min)
- 🐧 内核对照: 读 `net/core/neighbour.c` 看 ARP/ND 表实现 (30min)
- 📤 产出: `docs/sai-dpdk-mini-arch.md`
- [ ] **Day 136 (2026-11-11, 周三)** · 主题: 内部数据结构
- 🔧 动手: 设计 port/fdb/route/acl 内部 struct (150min)
- 📤 产出: `docs/sai-dpdk-mini-ds.md`
- [ ] **Day 137 (2026-11-12, 周四)** · 主题: 线程模型
- 🔧 动手: 决定 SAI 调用线程 vs DPDK lcore 关系 (120min)
- 📤 产出: `docs/sai-dpdk-mini-thread.md`
- [ ] **Day 138 (2026-11-13, 周五)** · 主题: 仓库脚手架
- 🔧 动手: 创建仓库、Makefile、CMakeLists (120min)
- 📤 产出: `code/sai-dpdk-mini/` 初始化
- [ ] **Day 139 (2026-11-14, 周六)** · 主题: 大块实验 — 编译框架
- 🔧 动手: 让 sai_api_query 返回所有空 stub 编译通过 (360min)
- 📤 产出: commit "skeleton compiles"
- [ ] **Day 140 (2026-11-15, 周日)** · ☕ 复盘
- 📤 产出: `notes/P2/W20-summary.md`
---
### Week 21 (Day 141-147) · sai_switch + sai_port
- [ ] **Day 141 (2026-11-16, 周一)** · 主题: sai_create_switch
- 🔧 动手: 实现 EAL 初始化 + 探测端口 (180min)
- 📤 产出: commit "sai_create_switch"
- [ ] **Day 142 (2026-11-17, 周二)** · 主题: sai_remove_switch
- 🔧 动手: 资源回收 (120min)
- 🐧 内核对照: 读 `net/core/dev.c::register_netdev` / `unregister_netdev` (30min)
- 📤 产出: commit "sai_remove_switch"
- [ ] **Day 143 (2026-11-18, 周三)** · 主题: sai_create_port
- 🔧 动手: 绑定 DPDK port_id + 启动 (180min)
- 📤 产出: commit "sai_create_port"
- [ ] **Day 144 (2026-11-19, 周四)** · 主题: port attribute
- 🔧 动手: 实现 admin_state / speed / mtu 等属性 (150min)
- 📤 产出: commit "port attrs"
- [ ] **Day 145 (2026-11-20, 周五)** · 主题: port 统计
- 🔧 动手: 实现 get_port_stats 桥接 rte_eth_stats (150min)
- 📤 产出: commit "port stats"
- [ ] **Day 146 (2026-11-21, 周六)** · 主题: 大块实验 — syncd 加载 sai-dpdk-mini
- 🔧 动手: 把 .so 让 syncd 加载,看到端口出现在 ASIC_DB (360min)
- 📤 产出: `notes/P2/W21-D6-syncd-load.md`
- [ ] **Day 147 (2026-11-22, 周日)** · ☕ 复盘
- 📤 产出: `notes/P2/W21-summary.md`
---
### Week 22 (Day 148-154) · sai_fdb + sai_vlan (L2)
- [ ] **Day 148 (2026-11-23, 周一)** · 主题: sai_create_vlan
- 🔧 动手: 用 bitmap 实现 VLAN 表 (150min)
- 📤 产出: commit "sai_vlan"
- [ ] **Day 149 (2026-11-24, 周二)** · 主题: VLAN member
- 🔧 动手: 端口 ↔ VLAN 映射 (150min)
- 🐧 内核对照: 读 `net/8021q/vlan_core.c` 看内核 VLAN 处理 (30min)
- 📤 产出: commit "vlan member"
- [ ] **Day 150 (2026-11-25, 周三)** · 主题: sai_create_fdb_entry
- 🔧 动手: rte_hash MAC 表 (180min)
- 📤 产出: commit "fdb create"
- [ ] **Day 151 (2026-11-26, 周四)** · 主题: FDB age + flush
- 🔧 动手: 定时器 + 老化机制 (150min)
- 📤 产出: commit "fdb age"
- [ ] **Day 152 (2026-11-27, 周五)** · 主题: L2 转发路径
- 🔧 动手: 数据面查 MAC 表转发 (180min)
- 📤 产出: commit "l2 forward"
- [ ] **Day 153 (2026-11-28, 周六)** · 主题: 大块实验 — L2 跑通
- 🔧 动手: SONiC 配两个 VLAN,互通验证 (360min)
- 📤 产出: `perf-data/P2/W22-l2-test.md`
- [ ] **Day 154 (2026-11-29, 周日)** · ☕ 复盘
- 📤 产出: `notes/P2/W22-summary.md`
---
### Week 23 (Day 155-161) · sai_route + sai_neighbor (L3)
- [ ] **Day 155 (2026-11-30, 周一)** · 主题: sai_create_router_interface
- 🔧 动手: 实现 RIF 概念 (150min)
- 📤 产出: commit "rif"
- [ ] **Day 156 (2026-12-01, 周二)** · 主题: sai_create_neighbor
- 🔧 动手: ARP/ND 表 (180min)
- 🐧 内核对照: 读 `net/ipv4/arp.c` 看 ARP 状态机(NUD_* states)(30min)
- 📤 产出: commit "neighbor"
- [ ] **Day 157 (2026-12-02, 周三)** · 主题: sai_create_next_hop
- 🔧 动手: nexthop 表 (150min)
- 📤 产出: commit "nexthop"
- [ ] **Day 158 (2026-12-03, 周四)** · 主题: sai_create_route_entry
- 🔧 动手: rte_lpm 路由表 (180min)
- 📤 产出: commit "route lpm"
- [ ] **Day 159 (2026-12-04, 周五)** · 主题: L3 转发路径
- 🔧 动手: LPM 查表 → 改 dst MAC → 转发 (180min)
- 📤 产出: commit "l3 forward"
- [ ] **Day 160 (2026-12-05, 周六)** · 主题: 大块实验 — L3 跑通
- 🔧 动手: SONiC 配 IP + 静态路由 + ping (360min)
- 📤 产出: `perf-data/P2/W23-l3-test.md`
- [ ] **Day 161 (2026-12-06, 周日)** · ☕ 复盘
- 📤 产出: `notes/P2/W23-summary.md`
---
### Week 24 (Day 162-168) · sai_acl + rte_flow
- [ ] **Day 162 (2026-12-07, 周一)** · 主题: SAI ACL 模型
- 📖 学习: ACL table / group / entry / counter (120min)
- 📤 产出: `notes/P2/W24-D1-acl-model.md`
- [ ] **Day 163 (2026-12-08, 周二)** · 主题: rte_flow 映射设计
- 🔧 动手: 设计 SAI ACL → rte_flow 转换规则 (150min)
- 🐧 内核对照: 读 `net/sched/cls_flower.c` 看内核 flow classifier (30min)
- 📤 产出: `docs/acl-mapping.md`(含 rte_flow vs tc-flower 对照)
- [ ] **Day 164 (2026-12-09, 周三)** · 主题: sai_create_acl_table
- 🔧 动手: 实现 ACL table 容器 (150min)
- 📤 产出: commit "acl table"
- [ ] **Day 165 (2026-12-10, 周四)** · 主题: sai_create_acl_entry
- 🔧 动手: 转 rte_flow rule 下发网卡 (180min)
- 📤 产出: commit "acl entry"
- [ ] **Day 166 (2026-12-11, 周五)** · 主题: ACL counter
- 🔧 动手: rte_flow counter action (120min)
- 📤 产出: commit "acl counter"
- [ ] **Day 167 (2026-12-12, 周六)** · 主题: 大块实验 — ACL 跑通
- 🔧 动手: SONiC 配置 ACL drop 某 IP,验证 (360min)
- 📤 产出: `perf-data/P2/W24-acl-test.md`
- [ ] **Day 168 (2026-12-13, 周日)** · ☕ 复盘
- 📤 产出: `notes/P2/W24-summary.md`
---
### Week 25 (Day 169-175) · sai pkt-io (host_if)
- [ ] **Day 169 (2026-12-14, 周一)** · 主题: SAI host_if 模型
- 📖 学习: trap group / trap / host_if (120min)
- 📤 产出: `notes/P2/W25-D1-hostif-model.md`
- [ ] **Day 170 (2026-12-15, 周二)** · 主题: TAP 设备桥接
- 🔧 动手: 创建 TAP,绑定到 SAI port (150min)
- 🐧 内核对照: 读 `drivers/net/tun.c` 看 tun/tap 完整实现 (45min)
- 📤 产出: commit "tap binding"
- [ ] **Day 171 (2026-12-16, 周三)** · 主题: CPU 收包路径
- 🔧 动手: 命中 trap 的包送 TAP (180min)
- 📤 产出: commit "cpu rx"
- [ ] **Day 172 (2026-12-17, 周四)** · 主题: CPU 发包路径
- 🔧 动手: TAP 写入的包 → DPDK tx (150min)
- 📤 产出: commit "cpu tx"
- [ ] **Day 173 (2026-12-18, 周五)** · 主题: BGP/LACP 跑通验证
- 🔧 动手: 起 FRR,看能不能建邻居 (180min)
- 📤 产出: `perf-data/P2/W25-bgp-test.md`
- [ ] **Day 174 (2026-12-19, 周六)** · 主题: 大块实验 — 端到端打通
- 🔧 动手: SONiC + sai-dpdk-mini 跑完整 L2/L3/ACL/BGP (360min)
- 📤 产出: 演示视频/截图
- [ ] **Day 175 (2026-12-20, 周日)** · ☕ 复盘
- 📤 产出: `notes/P2/W25-summary.md`
---
### Week 26 (Day 176-182) · 集成 + 答辩
- [ ] **Day 176 (2026-12-21, 周一)** · 主题: 集成测试
- 🔧 动手: 跑 SONiC PTF / VS test (180min)
- 📤 产出: `perf-data/P2/W26-vs-test.md`
- [ ] **Day 177 (2026-12-22, 周二)** · 主题: README + 架构图
- 🔧 动手: 完善 sai-dpdk-mini 文档 (180min)
- 🐧 内核对照: 在 README 加一节 "SAI vs Linux kernel netdev API 对照" (30min)
- 📤 产出: `code/sai-dpdk-mini/README.md`
- [ ] **Day 178 (2026-12-23, 周三)** · 主题: 技术博客 (1)
- 🔧 动手: "SONiC 控制面 → SAI → DPDK 全链路" (180min)
- 📤 产出: `blog/P2-sonic-sai-dpdk.md`
- [ ] **Day 179 (2026-12-24, 周四)** · 主题: 技术博客 (2)
- 🔧 动手: "用 DPDK 实现 SAI 最小适配器" (180min)
- 📤 产出: `blog/P2-sai-dpdk-mini.md`
- [ ] **Day 180 (2026-12-25, 周五)** · 主题: 简历更新 v2
- 🔧 动手: 加入 P2 项目 (90min)
- 📤 产出: `career/resume-v2.md`
- [ ] **Day 181 (2026-12-26, 周六)** · 主题: 大块实验 — 开源发布
- 🔧 动手: GitHub release v0.1,发知乎/掘金 (240min)
- 📤 产出: GitHub release + 推广帖
- [ ] **Day 182 (2026-12-27, 周日)** · 🎯 P2 阶段答辩
- 📤 产出: `P2-final/answer.md` + `P2-final/retro.md` + `monthly/2026-12.md`
---
# P3 · vSwitch / 云网关数据面 (M7-M9)
> **Day 183-273**, 2026-12-28 ~ 2027-03-28
> **核心目标**: 吃透 OVS-DPDK 数据面、入门 VPP 并写出 plugin、自研一个用户态 LB 原型
## P3.0 阶段目标
1. OVS-DPDK 源码精读 + 调优实战
2. VPP 入门 + 写一个自定义 node 插件
3. 自研 `udp-lb` / `tcp-lb`:4-tuple hash + RSS + 健康检查
4. 跑通一个云网关原型(NAT/SNAT/DNAT)
## P3.1 关键交付物
- [ ] `notes/P3/` 13 周笔记
- [ ] `code/vpp-plugin-demo/` VPP 自定义 node
- [ ] `code/dpdk-lb/` 自研用户态 LB
- [ ] `perf-data/P3/` OVS-DPDK 调优数据
## P3.1.5 🐧 本阶段内核对照清单(K5 + K6)
| 周 | 对照主题 | 内核源码路径 |
|---|---|---|
| W27 | 内核 OVS datapath | `net/openvswitch/datapath.c`, `flow_table.c` |
| W28 | 内核 OVS flow_table | `net/openvswitch/flow_table.c` |
| W29 | 内核 conntrack | `net/netfilter/nf_conntrack_core.c` |
| W30 | qdisc + 速率限制 | `net/sched/sch_*.c` |
| W31 | bridge fast path | `net/bridge/br_input.c` |
| W32 | netdev_rx_handler | `net/core/dev.c::netif_receive_skb_core` |
| W33 | XDP 程序加载 | `net/core/dev.c::dev_xdp_install` |
| W34 | XDP redirect / cpumap | `kernel/bpf/cpumap.c`, `devmap.c` |
| W35 | IPVS (LVS) 内核 LB 实现 | `net/netfilter/ipvs/ip_vs_core.c` |
| W36 | maglev / consistent hash | `net/netfilter/ipvs/ip_vs_sh.c` |
| W37 | tc flower offload | `net/sched/cls_flower.c` |
| W38 | NAT (nftables) | `net/netfilter/nf_nat_core.c` |
| W39 | 总结:OVS-kernel vs OVS-DPDK 对照 | — |
## P3.2 周计划总览 (W27-W39)
| 周 | Day | 主题 | 里程碑 |
|---|---|---|---|
| W27 | 183-189 | OVS 架构总览 | ovs-vswitchd 起来 |
| W28 | 190-196 | OVS-DPDK datapath | dpcls/dpif |
| W29 | 197-203 | OVS megaflow | EMC + megaflow 抓数据 |
| W30 | 204-210 | OVS-DPDK 调优 | PMD threads tune |
| W31 | 211-217 | VPP 架构 | hello node |
| W32 | 218-224 | VPP graph model | 自定义 node |
| W33 | 225-231 | VPP plugin 框架 | 插件骨架 |
| W34 | 232-238 | VPP plugin 实现 | 编译/加载 |
| W35 | 239-245 | LB 设计 | RFC + 架构 |
| W36 | 246-252 | LB 数据面 | 4-tuple hash |
| W37 | 253-259 | LB 健康检查 | active probe |
| W38 | 260-266 | NAT/SNAT/DNAT | conntrack |
| W39 | 267-273 | P3 总结 | 答辩 |
## P3.3 详细日计划
### Week 27 (Day 183-189) · OVS 架构总览
- [ ] **Day 183 (2026-12-28, 周一)** · 主题: OVS 总体架构
- 📖 学习: ovs-architecture.7 文档 (120min)
- 📤 产出: `notes/P3/W27-D1-ovs-arch.md`
- [ ] **Day 184 (2026-12-29, 周二)** · 主题: OVS 编译 + DPDK 支持
- 🔧 动手: 编译 ovs-3.x with-dpdk (120min)
- 🐧 内核对照: 读 `net/openvswitch/datapath.c::ovs_dp_process_packet` (30min)
- 📤 产出: `notes/P3/W27-D2-ovs-build.md`
- [ ] **Day 185 (2026-12-30, 周三)** · 主题: 启动 ovs-vswitchd
- 🔧 动手: 配 dpdk-init + 创建 br0 (120min)
- 📤 产出: `notes/P3/W27-D3-ovs-up.md`
- [ ] **Day 186 (2026-12-31, 周四)** · 主题: 添加 dpdk port
- 🔧 动手: add-port 绑定 dpdk0/dpdk1 (120min)
- 📤 产出: `notes/P3/W27-D4-dpdk-port.md`
- [ ] **Day 187 (2027-01-01, 周五)** · ☕ 元旦假期 — 留白
- [ ] **Day 188 (2027-01-02, 周六)** · ☕ 元旦假期 — 留白
- [ ] **Day 189 (2027-01-03, 周日)** · ☕ 元旦假期 — 留白
---
### Week 28 (Day 190-196) · OVS-DPDK datapath
- [ ] **Day 190 (2027-01-04, 周一)** · 主题: dpif-netdev 总览
- 📖 学习: `lib/dpif-netdev.c` (120min)
- 📤 产出: `notes/P3/W28-D1-dpif.md`
- [ ] **Day 191 (2027-01-05, 周二)** · 主题: PMD threads
- 📖 学习: pmd_thread_main 主循环 (150min)
- 🐧 内核对照: 读 `net/openvswitch/flow_table.c` 看内核 OVS megaflow (30min)
- 📤 产出: `notes/P3/W28-D2-pmd.md`
- [ ] **Day 192 (2027-01-06, 周三)** · 主题: EMC (exact match cache)
- 📖 学习: emc_lookup / emc_insert (120min)
- 📤 产出: `notes/P3/W28-D3-emc.md`
- [ ] **Day 193 (2027-01-07, 周四)** · 主题: dpcls (megaflow cache)
- 📖 学习: dpcls_lookup (150min)
- 📤 产出: `notes/P3/W28-D4-dpcls.md`
- [ ] **Day 194 (2027-01-08, 周五)** · 主题: upcall slow path
- 📖 学习: upcall_xlate (90min)
- 📤 产出: `notes/P3/W28-D5-upcall.md`
- [ ] **Day 195 (2027-01-09, 周六)** · 主题: 大块实验 — 抓 OVS 数据面
- 🔧 动手: 用 perf 抓 PMD 热点 (360min)
- 📤 产出: `flamegraph/W28-ovs.svg`
- [ ] **Day 196 (2027-01-10, 周日)** · ☕ 复盘
- 📤 产出: `notes/P3/W28-summary.md`
---
### Week 29 (Day 197-203) · OVS megaflow
- [ ] **Day 197 (2027-01-11, 周一)** · 主题: megaflow 概念
- 📖 学习: 通配符 + bitmask (120min)
- 📤 产出: `notes/P3/W29-D1-megaflow.md`
- [ ] **Day 198 (2027-01-12, 周二)** · 主题: 抓 megaflow 表
- 🔧 动手: `ovs-appctl dpctl/dump-flows` (120min)
- 🐧 内核对照: 读 `net/netfilter/nf_conntrack_core.c::nf_conntrack_in` (30min)
- 📤 产出: `notes/P3/W29-D2-dump-flows.md`
- [ ] **Day 199 (2027-01-13, 周三)** · 主题: revalidator
- 📖 学习: revalidator 线程 (120min)
- 📤 产出: `notes/P3/W29-D3-revalidator.md`
- [ ] **Day 200 (2027-01-14, 周四)** · 主题: SMC (signature match cache)
- 📖 学习: SMC 优化 (90min)
- 📤 产出: `notes/P3/W29-D4-smc.md`
- [ ] **Day 201 (2027-01-15, 周五)** · 主题: connection tracking
- 📖 学习: conntrack 模块 (120min)
- 📤 产出: `notes/P3/W29-D5-ct.md`
- [ ] **Day 202 (2027-01-16, 周六)** · 主题: 大块实验 — 流表压力测试
- 🔧 动手: 用 dperf 打 100 万流,观察 EMC/SMC/dpcls 命中率 (360min)
- 📤 产出: `perf-data/P3/W29-flow-stress.md`
- [ ] **Day 203 (2027-01-17, 周日)** · ☕ 复盘
- 📤 产出: `notes/P3/W29-summary.md`
---
### Week 30 (Day 204-210) · OVS-DPDK 调优
- [ ] **Day 204 (2027-01-18, 周一)** · 主题: PMD core 绑定
- 🔧 动手: pmd-cpu-mask 调试 (120min)
- 📤 产出: `notes/P3/W30-D1-pmd-mask.md`
- [ ] **Day 205 (2027-01-19, 周二)** · 主题: RXQ assignment
- 🔧 动手: pmd-rxq-affinity (120min)
- 🐧 内核对照: 读 `net/sched/sch_htb.c` 看内核 qdisc 限速 (30min)
- 📤 产出: `notes/P3/W30-D2-rxq.md`
- [ ] **Day 206 (2027-01-20, 周三)** · 主题: mbuf 池调整
- 🔧 动手: shared mempool 配置 (120min)
- 📤 产出: `notes/P3/W30-D3-mbuf.md`
- [ ] **Day 207 (2027-01-21, 周四)** · 主题: TX flush 周期
- 🔧 动手: tx-flush-interval 调优 (120min)
- 📤 产出: `notes/P3/W30-D4-tx-flush.md`
- [ ] **Day 208 (2027-01-22, 周五)** · 主题: hardware offload
- 🔧 动手: hw-offload=true 试跑 (120min)
- 📤 产出: `notes/P3/W30-D5-hw-offload.md`
- [ ] **Day 209 (2027-01-23, 周六)** · 主题: 大块实验 — 调优冲线速
- 🔧 动手: 把 OVS-DPDK 调到接近线速 (480min)
- 📤 产出: `perf-data/P3/W30-ovs-perf.md`
- [ ] **Day 210 (2027-01-24, 周日)** · ☕ 复盘
- 📤 产出: `notes/P3/W30-summary.md`
---
### Week 31 (Day 211-217) · VPP 架构
- [ ] **Day 211 (2027-01-25, 周一)** · 主题: VPP 总览
- 📖 学习: VPP fd.io 文档 (120min)
- 📤 产出: `notes/P3/W31-D1-vpp-overview.md`
- [ ] **Day 212 (2027-01-26, 周二)** · 主题: VPP 编译安装
- 🔧 动手: 从源码编译 (120min)
- 🐧 内核对照: 读 `net/bridge/br_input.c` 看内核 bridge fast path (30min)
- 📤 产出: `notes/P3/W31-D2-vpp-build.md`
- [ ] **Day 213 (2027-01-27, 周三)** · 主题: VPP CLI 基础
- 🔧 动手: vppctl 配置 L2/L3 (120min)
- 📤 产出: `notes/P3/W31-D3-vpp-cli.md`
- [ ] **Day 214 (2027-01-28, 周四)** · 主题: vector packet processing
- 📖 学习: VPP 的 vector graph 模型 (150min)
- 📤 产出: `notes/P3/W31-D4-graph.md`
- [ ] **Day 215 (2027-01-29, 周五)** · 主题: VPP 主要 nodes
- 📖 学习: dpdk-input / ip4-lookup / ip4-rewrite (120min)
- 📤 产出: `notes/P3/W31-D5-nodes.md`
- [ ] **Day 216 (2027-01-30, 周六)** · 主题: 大块实验 — VPP L3 转发
- 🔧 动手: 配两口 + 静态路由 + 压测 (360min)
- 📤 产出: `perf-data/P3/W31-vpp-l3.md`
- [ ] **Day 217 (2027-01-31, 周日)** · ☕ 复盘 + 月度
- 📤 产出: `notes/P3/W31-summary.md` + `monthly/2027-01.md`
---
### Week 32 (Day 218-224) · VPP graph model
- [ ] **Day 218 (2027-02-01, 周一)** · 主题: node registration
- 📖 学习: VLIB_REGISTER_NODE 宏 (120min)
- 📤 产出: `notes/P3/W32-D1-node-reg.md`
- [ ] **Day 219 (2027-02-02, 周二)** · 主题: node function
- 📖 学习: 写一个最小 node (150min)
- 🐧 内核对照: 读 `net/core/dev.c::netdev_rx_handler_register` 看内核 rx_handler 注入机制 (30min)
- 📤 产出: `code/P3/vpp-hello-node/`
- [ ] **Day 220 (2027-02-03, 周三)** · 主题: next nodes
- 📖 学习: vlib_node_runtime_t::next_index (120min)
- 📤 产出: `notes/P3/W32-D3-next.md`
- [ ] **Day 221 (2027-02-04, 周四)** · 主题: buffer & metadata
- 📖 学习: vlib_buffer_t (120min)
- 📤 产出: `notes/P3/W32-D4-vlib-buf.md`
- [ ] **Day 222 (2027-02-05, 周五)** · 主题: trace + counter
- 🔧 动手: 给 node 加 trace (120min)
- 📤 产出: `notes/P3/W32-D5-trace.md`
- [ ] **Day 223 (2027-02-06, 周六)** · ☕ 春节假期 — 留白
- [ ] **Day 224 (2027-02-07, 周日)** · ☕ 春节假期 — 留白
---
### Week 33 (Day 225-231) · VPP plugin 框架
- [ ] **Day 225 (2027-02-08, 周一)** · ☕ 春节假期 — 留白
- [ ] **Day 226 (2027-02-09, 周二)** · ☕ 春节假期 — 留白
- [ ] **Day 227 (2027-02-10, 周三)** · ☕ 春节假期 — 留白
- [ ] **Day 228 (2027-02-11, 周四)** · ☕ 春节假期 — 留白
- [ ] **Day 229 (2027-02-12, 周五)** · ☕ 春节假期 — 留白
- [ ] **Day 230 (2027-02-13, 周六)** · 主题: plugin skeleton
- 🔧 动手: 用 vpp_plugin_template 生成骨架 (240min)
- 📤 产出: `code/P3/vpp-plugin-demo/`
- [ ] **Day 231 (2027-02-14, 周日)** · ☕ 复盘
- 📤 产出: `notes/P3/W33-summary.md`
---
### Week 34 (Day 232-238) · VPP plugin 实现
- [ ] **Day 232 (2027-02-15, 周一)** · 主题: API 定义
- 🔧 动手: 写 .api 文件 (120min)
- 📤 产出: commit "api def"
- [ ] **Day 233 (2027-02-16, 周二)** · 主题: CLI 命令
- 🔧 动手: 注册自定义 vppctl 命令 (150min)
- 🐧 内核对照: 读 `kernel/bpf/cpumap.c` 看 XDP cpumap 程序加载 (30min)
- 📤 产出: commit "cli"
- [ ] **Day 234 (2027-02-17, 周三)** · 主题: node 实现
- 🔧 动手: 写一个 IP 黑名单 drop node (180min)
- 📤 产出: commit "blacklist node"
- [ ] **Day 235 (2027-02-18, 周四)** · 主题: 接入 graph
- 🔧 动手: 插到 ip4-input 之后 (120min)
- 📤 产出: commit "graph hook"
- [ ] **Day 236 (2027-02-19, 周五)** · 主题: 单元测试
- 🔧 动手: 用 VPP test framework (120min)
- 📤 产出: commit "tests"
- [ ] **Day 237 (2027-02-20, 周六)** · 主题: 大块实验 — 黑名单压测
- 🔧 动手: 10 万条黑名单 + 压测 (360min)
- 📤 产出: `perf-data/P3/W34-blacklist.md`
- [ ] **Day 238 (2027-02-21, 周日)** · ☕ 复盘
- 📤 产出: `notes/P3/W34-summary.md`
---
### Week 35 (Day 239-245) · LB 设计
- [ ] **Day 239 (2027-02-22, 周一)** · 主题: LB 需求分析
- 🔧 动手: 写需求文档(L4/L7、DR/NAT)(120min)
- 📤 产出: `docs/dpdk-lb-req.md`
- [ ] **Day 240 (2027-02-23, 周二)** · 主题: 主流 LB 调研
- 📖 学习: LVS / Maglev / Katran (180min)
- 🐧 内核对照: 读 `net/netfilter/ipvs/ip_vs_core.c::ip_vs_in` 看 LVS 数据面 (30min)
- 📤 产出: `notes/P3/W35-D2-lb-survey.md`
- [ ] **Day 241 (2027-02-24, 周三)** · 主题: hash 算法选型
- 📖 学习: 一致性 hash / Maglev hash (120min)
- 📤 产出: `notes/P3/W35-D3-hash.md`
- [ ] **Day 242 (2027-02-25, 周四)** · 主题: 架构设计
- 🔧 动手: 画架构图 (150min)
- 📤 产出: `docs/dpdk-lb-arch.md`
- [ ] **Day 243 (2027-02-26, 周五)** · 主题: 仓库脚手架
- 🔧 动手: 初始化 (120min)
- 📤 产出: `code/dpdk-lb/`
- [ ] **Day 244 (2027-02-27, 周六)** · 主题: 大块实验 — 控制面 mock
- 🔧 动手: 写一个 mock config 接口 (360min)
- 📤 产出: commit "config api"
- [ ] **Day 245 (2027-02-28, 周日)** · ☕ 复盘 + 月度
- 📤 产出: `notes/P3/W35-summary.md` + `monthly/2027-02.md`
---
### Week 36 (Day 246-252) · LB 数据面
- [ ] **Day 246 (2027-03-01, 周一)** · 主题: RX + parse
- 🔧 动手: 实现 RX 路径 (180min)
- 📤 产出: commit "rx parse"
- [ ] **Day 247 (2027-03-02, 周二)** · 主题: 4-tuple hash
- 🔧 动手: rte_hash + Maglev hash (180min)
- 🐧 内核对照: 读 `net/netfilter/ipvs/ip_vs_sh.c` 看内核源散列调度 (30min)
- 📤 产出: commit "hash"
- [ ] **Day 248 (2027-03-03, 周三)** · 主题: backend 选择
- 🔧 动手: real server 列表 + 状态 (150min)
- 📤 产出: commit "backend pick"
- [ ] **Day 249 (2027-03-04, 周四)** · 主题: NAT 改写
- 🔧 动手: 改 dst IP/MAC (150min)
- 📤 产出: commit "nat rewrite"
- [ ] **Day 250 (2027-03-05, 周五)** · 主题: session table
- 🔧 动手: 连接表 + 超时 (180min)
- 📤 产出: commit "session table"
- [ ] **Day 251 (2027-03-06, 周六)** · 主题: 大块实验 — LB 跑通
- 🔧 动手: 配 3 个 backend,curl 验证 (360min)
- 📤 产出: `perf-data/P3/W36-lb-test.md`
- [ ] **Day 252 (2027-03-07, 周日)** · ☕ 复盘
- 📤 产出: `notes/P3/W36-summary.md`
---
### Week 37 (Day 253-259) · LB 健康检查
- [ ] **Day 253 (2027-03-08, 周一)** · 主题: 健康检查设计
- 🔧 动手: TCP/HTTP probe (150min)
- 📤 产出: commit "hc design"
- [ ] **Day 254 (2027-03-09, 周二)** · 主题: probe 线程
- 🔧 动手: 独立 service core 跑 probe (180min)
- 🐧 内核对照: 读 `net/sched/cls_flower.c` 看 tc flower + hw offload 路径 (30min)
- 📤 产出: commit "probe thread"
- [ ] **Day 255 (2027-03-10, 周三)** · 主题: 故障切换
- 🔧 动手: 摘除 unhealthy backend (150min)
- 📤 产出: commit "failover"
- [ ] **Day 256 (2027-03-11, 周四)** · 主题: 统计 + Prometheus
- 🔧 动手: 暴露 metrics (150min)
- 📤 产出: commit "metrics"
- [ ] **Day 257 (2027-03-12, 周五)** · 主题: 压力测试
- 🔧 动手: dperf 打 1Mpps (180min)
- 📤 产出: `perf-data/P3/W37-lb-stress.md`
- [ ] **Day 258 (2027-03-13, 周六)** · 主题: 大块实验 — LB 调优
- 🔧 动手: 调到 5Mpps (480min)
- 📤 产出: `perf-data/P3/W37-lb-tune.md`
- [ ] **Day 259 (2027-03-14, 周日)** · ☕ 复盘
- 📤 产出: `notes/P3/W37-summary.md`
---
### Week 38 (Day 260-266) · NAT/SNAT/DNAT
- [ ] **Day 260 (2027-03-15, 周一)** · 主题: NAT 概念
- 📖 学习: SNAT/DNAT/Hairpin (120min)
- 📤 产出: `notes/P3/W38-D1-nat.md`
- [ ] **Day 261 (2027-03-16, 周二)** · 主题: conntrack 设计
- 🔧 动手: 设计连接表 (150min)
- 🐧 内核对照: 读 `net/netfilter/nf_nat_core.c::nf_nat_setup_info` 看内核 NAT 实现 (30min)
- 📤 产出: `docs/conntrack.md`
- [ ] **Day 262 (2027-03-17, 周三)** · 主题: SNAT 实现
- 🔧 动手: 出方向源地址池 (180min)
- 📤 产出: commit "snat"
- [ ] **Day 263 (2027-03-18, 周四)** · 主题: DNAT 实现
- 🔧 动手: 入方向目的地址改写 (180min)
- 📤 产出: commit "dnat"
- [ ] **Day 264 (2027-03-19, 周五)** · 主题: ALG (FTP) 略
- 📖 学习: ALG 思路 (90min)
- 📤 产出: `notes/P3/W38-D5-alg.md`
- [ ] **Day 265 (2027-03-20, 周六)** · 主题: 大块实验 — NAT 跑通
- 🔧 动手: 配置 SNAT/DNAT 验证 (360min)
- 📤 产出: `perf-data/P3/W38-nat-test.md`
- [ ] **Day 266 (2027-03-21, 周日)** · ☕ 复盘
- 📤 产出: `notes/P3/W38-summary.md`
---
### Week 39 (Day 267-273) · P3 总结
- [ ] **Day 267 (2027-03-22, 周一)** · 主题: 整理产出
- 🔧 动手: 组织 P3 文档 (180min)
- 📤 产出: `P3-final/`
- [ ] **Day 268 (2027-03-23, 周二)** · 主题: 技术博客 (1)
- 🔧 动手: "OVS-DPDK 调优实战" (180min)
- 🐧 内核对照: 博客加一节 "OVS-kernel vs OVS-DPDK datapath 对照" (30min)
- 📤 产出: `blog/P3-ovs-tuning.md`
- [ ] **Day 269 (2027-03-24, 周三)** · 主题: 技术博客 (2)
- 🔧 动手: "用 DPDK 写一个 5Mpps LB" (180min)
- 📤 产出: `blog/P3-dpdk-lb.md`
- [ ] **Day 270 (2027-03-25, 周四)** · 主题: 技术博客 (3)
- 🔧 动手: "VPP graph model 与自定义 plugin" (180min)
- 📤 产出: `blog/P3-vpp-plugin.md`
- [ ] **Day 271 (2027-03-26, 周五)** · 主题: 简历更新 v3
- 🔧 动手: 加 P3 (90min)
- 📤 产出: `career/resume-v3.md`
- [ ] **Day 272 (2027-03-27, 周六)** · 主题: 大块实验 — 开源 dpdk-lb
- 🔧 动手: 发 GitHub + 写中英 README (240min)
- 📤 产出: GitHub release
- [ ] **Day 273 (2027-03-28, 周日)** · 🎯 P3 阶段答辩
- 📤 产出: `P3-final/answer.md` + `P3-final/retro.md` + `monthly/2027-03.md`
---
# P4 · 网络安全数据面 (M10-M12)
> **Day 274-364**, 2027-03-29 ~ 2027-06-27
> **核心目标**: Suricata-DPDK 跑通;自研一个 DDoS 清洗原型(抗 5Mpps SYN flood);理解 IDS/IPS 数据面
## P4.0 阶段目标
1. Suricata DPDK 模式跑通 + 调优
2. 自研 DDoS 清洗:SYN cookie / 速率限制 / 黑白名单
3. 理解 TLS fingerprint (JA3/JA4)
4. 输出 3 篇安全数据面博客
## P4.1 关键交付物
- [ ] `notes/P4/` 13 周笔记
- [ ] `code/ddos-clean/` 自研 DDoS 清洗
- [ ] `perf-data/P4/` 5Mpps SYN flood 抗压数据
## P4.1.5 🐧 本阶段内核对照清单(K5 深入 + syn cookie)
| 周 | 对照主题 | 内核源码路径 |
|---|---|---|
| W40 | 内核 IDS/IPS hook 点 | `net/netfilter/core.c`, `nf_hook_slow` |
| W41 | AF_PACKET / PACKET_MMAP | `net/packet/af_packet.c` |
| W42 | XDP DDoS drop | `samples/bpf/xdp_ddos*.c` |
| W43 | nftables 规则匹配 | `net/netfilter/nf_tables_core.c` |
| W44 | TLS kernel offload (kTLS) | `net/tls/` |
| W45 | 内核限速 (tbf/police) | `net/sched/sch_tbf.c` |
| W46 | 内核 SYN cookie | `net/ipv4/syncookies.c` |
| W47 | 内核 UDP 流量控制 | `net/ipv4/udp.c` |
| W48 | conntrack helper (DNS/FTP) | `net/netfilter/nf_conntrack_helper.c` |
| W49 | ipset (大规模 IP 集合) | `net/netfilter/ipset/` |
| W50 | BPF-based rate limit | `kernel/bpf/`, `samples/bpf/` |
| W51 | 内核 perf + tracepoints | `include/trace/events/net.h` |
| W52 | 总结:内核 vs 用户态清洗对比 | — |
## P4.2 周计划总览 (W40-W52)
| 周 | Day | 主题 | 里程碑 |
|---|---|---|---|
| W40 | 274-280 | DDoS 攻击类型 | 攻击谱系 |
| W41 | 281-287 | Suricata 编译 | dpdk runmode |
| W42 | 288-294 | Suricata 数据面 | 抓性能 |
| W43 | 295-301 | Suricata 规则 | Emerging Threats |
| W44 | 302-308 | TLS fingerprint | JA3/JA4 |
| W45 | 309-315 | DDoS 清洗设计 | RFC |
| W46 | 316-322 | SYN flood 防护 | SYN cookie |
| W47 | 323-329 | UDP flood 防护 | rate limit |
| W48 | 330-336 | reflection attack | DNS amp |
| W49 | 337-343 | 黑白名单 + ASN | geo block |
| W50 | 344-350 | 抗压测试 | 5Mpps |
| W51 | 351-357 | 整体调优 | 火焰图 |
| W52 | 358-364 | P4 总结 | 答辩 |
## P4.3 详细日计划
### Week 40 (Day 274-280) · DDoS 攻击类型
- [ ] **Day 274 (2027-03-29, 周一)** · 主题: 攻击分类
- 📖 学习: volumetric / protocol / application (120min)
- 📤 产出: `notes/P4/W40-D1-attack-types.md`
- [ ] **Day 275 (2027-03-30, 周二)** · 主题: SYN flood 深入
- 📖 学习: 半连接队列 + cookie (90min)
- 🐧 内核对照: 读 `net/ipv4/syncookies.c` 完整 SYN cookie 实现 (45min)
- 📤 产出: `notes/P4/W40-D2-syn-flood.md`
- [ ] **Day 276 (2027-03-31, 周三)** · 主题: UDP/ICMP flood
- 📖 学习: 反射放大 (90min)
- 📤 产出: `notes/P4/W40-D3-udp-flood.md`
- [ ] **Day 277 (2027-04-01, 周四)** · 主题: HTTP/CC 攻击
- 📖 学习: 慢攻击 + 应用层 (90min)
- 📤 产出: `notes/P4/W40-D4-cc.md`
- [ ] **Day 278 (2027-04-02, 周五)** · 主题: 业界清洗设备
- 📖 学习: Arbor / NSFOCUS / 阿里 SCDN (120min)
- 📤 产出: `notes/P4/W40-D5-vendors.md`
- [ ] **Day 279 (2027-04-03, 周六)** · ☕ 清明假期 — 留白
- [ ] **Day 280 (2027-04-04, 周日)** · ☕ 清明假期 — 留白
---
### Week 41 (Day 281-287) · Suricata 编译
- [ ] **Day 281 (2027-04-05, 周一)** · ☕ 清明假期 — 留白
- [ ] **Day 282 (2027-04-06, 周二)** · 主题: Suricata 编译
- 🔧 动手: with-dpdk 编译 (120min)
- 🐧 内核对照: 读 `net/packet/af_packet.c` 看 AF_PACKET / PACKET_MMAP (30min)
- 📤 产出: `notes/P4/W41-D2-build.md`
- [ ] **Day 283 (2027-04-07, 周三)** · 主题: dpdk runmode 配置
- 🔧 动手: suricata.yaml dpdk 配置 (120min)
- 📤 产出: `notes/P4/W41-D3-cfg.md`
- [ ] **Day 284 (2027-04-08, 周四)** · 主题: IDS 模式起跑
- 🔧 动手: 用 ET rule 跑 IDS (120min)
- 📤 产出: `notes/P4/W41-D4-ids.md`
- [ ] **Day 285 (2027-04-09, 周五)** · 主题: IPS 模式
- 🔧 动手: inline + drop 测试 (120min)
- 📤 产出: `notes/P4/W41-D5-ips.md`
- [ ] **Day 286 (2027-04-10, 周六)** · 主题: 大块实验 — 性能 baseline
- 🔧 动手: 压测 Suricata DPDK 模式吞吐 (360min)
- 📤 产出: `perf-data/P4/W41-suricata-perf.md`
- [ ] **Day 287 (2027-04-11, 周日)** · ☕ 复盘
- 📤 产出: `notes/P4/W41-summary.md`
---
### Week 42 (Day 288-294) · Suricata 数据面
- [ ] **Day 288 (2027-04-12, 周一)** · 主题: Suricata 流水线
- 📖 学习: capture → decode → flow → detect (120min)
- 📤 产出: `notes/P4/W42-D1-pipeline.md`
- [ ] **Day 289 (2027-04-13, 周二)** · 主题: flow tracker
- 📖 学习: flow.c (120min)
- 🐧 内核对照: 读 `samples/bpf/xdp_ddos*.c` 看 XDP DDoS drop 范例 (30min)
- 📤 产出: `notes/P4/W42-D2-flow.md`
- [ ] **Day 290 (2027-04-14, 周三)** · 主题: 规则匹配引擎
- 📖 学习: detect.c (150min)
- 📤 产出: `notes/P4/W42-D3-detect.md`
- [ ] **Day 291 (2027-04-15, 周四)** · 主题: Hyperscan 加速
- 📖 学习: MPM with hyperscan (120min)
- 📤 产出: `notes/P4/W42-D4-hs.md`
- [ ] **Day 292 (2027-04-16, 周五)** · 主题: workers 模型
- 📖 学习: workers vs autofp (90min)
- 📤 产出: `notes/P4/W42-D5-workers.md`
- [ ] **Day 293 (2027-04-17, 周六)** · 主题: 大块实验 — Suricata 调优
- 🔧 动手: 调到 10Gbps wire speed (480min)
- 📤 产出: `perf-data/P4/W42-tune.md`
- [ ] **Day 294 (2027-04-18, 周日)** · ☕ 复盘
- 📤 产出: `notes/P4/W42-summary.md`
---
### Week 43 (Day 295-301) · Suricata 规则
- [ ] **Day 295 (2027-04-19, 周一)** · 主题: 规则语法
- 📖 学习: rule format (90min)
- 📤 产出: `notes/P4/W43-D1-rule-syntax.md`
- [ ] **Day 296 (2027-04-20, 周二)** · 主题: ET Open 规则
- 🔧 动手: 加载 ET Open + 验证 (120min)
- 🐧 内核对照: 读 `net/netfilter/nf_tables_core.c` 看 nft 规则匹配主循环 (30min)
- 📤 产出: `notes/P4/W43-D2-et.md`
- [ ] **Day 297 (2027-04-21, 周三)** · 主题: 自定义规则
- 🔧 动手: 写一条 SSH 暴力破解检测 (120min)
- 📤 产出: `code/P4/custom-rules/`
- [ ] **Day 298 (2027-04-22, 周四)** · 主题: lua scripting
- 📖 学习: Suricata lua 接口 (120min)
- 📤 产出: `notes/P4/W43-D4-lua.md`
- [ ] **Day 299 (2027-04-23, 周五)** · 主题: EVE JSON output
- 🔧 动手: 接 ELK 看 alert (90min)
- 📤 产出: `notes/P4/W43-D5-eve.md`
- [ ] **Day 300 (2027-04-24, 周六)** · 主题: 大块实验 — 攻击 replay
- 🔧 动手: replay 真实攻击 pcap,看是否报警 (360min)
- 📤 产出: `perf-data/P4/W43-replay.md`
- [ ] **Day 301 (2027-04-25, 周日)** · ☕ 复盘
- 📤 产出: `notes/P4/W43-summary.md`
---
### Week 44 (Day 302-308) · TLS fingerprint
- [ ] **Day 302 (2027-04-26, 周一)** · 主题: TLS handshake 复习
- 📖 学习: ClientHello 字段 (90min)
- 📤 产出: `notes/P4/W44-D1-tls.md`
- [ ] **Day 303 (2027-04-27, 周二)** · 主题: JA3
- 📖 学习: JA3 hash 算法 (90min)
- 🐧 内核对照: 读 `net/tls/tls_sw.c` 看内核 kTLS 卸载 (30min)
- 📤 产出: `notes/P4/W44-D2-ja3.md`
- [ ] **Day 304 (2027-04-28, 周三)** · 主题: JA4
- 📖 学习: JA4 升级版 (90min)
- 📤 产出: `notes/P4/W44-D3-ja4.md`
- [ ] **Day 305 (2027-04-29, 周四)** · 主题: 用 Suricata 抓 JA3
- 🔧 动手: 配规则输出 ja3 (120min)
- 📤 产出: `notes/P4/W44-D4-ja3-suricata.md`
- [ ] **Day 306 (2027-04-30, 周五)** · 主题: 月度复盘 + 整理
- 📤 产出: `monthly/2027-04.md`
- [ ] **Day 307 (2027-05-01, 周六)** · ☕ 五一假期 — 留白
- [ ] **Day 308 (2027-05-02, 周日)** · ☕ 五一假期 — 留白
---
### Week 45 (Day 309-315) · DDoS 清洗设计
- [ ] **Day 309 (2027-05-03, 周一)** · ☕ 五一假期 — 留白
- [ ] **Day 310 (2027-05-04, 周二)** · ☕ 五一假期 — 留白
- [ ] **Day 311 (2027-05-05, 周三)** · ☕ 五一假期 — 留白
- [ ] **Day 312 (2027-05-06, 周四)** · 主题: 清洗设备需求
- 🔧 动手: 写 RFC (150min)
- 📤 产出: `docs/ddos-clean-rfc.md`
- [ ] **Day 313 (2027-05-07, 周五)** · 主题: 架构设计
- 🔧 动手: 画清洗 pipeline 图 (150min)
- 📤 产出: `docs/ddos-clean-arch.md`
- [ ] **Day 314 (2027-05-08, 周六)** · 主题: 大块实验 — 仓库脚手架
- 🔧 动手: 初始化 + Makefile (360min)
- 📤 产出: `code/ddos-clean/`
- [ ] **Day 315 (2027-05-09, 周日)** · ☕ 复盘
- 📤 产出: `notes/P4/W45-summary.md`
---
### Week 46 (Day 316-322) · SYN flood 防护
- [ ] **Day 316 (2027-05-10, 周一)** · 主题: SYN cookie 原理
- 📖 学习: cookie 生成算法 (90min)
- 📤 产出: `notes/P4/W46-D1-syn-cookie.md`
- [ ] **Day 317 (2027-05-11, 周二)** · 主题: SYN proxy 实现
- 🔧 动手: 实现 SYN proxy 数据面 (180min)
- 🐧 内核对照: 读 `net/netfilter/nf_synproxy_core.c` (30min)
- 📤 产出: commit "syn proxy"
- [ ] **Day 318 (2027-05-12, 周三)** · 主题: cookie 校验
- 🔧 动手: ACK 阶段校验 cookie (150min)
- 📤 产出: commit "cookie verify"
- [ ] **Day 319 (2027-05-13, 周四)** · 主题: 后端连接保持
- 🔧 动手: 与真实服务器建二段连接 (180min)
- 📤 产出: commit "splice"
- [ ] **Day 320 (2027-05-14, 周五)** · 主题: SYN 速率限制
- 🔧 动手: token bucket (120min)
- 📤 产出: commit "syn rate limit"
- [ ] **Day 321 (2027-05-15, 周六)** · 主题: 大块实验 — SYN flood 抗压
- 🔧 动手: dperf 打 5Mpps SYN flood (480min)
- 📤 产出: `perf-data/P4/W46-syn-stress.md`
- [ ] **Day 322 (2027-05-16, 周日)** · ☕ 复盘
- 📤 产出: `notes/P4/W46-summary.md`
---
### Week 47 (Day 323-329) · UDP flood 防护
- [ ] **Day 323 (2027-05-17, 周一)** · 主题: UDP rate limit
- 🔧 动手: 实现 per-src rate limit (150min)
- 📤 产出: commit "udp rate"
- [ ] **Day 324 (2027-05-18, 周二)** · 主题: payload signature
- 🔧 动手: 检测放大攻击特征 (150min)
- 🐧 内核对照: 读 `net/ipv4/udp.c::__udp4_lib_rcv` 看内核 UDP 主入口 (30min)
- 📤 产出: commit "udp sig"
- [ ] **Day 325 (2027-05-19, 周三)** · 主题: source validation
- 🔧 动手: BCP38 检查 (120min)
- 📤 产出: commit "bcp38"
- [ ] **Day 326 (2027-05-20, 周四)** · 主题: ICMP 防护
- 🔧 动手: ICMP rate + size limit (120min)
- 📤 产出: commit "icmp"
- [ ] **Day 327 (2027-05-21, 周五)** · 主题: fragmentation 防护
- 🔧 动手: frag 重组 + 限制 (120min)
- 📤 产出: commit "frag"
- [ ] **Day 328 (2027-05-22, 周六)** · 主题: 大块实验 — UDP flood 抗压
- 🔧 动手: 测 10Mpps UDP (480min)
- 📤 产出: `perf-data/P4/W47-udp-stress.md`
- [ ] **Day 329 (2027-05-23, 周日)** · ☕ 复盘
- 📤 产出: `notes/P4/W47-summary.md`
---
### Week 48 (Day 330-336) · reflection attack
- [ ] **Day 330 (2027-05-24, 周一)** · 主题: 反射攻击谱系
- 📖 学习: DNS/NTP/SSDP/Memcached (120min)
- 📤 产出: `notes/P4/W48-D1-reflection.md`
- [ ] **Day 331 (2027-05-25, 周二)** · 主题: DNS amp 检测
- 🔧 动手: 检测异常 DNS 响应 (150min)
- 🐧 内核对照: 读 `net/netfilter/nf_conntrack_helper.c` 看 conntrack helper (30min)
- 📤 产出: commit "dns amp"
- [ ] **Day 332 (2027-05-26, 周三)** · 主题: NTP monlist 防护
- 🔧 动手: 拦截 monlist (120min)
- 📤 产出: commit "ntp"
- [ ] **Day 333 (2027-05-27, 周四)** · 主题: Memcached 防护
- 🔧 动手: 11211 异常拦截 (120min)
- 📤 产出: commit "memcached"
- [ ] **Day 334 (2027-05-28, 周五)** · 主题: 反射特征库
- 🔧 动手: 整理特征库 yaml (120min)
- 📤 产出: `config/reflection.yaml`
- [ ] **Day 335 (2027-05-29, 周六)** · 主题: 大块实验 — 反射攻击 replay
- 🔧 动手: replay 真实反射 pcap (360min)
- 📤 产出: `perf-data/P4/W48-replay.md`
- [ ] **Day 336 (2027-05-30, 周日)** · ☕ 复盘
- 📤 产出: `notes/P4/W48-summary.md`
---
### Week 49 (Day 337-343) · 黑白名单 + ASN
- [ ] **Day 337 (2027-05-31, 周一)** · 主题: 月度复盘
- 📤 产出: `monthly/2027-05.md`
- [ ] **Day 338 (2027-06-01, 周二)** · 主题: IP 黑名单
- 🔧 动手: rte_lpm 加速黑名单 (180min)
- 🐧 内核对照: 读 `net/netfilter/ipset/ip_set_hash_ip.c` 看内核 ipset (30min)
- 📤 产出: commit "ip blacklist"
- [ ] **Day 339 (2027-06-02, 周三)** · 主题: GeoIP
- 🔧 动手: 集成 MaxMind (120min)
- 📤 产出: commit "geoip"
- [ ] **Day 340 (2027-06-03, 周四)** · 主题: ASN 阻断
- 🔧 动手: ASN 级 drop (120min)
- 📤 产出: commit "asn block"
- [ ] **Day 341 (2027-06-04, 周五)** · 主题: 白名单 fast path
- 🔧 动手: 白名单直通 (120min)
- 📤 产出: commit "whitelist"
- [ ] **Day 342 (2027-06-05, 周六)** · 主题: 大块实验 — 1 千万条规则
- 🔧 动手: 加载 1000 万 IP,看查表性能 (360min)
- 📤 产出: `perf-data/P4/W49-lpm-scale.md`
- [ ] **Day 343 (2027-06-06, 周日)** · ☕ 复盘
- 📤 产出: `notes/P4/W49-summary.md`
---
### Week 50 (Day 344-350) · 抗压测试
- [ ] **Day 344 (2027-06-07, 周一)** · 主题: 混合攻击测试
- 🔧 动手: SYN + UDP + HTTP 同时打 (180min)
- 📤 产出: `perf-data/P4/W50-D1-mixed.md`
- [ ] **Day 345 (2027-06-08, 周二)** · 主题: 长连接保持率
- 🔧 动手: 攻击时合法用户存活率 (180min)
- 🐧 内核对照: 读 `include/trace/events/net.h` 看内核网络 tracepoints (30min)
- 📤 产出: `perf-data/P4/W50-D2-survival.md`
- [ ] **Day 346 (2027-06-09, 周三)** · ☕ 端午假期 — 留白
- [ ] **Day 347 (2027-06-10, 周四)** · ☕ 端午假期 — 留白
- [ ] **Day 348 (2027-06-11, 周五)** · ☕ 端午假期 — 留白
- [ ] **Day 349 (2027-06-12, 周六)** · 主题: 大块实验 — 测试报告
- 🔧 动手: 整理完整测试报告 (480min)
- 📤 产出: `perf-data/P4/W50-report.md`
- [ ] **Day 350 (2027-06-13, 周日)** · ☕ 复盘
- 📤 产出: `notes/P4/W50-summary.md`
---
### Week 51 (Day 351-357) · 整体调优
- [ ] **Day 351 (2027-06-14, 周一)** · 主题: perf top
- 🔧 动手: 找热点 (150min)
- 📤 产出: `perf-data/P4/W51-D1-perf.md`
- [ ] **Day 352 (2027-06-15, 周二)** · 主题: 火焰图
- 🔧 动手: 生成调用栈火焰 (120min)
- 🐧 内核对照: 读 `kernel/bpf/verifier.c` 简述 BPF 校验器(了解 BPF 生态)(30min)
- 📤 产出: `flamegraph/W51-ddos.svg`
- [ ] **Day 353 (2027-06-16, 周三)** · 主题: cache 优化
- 🔧 动手: 优化数据结构布局 (180min)
- 📤 产出: commit "cache opt"
- [ ] **Day 354 (2027-06-17, 周四)** · 主题: 批量化
- 🔧 动手: 关键路径改批量 (180min)
- 📤 产出: commit "batch"
- [ ] **Day 355 (2027-06-18, 周五)** · 主题: 多核扩展
- 🔧 动手: 测 1/2/4/8 核扩展性 (180min)
- 📤 产出: `perf-data/P4/W51-D5-scale.md`
- [ ] **Day 356 (2027-06-19, 周六)** · 主题: 大块实验 — 极限冲线速
- 🔧 动手: 单机 100Gbps 入流量清洗 (480min)
- 📤 产出: `perf-data/P4/W51-100G.md`
- [ ] **Day 357 (2027-06-20, 周日)** · ☕ 复盘
- 📤 产出: `notes/P4/W51-summary.md`
---
### Week 52 (Day 358-364) · P4 总结
- [ ] **Day 358 (2027-06-21, 周一)** · 主题: 整理产出
- 🔧 动手: 组织 P4 文档 (180min)
- 📤 产出: `P4-final/`
- [ ] **Day 359 (2027-06-22, 周二)** · 主题: 技术博客 (1)
- 🔧 动手: "Suricata-DPDK 工程实战" (180min)
- 🐧 内核对照: 博客加对照 "AF_PACKET vs Suricata-DPDK" 章节 (30min)
- 📤 产出: `blog/P4-suricata.md`
- [ ] **Day 360 (2027-06-23, 周三)** · 主题: 技术博客 (2)
- 🔧 动手: "用 DPDK 抗 5Mpps SYN flood" (180min)
- 📤 产出: `blog/P4-syn-defense.md`
- [ ] **Day 361 (2027-06-24, 周四)** · 主题: 技术博客 (3)
- 🔧 动手: "DDoS 清洗设备数据面架构" (180min)
- 📤 产出: `blog/P4-ddos-arch.md`
- [ ] **Day 362 (2027-06-25, 周五)** · 主题: 简历 v4 + 晋升材料
- 🔧 动手: 准备晋升答辩材料 (180min)
- 📤 产出: `career/promotion-package.md`
- [ ] **Day 363 (2027-06-26, 周六)** · 主题: 大块实验 — 开源 ddos-clean
- 🔧 动手: GitHub release + 推广 (360min)
- 📤 产出: GitHub release
- [ ] **Day 364 (2027-06-27, 周日)** · 🎯 P4 阶段答辩
- 📤 产出: `P4-final/answer.md` + `P4-final/retro.md` + `monthly/2027-06.md`
---
# P5 · DPU 数据面架构 (M13-M15)
> **Day 365-455**, 2027-06-28 ~ 2027-09-26
> **核心目标**: PCIe + vDPA + rte_flow offload 全打通;输出一份 DPU 数据面架构设计文档(达到 DPU 厂商面试的水平)
## P5.0 阶段目标
1. PCIe 完全吃透:手动解码 BAR / 写最小 PCIe 驱动
2. vDPA 跑通 + 源码理解
3. rte_flow hardware offload 实测(CX5/CX6)
4. 调研 BlueField / Pensando / 国产 DPU
5. 写一份"自研 DPU 数据面架构"设计文档
## P5.1 关键交付物
- [ ] `notes/P5/` 13 周笔记
- [ ] `code/pcie-driver-demo/` 最小 PCIe 驱动
- [ ] `code/vdpa-demo/` vDPA 实验
- [ ] `docs/dpu-arch-design.md` DPU 架构设计文档(30+ 页)
## P5.1.5 🐧 本阶段内核对照清单(K7 深挖 + virtio 内核驱动)
> P5 是内核学习最密集的阶段:PCIe、VFIO、virtio-net、vhost 全在内核。
| 周 | 对照主题 | 内核源码路径 |
|---|---|---|
| W53 | 内核 PCIe 枚举 | `drivers/pci/probe.c::pci_scan_bus`, `access.c` |
| W54 | 内核 MSI/MSI-X + IOMMU | `drivers/pci/msi.c`, `drivers/iommu/` |
| W55 | 内核 pci_driver 完整生命周期 | `drivers/pci/pci-driver.c` |
| W56 | 内核 VFIO | `drivers/vfio/pci/vfio_pci_core.c` |
| W57 | 内核 virtio-net 驱动 | `drivers/net/virtio_net.c` |
| W58 | 内核 vhost | `drivers/vhost/net.c`, `vhost.c` |
| W59 | 内核 vDPA framework | `drivers/vdpa/vdpa.c`, `drivers/virtio/virtio_vdpa.c` |
| W60 | 内核 mlx5 driver 全览 | `drivers/net/ethernet/mellanox/mlx5/core/` |
| W61 | 内核 SR-IOV | `drivers/pci/iov.c` |
| W62 | 内核 DMA API | `kernel/dma/mapping.c` |
| W63 | 内核热迁移辅助 | `drivers/vfio/vfio_iommu_type1.c` migration |
| W64 | 内核 devlink (卸载配置) | `net/core/devlink.c` |
| W65 | 总结:DPU 数据面内核视角综述 | — |
## P5.2 周计划总览 (W53-W65)
| 周 | Day | 主题 | 里程碑 |
|---|---|---|---|
| W53 | 365-371 | PCIe 拓扑 + Config Space | 解码 BAR |
| W54 | 372-378 | PCIe MSI-X + DMA | DMA demo |
| W55 | 379-385 | 写最小 PCIe 驱动 | insmod 成功 |
| W56 | 386-392 | virtio-net 协议 | spec 精读 |
| W57 | 393-399 | vhost-user | qemu 接 OVS |
| W58 | 400-406 | vDPA 框架 | mdev 跑通 |
| W59 | 407-413 | vDPA driver 源码 | mlx5 vdpa |
| W60 | 414-420 | rte_flow offload | CX5 实测 |
| W61 | 421-427 | DPU 业界调研 | 厂商对比 |
| W62 | 428-434 | BlueField 深入 | DOCA 入门 |
| W63 | 435-441 | DPU 架构 RFC | 30 页设计 |
| W64 | 442-448 | 架构评审 + 模拟面试 | 答辩稿 |
| W65 | 449-455 | P5 总结 | 文档定稿 |
## P5.3 详细日计划
### Week 53 (Day 365-371) · PCIe 拓扑 + Config Space
- [ ] **Day 365 (2027-06-28, 周一)** · 主题: PCIe 总览
- 📖 学习: 《PCI Express 体系结构导读》Ch.1-2 (120min)
- 📤 产出: `notes/P5/W53-D1-pcie-overview.md`
- [ ] **Day 366 (2027-06-29, 周二)** · 主题: 拓扑探查
- 🔧 动手: `lspci -tv` 画本机拓扑图 (120min)
- 🐧 内核对照: 读 `drivers/pci/probe.c::pci_scan_bus` 看 PCIe 枚举 (45min)
- 📤 产出: `notes/P5/W53-D2-topo.md`
- [ ] **Day 367 (2027-06-30, 周三)** · 主题: Configuration Space
- 🔧 动手: `lspci -xxxx` 解码 X540 头部 (150min)
- 📤 产出: `notes/P5/W53-D3-cfg-space.md`
- [ ] **Day 368 (2027-07-01, 周四)** · 主题: BAR 解码
- 🔧 动手: 手动解码 BAR0-5 (120min)
- 📤 产出: `notes/P5/W53-D4-bar.md`
- [ ] **Day 369 (2027-07-02, 周五)** · 主题: Capability 链
- 🔧 动手: 遍历 Capability + Ext Capability (120min)
- 📤 产出: `notes/P5/W53-D5-cap.md`
- [ ] **Day 370 (2027-07-03, 周六)** · 主题: 大块实验 — setpci 实验
- 🔧 动手: 用 setpci 改寄存器观察现象 (360min)
- 📤 产出: `notes/P5/W53-D6-setpci.md`
- [ ] **Day 371 (2027-07-04, 周日)** · ☕ 复盘
- 📤 产出: `notes/P5/W53-summary.md`
---
### Week 54 (Day 372-378) · PCIe MSI-X + DMA
- [ ] **Day 372 (2027-07-05, 周一)** · 主题: MSI/MSI-X
- 📖 学习: spec + capability (120min)
- 📤 产出: `notes/P5/W54-D1-msix.md`
- [ ] **Day 373 (2027-07-06, 周二)** · 主题: MSI-X Table 定位
- 🔧 动手: 在 BAR 中找 MSI-X Table (120min)
- 🐧 内核对照: 读 `drivers/pci/msi.c::pci_alloc_irq_vectors` (45min)
- 📤 产出: `notes/P5/W54-D2-msix-table.md`
- [ ] **Day 374 (2027-07-07, 周三)** · 主题: DMA 概念
- 📖 学习: DMA address / IOVA / IOMMU (120min)
- 📤 产出: `notes/P5/W54-D3-dma.md`
- [ ] **Day 375 (2027-07-08, 周四)** · 主题: dma-buf / iommu
- 📖 学习: VFIO mode (120min)
- 📤 产出: `notes/P5/W54-D4-iommu.md`
- [ ] **Day 376 (2027-07-09, 周五)** · 主题: AER / ACS
- 📖 学习: Advanced Error Reporting (90min)
- 📤 产出: `notes/P5/W54-D5-aer.md`
- [ ] **Day 377 (2027-07-10, 周六)** · 主题: 大块实验 — IOMMU 实验
- 🔧 动手: 开关 IOMMU 跑 DPDK,观察行为 (360min)
- 📤 产出: `perf-data/P5/W54-iommu.md`
- [ ] **Day 378 (2027-07-11, 周日)** · ☕ 复盘
- 📤 产出: `notes/P5/W54-summary.md`
---
### Week 55 (Day 379-385) · 写最小 PCIe 驱动
- [ ] **Day 379 (2027-07-12, 周一)** · 主题: pci_driver 框架
- 📖 学习: `include/linux/pci.h` (120min)
- 📤 产出: `notes/P5/W55-D1-driver.md`
- [ ] **Day 380 (2027-07-13, 周二)** · 主题: probe + remove
- 🔧 动手: 写最小 probe (180min)
- 🐧 内核对照: 读 `drivers/pci/pci-driver.c::__pci_register_driver` (30min)
- 📤 产出: `code/pcie-driver-demo/main.c`
- [ ] **Day 381 (2027-07-14, 周三)** · 主题: ioremap BAR
- 🔧 动手: 映射 BAR 读寄存器 (180min)
- 📤 产出: commit "ioremap"
- [ ] **Day 382 (2027-07-15, 周四)** · 主题: MSI-X 申请
- 🔧 动手: pci_alloc_irq_vectors (180min)
- 📤 产出: commit "msix"
- [ ] **Day 383 (2027-07-16, 周五)** · 主题: 中断处理
- 🔧 动手: request_irq + handler (150min)
- 📤 产出: commit "irq handler"
- [ ] **Day 384 (2027-07-17, 周六)** · 主题: 大块实验 — 加载测试
- 🔧 动手: insmod 加载 + dmesg 观察 (360min)
- 📤 产出: `perf-data/P5/W55-load.md`
- [ ] **Day 385 (2027-07-18, 周日)** · ☕ 复盘
- 📤 产出: `notes/P5/W55-summary.md`
---
### Week 56 (Day 386-392) · virtio-net 协议
- [ ] **Day 386 (2027-07-19, 周一)** · 主题: virtio spec 总览
- 📖 学习: virtio 1.2 spec Ch.1-3 (150min)
- 📤 产出: `notes/P5/W56-D1-virtio.md`
- [ ] **Day 387 (2027-07-20, 周二)** · 主题: virtqueue
- 📖 学习: split / packed virtqueue (150min)
- 🐧 内核对照: 读 `drivers/net/virtio_net.c` 完整 RX/TX 路径 (45min)
- 📤 产出: `notes/P5/W56-D2-vq.md`
- [ ] **Day 388 (2027-07-21, 周三)** · 主题: feature bits
- 📖 学习: virtio-net 特性 (120min)
- 📤 产出: `notes/P5/W56-D3-features.md`
- [ ] **Day 389 (2027-07-22, 周四)** · 主题: virtio-net PMD
- 📖 学习: `drivers/net/virtio/` (150min)
- 📤 产出: `notes/P5/W56-D4-virtio-pmd.md`
- [ ] **Day 390 (2027-07-23, 周五)** · 主题: virtio mediator
- 📖 学习: vDPA mediator 角色 (90min)
- 📤 产出: `notes/P5/W56-D5-mediator.md`
- [ ] **Day 391 (2027-07-24, 周六)** · 主题: 大块实验 — 跑 virtio-user
- 🔧 动手: testpmd + virtio-user (360min)
- 📤 产出: `notes/P5/W56-D6-virtio-user.md`
- [ ] **Day 392 (2027-07-25, 周日)** · ☕ 复盘
- 📤 产出: `notes/P5/W56-summary.md`
---
### Week 57 (Day 393-399) · vhost-user
- [ ] **Day 393 (2027-07-26, 周一)** · 主题: vhost-user 协议
- 📖 学习: spec (120min)
- 📤 产出: `notes/P5/W57-D1-vhost.md`
- [ ] **Day 394 (2027-07-27, 周二)** · 主题: vhost-user 消息
- 📖 学习: 28 种 message (150min)
- 🐧 内核对照: 读 `drivers/vhost/net.c::vhost_net_open` (30min)
- 📤 产出: `notes/P5/W57-D2-msg.md`
- [ ] **Day 395 (2027-07-28, 周三)** · 主题: DPDK vhost lib
- 📖 学习: `lib/vhost/` (150min)
- 📤 产出: `notes/P5/W57-D3-vhost-lib.md`
- [ ] **Day 396 (2027-07-29, 周四)** · 主题: QEMU + vhost-user
- 🔧 动手: QEMU 接 OVS-DPDK 跑 VM (180min)
- 📤 产出: `notes/P5/W57-D4-qemu.md`
- [ ] **Day 397 (2027-07-30, 周五)** · 主题: VM 内 PMD
- 🔧 动手: VM 内跑 DPDK testpmd (120min)
- 📤 产出: `notes/P5/W57-D5-vm-pmd.md`
- [ ] **Day 398 (2027-07-31, 周六)** · 主题: 大块实验 — VM↔VM 性能
- 🔧 动手: 两 VM 互打,记录 PPS (360min)
- 📤 产出: `perf-data/P5/W57-vm-vm.md`
- [ ] **Day 399 (2027-08-01, 周日)** · ☕ 复盘 + 月度
- 📤 产出: `notes/P5/W57-summary.md` + `monthly/2027-07.md`
---
### Week 58 (Day 400-406) · vDPA 框架
- [ ] **Day 400 (2027-08-02, 周一)** · 主题: vDPA 概念
- 📖 学习: vDPA = virtio data path acceleration (120min)
- 📤 产出: `notes/P5/W58-D1-vdpa.md`
- [ ] **Day 401 (2027-08-03, 周二)** · 主题: vDPA 架构
- 📖 学习: kernel vDPA framework (150min)
- 🐧 内核对照: 读 `drivers/vdpa/vdpa.c` + `drivers/virtio/virtio_vdpa.c` (45min)
- 📤 产出: `notes/P5/W58-D2-arch.md`
- [ ] **Day 402 (2027-08-04, 周三)** · 主题: mdev / vhost-vdpa
- 📖 学习: 两种暴露方式 (120min)
- 📤 产出: `notes/P5/W58-D3-mdev.md`
- [ ] **Day 403 (2027-08-05, 周四)** · 主题: DPDK vdpa lib
- 📖 学习: `lib/vhost/vdpa.c` (120min)
- 📤 产出: `notes/P5/W58-D4-dpdk-vdpa.md`
- [ ] **Day 404 (2027-08-06, 周五)** · 主题: 业界 vDPA 实现
- 📖 学习: Mellanox / Intel vDPA (120min)
- 📤 产出: `notes/P5/W58-D5-impl.md`
- [ ] **Day 405 (2027-08-07, 周六)** · 主题: 大块实验 — 跑 vdpa example
- 🔧 动手: examples/vdpa 跑通 (360min)
- 📤 产出: `notes/P5/W58-D6-example.md`
- [ ] **Day 406 (2027-08-08, 周日)** · ☕ 复盘
- 📤 产出: `notes/P5/W58-summary.md`
---
### Week 59 (Day 407-413) · vDPA driver 源码
- [ ] **Day 407 (2027-08-09, 周一)** · 主题: mlx5 vdpa 总览
- 📖 学习: `drivers/vdpa/mlx5/` (120min)
- 📤 产出: `notes/P5/W59-D1-mlx5.md`
- [ ] **Day 408 (2027-08-10, 周二)** · 主题: 设备初始化
- 📖 学习: probe + setup (150min)
- 🐧 内核对照: 读 `drivers/net/ethernet/mellanox/mlx5/core/main.c` (45min)
- 📤 产出: `notes/P5/W59-D2-init.md`
- [ ] **Day 409 (2027-08-11, 周三)** · 主题: virtq 卸载
- 📖 学习: 如何把 virtqueue 映射到 HW (180min)
- 📤 产出: `notes/P5/W59-D3-virtq-offload.md`
- [ ] **Day 410 (2027-08-12, 周四)** · 主题: 控制消息
- 📖 学习: 状态变更处理 (120min)
- 📤 产出: `notes/P5/W59-D4-ctrl.md`
- [ ] **Day 411 (2027-08-13, 周五)** · 主题: live migration
- 📖 学习: vDPA 热迁移机制 (120min)
- 📤 产出: `notes/P5/W59-D5-migration.md`
- [ ] **Day 412 (2027-08-14, 周六)** · 主题: 大块实验 — 跑 mlx5 vDPA(若有)
- 🔧 动手: 若有 CX5/CX6,实跑 (360min)
- 📤 产出: `perf-data/P5/W59-mlx5-vdpa.md`
- [ ] **Day 413 (2027-08-15, 周日)** · ☕ 复盘
- 📤 产出: `notes/P5/W59-summary.md`
---
### Week 60 (Day 414-420) · rte_flow offload
- [ ] **Day 414 (2027-08-16, 周一)** · 主题: rte_flow API 复习
- 📖 学习: pattern / action / attr (120min)
- 📤 产出: `notes/P5/W60-D1-rteflow.md`
- [ ] **Day 415 (2027-08-17, 周二)** · 主题: flow 探测能力
- 🔧 动手: rte_flow_validate 探测 (120min)
- 🐧 内核对照: 读 `drivers/pci/iov.c` 看内核 SR-IOV VF 创建 (30min)
- 📤 产出: `notes/P5/W60-D2-cap.md`
- [ ] **Day 416 (2027-08-18, 周三)** · 主题: 5-tuple 卸载
- 🔧 动手: 把 5-tuple 卸到 HW (180min)
- 📤 产出: commit "5tuple offload"
- [ ] **Day 417 (2027-08-19, 周四)** · 主题: RSS action
- 🔧 动手: rss action 配置 (120min)
- 📤 产出: commit "rss action"
- [ ] **Day 418 (2027-08-20, 周五)** · 主题: counter / meter
- 🔧 动手: 卸载 counter (120min)
- 📤 产出: commit "counter"
- [ ] **Day 419 (2027-08-21, 周六)** · 主题: 大块实验 — offload 性能对比
- 🔧 动手: SW vs HW 路径 PPS 对比 (480min)
- 📤 产出: `perf-data/P5/W60-offload.md`
- [ ] **Day 420 (2027-08-22, 周日)** · ☕ 复盘
- 📤 产出: `notes/P5/W60-summary.md`
---
### Week 61 (Day 421-427) · DPU 业界调研
- [ ] **Day 421 (2027-08-23, 周一)** · 主题: BlueField 1/2/3
- 📖 学习: NVIDIA 文档 (150min)
- 📤 产出: `notes/P5/W61-D1-bf.md`
- [ ] **Day 422 (2027-08-24, 周二)** · 主题: Pensando DSC
- 📖 学习: Pensando 架构 (120min)
- 🐧 内核对照: 读 `kernel/dma/mapping.c` DMA API (30min)
- 📤 产出: `notes/P5/W61-D2-pensando.md`
- [ ] **Day 423 (2027-08-25, 周三)** · 主题: AWS Nitro
- 📖 学习: re:Invent talks (120min)
- 📤 产出: `notes/P5/W61-D3-nitro.md`
- [ ] **Day 424 (2027-08-26, 周四)** · 主题: Azure SmartNIC (AccelNet)
- 📖 学习: NSDI'18 论文 (120min)
- 📤 产出: `notes/P5/W61-D4-accelnet.md`
- [ ] **Day 425 (2027-08-27, 周五)** · 主题: 国产 DPU
- 📖 学习: 中科驭数 / 云豹 / 星云 (120min)
- 📤 产出: `notes/P5/W61-D5-cn-dpu.md`
- [ ] **Day 426 (2027-08-28, 周六)** · 主题: 大块实验 — 厂商对比矩阵
- 🔧 动手: 写一份对比表(功能/性能/SDK/开放度)(360min)
- 📤 产出: `notes/P5/W61-D6-matrix.md`
- [ ] **Day 427 (2027-08-29, 周日)** · ☕ 复盘
- 📤 产出: `notes/P5/W61-summary.md`
---
### Week 62 (Day 428-434) · BlueField 深入
- [ ] **Day 428 (2027-08-30, 周一)** · 主题: DOCA 总览
- 📖 学习: DOCA SDK 文档 (150min)
- 📤 产出: `notes/P5/W62-D1-doca.md`
- [ ] **Day 429 (2027-08-31, 周二)** · 主题: DOCA Flow
- 📖 学习: DOCA Flow API (150min)
- 🐧 内核对照: 读 `drivers/vfio/vfio_iommu_type1.c` 看 vfio 迁移辅助 (30min)
- 📤 产出: `notes/P5/W62-D2-doca-flow.md`
- [ ] **Day 430 (2027-09-01, 周三)** · 主题: DOCA App Shield / DPI
- 📖 学习: 安全相关组件 (120min)
- 📤 产出: `notes/P5/W62-D3-app-shield.md`
- [ ] **Day 431 (2027-09-02, 周四)** · 主题: ARM SoC 调度
- 📖 学习: BlueField ARM 核分工 (120min)
- 📤 产出: `notes/P5/W62-D4-arm.md`
- [ ] **Day 432 (2027-09-03, 周五)** · 主题: BlueField 模式
- 📖 学习: Separated / Embedded / SmartNIC (120min)
- 📤 产出: `notes/P5/W62-D5-modes.md`
- [ ] **Day 433 (2027-09-04, 周六)** · 主题: 大块实验 — DOCA hello(若无硬件则模拟)
- 🔧 动手: 跑 DOCA 示例(无硬件则读源码)(360min)
- 📤 产出: `notes/P5/W62-D6-doca-hello.md`
- [ ] **Day 434 (2027-09-05, 周日)** · ☕ 复盘
- 📤 产出: `notes/P5/W62-summary.md`
---
### Week 63 (Day 435-441) · DPU 架构 RFC
- [ ] **Day 435 (2027-09-06, 周一)** · 主题: 设计目标
- 🔧 动手: 写 motivation + 目标 (180min)
- 📤 产出: `docs/dpu-arch-design.md` (1)
- [ ] **Day 436 (2027-09-07, 周二)** · 主题: 数据面架构
- 🔧 动手: 画 fast path / slow path 图 (180min)
- 🐧 内核对照: 读 `net/core/devlink.c` 看内核 devlink 卸载配置接口 (30min)
- 📤 产出: `docs/dpu-arch-design.md` (2)
- [ ] **Day 437 (2027-09-08, 周三)** · 主题: 卸载分层
- 🔧 动手: 写 HW / FW / SW 三层卸载策略 (180min)
- 📤 产出: `docs/dpu-arch-design.md` (3)
- [ ] **Day 438 (2027-09-09, 周四)** · 主题: 控制面
- 🔧 动手: 控制器接口设计 (180min)
- 📤 产出: `docs/dpu-arch-design.md` (4)
- [ ] **Day 439 (2027-09-10, 周五)** · 主题: 多租户隔离
- 🔧 动手: SR-IOV / SF / VF 设计 (150min)
- 📤 产出: `docs/dpu-arch-design.md` (5)
- [ ] **Day 440 (2027-09-11, 周六)** · 主题: 大块实验 — 性能模型
- 🔧 动手: 算 PPS / 带宽 / 时延预算 (360min)
- 📤 产出: `docs/dpu-arch-design.md` (6)
- [ ] **Day 441 (2027-09-12, 周日)** · ☕ 复盘
- 📤 产出: `notes/P5/W63-summary.md`
---
### Week 64 (Day 442-448) · 架构评审 + 模拟面试
- [ ] **Day 442 (2027-09-13, 周一)** · 主题: 自评审
- 🔧 动手: 自己挑漏洞 (180min)
- 📤 产出: `docs/dpu-arch-design-review.md`
- [ ] **Day 443 (2027-09-14, 周二)** · 主题: 同行评审准备
- 🔧 动手: 发给同行/导师评审 (120min)
- 🐧 内核对照: 综述"DPU 数据面从内核视角看" — 在设计文档补一节 (60min)
- 📤 产出: review 邮件 + 内核视角综述章节
- [ ] **Day 444 (2027-09-15, 周三)** · 主题: 答辩稿 v1
- 🔧 动手: 写 PPT/Keynote 草稿 (180min)
- 📤 产出: `slides/dpu-arch.pdf`
- [ ] **Day 445 (2027-09-16, 周四)** · 主题: 模拟面试 (1)
- 🔧 动手: 自我陈述 + Q&A 30 问 (180min)
- 📤 产出: `career/mock-interview-1.md`
- [ ] **Day 446 (2027-09-17, 周五)** · 主题: 模拟面试 (2)
- 🔧 动手: 找朋友模拟 (150min)
- 📤 产出: `career/mock-interview-2.md`
- [ ] **Day 447 (2027-09-18, 周六)** · 主题: 大块实验 — 答辩稿定稿
- 🔧 动手: 反复打磨 PPT + 文档 (480min)
- 📤 产出: 定稿 slides
- [ ] **Day 448 (2027-09-19, 周日)** · ☕ 复盘
- 📤 产出: `notes/P5/W64-summary.md`
---
### Week 65 (Day 449-455) · P5 总结
- [ ] **Day 449 (2027-09-20, 周一)** · 主题: 整理产出
- 🔧 动手: 组织 P5 文档 (180min)
- 📤 产出: `P5-final/`
- [ ] **Day 450 (2027-09-21, 周二)** · 主题: 技术博客 (1)
- 🔧 动手: "从 0 看懂 PCIe + vDPA" (180min)
- 🐧 内核对照: 博客中同时讲内核 vDPA 与 DPDK vDPA 对照 (30min)
- 📤 产出: `blog/P5-pcie-vdpa.md`
- [ ] **Day 451 (2027-09-22, 周三)** · 主题: 技术博客 (2)
- 🔧 动手: "DPU 数据面架构设计要点" (180min)
- 📤 产出: `blog/P5-dpu-arch.md`
- [ ] **Day 452 (2027-09-23, 周四)** · 主题: 简历 v5
- 🔧 动手: 把 P5 加入简历 (120min)
- 📤 产出: `career/resume-v5.md`
- [ ] **Day 453 (2027-09-24, 周五)** · 主题: 投递准备
- 🔧 动手: 列目标公司 + JD 分析 (180min)
- 📤 产出: `career/target-companies.md`
- [ ] **Day 454 (2027-09-25, 周六)** · 主题: 大块实验 — 简历定稿
- 🔧 动手: 简历定稿 + cover letter 模板 (360min)
- 📤 产出: `career/resume-final.md`
- [ ] **Day 455 (2027-09-26, 周日)** · 🎯 P5 阶段答辩
- 📤 产出: `P5-final/answer.md` + `P5-final/retro.md` + `monthly/2027-09.md`
---
# P6 · 作品收口 + 出口 (M16-M18)
> **Day 456-546**, 2027-09-27 ~ 2027-12-27
> **核心目标**: 把 18 个月所有产出收口,做出 1 个高质量开源项目、3 篇深度博客、1 套面试材料,正式投递目标公司或申报晋升
## P6.0 阶段目标
1. 挑选 1 个最有沉淀的项目(`libmtcp-v3` / `sai-dpdk-mini` / `dpdk-lb` / `ddos-clean`)做开源升级
2. 写出 3 篇引爆型博客(可推阿里云开发者社区/InfoQ/掘金/知乎)
3. 准备完整面试材料:自我介绍 / 项目深度 / 系统设计 / 八股
4. 投递目标公司 + 跟进
5. 准备晋升答辩材料(若选晋升路线)
## P6.1 关键交付物
- [ ] 1 个 GitHub Star ≥ 100 的开源项目
- [ ] 3 篇技术博客(每篇 PV ≥ 5000 目标)
- [ ] 1 份 8-10 页简历
- [ ] 1 套面试题库(200+ Q&A)
- [ ] 拿到 offer 或晋升通过
## P6.1.5 🐧 本阶段内核相关准备
P6 阶段不再新增内核学习,而是**整理**:
- 面试题库中单开一列 "内核 vs DPDK" 对照题 (~20 道)
- 简历技能栏加 "Linux 内核网络栈 (net_device / netlink / conntrack / vfio / vdpa)"
- 收尾博客 "18 个月成长" 中重点讲 "为什么 DPDK 工程师必须懂内核"
- 系统设计题准备时,凡涉及网络的都要有内核视角
- 面试自我介绍中主动提 "读过 XX 个内核网络子系统源码"
## P6.2 周计划总览 (W66-W78)
| 周 | Day | 主题 | 里程碑 |
|---|---|---|---|
| W66 | 456-462 | 选定开源主项目 | 项目选型 |
| W67 | 463-469 | 项目代码 review | issue 列表 |
| W68 | 470-476 | 项目重构 + 文档 | v1.0 release |
| W69 | 477-483 | CI + 测试 + benchmark | 完整 ci |
| W70 | 484-490 | 引爆博客 (1) | 发布 |
| W71 | 491-497 | 引爆博客 (2) | 发布 |
| W72 | 498-504 | 引爆博客 (3) | 发布 |
| W73 | 505-511 | 简历定稿 | 8-10 页 |
| W74 | 512-518 | 面试题库 (1) | 100 题 |
| W75 | 519-525 | 面试题库 (2) | 200 题 |
| W76 | 526-532 | 系统设计 + 模拟面试 | 答辩稿 |
| W77 | 533-539 | 投递 + 一面/二面 | 进展跟踪 |
| W78 | 540-546 | 收口 + 决策 | offer / 续航 |
## P6.3 详细日计划
### Week 66 (Day 456-462) · 选定开源主项目
- [ ] **Day 456 (2027-09-27, 周一)** · 主题: 项目盘点
- 🔧 动手: 把 4 个候选项目列优缺点 (180min)
- 📤 产出: `P6/project-eval.md`
- [ ] **Day 457 (2027-09-28, 周二)** · 主题: 受众分析
- 🔧 动手: 判断哪个最有人用 (120min)
- 📤 产出: `P6/audience.md`
- [ ] **Day 458 (2027-09-29, 周三)** · 主题: 选定 + RFC
- 🔧 动手: 写主项目 v1.0 RFC (180min)
- 📤 产出: `P6/main-project-rfc.md`
- [ ] **Day 459 (2027-09-30, 周四)** · 主题: 月度复盘
- 📤 产出: `monthly/2027-09.md`
- [ ] **Day 460 (2027-10-01, 周五)** · ☕ 国庆假期 — 留白
- [ ] **Day 461 (2027-10-02, 周六)** · ☕ 国庆假期 — 留白
- [ ] **Day 462 (2027-10-03, 周日)** · ☕ 国庆假期 — 留白
---
### Week 67 (Day 463-469) · 项目代码 review
- [ ] **Day 463 (2027-10-04, 周一)** · ☕ 国庆假期 — 留白
- [ ] **Day 464 (2027-10-05, 周二)** · ☕ 国庆假期 — 留白
- [ ] **Day 465 (2027-10-06, 周三)** · ☕ 国庆假期 — 留白
- [ ] **Day 466 (2027-10-07, 周四)** · ☕ 国庆假期 — 留白
- [ ] **Day 467 (2027-10-08, 周五)** · 主题: 代码 review (1)
- 🔧 动手: 通读主项目代码挑问题 (180min)
- 📤 产出: `P6/code-review-issues.md`
- [ ] **Day 468 (2027-10-09, 周六)** · 主题: 大块实验 — 代码 review (2)
- 🔧 动手: 列出 issue 优先级 (360min)
- 📤 产出: GitHub Issues 创建
- [ ] **Day 469 (2027-10-10, 周日)** · ☕ 复盘
- 📤 产出: `notes/P6/W67-summary.md`
---
### Week 68 (Day 470-476) · 项目重构 + 文档
- [ ] **Day 470 (2027-10-11, 周一)** · 主题: 接口重构
- 🔧 动手: 优化 API (180min)
- 📤 产出: commit "api refactor"
- [ ] **Day 471 (2027-10-12, 周二)** · 主题: 内部代码清理
- 🔧 动手: 去 warning + 加注释 (180min)
- 📤 产出: commit "cleanup"
- [ ] **Day 472 (2027-10-13, 周三)** · 主题: README 英文版
- 🔧 动手: 写英文 README (180min)
- 📤 产出: `README.md` (en)
- [ ] **Day 473 (2027-10-14, 周四)** · 主题: 架构图
- 🔧 动手: 画专业的架构图 (180min)
- 📤 产出: `docs/architecture.png`
- [ ] **Day 474 (2027-10-15, 周五)** · 主题: 使用文档
- 🔧 动手: 写 quick start + tutorial (180min)
- 📤 产出: `docs/getting-started.md`
- [ ] **Day 475 (2027-10-16, 周六)** · 主题: 大块实验 — v1.0 release
- 🔧 动手: 打 tag + release note (360min)
- 📤 产出: GitHub Release v1.0
- [ ] **Day 476 (2027-10-17, 周日)** · ☕ 复盘
- 📤 产出: `notes/P6/W68-summary.md`
---
### Week 69 (Day 477-483) · CI + 测试 + benchmark
- [ ] **Day 477 (2027-10-18, 周一)** · 主题: GitHub Actions
- 🔧 动手: 加 CI 编译 (150min)
- 📤 产出: `.github/workflows/build.yml`
- [ ] **Day 478 (2027-10-19, 周二)** · 主题: 单元测试
- 🔧 动手: 补单测覆盖 (180min)
- 📤 产出: commit "unit tests"
- [ ] **Day 479 (2027-10-20, 周三)** · 主题: 集成测试
- 🔧 动手: e2e 测试脚本 (180min)
- 📤 产出: commit "e2e tests"
- [ ] **Day 480 (2027-10-21, 周四)** · 主题: benchmark suite
- 🔧 动手: 标准化压测脚本 (180min)
- 📤 产出: `benchmarks/`
- [ ] **Day 481 (2027-10-22, 周五)** · 主题: 性能曲线图
- 🔧 动手: matplotlib 出图 (150min)
- 📤 产出: `benchmarks/results.png`
- [ ] **Day 482 (2027-10-23, 周六)** · 主题: 大块实验 — Docker 镜像
- 🔧 动手: Dockerfile + 一键运行 (360min)
- 📤 产出: Docker Hub 镜像
- [ ] **Day 483 (2027-10-24, 周日)** · ☕ 复盘
- 📤 产出: `notes/P6/W69-summary.md`
---
### Week 70 (Day 484-490) · 引爆博客 (1)
- [ ] **Day 484 (2027-10-25, 周一)** · 主题: 选题 + 大纲
- 🔧 动手: 写大纲 (120min)
- 📤 产出: `blog/outline-1.md`
- [ ] **Day 485 (2027-10-26, 周二)** · 主题: 一稿
- 🔧 动手: 写一稿 (180min)
- 📤 产出: `blog/draft-1.md`
- [ ] **Day 486 (2027-10-27, 周三)** · 主题: 配图
- 🔧 动手: 画 5-10 张图 (180min)
- 📤 产出: `blog/images-1/`
- [ ] **Day 487 (2027-10-28, 周四)** · 主题: 二稿 + 校对
- 🔧 动手: 打磨 (180min)
- 📤 产出: `blog/final-1.md`
- [ ] **Day 488 (2027-10-29, 周五)** · 主题: 发布
- 🔧 动手: 发到知乎 / 掘金 / InfoQ (120min)
- 📤 产出: 博客链接
- [ ] **Day 489 (2027-10-30, 周六)** · 主题: 大块实验 — 推广 + 答疑
- 🔧 动手: 各群分享 + 回复评论 (240min)
- 📤 产出: 数据快照
- [ ] **Day 490 (2027-10-31, 周日)** · ☕ 复盘 + 月度
- 📤 产出: `notes/P6/W70-summary.md` + `monthly/2027-10.md`
---
### Week 71 (Day 491-497) · 引爆博客 (2)
- [ ] **Day 491 (2027-11-01, 周一)** · 主题: 选题 (2)
- 🔧 动手: 大纲 (120min)
- 📤 产出: `blog/outline-2.md`
- [ ] **Day 492 (2027-11-02, 周二)** · 主题: 一稿
- 🔧 动手: 写 (180min)
- 📤 产出: `blog/draft-2.md`
- [ ] **Day 493 (2027-11-03, 周三)** · 主题: 配图
- 🔧 动手: 出图 (180min)
- 📤 产出: `blog/images-2/`
- [ ] **Day 494 (2027-11-04, 周四)** · 主题: 二稿
- 🔧 动手: 打磨 (180min)
- 📤 产出: `blog/final-2.md`
- [ ] **Day 495 (2027-11-05, 周五)** · 主题: 发布
- 🔧 动手: 多平台发布 (120min)
- 📤 产出: 链接
- [ ] **Day 496 (2027-11-06, 周六)** · 主题: 大块实验 — 推广
- 🔧 动手: 推广 + 答疑 (240min)
- 📤 产出: 数据快照
- [ ] **Day 497 (2027-11-07, 周日)** · ☕ 复盘
- 📤 产出: `notes/P6/W71-summary.md`
---
### Week 72 (Day 498-504) · 引爆博客 (3)
- [ ] **Day 498 (2027-11-08, 周一)** · 主题: 选题 (3) — 终极博客
- 🔧 动手: 大纲:"18 个月从 DPDK 用户到 DPU 架构师" (120min)
- 📤 产出: `blog/outline-3.md`
- [ ] **Day 499 (2027-11-09, 周二)** · 主题: 一稿
- 🔧 动手: 写 (180min)
- 📤 产出: `blog/draft-3.md`
- [ ] **Day 500 (2027-11-10, 周三)** · 主题: 配图 + 项目集
- 🔧 动手: 出项目集大图 (180min)
- 📤 产出: `blog/images-3/`
- [ ] **Day 501 (2027-11-11, 周四)** · 主题: 二稿
- 🔧 动手: 打磨 (180min)
- 📤 产出: `blog/final-3.md`
- [ ] **Day 502 (2027-11-12, 周五)** · 主题: 发布
- 🔧 动手: 全平台 (120min)
- 📤 产出: 链接
- [ ] **Day 503 (2027-11-13, 周六)** · 主题: 大块实验 — 全网推广
- 🔧 动手: 推广 + GitHub Trending (240min)
- 📤 产出: 数据快照
- [ ] **Day 504 (2027-11-14, 周日)** · ☕ 复盘
- 📤 产出: `notes/P6/W72-summary.md`
---
### Week 73 (Day 505-511) · 简历定稿
- [ ] **Day 505 (2027-11-15, 周一)** · 主题: 简历重写 (1)
- 🔧 动手: 项目栏 (180min)
- 📤 产出: `career/resume-v6.md`
- [ ] **Day 506 (2027-11-16, 周二)** · 主题: 简历重写 (2)
- 🔧 动手: 技能栏 + 学历 (150min)
- 📤 产出: `career/resume-v6.md`
- [ ] **Day 507 (2027-11-17, 周三)** · 主题: 简历定量化
- 🔧 动手: 把每个项目改成"动词+数字+技术"格式 (180min)
- 📤 产出: `career/resume-v6.md`
- [ ] **Day 508 (2027-11-18, 周四)** · 主题: PDF 排版
- 🔧 动手: typora/latex 美化 (180min)
- 📤 产出: `career/resume.pdf`
- [ ] **Day 509 (2027-11-19, 周五)** · 主题: 多版本简历
- 🔧 动手: 大厂版 / DPU 厂商版 / 安全版 (180min)
- 📤 产出: `career/resume-{bigtech,dpu,security}.pdf`
- [ ] **Day 510 (2027-11-20, 周六)** · 主题: 大块实验 — 简历找朋友 review
- 🔧 动手: 发 3-5 个同行 review,收集意见 (240min)
- 📤 产出: review 意见汇总
- [ ] **Day 511 (2027-11-21, 周日)** · ☕ 复盘
- 📤 产出: `notes/P6/W73-summary.md`
---
### Week 74 (Day 512-518) · 面试题库 (1)
- [ ] **Day 512 (2027-11-22, 周一)** · 主题: DPDK 基础题
- 🔧 动手: 30 道题 + 答案 (180min)
- 📤 产出: `career/qa-dpdk-basic.md`
- [ ] **Day 513 (2027-11-23, 周二)** · 主题: DPDK 进阶题
- 🔧 动手: 30 道题 (180min)
- 📤 产出: `career/qa-dpdk-adv.md`
- [ ] **Day 514 (2027-11-24, 周三)** · 主题: SONiC/SAI 题
- 🔧 动手: 20 道题 (150min)
- 📤 产出: `career/qa-sonic.md`
- [ ] **Day 515 (2027-11-25, 周四)** · 主题: Linux 内核网络
- 🔧 动手: 20 道题 (150min)
- 🐧 内核对照: 补充 20 道 "内核 vs DPDK 对照题"(skb/mbuf、napi/PMD、tc/rte_flow、netlink/sairedis)(60min)
- 📤 产出: `career/qa-kernel.md`(含 20 内核题 + 20 对照题)
- [ ] **Day 516 (2027-11-26, 周五)** · 主题: 操作系统/网络八股
- 🔧 动手: 30 道经典题 (180min)
- 📤 产出: `career/qa-classic.md`
- [ ] **Day 517 (2027-11-27, 周六)** · 主题: 大块实验 — 集中复习
- 🔧 动手: 复习上述全部 (480min)
- 📤 产出: `career/review-1.md`
- [ ] **Day 518 (2027-11-28, 周日)** · ☕ 复盘
- 📤 产出: `notes/P6/W74-summary.md`
---
### Week 75 (Day 519-525) · 面试题库 (2)
- [ ] **Day 519 (2027-11-29, 周一)** · 主题: 项目深度题 (libmtcp)
- 🔧 动手: 20 道项目深挖题 + 答案 (180min)
- 📤 产出: `career/qa-project-libmtcp.md`
- [ ] **Day 520 (2027-11-30, 周二)** · 主题: 项目深度题 (sai-dpdk-mini)
- 🔧 动手: 20 道 (180min)
- 📤 产出: `career/qa-project-sai.md`
- [ ] **Day 521 (2027-12-01, 周三)** · 主题: 项目深度题 (lb / ddos)
- 🔧 动手: 20 道 (180min)
- 📤 产出: `career/qa-project-lb-ddos.md`
- [ ] **Day 522 (2027-12-02, 周四)** · 主题: DPU 架构题
- 🔧 动手: 20 道 (180min)
- 📤 产出: `career/qa-dpu.md`
- [ ] **Day 523 (2027-12-03, 周五)** · 主题: 行为面试题
- 🔧 动手: STAR 模板 + 20 个故事 (180min)
- 📤 产出: `career/qa-behavior.md`
- [ ] **Day 524 (2027-12-04, 周六)** · 主题: 大块实验 — 集中复习
- 🔧 动手: 200 题全复习 (480min)
- 📤 产出: `career/review-2.md`
- [ ] **Day 525 (2027-12-05, 周日)** · ☕ 复盘
- 📤 产出: `notes/P6/W75-summary.md`
---
### Week 76 (Day 526-532) · 系统设计 + 模拟面试
- [ ] **Day 526 (2027-12-06, 周一)** · 主题: 系统设计题库
- 🔧 动手: 收集 10 道经典网络系统设计 (180min)
- 📤 产出: `career/sysdesign-list.md`
- [ ] **Day 527 (2027-12-07, 周二)** · 主题: 设计 (1) — 全球 CDN
- 🔧 动手: 写设计方案 (180min)
- 📤 产出: `career/sd-cdn.md`
- [ ] **Day 528 (2027-12-08, 周三)** · 主题: 设计 (2) — DDoS 清洗中心
- 🔧 动手: 写方案 (180min)
- 📤 产出: `career/sd-ddos.md`
- [ ] **Day 529 (2027-12-09, 周四)** · 主题: 设计 (3) — 智能网卡卸载
- 🔧 动手: 写方案 (180min)
- 📤 产出: `career/sd-smartnic.md`
- [ ] **Day 530 (2027-12-10, 周五)** · 主题: 模拟面试 (技术面)
- 🔧 动手: 找朋友模拟 (180min)
- 📤 产出: `career/mock-tech.md`
- [ ] **Day 531 (2027-12-11, 周六)** · 主题: 大块实验 — 模拟面试 (综合)
- 🔧 动手: 完整 1.5h 模拟 (240min)
- 📤 产出: `career/mock-full.md`
- [ ] **Day 532 (2027-12-12, 周日)** · ☕ 复盘
- 📤 产出: `notes/P6/W76-summary.md`
---
### Week 77 (Day 533-539) · 投递 + 一面/二面
- [ ] **Day 533 (2027-12-13, 周一)** · 主题: 投递目标公司 (1)
- 🔧 动手: 内推阿里云/腾讯云/字节 (120min)
- 📤 产出: `career/applications.md`
- [ ] **Day 534 (2027-12-14, 周二)** · 主题: 投递目标公司 (2)
- 🔧 动手: 投 DPU 厂商 (120min)
- 📤 产出: 更新 applications
- [ ] **Day 535 (2027-12-15, 周三)** · 主题: 跟进 + 一面
- 🔧 动手: 处理一面(实际情况调整)(150min)
- 📤 产出: `career/interview-log.md`
- [ ] **Day 536 (2027-12-16, 周四)** · 主题: 一面 → 二面
- 🔧 动手: 复盘 + 准备二面 (150min)
- 📤 产出: 更新 log
- [ ] **Day 537 (2027-12-17, 周五)** · 主题: 二面 / HR 面
- 🔧 动手: 应对 + 复盘 (150min)
- 📤 产出: 更新 log
- [ ] **Day 538 (2027-12-18, 周六)** · 主题: 大块实验 — 应对 onsite
- 🔧 动手: 集中处理面试 (480min)
- 📤 产出: 更新 log
- [ ] **Day 539 (2027-12-19, 周日)** · ☕ 复盘
- 📤 产出: `notes/P6/W77-summary.md`
---
### Week 78 (Day 540-546) · 收口 + 决策
- [ ] **Day 540 (2027-12-20, 周一)** · 主题: offer 比较 / 晋升答辩
- 🔧 动手: 写决策表 (150min)
- 📤 产出: `career/decision.md`
- [ ] **Day 541 (2027-12-21, 周二)** · 主题: 谈薪 / 答辩材料
- 🔧 动手: 准备 (150min)
- 📤 产出: `career/negotiation.md`
- [ ] **Day 542 (2027-12-22, 周三)** · 主题: 18 个月总复盘
- 🔧 动手: 写一万字总复盘 (240min)
- 📤 产出: `final/18months-retro.md`
- [ ] **Day 543 (2027-12-23, 周四)** · 主题: 写下一个 18 个月 v4 草稿
- 🔧 动手: 启动 v4 规划草稿 (180min)
- 📤 产出: `docs/superpowers/specs/2027-12-23-roadmap-v4-draft.md`
- [ ] **Day 544 (2027-12-24, 周五)** · 主题: 整理学习仓库
- 🔧 动手: 把 18 个月所有产出归档 (180min)
- 📤 产出: 归档 README
- [ ] **Day 545 (2027-12-25, 周六)** · 主题: 大块实验 — 公开总结贴
- 🔧 动手: 发知乎/B站长文 "18 个月成为 DPDK/DPU 工程师" (360min)
- 📤 产出: 发布链接
- [ ] **Day 546 (2027-12-27, 周日)** · 🎯 整体收官答辩 + 庆祝
- 📤 产出: `final/closing.md`(结束语 + 下一步)
---
## 附录 A · 项目仓库结构建议
推荐根目录布局(建议放在 `~/projects/dpdk-roadmap-v3/`):
```
dpdk-roadmap-v3/
├── notes/ # 学习笔记
│ ├── P1/ ... P6/
├── code/ # 代码项目
│ ├── libmtcp-v3/
│ ├── sai-dpdk-mini/
│ ├── dpdk-lb/
│ ├── ddos-clean/
│ ├── pcie-driver-demo/
│ └── ...
├── perf-data/ # 性能数据
├── flamegraph/ # 火焰图
├── docs/ # 设计文档
├── blog/ # 博客草稿
├── career/ # 简历、面试材料
├── slides/ # 演讲稿
├── monthly/ # 月度复盘
├── final/ # 阶段最终产出
└── docs/superpowers/specs/2026-06-29-dpdk-roadmap-v3-design.md # 本规划文档
```
---
## 附录 B · 性能基线参考
| 场景 | 硬件 | 目标 PPS | 目标带宽 |
|---|---|---|---|
| 单核 echo (X710 10G) | 1 core | 14.88 Mpps (64B) | 10 Gbps line rate |
| 多核 echo (CX5 100G) | 8 cores | ~100 Mpps (64B) | ~100 Gbps |
| OVS-DPDK L2 fwd | 4 cores | 20 Mpps | 80% line rate |
| dpdk-lb (4-tuple hash) | 4 cores | 5 Mpps | 20 Gbps |
| ddos-clean SYN cookie | 8 cores | 5 Mpps SYN | / |
| Suricata IDS | 8 cores | / | 10 Gbps |
---
## 附录 C · 周/月复盘模板
### 周复盘 (`notes/Pn/Wmm-summary.md`)
```markdown
# Week NN 复盘 (Day xxx-yyy)
## 完成情况
- [x] Day xxx: ...
- [ ] Day yyy: ...(未完成原因)
## 学到的 3 件事
1.
2.
3.
## 卡点 / 疑惑
-
## 下周计划微调
-
```
### 月复盘 (`monthly/YYYY-MM.md`)
```markdown
# 月度复盘 YYYY-MM
## 本月目标 vs 实际
| 目标 | 完成 | 备注 |
## 关键产出
- 代码:
- 笔记:
- 数据:
## 下月调整
- 节奏:
- 内容:
- 出口:
## 自我评分 (1-5)
- 学习深度:
- 动手量:
- 输出量:
- 心态:
```
---
## 收口语
> **18 个月很长,但日子是一天一天过的。**
> 不用每一天都完美执行,但每天都必须有一个**可见的产出物**。
> 当你回头看 Day 1 到 Day 546 的勾选状态时,你的实力会比任何一份简历都更有说服力。
— 起算日 2026-06-29,目标交付日 2027-12-27。