Step 2: Implement L3 forwarding
basic.p4文件包含了一个骨架P4程序,其中关键逻辑部分被TODO注释替换。你的实现应该遵循这个文件中给出的结构——用逻辑来替换每个TODO,实现缺失的部分。
basic.p4
文件包含了一个骨架P4程序,其中关键逻辑部分被TODO注释替换。你的实现应该遵循这个文件中给出的结构——用逻辑来替换每个TODO,实现缺失的部分。
一个完整的basic.p4
将包含以下组件:
- 以太网(
ethernet_t
)和IPv4(ipv4_t
)的头部类型定义。 - TODO:解析器,用于填充
ethernet_t
和ipv4_t
字段。 - 一个使用
mark_to_drop()
来丢弃数据包的动作。 - TODO:一个名为
ipv4_forward
的动作,它应该:- 设置下一跳的出口端口。
- 更新以太网目的地址为下一跳的地址。
- 更新以太网源地址为交换机的地址。
- 减少TTL。
- 一个控制块,其中包括:
- 定义一个表,用于读取IPv4目标地址,并调用
drop
或ipv4_forward
。 - 一个应用块,应用该表。
- 定义一个表,用于读取IPv4目标地址,并调用
- TODO:一个解封装器,选择插入到传出数据包中的字段的顺序。
- 一个包实例,包含解析器、控制和解封装器。
通常,一个包还需要校验和验证和重新计算控制的实例。但这些对于本教程来说不是必需的,并且被空控制的实例所替换。
Step 3: Run your solution
按照第一步的指示操作。这一次,你应该能够成功地在拓扑中的任意两个主机之间进行ping。
思考
-
你的解决方案的“测试套件”——在拓扑中的主机之间发送ping包——不够健壮。你还应该测试什么才能确保你的实现是正确的呢?
-
虽然Python的scapy库超出了本教程的范围,但它可以用于生成测试用的数据包。send.py文件展示了如何使用它?
其他需要考虑的问题:
- 如何改进你的程序来响应ARP请求?
- 如何改进你的程序以支持traceroute?
- 如何改进你的程序以支持下一跳?
- 这个程序足以替代路由器吗?还缺少什么?
故障排除
在开发过程中可能会出现几个问题:
-
basic.p4可能无法编译。在这种情况下,make run将报告编译器发出的错误并停止。
-
basic.p4可能会编译通过,但不能支持make run尝试使用P4Runtime安装的s1-runtime.json到s3-runtime.json文件中的控制平面规则。在这种情况下,如果无法安装控制平面规则,make run将报告错误。使用这些错误消息来修复你的basic.p4实现。
-
basic.p4可能会编译通过,并且控制平面规则可能已经安装,但交换机可能无法以期望的方式处理数据包。logs/sX.log文件包含了每个交换机如何处理每个数据包的详细日志。输出是详细的,可以帮助确定你的实现中的逻辑错误。
-
清理Mininet
在上述后两种情况下,make run可能会留下一个正在后台运行的Mininet实例。使用以下命令清理这些实例:make stop
The Use of Gateway (gw) and ARP Commands in topology.json
网关(gw)命令: route add default gw命令用于为主机设置默认网关。这告诉主机,如果目标IP不在同一个子网上,应该将数据包发送到哪个IP地址。对于主机来说,了解其默认网关对于与本地网络外的设备通信非常重要。
ARP命令: arp -i eth0 -s命令用于向主机的ARP缓存添加静态ARP条目。当你添加静态ARP条目时,你向计算机告知某个IP地址(如10.0.0.1)对应的MAC地址,因此它不需要一直向网络上的每个设备询问“谁有这个IP地址?”这对于这个练习(以及大多数其他练习)尤为重要,因为交换机不会响应ARP请求。在真实网络中,生产交换机通常会响应ARP请求,但在这些练习中,由于这种行为,对于网关路由器来说静态ARP条目是必需的。
-i eth0: 这指定了要执行ARP操作的网络接口(例如eth0)。
-s: 此标志用于设置静态ARP条目。
注意: 如果移除网关和ARP命令,你的网络中的主机可能会失去彼此之间以及与本地子网外设备的连接性。这可能导致运行pingall命令时出现100%的数据包丢失,因为主机没有到达目的地所需的路由信息和ARP条目。
翻译自 P4环境下basic练习: https://github.com/p4lang/tutorials/tree/master/exercises/basic