OpenFlow1.5协议

2017-12-14  本文已影响542人  墨痕hz

1.介绍

本协议涵盖了交换机的基本组件和功能,以及OpenFlow协议来管理OpenFlow交换机和控制器。


交换机组成.png

2.交换机组成

OpenFlow逻辑交换机由一个或多个流表和一个组表构成,它们执行数据包的查找和转发,以及一个或多个OpenFlow通道到外部控制器(图1)。交换机和控制器通信,控制器通过OpenFlow协议来管理交换机。

通过OpenFlow协议,控制器主动或被动的对数据包做出响应对流表中的流表项进行添加,删除和更新操作。交换机中的每一个流表都包含一组流表项;每个流表项包括匹配字段,计数器和指令,用于匹配数据包(见5.2)。

匹配过程从第一个流表开始匹配,并可能继续匹配流水线上的其他流表(见5.1).流表项按照优先级从每个表的第一个匹配项对数据包进行匹配。如果找到匹配的项,则执行特定流表项的相关指令(见5.5)。如果在流表中找不到匹配项,结果取决于table-miss流表项的配置。(例如:数据包可被转发到 OpenFlow 的信道控制器、丢弃、或者可以继续到下一个的流表,见 5.4)

与每个流表项相关的指令包含动作和修改流水线处理信息。(见5.5)包含在指令中的操作描述了数据包的转发,修改和组表的处理。流水线处理指令允许数据包被发送到后续流表中作进一步处理,并允许以元数据的形式在流表之间传递信息。当与匹配流条项相关联的指令集未指定下一个表时,流水线处理停止;此时数据包通常会被修改并转发(见5.6)。

流表项可以将匹配到的数据包转发到一个端口,通常为一个物理端口,也可能是交换机定义的逻辑端口或协议定义的保留端口(见4.1)。保留端口可以指定通用转发动作,例如发送到控制器,泛洪或使用非OpenFlow方法转发(如正常交换处理)(见4.5),交换机定义的逻辑端口可以指定链路聚合组,隧道或环回接口(见4.4)

与流表项相关的操作也可以将数据包转发到一个组,这个组指定了额外的处理(见5.10)。组代表泛洪的指令集,以及更复杂的转发语义(例如多路径,快速重路由和链路聚合)。作为间接的通用层,组也使多个流表项转发到一个单一的标识符(例如一个共同的下一跳的 IP 转发 )。这种抽象的行为使相同的输出行动非常有效。

组表包含组表项;每个组表项都包含一个具有特定规范的动作桶列表,这些动作桶依赖于组类型(见5.10.1)。 一个或多个动作桶中的动作被应用于数据包发送给该组。

只要保持争取的匹配和指令规范,交换机设计者可以自由的以任何形式实现内部结构。如果需要使用一个流表项将所有的组转发到多个端口,交换机设计师可以在硬件转发表中用一个单一的位掩码去实现。另一个例子是匹配; 如果 OpenFlow 交换机使用用不同数量
的硬件表物理实现,那么流水线就会被暴露出来。

3.名词解释

本节介绍OpenFlow中关键的名词,大多数名词都是特定应用于此协议。

行动是作用于数据包的操作。 可以将数据包转发到端口或修改数据包(例如递减TTL字段)或改变其状态(例如将其与
队列合并)。 大多数操作都包含参数,例如set-field操作包含字段类型和字段值。 可以将动作指定为与流条项相关联的指令集的一部分或者与组表项相关联的动作桶中。 操作可以在数据包的操作集中累加或立即应用于数据包(见5.8)。

一个有序的行动列表,这些行动包含在流表项的Apply-Actions指令或在Packet-out消息中,并且按照列表顺序立即执行(见5.7)。列表中的动作可以重复,它们的效果是积累的。

Write-Actions指令中的流表项中包含的一组操作,将其添加到行动集中,或者添加到按行动集顺序(请参阅5.6)执行的组动作桶中。 一个集合中的动作只能发生一次。

组中的一系列行动,该组将为每个数据包选择一个或多个动作桶。

