1.OpenFlow

2008年,斯坦福大学成立了一个名为Clean Slate的特别工作小组,这个小组在2009年开发出了一个可以满足SDN网络转控分离架构的标准,即OpenFlow 1.0。同时该小组还开发出了OpenFlow的参考交换机和NOX控制器。OpenFlow标准协议允许控制器直接访问和操作网络设备的转发平面,这些设备可以是物理设备,也可以是虚拟的路由器或者交换机。转发平面则采用基于流的方式进行转发。

OpenFlow 1.0问世后不久就引起了业界关注。2011年3月21日,德国电信、脸书、谷歌、微软、雅虎等公司共同成立的了ONF(Open Networking Foundation)组织,旨在推广SDN,并加大OpenFlow的标准化力度。芯片商Broadcom,设备商Cisco、Juniper、HP等,各数据中心解决方案提供者以及众多运营商纷纷参与。该组织陆续制定了OpenFlow 1.1、1.2、1.3、1.4等标准,目前仍在继续完善中。随着越来越多的公司加入ONF,OpenFlow及SDN技术的影响力也越来越大。

OpenFlow协议各个版本的演进过程和主要变化如下图所示,目前使用和支持最多的是OpenFlow1.3版本。

OVS流表和iptables openflow1.0协议流表结构_SDN

OpenFlow交换机转发面由两部分组成:端口和流表。一个交换机可以有很多种端口,也可以有很多级流表。OpenFlow网络由OpenFlow网络设备(OpenFlow 交换机)、控制器(OpenFlow控制器)、用于连接设备和控制器的安全通道(Secure Channel)以及OpenFlow表项组成。其中,OpenFlow 交换机设备和OpenFlow控制器是组成OpenFlow网络的实体,要求能够支持安全信道和OpenFlow表项。

OVS流表和iptables openflow1.0协议流表结构_SDN_02

2.OpenFlow控制器

OpenFlow控制器位于SDN架构中的控制层,通过OpenFlow协议南向指导设备的转发。目前主流的OpenFlow控制器分为两大类:开源控制器和厂商开发的商用控制器。这里简要介绍几款较为知名的开源控制器。

1、NOX/POX

NOX是第一款真正的SDN OpenFlow控制器,由Nicira公司在08年开发,并且捐赠给了开源组织。NOX支持OpenFlow V1.0,并提供相关C++的API,采用异步的、基于时间的编程模型。而POX可以视作是更新的、基于Python的NOX版本,支持Windows,Mac OS和Linux系统上的Python开发,主要用于研究和教育领域。

2、ONOS

ONOS(Open Network Operating System)控制器是由The Open Networking Lab使用Java及Apache实现发布的首款开源SDN网络操作系统,主要面向服务提供商和企业骨干网。ONOS的设计宗旨是实现可靠性强、性能好、灵活度高的SDN控制器。

3、OpenDaylight

OpenDaylight是一个Linux 基金合作项目,该项目以开源社区为主导,使用Java语言实现开源框架,旨在推动创新实施以及软件定义网络透明化。面对SDN型网络,OpenDaylight作为项目核心,拥有一套模块化、可插拔且极为灵活的控制器,还包含一套模块合集,能够执行需要快速完成的网络任务。OpenDaylight控制器的命名以化学元素为名,最初的产品是Hydrogen(氢),当前已经发布了第八个版本Oxygen(氧),并且实现了OpenDaylight与NFV开放平台OPNFV(Open Platform for NFV)、开源云平台OpenStack和开放网络自动化平台ONAP(Open Network Automation Platform)同步。

3.OpenFlow交换机

OpenFlow交换机由硬件平面上的OpenFlow表项和软件平面上的安全通道构成,OpenFlow表项为OpenFlow的关键组成部分,由Controller下发来实现控制平面对转发平面的控制。

OpenFlow 交换机主要有下面两种:

• OpenFlow-Only Switch:仅支持OpenFlow转发。

• OpenFlow-Hybrid Switch:既支持OpenFlow转发,也支持普通二三层转发。

一个OpenFlow交换机可以有若干个OpenFlow实例,每个OpenFlow实例可以单独连接控制器,相当于一台独立的交换机,根据控制器下发的流表项指导流量转发。OpenFlow实例使得一个OpenFlow交换机同时被多组控制器控制成为可能。

OVS流表和iptables openflow1.0协议流表结构_OVS流表和iptables_03

OpenFlow交换机实际在转发过程中,依赖于OpenFlow表项,转发动作则是由交换机的OpenFlow接口完成。OpenFlow接口有下面三类。

物理接口:比如交换机的以太网口等。可以作为匹配的入接口和出接口。

逻辑接口:比如聚合接口、Tunnel接口等。可以作为匹配的入接口和出接口。

保留接口:由转发动作定义的接口,实现OpenFlow转发功能。

4.OpenFlow表项

OpenFlow的表项在V1.0阶段,只有普通的单播表项,也即我们通常所说的OpenFlow流表。随着OpenFlow协议的发展,更多的OpenFlow表项被添加进来,如组表(Group Table),计量表(Meter Table)等,以实现更多的转发特性以及QoS功能。

