实验8:数据平面可编程实践——P4
一、实验目的
1.掌握V1Model框架下P4_16的程序结构和基本语法
2.能够运用 P4 进行简单数据平面编程
二、实验环境
1.下载虚拟机软件Oracle VisualBox或VMware;
2.在虚拟机中安装Ubuntu 16.04 Desktop amd64,并安装完整Mininet和P4开发环境;
3.提供P4镜像P4-Suite2018.ova,提取码:egwf
三、实验要求
学习P4官方示例教程,链接:(https://github.com/p4lang/tutorials),了解P4-16版本的基本语法、基于V1Model的P4代码结构,完成如下练习:
(一)基本要求
熟悉使用P4实现交换机IPv4的基本转发原理,编写P4程序,在下面的拓扑中实现IPV4 隧道转发。

- 进入文件夹
/P4/tutorials/exercises/basic_tunnel
- 在
basic_tunnel.p4
中补全代码后,在终端输入make run
运行,并启动mininet
- 输入
pingall
测试连通性
- 输入
xterm h1 h2 h3
打开主机模拟终端
没有采用隧道转发时
- 在h2终端下输入
./receive.py
- 在h1终端下输入
./send.py 10.0.2.2 "031902335 h1 to h2"
,没有采用隧道转发,h1向h2发送消息,h3无法收到
- 在h3终端下输入
./receive.py
- 在h1终端下输入
./send.py 10.0.3.3 "031902335 h1 to h3"
,没有采用隧道转发,h1向h3发送消息,h2无法收到
采用隧道转发时
- 在h1终端下输入
./send.py 10.0.2.2 "031902335 hi 1-2" --dst_id 2
,采用隧道转发,h2收到消息
- 在h1终端下输入
./send.py 10.0.3.3 "031902335 hi 1-3" --dst_id 2
,采用隧道转发,虽然IP改变,但是经过隧道转发,交换机仍然将该报文发送给h2
(二)进阶要求
在熟悉隧道转发原理的前提下,编写实现P4Runtime的Python代码,将流规则下发到上图拓扑中的交换机,实现依据此规则的隧道转发。
- 进入目录
/P4/tutorials/exercises/p4runtime
,打开终端输入make
运行,并启动mininet
修改代码前
- 输入
mininet> h1 ping h2
,因为交换机中没有规则,所以无法ping通 - 打开另一个终端并输入
cd ~/tutorials/exercises/p4runtime
./mycontroller.py
,每隔2秒打印隧道入口和出口计数器。 - 在第二个终端中输入
Ctrl-C
来停止mycontroller.py
修改代码后
- 在第一个终端再次输入
mininet> h1 ping h2
,发现隧道入口和出口计数器都发生了变化
三、个人总结
-
实验难度:难
-
实验过程遇到的困难及解决办法:
- 导入镜像后,发现虚拟机页面很小,而且也不能粘贴代码,查询资料后才知道要安装VMware Tools,安装后得以解决。
- 在补全代码上遇到了困难,通过翻找官方文档、查询资料、询问同学,才编写出代码。查看github源码时一开始还不太理解,后来发现,源码中有todo的地方就是我要加入代码的地方,并且通过readme可以了解如何操作运行。
- 补全代码后输入
make run
命令报错,查询资料和通过参考同学博客的解决问题部分发现,应该要修改P4 程序,使调用 mark_to_drop()函数 时不携带参数,修改后能成功运行。
- 在做进阶实验时,有了基础部分的基础,上手就会快些,操作步骤参考github源码里的readme部分就可以明白,但是在代码编写上就出了点问题,从官网的代码中进行修改,参考规则一、三编写规则二的代码,不知道是哪里改错了一直无法运行
mycontroller.py
,但是找不到原来的代码了,只好找同学要了虚拟机中的mycontroller.py
代码,然后在这基础上加以修改,仔细检查后发现是出入口隧道搞错了,修改后可以运行。
-
个人感想:
本次实验最难的部分就是代码编写,查看官方代码时又是通过翻译和英文结合才能勉强理解其中的步骤和含义,通过本次实验,学习老师给出的教程了解P4-16版本的基本语法、基于V1Model的P4代码结构后,对p4有了更深的了解,这次实验只涉及到了p4的一部分,所以对p4的学习还不够深,还有很多地方要了解学习。通过这几次实验,对mininet的使用已经很熟练了,也提高了查看英文文档、编写代码的能力,学到了很多知识。