实验8:数据平面可编程实践——P4
一、实验目的
- 掌握V1Model框架下P4_16的程序结构和基本语法
- 能够运用 P4 进行简单数据平面编程
二、实验环境
- 下载虚拟机软件Oracle VisualBox或VMware
- 在虚拟机中安装Ubuntu 16.04 Desktop amd64,并安装完整Mininet和P4开发环境
- 提供P4镜像P4-Suite2018.ova,提取码:egwf
三、实验要求
- 学习P4官方示例教程,链接:https://github.com/p4lang/tutorials,了解P4-16版本的基本语法、基于V1Model的P4代码结构,完成如下练习:
(一)基本要求
1.熟悉使用P4实现交换机IPv4的基本转发原理,编写P4程序,在下面的拓扑中实现IPV4 隧道转发
- 补全
/P4/tutorials/exercises/basic_tunnel
中的basic_tunnel.p4
代码
- 在此文件夹中打开终端并输入
make run
命令运行后用xterm
命令打开主机h1 h2 h3
- 在
h2
和h3
中输入./receive.py
,在h1
中分别输入./send.py 10.0.2.2 "P4 is 666"
和./send.py 10.0.3.3 "P4 is 777"
- 可以看到没有采用隧道转发的情况下,由ip地址来决定目的主机
- 采用隧道转发,在
h1
中输入./send.py 10.0.3.3 "P4 is really cool!" --dst_id 2
- 可以看到虽然修改了目的ip地址,但是
h2
还是收到了报文,而h3
没有收到,因为此时通信是根据mytunnel
标头指定的dst_id
进行转发的。
(二)进阶要求
1.在熟悉隧道转发原理的前提下,编写实现P4Runtime的Python代码,将流规则下发到上图拓扑中的交换机,实现依据此规则的隧道转发
- 首先在
/P4/tutorials/exercises/p4runtime
中打开终端运行命令make
,并进行h1 ping h2
操作
- 对
mycontroller.py
里面的writeTunnelRules
函数的代码进行补充(主要是三个规则)
- 另开一个终端输入命令
./mycontroller.py
- 这个时候可以看见ingress,egress的计数都上涨了,并且
h1
与h2
也可以ping通
四、个人总结
- 实验难度:适中
- 实验过程中遇到的困难及解决办法
- 因为这次实验使用了新的虚拟机P4-Suite2018,发现复制粘贴功能用不了了,手动安装了
vmwaretools
之后成功解决问题。 - 刚开始不懂得如何启动
P4runtime
服务,在网上参考了P4相关学习笔记后知道要用make
而不是make run
,(如果报错就先make clean
)并且还要运行mycontroller.py
,因为mycontroller.py
作为一个结能的控制平面做了以下的事情:- 为P4Runtime服务构建了一个到交换机的 gRPC连接
- 把P4程序push给各个交换机
- 在h1,h2之间的两个隧道编写了ingress/egress规则
- 每两秒读隧道的ingress/egress计数器
- 因为这次实验使用了新的虚拟机P4-Suite2018,发现复制粘贴功能用不了了,手动安装了
- 个人感想
- 这几年可编程硬件越来越重要了。在本次实验中,我们接触到了P4可编程语言,P4 作为一个编程语言,还算比较年轻,但也已经有6年多的历史了。类似于Python2和3的版本区别,P4也有两个版本,老的是P4 14,新的是P4 16,大体上看其编程难度也不是很难,作者给的代码都有比较详尽的注释,但自己对于P4编程来说还是不太熟练,在进行进阶要求时,参考了P4学习笔记-3,希望以后还能有机会接触到。
- 这几年可编程硬件越来越重要了。在本次实验中,我们接触到了P4可编程语言,P4 作为一个编程语言,还算比较年轻,但也已经有6年多的历史了。类似于Python2和3的版本区别,P4也有两个版本,老的是P4 14,新的是P4 16,大体上看其编程难度也不是很难,作者给的代码都有比较详尽的注释,但自己对于P4编程来说还是不太熟练,在进行进阶要求时,参考了P4学习笔记-3,希望以后还能有机会接触到。