本文目录
实验环境
P4官方虚拟机
实验过程
参考实验
1. cd进入实验中
2. 补充basic_tunnel.p4
PARSE部分
state parse_myTunnel {
packet.extract(hdr.myTunnel);
transition select(hdr.myTunnel.proto_id) {
TYPE_IPV4: parse_ipv4;
default: accept;
}
}
INGRESS PROCESSING部分
action myTunnel_forward(egressSpec_t port) {
standard_metadata.egress_spec = port;
}
table myTunnel_exact {
key = {
hdr.myTunnel.dst_id: exact;
}
actions = {
myTunnel_forward;
drop;
}
size = 1024;
default_action = drop();
}
apply {
if (hdr.ipv4.isValid() && !hdr.myTunnel.isValid()) {
// Process only non-tunneled IPv4 packets
ipv4_lpm.apply();
}
if (hdr.myTunnel.isValid()) {
// process tunneled packets
myTunnel_exact.apply();
}
}
DEPARSER部分
packet.emit(hdr.myTunnel);
3. make run
成功运行截图
❎Error:缺少第二步直接make run失败报错
make run报错截图
原因:查看basic_tunnel.p4内的MyIngress部分函数为补充完整(第二步),或者直接选择solution内的p4文件进行替换,重新make run
4. mininet进入成功, 连通性测试
pingall
5. 实现IPV4隧道转发
输入xterm h1 h2 h3 打开多个结点进行连通测试
测试1:无隧道的转发测试
在h1终端输入 ./send.py 10.0.2.2 “p4”
在h2终端输入 ./receive.py
测试结果:h1 send h2成功
测试2:隧道转发测试
在h1终端输入 ./send.py 10.0.2.2 “p4is here” --dst_id 2
在h2终端输入 ./receive.py
测试结果:h1 send h2成功
6. 退出
mininet> exit
make可能会留下在后台运行的Mininet实例。使用这些命令清除以下实例。
make stop
make clean
知识点
1. mininet是什么?
参考资料:Mininet介绍 - 简书 (jianshu.com)
Mininet是由一些虚拟的终端节点(end-hosts)、交换机、路由器连接而成的一个网络仿真器,它采用轻量级的虚拟化技术使得系统可以和真实网络相媲美。
Mininet可以很方便地创建一个支持SDN的网络:host就像真实的电脑一样工作,可以使用ssh登录,启动应用程序,程序可以向以太网端口发送数 据包,数据包会被交换机、路由器接收并处理。有了这个网络,就可以灵活地为网络添加新的功能并进行相关测试,然后轻松部署到真实的硬件环境中。
2. xterm是什么?
XTerm是一个X Window System上的终端模拟器,用来提供多个独立的SHELL输入输出。
3. 官方的实验教程翻译
前言
在本练习中,我们将为您在上一次任务中完成的IP路由器添加对基本隧道协议的支持。基本交换机根据目标IP地址进行转发。您的工作是定义一个新的报头类型来封装IP数据包并修改交换机代码,以便它使用新的隧道报头来决定目标端口。
新的报头类型将包含一个协议ID,它表示被封装的报文的类型,以及用于路由的目的地ID。
剧透警告:solution子目录中有一个参考解决方案。请随意将您的实现与引用进行比较。
此任务的初始代码位于一个名为 basic_tunnel.p4 的文件中,是前面的练习中 IP 路由器的简单解决方案。
关于控制平面的说明
P4程序定义了数据包处理流水线,但每个表中的规则由控制平面插入。当规则与数据包匹配时,它的操作被控制平面提供的参数作为规则的一部分调用。
对于本练习,我们已经添加了必要的静态控制平面表项。作为启动Mininet实例的一部分,make run命令将在每个交换机的表中安装数据包处理规则,这些规则是在sX-runtime.json文件中定义,其中X对应于交换机编号。
由于控制平面尝试访问myTunnel_exact表,并且该表尚不存在,因此make run命令不适用于初始代码。
重要:我们使用 P4Runtime 来安装控制平面规则。sX-runtime.json 文件的内容引用由编译器生成的 P4Info 文件中定义的表、键和操作的特定名称(在执行 make run 之后查找文件 build/basic.p4pnfo)。P4程序中添加或重命名表、键或操作的任何更改都需要反映在这些 sX-runtime.json文件中。
Step 1: 实现基本隧道
basic_tunnel.p4文件包含一个基本IP路由器的实现。它还包含用TODO标记的注释,这些注释指出了您需要实现的功能。一个basic_tunnel.p4的完整实现能使交换机可以根据自定义封装头的内容进行转发,如果报文中不存在封装头,也可以进行正常的IP转发。
你的工作如下:
- NOTE: 添加了一个名为myTunnel_t的新报头类型,它包含两个16位字段:proto_id和dst_id。
- NOTE: myTunnel _ t 报头已添加到报头结构中。
- TODO: 更新解析器(parser)以根据以太网报头中的etherType字段提取myTunnel报头或ipv4报头。myTunnel报头对应的etherType为0x1212。如果proto_id == TYPE_IPV4(即0x0800),解析器还应该提取myTunnel头之后的ipv4头。
- TODO: 定义一个名为myTunnel_forward的新动作,它简单地将出口端口(即standard_metadata总线的egress_spec字段)设置为控制平面提供的端口号。
- TODO: 如果myTunnel报头是有效的,更新MyIngress控制块中的apply语句来应用你新定义的myTunnel_exact表。否则,如果ipv4报头有效,则调用ipv4_lpm表。
- TODO: 更新分离器(deparser)以发出以太网,然后是myTunnel,然后是ipv4头。请记住,分离器只会发出有效的头文件。报头的隐式有效性位在提取时由解析器设置。所以这里不需要检查报头的有效性。
- TODO: 为新定义的表添加静态规则,以便交换机将正确地转发dst_id的每个可能值。查看下面的图,了解拓扑的端口配置以及我们将如何为主机分配id。对于这一步,您需要将转发规则添加到sx-runtime.json文件。
Step 2: 运行你的代码
- 在你的shell运行
make run
这一步运行包括:
- 编译basic_tunnel.p4
- 启动Mininet实例,其中三个交换机(s1、s2、s3)配置成三角形,每个交换机连接到一个主机(h1、h2和h3)。
- 主机的ip地址分别为10.0.1.1、10.0.2.2和10.0.3.3。
-
你现在应该看到一个Mininet命令提示符。分别打开h1和h2两个终端:
mininet> xterm h1 h2
-
每个主机都包括一个小型的基于Python的消息传递客户端和服务器。在h2的xterm中,启动服务器:
./receive.py
-
首先,我们将在没有隧道的情况下进行测试。在h1的xterm中,发送一个消息给h2:
./send.py 10.0.2.2 "P4 is cool"
-
数据包应该在h2收到。如果您检查收到的数据包,您应该看到它由一个以太网报头、一个IP报头、一个TCP报头和消息组成。如果你改变了目的IP地址(例如尝试发送到10.0.3.3),那么h2不会接收到该消息,而是会接收到h3。5.现在我们用隧道法进行测试。在h1的xterm中,发送一个消息给h2:
./send.py 10.0.2.2 "P4 is cool" --dst_id 2
-
数据包应该在h2收到。如果您检查收到的数据包,您应该看到它由一个以太网报头、一个隧道报头、一个IP报头、一个TCP报头和消息组成。
-
在h1的xterm中,发送一个消息:
./send.py 10.0.3.3 "P4 is cool" --dst_id 2
-
数据包应该在h2接收,即使该IP地址是h3的地址。这是因为当报文中有MyTunnel报头时,交换机不再使用IP报头进行路由。
-
键入exit或Ctrl-D以离开每个xterm和Mininet命令行。
PythonScapy本身不支持myTunnel头类型,所以我们提供了一个名为myTunnel_header.py的文件,它为我们的新自定义头添加了对Scapy的支持。如果您有兴趣了解如何这样做,请随意检查这个文件。
4. 隧道是什么?
参考资料:https://blog.csdn.net/Fly_hps/article/details/80626636
隧道技术(Tunneling)是一类网络协议,它是一种数据包封装技术,它将原始IP包(其报头包含原始发送者和最终目的地)封装在另外一个数据包(称为封装的IP包)的数据净荷中进行传输。使用隧道的原因是在不兼容的网络上传输数据,或在不安全网络上提供一个安全路径。
参考资料
实验8:数据平面可编程实践——P4 - bae-z - 博客园 (cnblogs.com)
p4-env: 在Ubuntu上快速搭建P4实验环境 (gitee.com)
好库,可以细看一下。从实验环境配置到该实验手把手教学