OpenFlow,一种网络通信协议,属于数据链路层,能够控制网上交换器或路由器的转发平面(forwarding plane),借此改变网络数据包所走的网络路径。。

OpenFlow协议背景:
转发和控制分离是SDN网络的本质特点之一 。在SDN网络架构中,控制平面与转发平面分离,网络的管理和状态在逻辑上集中到一起,底层的网络基础从应用中独立出来,由此,网络获得前所未有的可编程、可控制和自动化能力。这使用户可以很容易根据业务需求,建立高度可扩展的弹性网络。要实现SDN网络的转控分离架构,就需要在SDN控制器与数据转发层之间建立一个通信接口标准。

学过计算机网络的人都知道,OSI七层架构,这是现代互联网通信的基础。而SDN提出的是三层架构,及应用层(业务层),控制层,转发层。在这种架构上有两个突出的特点,一个是控制平面和数据平面分离,一个是可编程性。数控分离可以更大程度的使转发层设备发挥数据转发能力(和瘦AP一个道理);而可编程可以使网络设备成为变形金刚,一个设备可以是交换机,可以是路由器,也可以变成防火墙或者网关,设备功能由程序定义。

Openflow协议于2006年诞生于斯坦福大学的一个资助项目,2008年由Nick McKeown教授发表的论文《OpenFlow:Enableing Innovationin Campus Networks》正式提出。我们已经知道,SDN核心思想为数据与控制分离,硬件与软件解耦。openflow协议通过引入“流”的概念,控制器根据某次通信中“流”的第一个数据分组的特征,使用openflow协议提供的接口对数据平面设备部署策略,也就是在交换机上部署流表,这些通信的后续流量则按照相应流表在硬件上进行匹配,转发,从而实现网络设备在数据转发平面的灵活变动,网络设备的功能不再是一成不变。

OpenFlow控制器:
OpenFlow控制器位于SDN架构中的控制层,通过OpenFlow协议南向指导设备的转发。

1、NOX/pox
NOX是第一款真正的SDN OpenFlow控制器,由Nicira公司在08年开发,并且捐赠给了开源组织。NOX支持OpenFlow V1.0,采用异步的、基于时间的编程模型。

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

3、OpenDaylight
OpenDaylight是一个Linux 基金合作项目,该项目以开源社区为主导,使用Java语言实现开源框架,旨在推动创新实施以及软件定义网络透明化。面对SDN型网络,OpenDaylight作为项目核心,拥有一套模块化、可插拔且极为灵活的控制器,还包含一套模块合集,能够执行需要快速完成的网络任务。

大多数开源的SDN控制器是完全基于OpenFlow协议开发的,这是因为其设计多数源自于Onix(一种分布式控制器框架)。相比之下,大部分商用控制器会将OpenFlow和其他协议进行联合使用,以完成更复杂的功能。

在openflow协议 1.0版本中,流表项主要由三部分组成:分组头域、计数器、动作表。

其中分组头域为数据分组匹配流表项时参考的依据,类似传统交换机做二层转发时匹配数据分组的MAC地址,或者路由器三层转发时的IP地址。分组头域里面包含OSI 1层至4层的12个网络控制信息,如源MAC,目的MAC,VLAN标签,VLAN优先级,源IP,TCP端口号等等,正是因为头域里面提供了丰富的标注,才使得控制器可以对流进行更加细粒度的控制。

计数器可以统计一些流的查找次数,生存时间等。

动作表为相应流对应的动作,如转发到本地网络栈,转给控制器,丢弃等。

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

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

一条OpenFlow的表项(Flow Entry)由匹配域(Match Fields)、优先级(Priority)、处理指令(Instructions)和统计数据(如Counters)等字段组成。
(1)Match Fields
流表项匹配规则,可以匹配入接口、物理入接口,流表间数据,二层报文头,三层报文头,四层端口号等报文字段等。

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

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

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

(5)Timeouts
流表项的超时时间,包括了Idle Time和Hard Time。
Idle Time:在Idle Time时间超时后如果没有报文匹配到该流表项,则此流表项被删除。

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

(6)Cookie
Controller下发的流表项的标识