FlowVisor是建立在OpenFlow之上的网络虚拟化工具,它可以将物理网络划分成多个逻辑网络,从而实现虚网划分。它为管理员提供了通过定义流规则,而不是调整路由器和交换机配置的方式来管理网络。正如管理程序依赖于标准x86指令来虚拟化服务器一样,FlowVisor使用标准OpenFlow指令集来管理OpenFlow交换机,这些指令设置了低级别规则,比如如何基于数据包表头的特点来转发数据包。
1 工作原理
作为一个网络虚拟化平台,FlowVisor部署在标准OpenFlow控制器和OpenFlow交换机之间,成为二者的透明代理。FlowVisor能够与多个控制器连接使得每个控制器控制一个虚网,保证各虚网相互隔离。
FlowVisor的设计有如下几个原则:(a) FlowVisor对控制器和交换机而言是透明的,它们都感知不到FlowVisor的存在;(b)各个虚网之间是隔离的,即使在广播条件下各个虚网的流量也必须实现隔离;(c)虚网划分策略是丰富且可扩展的,由于当前网络虚拟化的技术还不成熟,因此划分虚网的策略需要是灵活的、模块化的且可扩展的。
目前虚网划分范围涵盖了物理层、数据链路层、网络层和传输层的协议字段,以数据包的12元组作为划分依据,按照流的思想将网络资源进行合理分配,以达到限定当前切片内数据流量类型的目的。一般对于某个特殊的应用,可以通过指定源/目的IP地址、源/目的MAC地址或者TCP端口信息来把数据包划分到一个切片内。
FlowVisor是一个特殊的OpenFlow控制器,所有OpenFlow消息都将透过FlowVisor进行传送。FlowVisor会根据配置策略对OpenFlow消息进行拦截、修改、转发等操作。这样,OpenFlow控制器就只控制其被允许控制的流,并不知道其所管理的网络被FlowVisor进行过分片操作。相似地,从交换机发出的消息经过FlowVisor也只会被发送到相应的控制器。
FlowVisor主要由FVClassifier、FVSlicer和FlowSpace数据库三部分组成。FVClassifier用于维护与物理OpenFlow交换设备的连接,处理IO请求并记录每个物理设备的端口、性能等信息,每个FVClassifier对应一个OpenFlow交换设备。FVSlicer用于维护与控制器的连接,管理OpenFlow会话并对控制器下发的信令进行处理。当流从一个物理的OpenFlow交换设备到达FlowSpace后,FlowSpace根据数据库中切片规则,把OF消息交给本切片内的FVSlicer发送给连接的控制器。
图 1. FlowVisor工作原理
FlowVisor的核心主要是对上行消息的映射和对下行信令的过滤。如图1所示,控制器和交换机与FlowVisor的所有联系都通过Poll Loop来交互,交换机交给控制器的数据包通过FlowVisor的OFSwitchAcceptor模块接收后,FVClassifier对数据包的来源进行分析,再连接到FlowVisor中的数据库与Flowspace进行匹配,从而决定此数据包应该交由哪个控制器来处理。同理,控制器下发给交换机的数据包会通过相反的过程到达交换机。
2 安装配置
下面介绍如何在通用的Linux或者FreeBSD主机上构建和安装FlowVisor。以Ubuntu14.04系统下构建安装FlowVisor1.2为例,步骤如下:
第一步:源码下载,采用git的方式进行源码下载,下载FlowVisor-1.2-MAINT.zip安装包。
第二步:依赖包安装,需要安装ant和jdk,jdk要求使用jdk1.6版本或其以下版本,否则会发生错误。
第三步:编译,解压FlowVisor-1.2-MAINT.zip包后进行编译,成功后可以看到“BUILD SUCCESSFUL”提示。
第四步:安装,安装时使用默认路径,并输入用户名、用户组和密码,用户名是ubuntu的用户名。
FlowVisor安装完成后,它的配置文件位于/etc/flowvisor/config.json。配置文件中包括简单的Slice、FlowSpaceRule样例,以及FlowVisor的监听端口、日志等级、版本等信息。api_webserver_port是xml请求的监听端口,默认为8080; api_jetty_webserver_port是JSON请求的监听端口;listen_port是交换机的监听端口,默认为6633。参数配置如下所示:
图 2. FlowVisor参数配置
FlowVisor配置完成后,系统切换到FlowVisor用户下,即在上一步安装中输入的用户名,然后运行FlowVisor,命令如下:
3 常用命令
FlowVisor中常用的命令如表1所示:
表 1. FlowVisor常用命令
4 一个简单实例
软件环境准备:
在Ubuntu14.04LTS下搭建本实例所需的软件环境,安装软件如表2所示。其中基本软件环境镜像可以在sdnlab资源库中下载mininet-2.1.0p2-140718-ubuntu-14.04-server-amd64-ovf(包括Ubuntu14.04及安装好的mininet),链接为http://pan.baidu.com/s/1sjG0fXN。
表 2. 所需软件
相关端口配置:
表 3. 端口配置
网络拓扑配置:
图 3. 实例拓扑图
第二步,启动Mininet构建物理拓扑,包括1个交换机,2个主机,设置远程控制器为FlowVisor(127.0.0.1,6633)。
执行结果如下:
第三步,在FlowVisor上创建slice,指定FloodLight控制器(127.0.0.1:6634);然后添加两条基于端口划分的flowspace。
第四步,测试
在Mininet下进行主机ping操作。
执行结果如下,主机h1与h2可通信:
在FlowVisor下停止slice 。
在Mininet下再次验证h1与h2是否可通信。
执行结果如下,主机h1与h2不可通信:
5 总结
通过本文的阐述及实践,我们了解了FlowVisor的基本概念及工作原理。综合使用FlowVisor、FloodLight和Mininet,构建了一个基本SDN运行实例,通过本实例加强了对SDN组成原理的理解,提高了对FlowVisor的工作原理和使用方法的认知程度。希望以后可以为大家提供更多的实例,大家有想法也可以进一步交流。
本文来源于SDNLAB,可点击此阅读原文。如果您对本文感兴趣,可参与以下互动方式与作者近距离交流。(1) 微博(http://weibo.com/sdnlab/)
(2) 微信(账号:SDNLAB)
(3) QQ群
SDN研究群(214146842)
OpenDaylight研究群(194240432)