与数据包相关的行动集合,在报文被每个表处理的时候这些行动可以累加,在指
令集指导报文退出处理流水线的时候这些行动会被执行。

一个 8 位字节

一个在交换机和控制器之间传送OpenFlow消息的网络连接,可以使用各种网络传输协议来实现(见6.3)。 一个OpenFlow
通道有一个主要的连接,并可选择多个辅助连接(见6.3.8)。

管理与控制器通信的OpenFlow逻辑交换机组件的聚合。 控制信道每个包含一个OpenFlow信道OpenFlow控制器。

计数器是OpenFlow统计的主要元素,并在流水线的各个特定点(如端口或流入口)上累积(见5.9)。 计数器通常计数通过OpenFlow元素的数据包和字节的数量,但也定义了其他计数器类型。

一个OpenFlow逻辑交换机组件的聚合,直接在流量处理和转发中进行。流水线、组表和端口的数据通道。

在流表中用于匹配和处理数据包的一个元素。它包含用于匹配数据包的匹配字
段、匹配次序的优先级,跟踪数据包的计数器,以及对应的的指令集 。

流水线的一个阶段,包含若干流表项

决定一个数据包的输出端口或输出端口集合,并传输数据包到这些输出端口。

一系列的动作桶和一些选择一个或者多个行动应用到数据包单元的方法。

控制嵌入在由交换机使用的分组中的信息以识别分组并且通知交换机如何处理和转发分组。 头通常包括各种标题字段以标识分组的来源和目的地,以及如何解释其他标题和有效载荷。

一个来自数据包头的值。 数据包头被解析以提取与相应的匹配字段匹配的头字段。

指令存在于流表项中,描述报文匹配流表项时 OpenFlow 的处理方式。指令可以修
改流水线处理,如指导包匹配另一个流表,也可以包含一系列添加到行动集的行动,还可以包含一系列立即应用到数据包的行动。

附加到流表中的流表项的一组指令。

用来匹配数据包的字段,包括包头,进入端口,元数据值。匹配字段可能会
进行通配符匹配(匹配任何值)或者在某些情况下通过位掩码进行匹配。

一个可屏蔽寄存器的值,用于携带信息从一个表到下一个。

OpenFlow交换机和OpenFlow控制器之间的接口,由控制器用来管理交换机。

一个实体使用OpenFlow交换机协议与OpenFlow交换机进行交互。 在大多数情况下,OpenFlow控制器是控制许多OpenFlow逻辑交换机的软件。

一组可以作为单个实体进行管理的OpenFlow资源包括一个数据通路和一个控制通道。

本规范定义的协议。 也称为OpenFlow交换机协议。

在一个 openflow 交换机中提供匹配、转发和数据包修改功能的流表连接集合。

在流水线处理过程中附加到数据包的不是头字段的一组值。包括入口端口,元数据值,隧道ID值等。

数据包进入和退出OpenFlow流水线(见4.1)。 可能是一个物理端口,一个
逻辑端口或由OpenFlow交换机协议定义的保留端口。

按照数据包在输出端口上的优先级调度数据包,以提供服务质量(QoS)。

一个头,可以插入到数据包或者通过压入和弹出行动进行移除。

一个数据包最开始出现的标签

4.OpenFlow端口

本节介绍了 OpenFlow 的端口的抽象概念和 OpenFlow 支持的各类端口。

4.1 OpenFlow端口

OpenFlow端口是OpenFlow处理进程与网络其他部分传递数据包包的网络接口。OpenFlow交换机之间通过OpenFlow端口在逻辑上相互连接,只能通过第一台交换机上的输出OpenFlow端口和第二台交换机上的输入OpenFlow端口将数据包从一台OpenFlow交换机转发到另一台OpenFlow交换机。
OpenFlow 交换机使一些 OpenFlow 的端口,可用于 OpenFlow 的处理。 OpenFlow 的端口组可能与交换机硬件中提供的网络端口不完全相同,因为有些硬件网络接口可能被 OpenFlow禁用,OpenFlow 交换机也可以定义额外的端口。
数据包都是在输入端口处接收,经由流水线处理(见5.1)后会转发至输出端口。输入端口是数据包的一种属性,在流水线处理数据包的过程中表示数据包进入交换机的端口,匹配时会用到输入端口(见5.3)。流水线可以通过输出动作将封包从输出端口输出(见5.8),这一动作决定了封包如何从交换机回到网络中。
一个OpenFlow交换机必须支持三种类型的端口:物理端口,逻辑端口和预定端口。

