Skip to content

Commit 2505e1d

Browse files
committed
feat: add p4-forward-lab docs
feat: add p4-forward-lab docs feat: add p4-forward-lab docs
1 parent 0793673 commit 2505e1d

File tree

3 files changed

+121
-0
lines changed

3 files changed

+121
-0
lines changed

docs/img/lab2_topo.png

12.4 KB
Loading

docs/p4/tofino_lab.md

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
# P4 实验:Tofino 交换机转发程序
2+
3+
在本节实验中,实验者将通过 Tofino 可编程交换机熟悉 P4 数据平面与控制平面的协作机制,理解如何通过手动下发表项实现基本的二层与三层转发功能,掌握交换机在数据平面和控制平面的包处理逻辑。
4+
5+
## 实验环境
6+
7+
| 组件 | 功能描述 |
8+
| -------------- | -------------------------------------------------- |
9+
| **Tofino 交换机** | 硬件可编程交换芯片,运行编译后的 P4 数据平面程序 |
10+
| **控制平面** | 负责下发表项,可通过 BfRt API 实现 |
11+
| **Host A** | 模拟网络节点 A,配置 IP `192.168.1.2/24`,网关 `192.168.1.1` |
12+
| **Host B** | 模拟网络节点 B,配置 IP `192.168.2.2/24`,网关 `192.168.2.1` |
13+
14+
网络拓扑如下:
15+
16+
![alt text](../img/lab2_topo.png)
17+
18+
## 实验目标
19+
20+
* 理解 Tofino 数据平面的基本转发逻辑;
21+
* 熟悉控制平面表项下发流程
22+
* 掌握 ARP 解析与 IP 分组转发机制
23+
* 通过表项配置实现 A 与 B 的互通
24+
25+
## 实验内容
26+
27+
### 连通性测试场景
28+
29+
| 主机 | IP 地址 | 网关地址 |
30+
| ----- | -------------- | ----------- |
31+
| **A** | 192.168.1.2/24 | 192.168.1.1 |
32+
| **B** | 192.168.2.2/24 | 192.168.2.1 |
33+
34+
实验者需实现以下通信流程:
35+
36+
* 从主机 `A` 执行 `ping 192.168.2.2`
37+
* 确保数据平面能够正确处理 `ARP` 报文和 `IP` 分组报文
38+
* 确认主机 `B` 能够正确收到并回复 `ICMP Echo Request`
39+
40+
### 报文交互与处理流程
41+
42+
#### ARP 请求与响应流程
43+
44+
主机 `A` 的行为:
45+
46+
1. `A` 发送 `ICMP` 时,发现目的地址 `192.168.2.2` 不在同一子网,故使用默认路由,向默认网关发送;
47+
2. 根据默认网关配置,`A` 向网关地址 `192.168.1.1` 发送 `ARP Request`,报文内容:询问 `“Who has 192.168.1.1? Tell 192.168.1.2”`
48+
3. `A` 收到 `ARP Reply` 后,将网关 `MAC` 加入 `ARP` 缓存
49+
50+
Tofino 交换机的行为:
51+
52+
1.`A` 相连的端口收到该 `ARP Request`
53+
2. 交换机根据控制平面下发的端口配置(`IP``MAC` 地址),对接收到的 `ARP Request` 进行修改,将其转换为对应的 `ARP Reply` 并返回给主机 `A`
54+
55+
#### ICMP Echo Request 与 Reply 流程
56+
57+
1. `A -> Switch``A` 发送 `ICMP Echo Request` 到交换机,目的 `MAC` 为网关 `MAC`
58+
3. `Switch -> B`:交换机修改以太网头部,设置正确的源 `MAC` 和目的 `MAC`,发送 `ICMP Echo Request``B`
59+
* 解析 `IP` 分组;
60+
* 查询转发表(控制平面预先下发),转发到连接 `B` 的端口;
61+
* 若目的 `MAC` 地址未知,发送 `ARP Request` 询问 `B``MAC` 地址;
62+
* 修改以太网头部,设置正确的源 `MAC` 和目的 `MAC`
63+
4. `B -> Switch``B` 收到 `ICMP Echo Request`,回复 `ICMP Echo Reply` 给交换机。
64+
5. `Switch -> A`:交换机收到 `ICMP Echo Reply`,查询转发表,修改以太网头部,发送给 `A`
65+
66+
注意:
67+
68+
* 实验中无需实现动态路由算法,只需由控制平面直接下发表项即可。
69+
* 交换机端口配置的 `IP``MAC` 地址由控制平面预先设置,在数据平面中对应存储端口相关信息的 `meta data` 为:
70+
71+
| `meta_data` | 信息类型 |
72+
| -- | ------------------------------- |
73+
| `ig_md.port_ip` | `ingress` 端口 `IP` |
74+
| `ig_md.port_mac` | `ingress` 端口 `MAC` |
75+
| `eg_md.port_ip` | `egress` 端口 `IP` |
76+
| `eg_md.port_mac` | `egress` 端口 `MAC` |
77+
78+
### 不同平面职责划分
79+
80+
#### 数据平面
81+
82+
数据平面程序负责解析和处理收到的报文,主要职责包括:
83+
84+
* 解析以太网、`ARP``IP` 分组;
85+
* 根据控制平面下发的表项进行匹配和转发决策;
86+
* 处理 `ARP` 请求与应答报文;
87+
* 执行网关功能,转发 `IP` 分组。
88+
89+
#### 控制平面
90+
91+
控制平面程序负责下发表项,主要职责包括:
92+
93+
* 配置端口的 `IP` 地址与 `MAC` 地址;
94+
* 配置静态转发表,实现 `A ``B` 之间的互通;
95+
96+
思考:从与 `B` 连通的端口转发出去的报文,是否每次都需要发送 `ARP` 请求查询 `B``MAC` 地址?如果不需要,控制平面应如何下发表项以避免频繁发送 `ARP` 请求?数据平面需要做哪些修改以支持该功能?
97+
98+
## 实验验证
99+
100+
| 步骤 | 验证方式 | 期望结果 |
101+
| -- | ------------------------------- | ---------------------------------- |
102+
| 1 |`A``B` 分别抓包(`tcpdump`| 可看到 ARP Request/Reply、ICMP Echo 报文 |
103+
| 2 | `A` 执行 `ping Host B` | 可以连通 |
104+
105+
106+
## 补充内容
107+
108+
在本实验中,主机 `A` 和主机 `B` 位于不同的子网。要实现 `A``B` 的通信,必须通过 `网关 (Gateway)` 转发。交换机在本实验中扮演网关的角色。
109+
110+
为便于理解,建议同学们参考以下 RFC 文档
111+
112+
| 主题 | RFC 编号 |
113+
| ------------------- | --------------------------------------------------------- |
114+
| **ARP(地址解析协议)** | [RFC 826](https://datatracker.ietf.org/doc/html/rfc826) |
115+
| **ICMP(互联网控制消息协议)** | [RFC 792](https://datatracker.ietf.org/doc/html/rfc792) |
116+
| **IPv4** | [RFC 791](https://datatracker.ietf.org/doc/html/rfc791) |
117+
| **子网与路由概念** | [RFC 950](https://datatracker.ietf.org/doc/html/rfc950) |
118+
| **网关与路由选择** | [RFC 1812](https://datatracker.ietf.org/doc/html/rfc1812) |
119+
120+

mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ nav:
6464
- 控制平面: p4/control_plane.md
6565
- 第二阶段:
6666
- Tofino 交换机: p4/tofino_data_plane.md
67+
- 交换机转发实验: p4/tofino_lab.md
6768
- 硬件路由器实验【停开】:
6869
- 总述: joint/index.md
6970
- 开始实验: joint/basics.md

0 commit comments

Comments
 (0)