狭义的OpenFlow流表是指OpenFlow单播表项,广义的OpenFlow流表则包含了所有类型的OpenFlow表项。OpenFlow通过用户定义的流表来匹配和处理报文。所有流表项都被组织在不同的Flow Table中,在同一个Flow Table中按流表项的优先级进行先后匹配。一个OpenFlow的设备可以包含一个或者多个Flow Table。

4.1流表项组成

一条OpenFlow的表项(Flow Entry)由匹配域(Match Fields)、优先级(Priority)、处理指令(Instructions)和统计数据(如Counters)等字段组成,流表项的结构随着OpenFlow版本的演进不断丰富,不同协议版本的流表项结构如下。

OVS流表和iptables openflow1.0协议流表结构_SDN_04

(1)Match Fields

流表项匹配规则,可以匹配入接口、物理入接口,流表间数据,二层报文头,三层报文头,四层端口号等报文字段等。

(2)Priority

流表项优先级,定义流表项之间的匹配顺序,优先级高的先匹配。

(3)Counters

流表项统计计数,统计有多少个报文和字节匹配到该流表项。

(4)Instructions & Actions

流表项动作指令(Instructions & Actions)集,定义匹配到该流表项的报文需要进行的处理。当报文匹配流表项时,每个流表项包含的指令集就会执行。这些指令会影响到报文、动作集以及管道流程。 交换机不需要支持所有的指令类型,并且控制器可以询问。

Instructions

OpenFlow交换机所支持的指令类型。 具体的指令(Instructions)类型参见下表:

OVS流表和iptables openflow1.0协议流表结构_Group_05

每个流表表项的指令集中每种指令类型最多只能有一个,指令的执行的优先顺序为:

Meter –> Apply-Actions -> Clear Actions -> Write-Actions -> Write-Metadata -> Goto-Table

当OpenFlow交换机无法执行某个流表项中的动作时,该交换机可以拒绝这个流表项,并向Controller返回unsupported flow error 信息。

Action

常见Action动作的类型如下:

OVS流表和iptables openflow1.0协议流表结构_Group_06

(5)Timeouts

流表项的超时时间,包括了Idle Time和Hard Time。

Idle Time:在Idle Time时间超时后如果没有报文匹配到该流表项,则此流表项被删除。

Hard Time:在Hard Time时间超时后,无论是否有报文匹配到该流表项,此流表项都会被删除。

(6)Cookie

Controller下发的流表项的标识

4.2 流表处理流程

OpenFlow规范中定义了流水线式的处理流程,报文匹配处理流程如下图所示:

OVS流表和iptables openflow1.0协议流表结构_SDN_07

当报文进入Switch后,必须从最小的Flow Table开始依次匹配。Flow Table可以按次序从小到大越级跳转,但不能从某一Flow Table向前跳转至编号更小的Flow Table。当报文成功匹配一条Flow Entry后,将首先更新该Flow Entry对应的统计数据(如成功匹配数据包总数目和总字节数等),然后根据Flow Table中的指令进行相应操作,比如跳转至后续某一Flow Table继续处理,修改或者立即执行该数据包对应的Action Set等。当数据包已经处于最后一个Flow Table时,其对应的Action Set中的所有Action将被执行,包括转发至某一端口,修改数据包某一字段,丢弃数据包等。具体实现时,OpenFlow交换机还需要对匹配表项次数进行计数、更新匹配集和元数据等操作。

下图为流表匹配流程示意图。

4.3 Table Miss表项

每个流表(Flow Table)都包含一个Table Miss流表项,该表项用于定义在流表中没有匹配的报文的处理方式,该表项的匹配域为通配,即匹配任何报文,优先级为0,Instructions与正常表项相同。通常,如果Table-Miss表项不存在,默认行为是丢弃报文。

4.4 Flow Remove

Flow Entry可以由Controller通过OpenFlow消息进行删除,也可以在Idle Time超时或者Hard Time超时后自动删除。Idle Time超时有两种情况:某个流表表项长时间不匹配报文则idle_timeout字段设置为非0;某个流表表项一定时间过后,无论是否匹配报文 hard_timeout字段设置为非0。如果Controller在建立表项时,携带了Flow Remove标记,则表项在删除时,设备需要通知Controller Flow Remove消息。

5.OpenFlow组表

OpenFlow组表的表项被流表项(Flow Entry)所引用,提供组播报文转发功能。一系列的Group表项组成了Group Table,每个表项结构如图:

OVS流表和iptables openflow1.0协议流表结构_OVS流表和iptables_08

根据Group ID可检索到相应Group表项,每个Group表项包含多个动作Bucket,每个Bucket包含多个动作,Bucket内的动作执行顺序依照Action Set的顺序。

6.OpenFlow Meter表

Meter计量表项被流表项(Flow Entry)所引用,为所有引用Meter表项的流表项提供报文限速的功能。一系列的Meter表项组成了Meter Table, 每个Meter表项的组织结构如下:

OVS流表和iptables openflow1.0协议流表结构_Group_09

一个Meter表项可以包含一个或者多个Meter Bands,每个Meter Band定义了速率以及动作,报文的速率超过了某些MeterBand,根据这些MeterBand中速率最大的那个定义的动作进行处理。