4.2 标准端口

OpenFlow标准端口被定义为物理端口,逻辑端口和本地保留端口(如果支持的话)(不包括其他保留端口)。标准端口可以用作输入和输出端口,它们可以在组中使用(见5.10)具有端口计数器(见5.9),此外它们还具有状态与配置(见7.2.1)。

4.3 物理端口

OpenFlow的物理端口是与交换机硬件接口对应的由交换机定义的端口。例如,以太网交换机上,物理端口与以太网接口一一映射对应。在某些部署中,OpenFlow交换机是在硬件上可以实现虚拟化。此时,物理端口可能代表着对应交换机硬件接口资源的一个网络虚拟切片。

4.4 逻辑端口

OpenFlow 的逻辑端口为交换机定义的端口,并不直接对应一个交换机的硬件接口。逻辑端
口是更高层次的抽象概念,可能是交换机中不使用 OpenFlow 的端口(如链路汇聚组,隧道,
环回接口)。
逻辑端口可能包括报文封装,可以映射到不同的物理端口。这些逻辑端口的处理动作相对
于 openflow 处理来说必须是透明的,而且这些端口必须通过 openflow 处理起作用,像硬
件接口一样。
物理端口和逻辑端口之间的唯一区别是:一个逻辑端口的数据包可能有一个叫做隧道 ID 的
额外的元数据字段与它相关联;而当一个逻辑端口上接收到的分组被发送到控制器时,其
逻辑端口和底层的物理端口都要报告给控制器。

4.5 保留端口

本规范所定义的 OpenFlow 的保留端口。它们指定通用的转发动作,如发送到控制器,泛洪,
或使用非 OpenFlow 的方法转发,如“正常”交换机处理。

动作 内容
ALL 代表了交换机可以用于转发一个特定数据包的所有端口。只能用作输出端口。在这种情况下,数据包将被复制到各个端口执行出操作,当然数据包的入端口与配置为OFPPC_NO_FWD的端口除外。
CONTROLLER 代表与控制器相连的控制信道,可以作为入口端口或出口端口使用。作为入口端口使用时,将数据包封装在Package-in消息中,并将其转发到控制器见(7.4.1)。作为出口端口使用时,它能识别数据包来自于控制器。
TABLE 代表OpenFlow流水线的开始(见5.1)。这个端口只有在Package-out消息动作集中的输出动作里才有意义(见7.3.6)。执行输出操作是,将数据包转发至第一个流表,由此开始一个OpenFlow流水线处理数据包的过程。
IN PORT 代表数据包的入口端口。只能作为输出端口使用,通过它的入口端口送出数据包
ANY 在OpenFlow请求没有指定端口时使用的特殊值(也就是端口匹配值为通配符时)。一些OpenFlow指令可能指明只对特定的端口应用,这一属性取决于流表项的端口号码属性,当这一属性被设为ANY时,请求会引用到各个端口上。既不能做入口端口也不能做出口端口。
UNSET 用于指明输出端口在动作集中为设置的特殊值。只能在用匹配属性OXM_OF_ACTSET_OUTPUT来匹配动作集中的输出端口时使用(见7.2.3.7)。既不能做入口端口也不能做出口端口。
动作 内容
LOCAL 交换机的本地网络堆栈和管理堆栈
NORMAL 代表传统的非OpenFlow流水线,仅用于一个输出端口
FLOOD 使用普通流水线处理进行泛洪(发往所有端口但不包括入端口)

4.6 端口改变( Port changes)

交换机的配置,例如使用OpenFlow配置协议,可能会随时增加或删除交换机上的端口。交换机会根据端口下层的情况来改变端口的状态,例如链路停止运行(见7.2.1)。控制器或交换机的配置也有可能改变端口的配置(见7.2.1)。所有的这些改变都会告知控制器(见7.4.3)。

