作者简介:郑浩,东南大学本科生,研究方向:OpenFlow,P4。邮箱: zenhox@163.com
本文内容简介
本文首先向大家简单介绍在学习P4过程中需要用到的工具。本文的主要特色是让对P4感兴趣的大家不费吹灰之力的在工作,学习之余,快速搭建完善的P4实验环境并开始第一个P4实验。本文的更新日期是2018年10月8日,使用相对于大多数教程来说较新的P4环境,本文提供两种搭建环境的方法,它们的特点如下:
优点: 方便,快捷,对操作系统没什么要求。
缺点:运行较慢。
如果工作环境没有Linux系统,建议使用VM。
优点:运行速率快,环境较新。
缺点:可能会遇到错误,需要一个ubuntu系统。
不用担心费神的环境搭建,本文将提供一个一键搭建环境的脚本。这个脚本通过了我多次测试。
实验环境介绍
各个组件简介
主要需要安装5个组件:
首先要明白他们各自的作用【图片来源于p4.org】:
如图,我们写好xxx.p4代码,通过 p4c 这个 p4 compiler 将p4代码编译成为p4交换机可以理解的各种”机器代码”。如果目标交换机是 bmv2 , 那么p4c将生成 .json文件。
搭建环境
搭建环境有两条路可以走:
方法一: 虚拟机套件
1.FTP服务器下载, 这个是一个云主机,如果过期或者服务器崩溃, 联系我去修复。
2.如果FTP服务器崩溃,建议自己装一个Ubuntu16.04的虚拟机,然后调用方法二,其实也很简单。
3.这里还有一个腾讯微云的链接: https://share.weiyun.com/581m3WN
方法二: 真机搭建
真机搭建需要获得各个组件的源码,然后编译安装,可能遇到各个组件之间的版本兼容性,依赖性等问题。
本来打算一步一步写出手动搭建的步骤,但过程比较痛苦,为了防止让大家陷入搭建环境这种苦涩且收益不大的环节,本文按照p4 tutorials中vagrant用于构建虚拟机环境的脚本,进行了适当修改后,最终改成一个搭建真机P4实验环境的脚本。通过这个脚本,可以方便的让大家搭建好P4学习环境,该脚本通过了本人多次测试。
建议在网络环境较好的环境下执行脚本,如果能使用国外的代理就更好了,如果网速较慢,建议晚上睡觉前执行,然后天亮后再瞅瞅,毕竟国内访问github有时真的太慢了。
相关脚本已经上传至p4-quick 。
在搭建之前
为了不破坏原环境的整洁性,我们还是在home目录下创建一个P4的工作目录,并且加入环境变量:
在运行脚本之前,先核实一下必要的环境和依赖:
开始搭建
先安装一些依赖:
然后创建一个文件,用于存放搭建环境的脚本:
然后将以下内容,复制到 env_up.sh文件当中:
保存退出脚本,然后执行这个脚本:
脚本开始自动为你搭建环境,如果中途遇到错误,脚本会中断,如果脚本顺利执行,那么脚本结束后,环境便搭建好了。
进行第一个实验
进行实验之前
如果你下载的是本文提供的第二种虚拟机,或者通过脚本安装了P4环境,现在P4目录下面应该是这个样子:
我们主要的工作目录时tutorials,其余的都是被使用的工具组件。细看tutorials:
其中utils里面存放了一些用于调用各个组件(mininet, bmv2, PI, p4c)的脚本,有了这些脚本,我们可以专注于p4代码的开发,控制面的编写,以及拓扑的构建,而不需要费神去了解bmv2的启动命令,p4c的调用选项等等。具体如何使用,也是非常的简单,我们进入一个具体的例子查看:
可以看到,通过Makefile,我们可以调用utils下的脚本,让我们的p4代码跑起来:
调用make run,我们可以运行当前目录下(以basic目录为例)的代码,它将执行以下几个步骤:
在新版本的tutorials中,载入静态流表项时采用了runtime方法,而非之前的CLI方法,我们查看一下s1-runtime.json的部分
这是一个json文件,可以看到,其作用是定义一个个具体的流表项,标明了流表项所处的位置,匹配域,匹配模式,动作名,以及动作参数。这些字段都依赖于我们P4代码中所自定义的流表,匹配域和动作。
开始第一个实验basic
查看要实现的功能
查看README,里面这样介绍这个实验:
可以看到这是一个实现转发功能的P4实例,文件剩余部分是进行实验具体的思路和指令,建议大家多多查阅README,以后就可以自己学习啦~
查看网络拓扑结构 topology.json:
清晰明了:这个拓扑中有3个switch,3个host,构成一个三角形的拓扑,注意到定义switches的时候,会定义载入到交换机的流表项文件”sN-runtime.json”。
了解大概之后,我们开始编写basic.p4代码:
回忆代码要实现的功能:ip_v4转发。我们需要完成的是tutorials中的TODO部分。
在代码的开头, 我们得知该代码是P4_16版本,使用的是我们之前谈到的v1_model。
通过查看main回顾v1_model:
我们要需要完成以下几个基本的步骤,其余部分可以暂时省略。
定义数据结构:
Parser 解析数据包
parser是一个有限状态机。从 start 状态开始,每一个状态便解析一种协议,然后根据低层协议的类型字段,选择解析高一层协议的状态,然后transition到该状态解析上层协议,最后transition到accept。具体如下:
Ingress
Checksum 和 Deparser
这两个部分都有高度抽象的内置函数直接完成:
写好控制面代码
虽然说官方为了让大家专注于数据面编程,已经给好了控制面指令,但是我们有必要查看一下他们,从而有了更深入的理解, 查看 s[1,2,3]-runtime.json, 里面定义了很多流表项。以s1-runtime.json为例, 具体的一条流表项为:
回想,table name 就是我们在p4代码中自定义的转发表。匹配域也依照了我们自定义的代码。而动作也按照我们编写的动作代码传入了相应的参数。将所有的流表项汇总一下, 我绘制了下面的图片:
看到这一步,我们便了然了。数据面定义了转发表,而控制面下发了具体匹配转发的流表项,使得这三个主机可以互通。而在控制面下发的流表项与我们p4代码中定义的流表结构息息相关。
运行代码
丢包率为0,说明转发功能实现了。这样我们完成了第一个实验。
一点建议
总结
本文提供给大家最快捷的方式去体验,学习和使用P4。其中有方便的虚拟机直接使用,也有真机搭建的脚本。搭建好环境并且开始第一个实验后,大家可以自己专注于P4的学习啦。