本文首发于我的公众号码农之屋(id: Spider1818),专注于干货分享,包含但不限于Java编程、网络技术、Linux内核及实操、容器技术等。欢迎大家关注,二维码文末可以扫。
导读:OpenFlow协议允许控制器直接访问和操作网络设备的转发平面,它是实现SDN网络转控分离的关键部分。通过OpenFlow协议,SDN控制器与数据转发层之间建立了一个标准的通信接口。本文将对其背景及组件进行详细介绍,OpenFlow的运行机制将放在下一篇文章进行介绍。
一、背景
转发和控制分离是SDN网络的本质特点之一。在SDN网络架构中,控制平面与转发平面分离,网络的管理和状态在逻辑上集中到一起,底层的网络基础从应用中独立出来,由此,网络获得前所未有的可编程、可控制和自动化能力。这使用户可以很容易根据业务需求,建立高度可扩展的弹性网络。要实现SDN网络的转控分离架构,就需要在SDN控制器与数据转发层之间建立一个标准通信接口。
2008年,斯坦福大学成立了一个名为Clean Slate的小组,这个小组在2009年开发出了一个可以满足SDN网络转控分离架构的标准,即OpenFlow 1.0。OpenFlow协议允许控制器直接访问和操作网络设备的转发平面,这些设备可以是物理设备,也可以是虚拟的路由器或者交换机。
OpenFlow 1.0问世后不久就引起了业界关注。2011年3月21日,德国电信、脸书、谷歌、微软、雅虎等公司共同成立的了ONF组织,旨在推广SDN,并加大OpenFlow的标准化力度。该组织陆续制定了OpenFlow 1.1、1.2、1.3、1.4等标准,目前仍在继续完善中。
二、OpenFlow组件
OpenFlow组件包含了OpenFlow交换机、OpenFlow控制器、用于连接设备和控制器的安全通道(Secure Channel)以及OpenFlow表项,具体可参考图1。其中OpenFlow交换机设备和OpenFlow控制器是组成OpenFlow网络的实体,要求能够支持安全信道和OpenFlow表项。
2.1、OpenFlow控制器
OpenFlow控制器位于SDN架构中的控制层,通过OpenFlow协议南向指导设备的转发。目前主流的OpenFlow控制器分为两大类:开源控制器和厂商开发的商用控制器。这里简要介绍几款较为知名的开源控制器。
1)NOX/POX
NOX是第一款真正的SDNOpenFlow控制器,由Nicira公司在08年开发,并且捐赠给了开源组织。NOX支持OpenFlow V1.0,并提供相关C++的API,采用异步的、基于时间的编程模型。
2)ONOS
ONOS控制器是由The OpenNetworking Lab使用Java及Apache实现发布的首款开源SDN网络操作系统,主要面向服务提供商和企业骨干网。ONOS的设计宗旨是实现可靠性强、性能好、灵活度高的SDN控制器。
3)OpenDaylight
OpenDaylight是一个Linux 基金合作项目,该项目以开源社区为主导,使用Java语言实现开源框架,旨在推动创新实施以及软件定义网络透明化。面对SDN型网络,OpenDaylight作为项目核心,拥有一套模块化、可插拔且极为灵活的控制器,还包含一套模块合集,能够执行需要快速完成的网络任务。
2.2、OpenFlow交换机
OpenFlow交换机由硬件平面上的OpenFlow表项和软件平面上的安全通道构成,OpenFlow表项为OpenFlow的关键组成部分,由Controller下发来实现控制平面对转发平面的控制。
一个OpenFlow交换机可以有若干个OpenFlow实例,每个OpenFlow实例可以单独连接控制器,相当于一台独立的交换机,根据控制器下发的流表项指导流量转发。OpenFlow实例使得一个OpenFlow交换机同时被多组控制器控制成为可能。
OpenFlow交换机实际在转发过程中,依赖于OpenFlow表项,转发动作则是由交换机的OpenFlow接口完成。OpenFlow接口主要有三类,物理接口(比如交换机的以太网口)、逻辑接口(比如聚合接口、Tunnel接口)和保留接口(由转发动作定义的接口,实现OpenFlow转发功能)。
三、OpenFlow表项
OpenFlow的表项在V1.0阶段,只有普通的单播表项,也即我们通常所说的OpenFlow流表。随着OpenFlow协议的发展,更多的OpenFlow表项被添加进来,如组表(Group Table),计量表(Meter Table)等,以实现更多的转发特性以及QoS功能。
3.1、OpenFlow流表
狭义的OpenFlow流表是指OpenFlow单播表项,广义的OpenFlow流表则包含了所有类型的OpenFlow表项。OpenFlow通过用户定义的流表来匹配和处理报文。所有流表项都被组织在不同的Flow Table中,在同一个Flow Table中按流表项的优先级进行先后匹配。一个OpenFlow的设备可以包含一个或者多个Flow Table。
(1)、流表项组成
一条OpenFlow的表项(Flow Entry)由匹配域(Match Fields)、优先级(Priority)、处理指令(Instructions)和统计数据(如Counters)等字段组成,流表项的结构随着OpenFlow版本的演进不断丰富,不同协议版本的流表项结构如下。
1)Match Fields
流表项匹配规则,可以匹配入接口、物理入接口,流表间数据,二层报文头,三层报文头,四层端口号等报文字段等。
2)Priority
流表项优先级,定义流表项之间的匹配顺序,优先级高的先匹配。
3)Counters
流表项统计计数,统计有多少个报文和字节匹配到该流表项。
4)Instructions& Actions
流表项动作指令(Instructions& Actions)集,定义匹配到该流表项的报文需要进行的处理。当报文匹配流表项时,每个流表项包含的指令集就会执行。这些指令会影响到报文、动作集以及管道流程。交换机不需要支持所有的指令类型,并且控制器可以询问OpenFlow交换机所支持的指令类型。具体的指令类型参见下表:
表1流表项动作指令
Instruction | 处理 |
Meter | 对匹配到流表项的报文进行限速 |
Apply-Actions | 立即执行Action |
Clear-Actions | 清除动作集(Action Set)中的所有Action |
Write-Actions | 更改动作集(Action Set)中的所有Action |
Write-Metadata | 更改流表间数据,在支持多级流表时使用 |
Goto-Table | 进入下一级流表 |
每个流表表项的指令集中每种指令类型最多只能有一个,指令的执行的优先顺序为:
Meter –> Apply-Actions -> Clear Actions-> Write-Actions -> Write-Metadata -> Goto-Table
当OpenFlow交换机无法执行某个流表项中的动作时,该交换机可以拒绝这个流表项,并向Controller返回unsupported flow error信息。
常见Action动作的类型如下:
表2 Action动作
必选的 | Output | 转发到指定的OpenFlow端口 |
Drop | 无直接动作,指令集中无output动作则丢弃该报文 |
Group | 处理报文到指定Group |
可选的 | Set-Queue | 设置报文的队列id |
Push-Tag/Pop-Tag | 写入/弹出标签例如VLAN, MPLS等 |
Set-Field | 修改报文的头字段 |
Change-TTL | 修改TTL,Hop Limit等字段 |
5)Timeouts
流表项的超时时间,包括了Idle Time和Hard Time。
Idle Time:在Idle Time时间超时后如果没有报文匹配到该流表项,则此流表项被删除。
Hard Time:在Hard Time时间超时后,无论是否有报文匹配到该流表项,此流表项都会被删除。
6)Cookie
Controller下发的流表项的标识
3.2、流表处理流程
OpenFlow规范中定义了流水线式的处理流程,报文匹配处理流程如下图所示:
当报文进入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交换机还需要对匹配表项次数进行计数、更新匹配集和元数据等操作。
3.3、Table Miss表项
每个流表(Flow Table)都包含一个TableMiss流表项,该表项用于定义在流表中没有匹配的报文的处理方式,该表项的匹配域为通配,即匹配任何报文,优先级为0,Instructions与正常表项相同。通常,如果Table-Miss表项不存在,默认行为是丢弃报文。
3.4、Flow Remove
Flow Entry可以由Controller通过OpenFlow消息进行删除,也可以在IdleTime超时或者Hard Time超时后自动删除。Idle Time超时有两种情况:某个流表表项长时间不匹配报文则idle_timeout字段设置为非0;某个流表表项一定时间过后,无论是否匹配报文 hard_timeout字段设置为非0。如果Controller在建立表项时,携带了Flow Remove标记,则表项在删除时,设备需要通知Controller Flow Remove消息。
四、OpenFlow组表
OpenFlow组表的表项被流表项(Flow Entry)所引用,提供组播报文转发功能。一系列的Group表项组成了GroupTable,每个表项结构如图:
根据Group ID可检索到相应Group表项,每个Group表项包含多个动作Bucket,每个Bucket包含多个动作,Bucket内的动作执行顺序依照ActionSet的顺序。
4.1、OpenFlowMeter表
Meter计量表项被流表项(FlowEntry)所引用,为所有引用Meter表项的流表项提供报文限速的功能。一系列的Meter表项组成了MeterTable,每个Meter表项的组织结构如下:
一个Meter表项可以包含一个或者多个MeterBands,每个Meter Band定义了速率以及动作,报文的速率超过了某些MeterBand,根据这些MeterBand中速率最大的那个定义的动作进行处理。
4.2、OpenFlow安全通道
OpenFlow设备与Controller通过建立OpenFlow信道,进行OpenFlow消息交互,实现表项下发,查询以及状态上报等功能。通过OpenFlow信道的报文都是根据OpenFlow协议定义的,通常采用TLS(Transport Layer Security)加密,但也支持简单的TCP直接传输。如果安全通道采用TLS连接加密,当交换机启动时,会尝试连接到控制器的6633 TCP端口(Openflow端口通常默认建议设置为6633)。双方通过交换证书进行认证。因此,在加密时,每个交换机至少需配置两个证书。
我的公众号「码农之屋」(id: Spider1818) ,分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)