端口的增添,修改或者移除不会改变流表中的内容,即使是流表项的内容里涉及到了有变更的端口。转发给不存在的端口的数据包将被丢弃(见5.6)。类似地,端口的增添,修改或者移除不会改变组表中的内容。组的行为可能会由于实时检查而改变(见6.7)。

端口被删去后,另一个物理或逻辑端口会使用它的端口号。仍然导向这个该端口号的流表或组表会将数据包转发到不同的端口,导致不良的结果。因此,删除端口后应告知控制器来删除导向这个该端口号的流表或组表。

4.7 端口再循环(Port recirculation)

逻辑端口可以用来插入网络服务或者是OpenFlow交换机的复杂处理。大多数情况下,送至逻辑端口的数据包不会再回到相同的交换机,它们要么被逻辑端口处理要么通过物理端口送出至网络。在其他情况下,送到逻辑端口的数据包会在处理后再转发到交换机。

通过逻辑端口实现数据包再循环只是一种可行的方式,OpenFlow还支持另外更多类型的再循环方式。最简单的再循环方法就是通过同一逻辑端口再将封包返回交换机,这种方法可以用在回环或是无方向的封包处理上。再循环也可以发生在一对逻辑端口上,也就是数据包从一个逻辑端口甲送出从另外一个逻辑端口乙送回交换机。这种方法可以用来代表隧道终端或是双向的数据包处理。端口存在描述端口之间再流通的属性(见7.2.1.2)。

一个交换机应当避免它在使用再循环时陷入无尽的循环中,这种方法针对不同应用而不同且不再本篇说明文档范围内。举个例子,交换机可以给每个数据包附加一个再流通计数器,每次封包再循环后计数器加一,当计数器值大于预定门限时,交换机就会将该数据包丢弃。我们极力推荐在配置控制器时,一定要避免因为流表项的组合而导致再流通循环回圈的产生。
由于数据包具有很大范围的处理可能与方式,因此我们可以假定很少很少的数据包会再回到交换机。再循环的封包回到流水线的第一个流表(见5.1)并且新的输入端口可以识别出循环的数据包。数据包的报头可能会改变,因此匹配属性并不保证与之前一致。逻辑端口可能会做数据包分割或是组合,因此数据包不会一一对应且有不同的大小。
隧道ID以及一些其他与数据包相关的流水线属性可能在再流通的过程有一部分不变,作为返回交换机后的匹配值。选择保留的流水线属性通过端口匹配属性申明(见7.2.1.2)。如果流水线属性在OFPPDPT_PIPELINE_OUTPUT与OFPPDPT_PIPELINE_INPUT中都有出现,那么这一属性就会在循环的过程中保留(亦即必须保持不变)。

5.OpenFlow表

本节描述流表和组表的组件,以及与匹配和行动处理的技术。

5.1流水线处理( Pipeline Processing)

OpenFlow交换机有两种类型:OpenFlow—only,OpenFLow-hybrid。在OpenFlow-only 的交换机上只能由OpenFlow流水线来处理数据包。
OpenFlow-hybrid交换机同时支持OpenFlow操作与传统二层以太网交换机,VLAN独立,三层路由(IPv4,IPv6),ACL,QoS等操作。这些交换机在OpenFlow操作方法之外还提供了分类方法将数据包流量导向OpenFlow流水线或普通流水线。例如,一个交换机可能会根据VLAN标签或是输入端口来决定使用哪条流水线。同样地,OpenFlow-hybrid交换机也会使用普通与泛洪预定端口(见4.5)将封包从OpenFlow流水线导向普通流水线。
OpenFlow流水线包含一个或多个流表,每个流表有多个流表项。OpenFlow流水线定义了数据包与流表交互的方式,见图。一个OpenFlow交换机至少要有一个入口流表,只有一个流表得交换机并非没有意义,在这种情况下,流水线处理得到极大的简化。
流表从0开始按序编号,处理过程分为两个阶段,入口处理与出口处理。两个阶段由第一个出口流表分开(见7.3.2)。编号小于第一个出口流表的的流表作为入口流表,编号比它大的不能作为入口流表使用。
流水线处理总是从第一个流表的入口处理,数据包首先与0号流表的流表项匹配,是否使用其他输入流表取决于匹配的结果。如果结果是将数据包转发到输出端口,交换机会在输出端口执行出口处理。出口处理不是必备的,交换机可能不支持任何出口处理或者是没有配置为可使用出口处理。如果没有有效的出口流表被配置为第一个出口表(见7.3.2),数据包将会由输出端口处理。大多数情况下数据包会被送出交换机。如果存在有效的出口表,封包会与它的流表项进行匹配,是否使用其他出口流表同样取决于匹配的结果。

