前言
网络领域顶级会议SIGCOMM2014发表了论文“P4: Programming protocol-independent packet processors”,P4的出现在业内引起了巨大的反响,也掀起了一阵研究P4的热潮。PISCES作为P4的可编程及协议无关的软件交换机,为P4 的进一步发展提供了驱动支持。为分享促进P4交流,本文描述我们对PISCES的解析、安装运行、实例测试等的理解和步骤。
一、PISCES解析
随着网络的蓬勃发展,新的网络技术的推陈出新,人们对于交换机的研究也越来越关注。无论是对于传统网络,还是对于像SDN这类的新兴网络,交换机都在其中扮演着至关重要的意义。
交换机可以分为两类:硬件交换机和软件交换机。和软件交换机相比,普通硬件交换机具有功能单一,升级难的缺点。但软件交换机在增加新功能时,同样存在着以下缺点:(1)代码量巨大;(2)需要修改内核;(3)修改人员需要很强的专业知识。而PISCES就是基于P4语言和OVS开发平台的软件交换机,很好的解决了上述问题,其相对于OVS,实现同样的功能可以缩减40倍的代码量。
选择P4,因为它的交换机的抽象模型类似于OpenFlow(OVS中内置的语言),它允许我们在具有和不具有P4前端的情况下,对OVS进行直接的端对端比较。 有一个共同的方法来表示在网络中的所有交换机的转发并且具有从一个到另一个可移植的代码是有利的。
使用OVS作为PISCES的基础,因为它被广泛使用,并且包含一个可编程交换机的一些基本框架,因此允许我们只关注需要定制的交换机部分(即解析,匹配和动作) 。代码结构良好,适合修改,测试环境已经存在。
PISECS对OVS进行了三次修改,以使其能够实现任何P4程序中描述的转发行为。
1、OVS不支持任意封装和解封装,P4程序可能需要
添加了header()和remove header(),分别执行封装和解封装,并在快速路径中执行这些操作。
2、基于头字段比较的条件
例如:x <y之间的关系测试需要k(k + 1)/ 2个这样的规则。为了同时测试两个这样的条件,单独采取n1和n2规则,需要n1×n2规则。扩展允许P4编译器发出一个形式为If x <y。
3、一般校验和验证/更新
OVS只支持增量校验和,但我们要支持校验和的其他用途的程序员的意图。因此,我们添加了增量校验和优化。
PISCES原型是OVS的修改版本,解析、匹配和动作代码由P4编译器生成的C代码替代。工作流程如图1所示:首先,程序员创建一个P4程序,并使用PISCES版本的P4编译器为OVS生成新的解析,匹配和动作代码。其次,编译OVS(使用常规C编译器)来创建一个依赖于协议的交换机,如P4程序中所述处理数据包。
图1
二、PISCES虚拟环境介绍及配置
接下来我们介绍如何设置PISCES的虚拟环境,同时运行一些P4项目的简单例子。
首先说一下运行环境,笔者最先是在windows下进行安装配置的,但是最后发现会卡在一个地方,这个在下面介绍具体步骤的时候会再提到,所以关于windows的安装就没有再继续下去。
第二次尝试是在windows下vmware虚拟的ubuntu-12的系统里,但是在添加vagrant box这一步时,会认为ubuntu-trusty64.box这个文件是无效文件,同时尝试用vagrant box remove命令删除vagrant box时,发现也删除不了。笔者猜测应该是ubuntu版本的问题,因为这个问题再安装ns3的时候也有遇到过。果然在vmware虚拟了ubuntu-15之后这个问题可以轻松解决,但是在vagrant up这一步的时候,会提示bios没有支持虚拟化,而笔者bios肯定是支持的,不然vmware也跑不起来,归根结底,原因是虚拟机里不能再跑virtual box了。所以在虚拟机下的ubuntu系统跑PISCES也是行不通的。
第三次就是直接在ubuntu系统下,而这次是成功的,接下来我们就以这次成功的配置为案例,介绍如何配置PISCES的虚拟环境。
2.1 需要预装的软件
Virtualbox+ Vagrant
vagrant就是一款构建虚拟开发环境的工具,支持window,linux,mac,总有一款适合你。并且vagrant 可以把配置好的环境打包成一个box,分享给其他人直接使用,非常方便,virtualbox与其搭配一起构建了一个统一的开发环境。
安装命令:
1 2 3 |
Sudo apt-get install virtualbox Sudo apt-get install vagrant: SSH |
SSH 是建立在应用层和传输层基础上的安全协议,用于虚拟环境下实现传输。
安装命令:
1 2 |
Sudo apt-get install ssh Git |
用于下载github上的文件
安装命令
1 |
Sudo apt-get install git |
2.2 安装虚拟机
虚拟机有三种: Switch, Generator, and Receiver。发送端从eth1接口发送流到交换机,交换机根据P4程序的配置处理数据包并将其发送到接受端的eth2接口。接收器接收到流量,并在屏幕上显示数据。
(1)添加vagrant box
1 |
$ vagrant box add pisces-ubuntu-trusty64 http://www.cs.princeton.edu/~mshahbaz/projects/pisces/vagrant/ubuntu-trusty64.box |
这里如果直接下载网速很慢的话,也可以直接通过网站直接下载然后将上面命令里的网址改成存放文件的地址即可,比如:
1 |
$ vagrant box add pisces-ubuntu-trusty64 ~/下载/ ubuntu-trusty64.box |
(Ubuntu-12系统就会认为ubuntu-trusty64.box是无效文件)
(2)从github克隆vagrant文件
1 2 |
$ git clone https://github.com/P4-vSwitch/vagrant.git $ cd vagrant |
(3)打开虚拟机
1 |
$ vagrant up |
这个时候一般需要10-15分钟,不要心急,你可以放松一下。
同时我们打开virutalbox会发现三个虚拟机都已经生成
三、运行实例
3.1 Simple Layer-2 Switch
我们展示如何用PISCES构建一个简单的2层交换机。我们使用由p4程序p4lang / p4factory库提供的 l2_switch.p4。
登陆交换机VM(Log into the switch VM)
1 |
$ vagrant ssh switch |
编译l2_switch.p4
首先,设置交换机VM中DPDK的环境变量
1 2 3 4 |
$ export RTE_SDK=/home/vagrant/ovs/deps/dpdk $ export RTE_TARGET=x86_64-native-linuxapp-gcc $ export DPDK_DIR=$RTE_SDK $ export DPDK_BUILD=$DPDK_DIR/$RTE_TARGET/ |
编译
1 2 3 4 5 6 |
$ cd ~/ovs $ sudo ./configure --with-dpdk=$DPDK_BUILD CFLAGS="-g -O2 -Wno-cast-align" \ p4inputfile=/vagrant/examples/l2_switch/l2_switch.p4 \ p4outputdir=./include/p4/src $ sudo make clean $ sudo make -j 2 |
运行l2_switch.p4
(1)Run ovsdb-server
打开一个新的终端,登陆交换机VM,运行 ovsdb-server
1 2 3 |
$ cd ~/ovs/ovsdb $ sudo ./ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \ --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile |
注意这里的登陆交换机VM包括:
1 2 |
$ cd vagrant $ vagrant ssh switch |
(2)Run ovs-vswitchd
打开一个新的终端,登陆交换机VM,运行 ovs-vswitchd
1 2 |
$ cd ~/ovs/vswitchd $ sudo ./ovs-vswitchd --dpdk -c 0x1 -n 4 -- unix:/usr/local/var/run/openvswitch/db.sock –pidfile |
(3)创建一个OVS网桥
打开一个新的终端,登陆交换机VM,运行一下命令创建一个OVS网桥
1 2 3 4 5 6 |
$ cd ~/ovs/utilities $ sudo ./ovs-vsctl --no-wait init $ sudo ./ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev $ sudo ./ovs-vsctl set bridge br0 protocols=OpenFlow15 $ sudo ./ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk $ sudo ./ovs-vsctl add-port br0 dpdk1 -- set Interface dpdk1 type=dpdk |
注意,网桥建立后就会一直存在,你可以用以下命令删除它
1 |
$ sudo ./ovs-vsctl del-br br0 |
用以下命令查看网桥的设置
1 |
$ sudo ./ovs-vsctl show |
切记,在有网桥的情况下不要再添加相同名字的网桥,否则很容易出现卡死的情况,笔者就出现了这种情况,添加不了新的网桥,也删除不了旧的网桥,打完命令就卡死在那里。(4)安装流规则
1 2 |
$ cd /vagrant/examples/l2_switch/ $ sudo ./l2_switch.sh |
1 2 |
$ cd vagrant $ vagrant ssh generator |
输入以下命令
1 2 |
$ cd ~/pktgen $ sudo ./app/app/x86_64-native-linuxapp-gcc/app/pktgen -c 0x3 -n 4 -- -P -m "1.0" -f /vagrant/examples/l2_switch/generator.pkt |
同样的,打开一个新的终端,登陆接收端VM
1 2 3 4 |
$ cd vagrant $ vagrant ssh receiver $ cd ~/pktgen $ sudo ./app/app/x86_64-native-linuxapp-gcc/app/pktgen -c 0x3 -n 4 -- -P -m "1.0" -f /vagrant/examples/l2_switch/receiver.pkt |
这样我们就可以分别看到接收端和发送端的情况了
发送端:
接收端
3.2 Simple Router
而另外一个实例,构建简单的路由器所需的步骤和上面的大同小异。
(1)P4 程序文件的位置:
1 |
/vagrant/examples/simple_router/simple_router.p4 |
(2)定义流规则文件的位置:
1 |
/vagrant/examples/simple_router/simple_router.sh |
(3)发送和接受测试流
在发送端VM运行以下命令
1 2 |
$ cd ~/pktgen $ sudo ./app/app/x86_64-native-linuxapp-gcc/app/pktgen -c 0x3 -n 4 -- -P -m "1.0" -f /vagrant/examples/simple_router/generator.pkt |
在接受端VM运行以下命令
1 2 |
$ cd ~/pktgen $ sudo ./app/app/x86_64-native-linuxapp-gcc/app/pktgen -c 0x3 -n 4 -- -P -m "1.0" -f /vagrant/examples/simple_router/receiver.pkt |
四、结语
以上PISCES的定义、工作流程和虚拟环境配置就介绍完了,希望能给不了解PISCES的人提供帮助,同时,因为笔者也是初学者,难免出错,请各位大牛批评指正,也欢迎大家多多交流。邮箱:562613629@qq.com。
同时还要感谢在撰写过程中,汪培侨、黄志文、陈翔这几位同学提供的帮助,以及张栋老师的指导。
参考文献:
Bosshart P, Daly D, Gibb G, et al. P4: Programming protocol-independent packet processors[J]. ACM SIGCOMM Computer Communication Review, 2014, 44(3): 87-95.
作者简介:刘宇欣,福州大学数学与计算机科学学院2015级软件工程研究生 ,研究方向:数据中心的拥塞控制;数据平面可编程。