一、OpenFlow协议原理
1.OpenFlow技术背景
●转发和控制分离是SDN网络的本质特点之一。在SDN网络架构中,控制平面与转发平面分离,网络的管理和状态在逻辑上集中到一起,底层的网络基础从应用中独立出来,由此,网络获得前所未有的可编程、可控制和自动化能力。这使用户可以很容易根据业务需求,建立高度可扩展的弹性网络。要实现SDN网络的转控分离架构,就需要在SDN控制器与数据转发层之间建立一个通信接口标准。
●2009年开发出一个满足SDN网络转控分离架构的标准,OpenFlow1.0。
●OpenFlow是一种网上通信协议,属于数据链路层,允许控制器直接访问和操作网络设备的转发平面(forwardingplane),借此改变网上数据包所走的网上路径。这些设备可以是物理设备,也可以是虚拟的路由器或者交换机。转发平面则采用基于流的方式进行转发。
●OpenFlow的思路很简单,网络设备维护一个或者若干个流表,并且数据流只按照这些流表进行转发。流表本身的生成、维护完全由外置的控制器来管理。
●流表项并非仅指普通的IP五元组,而是由一些关键字和执行动作组成的灵活规则,并且每个关键字字段都是可以通配的。在实际应用中,网络管理人员可以通过配置流表项中具体的匹配关键字来决定使用何种粒度的流转发规则。例如,如果只需要根据目的IP进行路由,那么下发流表项时,关键字只匹配目的IP字段,其它关键字全通配,而动作中只需要一个出端口即可实现常规的IP路由转发。
2.OpenFlow版本
OpenFlow各个版本,目前我们Renix支持Openflow1.3版本。
协议版本 |
主要功能 |
OpenFlow 1.0 |
单表、IPV4 |
OpenFlow 1.1 |
多级流表、组表、MPLS、VLAN |
OpenFlow 1.2 |
多控制器、IPV6 |
OpenFlow 1.3 |
Meter表、版本协商能力 |
OpenFlow 1.4 |
流表同步、协议消息完善 |
OpenFlow 1.5 |
数据包类型识别流程(以太网数据包、PPP数据包)egress Table |
下面我们先介绍下OpenFlow1.0版本
3.OpenFlow1.0
一个支持OpenFlow1.0的交换机有一张流表(FlowTable)和一个安全通道(SecureChannel)。流表(FlowTable)向交换机提供执行数据包的查找和转发工作的依据;安全通道(SecureChannel)向交换机提供到外部控制器的安全连接,如下图所示。控制器使用OpenFlow1.0这一南向协议对交换机进行控制。
4.流表FlowTable
一个流表包含一个流表项的集合、一个活动计数器、一个待作用至匹配数据包的操作集(可能包含0个或多个操作)。所有交换机处理的数据都要经过流表的比对。若发现一个匹配的流表项,则这个表项中所有的操作都将在这个数据表上执行。若没有匹配任何流表项,则数据包将通过安全通道转发给控制器。控制器负责在没有有效流表项的情况下决定如何处理数据包,并向交换机的流表添加或删除流表项。 一个流表项由HeaderFields(包头域)、Counters(计数器)、Actions(操作集)组成。如下图所示:
(1)HeaderFields(包头域)
交换机根据HeaderFields(包头域)对接收的数据包进行匹配,OpenFlow1.0的HeaderFields(包头域)由12元组组成。SDN交换机解析数据包后逐一对这12元组进行匹配,每一元组的匹配分为固定值匹配和掩码匹配。12元组详情如下:
(2)Counters(计数器)
交换机使用Counters(计数器)来对匹配的数据包进行更新,Counters(计数器)可根据每流表、每个流、每个端口、每个队列进行维护。
(3)Actions(操作集)
交换机对匹配成功的数据包执行相应的Actions(操作集),每个操作集可能包含0个或多个操作。若发现一个匹配的流表项,则这个表项中所有的操作将在这个数据表上执行。
●若没有匹配任何流表项,也没有包含任何转发操作,交换机将丢弃数据包,用户必须按指定的顺序(如根据优先级编号)来执行待操作列表。
若一个流表项不能按指定的顺序来对数据包执行列表中的操作,则交换机可能将这个流表项驳回,并立即返回一个不支持流的错误值。
操作分为两种,一种为RequiredActions必需操作、另一种为OptionalAction可选操作。注意交换机不需要支持所有的操作类型,只需要支持RequiredActions必需操作即可。交换机连接到控制器时将告知哪些是可选操作。
(4)RequiredActions (必需操作)
每台交换机都必须支持这些操作,包括转发操作中的必需操作和丢弃,其中转发操作中的必需操作包括以下几项。
ALL |
将数据转发至不包括进入接口的所有接口 |
CONTROLLER |
将数据包封装并传输至控制器 |
LOCAL |
将数据包发送至本地交换机网络栈。 |
TABLE |
仅向 packet-out消息执行流表中的操作。 |
IN PORT |
将数据包从其进入的接口发出。 |
丢弃 |
若数据包不匹配所有的流表项,则交换机将丢弃此数据包。 |
(5)OptionalAction (可选操作)
可选操作包括转发操作中的可选操作,入队,修改域。
转发操作中的可选操作包括以下几项:
NORMAL:执行传统交换机支持的转发路径。
FLOOD:使用最小生成树的原理将数据包泛洪至除入口之外的所有接口。
入队:入队操作是将数据包转发至一个端口所对应的队列中。
修改域的操作是SDN最强大的功能之一。允许修改数据包的包头内容包括以下几项:
修改VLAN标签 修改VLAN优先级
弹出VLAN标签 修改源MAC地址
修改目的MAC地址 修改源IP地址
修改目的IP地址 修改IP服务类型字段
修改源端口号 修改目的端口号
(6)匹配流表
交换机接收到一个数据包后,执行匹配流程。其中对于数据包的包头进行解析,以用于交换机基于数据包的类型来查找流表。根据数据包是否属于VLAN(以太网类型0x8100)、是否为ARP数据包(以太网类型0x0806)、是否为IP数据包(以太网类型0x0800)、是否为TCP或UDP包(IP协议为6或7)、是否为ICMP(IP协议为1)来提取关键信息进行比对。
数据包基于优先级(优先级越高,其数字也越高)来对众多流表项进行匹配。若一个流表项指定了精确的匹配(即没有通用符),则它是最高优先级的,其他带有通用符的流表项有其相应的优先级。先匹配优先级高的流表项,如果两个流表项优先级相同,那么由具体的交换机自行决定。
当数据包匹配到一条流表项时,流表项对应的计数器更新。若没有匹配到任何流表项,则交换机将这个数据包通过安全通道发送给控制器。另外注意,若某个域的值为ANNY,则它匹配包头对应这条域中所有可能值的数据包。
5.安全通道(SecureChannel)
●安全通道是连接交换机和控制器的接口,所有的安全通道消息都必须遵守OpenFow协议。OpenFlow协议支持3种消息类型:controller-to-switch(交换机到控制器)、asynchronous(异步)和symmetric(对称),每一类消息又有多个子消息类型。
●controller-to-switch:消息由控制器发起,用于直接管理或监视交换机的状态,包括Features(获取交换机特性)、Configuration(配置OpenFlow交换机)、Modify-State(修改交换机状态,即修改流表)、Read-State(读取交换机状态)、Send-Packet(发送数据包)、Barrier(阻塞消息)
●synchronous(异步)消息:由交换机发起,用以提醒控制器更新网络事件和交换机状态变化的状态,包括Packet-In(告知控制器交换机接收到数据包,注意此数据包为交换机无法处理的数据包)、Flow-Removed(告知控制器交换机流表被删除)、Port-Status(告知控制器交换机端口状态更新)、Error(告知控制器交换机发生错误,如控制器给交换机下发了一些无法执行的命令)
●symmetric(对称)消息:可以由交换机或控制器发起而无须邀请,包括Hello(建立OpenFlow连接),Echo(确认交换机与控制器之间的连接状态,互相探测对方是否存在)、Vendor(由厂商自定义消息)。
6.OpenFlow1.3
OpenFlow1.3增如了多级流表(流水线结构)、组表、度量(Meter,此结构体主要用来做流量,定义转发的性能),修改了数据包特征匹配的描述方法(main方法,更具拓展性),还增加了数据包处理的动作类型,加强了多控制器的支持,提供更安全的连接和辅助连接。
OpenFlow1.3交换机的主要组件主要由一到多个流表、一个组表、一个连接到外部控制器的OpenFlow通道组成。流表和组表执行数据包查找和转发功能。
7.流表(FlowTable)
每个流表包含一个流表项的集合。每个流表项由一个匹配域、一个计数器、一个待作用到匹配的数据包的指令(Instructions)集、一个超时时间、一个cookie组成。一个流表项的结构如下所示:
OpenFlow1.3的流表与OpenFlow1.0的流表最大的不同是原来的行为(Actions)变成了指令(Instructions),可以在流表之间进行跳转。
8.匹配
●OpenFlow1.0定义了12个匹配的元组,OpenFlow1.3定义了40个匹配的元组。
●但并非OpenFlow1.3的匹配全部需要包含这40个元组,只需要包含必备的13个元组进入端口 以太网源地址、 以太网目标地址、以太网类型、 IP协议、IPV4目标地址、IPV6源地址 、IPV6目标地、TCP源端口地址、TCP目标端口地址、UDP源端口地址、UDP目标端口地址
再加入其他所需的可选匹配元组即可。
●OpenFlow13的匹配域是变长的。
9.指今(Instructions)
●一个指令要么修改流水处理(如将数据包指向另一个流表),要么包含一个待加入操作集(Action Set)的操作集合,要么包含一个立即在数据包上生效的操作列表。其中操作集(Action Set)与数据包相关的操作集合在报文被每个表处理的时候可以累加,在指令集指导报文退出处理流水线的时候这些行动会被执行.
●当报文匹配上流表项时,执行表项包含的指令集。指令集类型如下所示:
●当流表项的指令集中不包含GoTo-Table时,立即执行相关联的动作集。动作集类型如下所示:
10.组表(GroupTable)
组表(Group Table)是一个行为桶的列表和选择其中一个或多个桶以应用到一个包基础上的方法。
一个流表项的结构如下图所示:
其中组类型包括以下几项:
★indirect:只包含一个Action列表的组表,转发效率更高,可以用于路由聚合。
★all:执行actionbuckets中的所有动作,可以用于组播。
★select:随机执行actionbuckets中的一个动作,可以用于多径传播。
★fastfailover:如两端点间有N条路径,可写入
★actionbuckets,之后随机选择其中一条路径。
11.OpenFLow1.3流表的流水线处理
●OpenFlow1.3交换机接收到一个数据包后,以流水线的方式匹配多个流表。交换机将匹配域从数据包中提取出来,之后交换机从第一个流表开始查询可匹配的流表项,依次处理至最后一个流表。流表之间是可以跳转的(根据流表项的指定跳转),流表项的匹配过程与OpenFlow1.0类似,每一个流表必须支持能处理table-miss的流表项。table-miss表项指定在流表中如何处理与其他流表项未匹配的数据包,比如数据包发送到控制器,丢弃数据包或直接将包扔到后续的表。
●流表中的处理可以分成三步:
(1)找到最高优先级匹配的流表项。
(2)应用指令:
①修改数据包并更新匹配域(应用操作指令)。
②更新操作集(清除操作和或写入操作指令)。
③更新元数据。
(3)将匹配数据和操作集发送到下一个流表。
12.OpenFLow1.3流表的匹配
OpenFlow1.3流表的匹配流程与OpenFlow1.0相比,数据包进入交换机增加一个需要匹配的信息:一个一层的输入端口In_Port、数据包头(二层、三层、四层的信息)、元数据(64比特的数据,在流表协议转换的时候携带控制器自定义的一些额外的信息)。
二、测试用例
1.测试目的
在Controller上配置流表下发switch
2.测试说明
由于交换机不支持openflow,所以使用测试背靠背验证。
测试仪只能模拟简单的switch,而且测试仪模拟的switch上无法查看到Controller下发的流表信息。这里着重讲配置
3.测试步骤
(1)按图连接好拓扑
(2)使用配置向导在P1上配置OpenFlowController业务
(3)使用配置向导在P2上配置OpenFlowSwitch业务
(4)开启OpenFlowController和Switch业务
(5)开启抓包,查看OpenFlowController发送消息
4.预期结果
OpenFlowController和Switch可以建立会话
查看抓包,可以抓到Controller发送的消息
三、测试步骤
Step1:占用Ports
1.1添加机框
1.2占用Ports
1.3配置端口IP
Step2:配置OpenFlowSwitch
Step3:配置OpenFlowController
3.1配置OpenFlowController
3.2配置ActionList
3.3配置FlowTable —匹配规则
3.4配置FlowTable—指令集
3.5配置CommandList
3.6在Controller上配置Switch信息
Step4:抓取分析OpenFlow消息
4.1运行OpenFlowController 和Switch
4.2抓包查看OpenFlow交互报文
转载:https://blog.csdn.net/XINERTEL/article/details/128034313