当通过流表进行处理时,将该数据包与流表中的流表项进行匹配进而选择一个流表项(见5.3)。如果匹配到流表项,则包含在该流表项中的指令集被执行。这些指令可能明确地将数据包指向另一个流表(使用Goto指令,见5.5),在下一个流表再次重复相同的过程。流表项只能指导
数据包发送到大于其自己的流表号的流表,换句话说流水线处理只能前进,不能后退。显然,流水线的最后一个表的流表项不包含Goto-Table指令。如果匹配的流表项不指导数据包发送到另一个流表,当前阶段的流水线处理停止,数据包
与相关的行动集一起被处理,通常进行转发(见5.6)。

如果数据包与流表中的流表项不匹配,则这是table-miss行为。table-miss取决于表的配置(见5.4)。table-miss流表项可以灵活地指定如何处理不匹配的数据包,包括丢弃,将它们传递给另一个表,或通过控制通道将它们发送给控制器
包入信息(见6.1.2)。

很少有数据包没有被流表项完全处理,流水线处理停止的情况,而不处理数据包的行动集或将其指向另一个表。如果没有table-miss流入口
数据包被丢弃(见5.4)。如果发现一个无效的TTL,数据包可能会被发送到控制器(见5.8)。
OpenFlow流水线和各种OpenFlow操作处理特定类型的数据包与该分组类型定义的规范一致,除非本规范或者本规范OpenFlow配置另有指定。例如,Open-
流程必须符合IEEE规范,并且OpenFlow所使用的TCP / IP标题定义必须符合IEEE规范符合RFC规范。另外,OpenFlow交换机中的数据包重新排序必须符合符合IEEE规范的要求,只要数据包由相同的流表项,组桶和计量表带。


流水线处理.png

5.2流表与流表项

Match Fields Priority Counters Instructions Timeouts Cookie

一个流表中包含多个流表项,每个流表项包含:

Match Fields Priority Counters Instructions Timeouts Cookie
内容 说明
匹配字段 对数据包匹配,包括端口和数据包报头,及前一个表指定的可选元数据
优先级 流表项的匹配次序
计数器 更新匹配数据包的计数
指令 修改行动集或流水线处理
超时 最大时间计数或流有效时间
cookie 由控制器选择的不透明数据值。控制器用来过滤统计数据,流改变和删除

流表项通过匹配字段和优先级决定,在一个流表中匹配字段和优先级共同确定唯一的流表项。所有字段通配和优先级为0的流表项为table-miss流表项。

5.3匹配

匹配流程1.png

OpenFlow交换机在接收到一个数据包后,开始从第一个流表,并基于流水线的方式进行查找。
数据匹配字段从数据包中提取,用于表查找的数据包匹配字段依赖于数据包类型,这些类型通常包括各种数据包的报头字段,如:以太网源地址或IPV4地址。除了通过数据包报头中进行匹配,也可以通过入口端口和元数据字段进行匹配。元数据可以用来在一个交换机的不同表里面传递信息。报文匹配字段标识报文的当前状态,如果在前一个表中使用Apply-Actions改变了数据包的报头,那么这些变化也会在数据包匹配字段中反映。
数据包匹配字段中的值用于查找匹配的流表项,如果流表项字段具有值得ANY,他就可以匹配报头中的所有可能值。数据包与表进行匹配,优先级最高的表项必须被选择,且与选择流表项相关的计数器会更新,选定流表项的指令集也被执行。若多个匹配的流表项有相同的最高优先级,所选择的流表项被确定为未定义表项。
OpenFlow1.5协议的匹配流程没有太大改变,只是更加具体化了action set的执行过程。其中着重细化了output动作。OpenFlow 1.5协议引进了Egress Tables,细化了output action,可以在输出端口处理数据包。当一个数据包输出到某个端口时,首先会从第一个egress table开始处理,由流表项定义处理方式并且转发给其他egress table。引进egress table后,原先由控制器指定output的相关操作,现在将这一功能下放到交换机中,提高数据包的处理效率。

以上内容参看OpenFlow1.3,如有疑问参看OpenFlow1.5英文原版

6.OpenFlow通道

OpenFlow通道是交换机连接控制器的接口,通过这个接口,控制器可以对交换机进行管理和配置,接收交换机信息并向交换机发送数据包。
消息被封装为openflow协议中规定的格式在交换机和控制器之间传输,运行在安全传输层协议和无保护的tcp连接上。

6.1 OpenFlow协议

OpenFlow协议支持三种消息类型:controller-to-switch,asynchronous(异步)和symmetric(对称),三种消息类型又有多个子消息类型。

controller-to-switch消息由控制器发出,主要用于管理和获取switch状态;asynchronous消息由switch发出,用于网络事件和交换机状态变化更新发送到控制器;symmetric消息可以由交换机或控制器发出。

内容 说明
Features 建立传输安全会话时,控制器发送给交换机,交换机应答交换机所支持的功能
Configuration 控制器用于设置或查询交换机上的配置信息,交换机需应答查询信息
Modify-state 控制器管理交换机流表项和端口状态
Read-state 控制器想交换机请求关于流或数据包的统计信息
Packet-out 控制器通过交换机向指定端口发送数据包
Barrier 控制器确保消息依赖满足,接收完成操作通知
内容 说明
Packet-in 数据包在交换机中没有匹配项时,通过Packet-in消息发送给控制器
Flow-removed 交换机的流表项因为超时或修改等原因被删除掉,会触发此消息
Port-status 交换机端口状态发生变化时触发
Error 交换机发生问题时触发
内容 说明
Hello 交换机和控制器用于建立连接
Echo 交换机和控制器均可以发送Echo,接收者需回复Echo reply。用于测量延迟,是否保持连接
Vendor 交换机提供附加信息

6.2 建立连接

OpenFlow连接建立后,交换机和控制器必须先要发送OFPT_HELLO消息给对方,该消息携带双方支持的最高版本号,接收方将采用双方都支持的最低协议版本进行通信。发现共同支持的协议版本,则进行连接,否则发送OFPT_ERROR消息,中断连接。

6.3 加密

安全通道用TLS连接加密,交换机启动后通过6633端口进行TCP连接,双方交换证书进行认证。

6.4 中断连接

连接异常时,交换机尝试去连接备份的控制器。当多次连接失败后,交换机进入紧急模式,重置所有的TCP连接。此后,数据包匹配指定的紧急模式流表项,删除其他正常流表项。

6.5 多控制器

交换机可以与多台控制器建立连接,进行故障转移和负载均衡。

6.5.1 Role

与多台控制器建立连接时,各个控制器具有名为Role(角色)的作用,Role可以分为:

默认的Role为EQUAL。当为EQUAL时,各个控制器具有相同的作用,也可以对OpenFlow交换机进行完全访问。EQUAL控制器可以对交换机发送Flow-Mod消息,变更交换机设置,在默认设置中,OpenFlow交换机向EQUAL控制器发送所有的异步消息。

对于MASTER控制器,具有和EQUAL相同的权限,但是一个拓扑中只能存在一个MASTER,一个OpenFlow交换机只能与一个MASTER控制器连接,同时,其他的控制器被置为SLAVE。

当交换机为SLAVE时,OpenFlow控制器只能对OpenFlow交换机进行Read-Only访问,只要不指定异步消息,将不能向SLAVE发送除Port-Status消息之外的消息。

    内容仅供参考,如有错误和不合适的地方还望指正。
上一篇下一篇

猜你喜欢

热点阅读