一、开关组件
OpenFlow交换机由一个或多个流表和一个组表组成,组表执行数据包查找和转发,以及一个通向外部控制器的OpenFlow通道(如下图)。交换机与控制器通信,控制器通过OpenFlow协议管理交换机。
使用OpenFlow协议,控制器可以反应性地(对包作出响应)和主动地在流表中添加、更新和删除流项。
开关中的每个流表包含一组流项;每个流条目由匹配字段、计数器和一组指令组成处理。
管道处理指令允许将数据包发送到后续的表进行进一步处理,并允许以元数据的形式在表之间通信信息。当与匹配流条目关联的指令集没有指定下一个表时,表管道处理停止;此时数据包通常被修改和转发。
流条目可以转发到端口。这通常是一个物理端口,但它也可能是由交换机定义的逻辑端口,或由本规范定义的保留端口。保留的端口可能被指定
二、术语表
本节描述OpenFlow规范的关键术语:
字节(Byte): 一个8位八隅体。
包(Packet): 一个以太网帧,包括报头和有效载荷。
端口(Port): 数据包进入和退出OpenFlow管道。可以是物理端口、交换机定义的逻辑端口或OpenFlow协议定义的保留端口。
管道(Pipeline): 在OpenFlow交换机中提供匹配、转发和包修改的一组链接流表。
流表(Flow Table): 一个阶段的管道。它包含流条目。
流条目(Flow Entry): 流表中用于匹配和处理数据包的元素。它包含一组匹配信息包的匹配字段、一个匹配优先级、一组跟踪信息包的计数器和一组要应用的指令
匹配字段(Match Field): 数据包与之匹配的字段,包括信息包头、入口端口和元数据值。匹配字段可以使用通配符(匹配任何值),在某些情况下可以使用位掩码
元数据(Metadata):一个可屏蔽的寄存器值,用于将信息从一个表传递到下一个表。
指令(Instruction):说明附加到一个流条目和描述OpenFlow处理,当一个数据包匹配流条目。指令要么修改管道处理,比如将数据包定向到另一个流表,要么包含一组要添加到操作集的操作,要么包含一组要立即应用到数据包的操作。
行动(Action):一个操作,将数据包转发到一个港口或修改包,如递减TTL字段。可以将操作指定为与流条目相关联的指令集的一部分,或者指定为与组条目相关联的操作桶的一部分。操作可以累积在信息包的操作集中,也可以立即应用到信息包。
行动组(Action Set):一组与包相关的行为,是积累而包处理每个表和执行指令集指示数据包退出处理管道。
组(Group):一组动作的水桶和一些手段选择的一个或多个这些桶在每个包的基础上应用。
行动桶(Action Bucket):一组行为和相关参数,定义组。
标记(Tag):一个头可以插入或删除从一个数据包通过推动和流行的行为。
外层标签(Outermost Tag):标签出现接近一个数据包的开始。
控制器(Controller):一个实体与OpenFlow开关使用OpenFlow协议交互。
计(Meter):一个开关元件,可以测量和控制数据包的速率。如果通过该仪表的包率或字节率超过预定义的阈值,该仪表触发一个仪表频带。如果米带丢失了数据包,它被称为速率限制器。
三、OpenFlow端口
本节描述OpenFlow端口抽象和OpenFlow支持的各种类型的OpenFlow端口。
4.1 OpenFlow端口(OpenFlow Ports)
OpenFlow交换机必须支持的三种类型的标准端口:物理端口、逻辑端口、保留端口。
Open Flow端口的作用:OpenFlow处理进程和网络之间传递数据包的网络接口,OpenFlow交换机之间通过OpenFlow端口在逻辑上相互连接。
OpenFlow的数据包从入口端口接收,经过OpenFlow的流水线处理,可将它们转发到输出端口。输入端口是数据包的属性,贯穿整个OpenFlow流水线,代表数据包是从哪个端口接收的。在进行报文匹配的时候会用到入端口。OpenFlow流水线可以决定数据包通过输出行动发送到输出端口,它定义了数据包怎样传到网络中。
4.2 标准端口(Standard Ports)
OpenFlow标准端口被定义为物理端口、逻辑端口和本地保留端口。
标准端口可以用作入口和输出端口,它们可以在组中使用,并且它们具有端口计数器。
4.3 物理端口(Physical Ports)
OpenFlow的物理端口为交换机的一个硬件接口。
在一些部署中,OpenFlow交换机可以实现硬件的虚拟化,在这种情况下,OpenFlow物理端口可以代表一个与交换机硬件接口对应的虚拟切片。
4.4 逻辑端口(Logical Ports)
OpenFlow的逻辑端口为交换机定义的端口,并不直接对应一个交换机的硬件接口,是一个更高层次的概念。
相对于物理端口,逻辑端口的数据包中存在一个叫做隧道ID的额外的元数据字段与之关联;
当逻辑端口接受的分组被发送的控制器时,其逻辑端口和对应底层的物理端口都要报告给控制器。
4.5 保留端口(Reserved Ports)
OpenFlow的保留端口,通常用作转发动作,比如:发送到控制器,泛洪,或使用非OpenFlow的方法转发,即正常交换机处理方式。
OpenFlow交换机的保留端口可以分为”Required”(必备)和”Optional”可选 两种方式
四、OpenFlow表
4.1 流水线处理(Pipeline Processing)
每个OpenFlow交换机的流水线包含多个流表,每个流表包含多个流表项。OpenFlow交换机至少具有一个流表。
●流水线流程:
OpenFlow交换机流表按照标号从0开始,并且总是从第一个流表开始,数据包与流表0的流表项进行匹配,其他的流表根据第一个表的匹配结果进行调用。在对某个流表的流表项进行匹配时候,如果匹配到了流表项,则该流表项内的指令集被执行,这些指令可能包括指导数据包传递到另一个流表的Goto指令,在哪里进行同样的处理(流水线处理只能前进,即goto指令只能指向比它大的流表)。
流水线的最后一个表项可以不包括GOTO指令。当数据包匹配到的流表项没有GOTO指令时,流水线处理停止,数据包将会进行转发操作。
若数据包在流表中没有匹配到流表项,这是一个table-miss行为,table-miss将会对数据包进行丢弃或者传递到另一个表中取决于table-miss流表的配置或根据数据包的信息转发到控制器。
4.2 流表(Flow Table)
一个流表中包含多个流表项,每个流表项包含:Match Fields 、Priority、Counters、Instructions、Timeouts、Cookie
匹配字段(Match Fields):对数据包匹配,包括端口和数据包报头,以及一个表指定的可选元数据。
优先级(Priority):流表项的匹配次序
计数器(Counters):更新匹配数据包的计数
指令(Instructions):修改行动集或流水线处理
超时(Timeouts):最大时间计数或流有效时间
Cookie:由控制器选择的不透明数据值。控制器用来过滤统计数据,流改变和删除。
注:流表项通过匹配字段和优先级决定,在一个流表中匹配字段和优先级共同确定唯一的流表项。所有字段通配和优先级为0的流表项为table-miss流表项。
4.3 匹配(Matching)
匹配流程:
OpenFlow交换机在接收到一个数据包后,开始从第一个流表,并基于流水线的方式进行查找。数据匹配字段从数据包中提取,用于表查找的数据包匹配字段依赖于数据包类型,这些类型通常包括各种数据包的报头字段,比如:以太网源地址或IPV4地址。
除了通过数据包报头中进行匹配,也可以通过入口端口和元数据字段进行匹配。元数据可以用来在一个交换机的不同表里面传递信息。报文匹配字段表示报文当前状态,如果在前一个表中使用Apply-actions改变了数据包的报头,那么这些变化也会在数据包匹配字段中反映。
数据包匹配字段中的值用来查找匹配的流表项,如果流表项字段具有值得ANY,他就可以匹配报头中的所有可能值。数据包与表进行匹配,优先级最高的表项必须被选择,并且与选择流表项相关的计数器就会更新,选定流表项的指令集也会被执行。若多个匹配的流表项有相同的最高优先级,所选择的流表项被确定为未定义表项。
如图所示,当交换机收到一个数据包的时候,交换机就会从第一个(编号为0)流表开始和流表项进行匹配,如果匹配成功,则更新计数器并执行流表项中的指令。流表项中的指令会产三种不同的操作:更新动作集(action set)、修改包头域/更新匹配字段、更新元数据。 如果该流表项还有GOTO指令指向了某一其他流表,则执行完本次指令的数据包以及动作集、元数据等信息转到下级流表中进一步匹配,若未指向另一流表则执行动作集,此时流水线处理结束。如果在第一个流表中并未匹配成功,则查找该流表中是否添加了miss-table流表项,如果存在miss-table流表项,则执行miss-table流表项中的指令,比如:丢弃、传到另外一个流表或者通过packet-in消息传给控制器。如果在流表中并未匹配成功且该流表中不存在miss-table流表项,那么交换机将会丢弃该数据。
当数据与流表项进行匹配的时候,匹配域包括数据包的包头字段+入端口+元数据信息。这里需要注意的是元数据必须在前级流表中指定,也就是说第一个流表中是不会对元数据进行匹配的。而前级流表的action中有修改数据包包头的操作会影响后级流表对数据的匹配。
4.4 Table-miss
每一个流表必须能处理table-miss的流表项。table-miss表项指定在流表中如何处理与其他流表项未匹配的数据包。比如讲数据包发送到控制器,丢弃数据包或直接将包扔到后续的表。
table-miss的流表项也有他的匹配字段和优先级,它通配所有匹配字段,且优先级最低(0)。table-miss流表项的匹配可能会不属于正常范围内流表支持的匹配,例如精确匹配会不支持在其他流表项中使用通配符,但必须支持table-miss的通配符流表项。table-miss流表项的行为在许多方面像任何其他流表项,流表中不存在table-miss表项,控制器可以在任何时候添加或删除它,它也可能会超时失效。table-miss流表项能够匹配其他流表项不能匹配的数据,当数据包与table-miss表项匹配时,table-miss表项指令就会执行。如果该table-miss表项直接将数据包通过CONTROLLER端口发送到控制器,那么报文中的信息必须与一个table-miss表项匹配。
4.5 流表项删除(Flow Removal)
流表项删除有2种方式:控制器的请求、交换机流超时机制。
●交换机流超时机制
每个流条目都有一个与之关联的idle_timeout和一个hard_timeout。如果hard_timeout字段是非零的,则开关必须注意流条目的到达时间,因为稍后可能需要驱逐该条目。非零的hard_timeout字段会导致流条目在给定的秒数之后被删除,而不管它匹配了多少包。如果idle_timeout字段非零,交换机必须注意最后一个相关数据包的到达时间
●控制器请求方法:
控制器可以通过发送删除流表修改消息(OFPFC_DELETE或OFPFC_DELETE_STRICT )主动从流表中删除流项。
流条目被控制器或流超时机制删除时,开关必须检查流条目的OFPFF_SEND_FLOW_REM标志。如果设置了此标志,则开关必须向控制器发送删除流的消息。每个已删除流的消息都包含流条目的完整描述、删除原因(到期或删除)、删除时的流条目持续时间,以及删除时的流统计信息。
4.6 组表(Group Table)
组表包括若干组表项,这也是一种openflow转发方法,就是若干流表项指向一组Group Identifier、Group Type、Counters、Action Buckets
每个组表项由组编号确定具体为:
组编号:一个32位的无符号整数,唯一标识该组
组类型:确定组语义
计数器:当报文被组表处理时更新数据
行动桶:包含一组要执行的动作和参数
●组类型(Group Types)
组类型包括必备选项(Required Optional)、可选选项(Optional)
必备选项(Required):
可选选项:
4.7 计量表(Meter Table)
一个计量表包含若干个计量表项,确定每个流量的计数,单位流量的计量可以使OpenFlow实现各种简单的QoS业务,如:限速,并且可以结合每个端口队列来实现复杂的Qos框架,如DiffServ。
计量可以测试数据包的速率,使这些数据包可以实现速率控制。计量直接连接到流表项。任意的流表项可以在它的指令集中定义一个计量,计量测试和控制和它相连的所有流的速率,在同一个表中可以使用多个计量,但必须使用分离的流表项。
每个计量表项所含内容及说明:
计量的标识符(Meter Identifier): 一个32位的无符号整数唯一识别符
计量带(Meter Bands): 无序列表,定义带的速度和处理数据包的方式
计数器(Counters): 报文被计量表项处理时更新
计量表带包括:
●带类型(Band Type): 定义了数据包怎样被处理
●计量率(Rate): 选择计量带,定义了带可以运行的最低速率
●计数器(Counters):当数据包被计量带处理时更新
●类型参数: 带类型的可选参数
带类型可选(Optional)参数
4.8 计数器(Counter)
计数器可以进行如下计数:每一个流表,流量入口,端口队列,组,动作桶,计量表,计量带。主要用于统计流量信息,例如活动表项,查找次数,发送包数等。
4.9 指令(Instructions)
每个流表项中包含一组指令,当一个数据包匹配流表项时指令会被执行,这些指令可以更改数据包,行动组或流水线处理。OpenFlow中包含的指令如下:可选(Optional)和必备(Required)
4.10 行动集(Action Set)
行动集包含所有的行动,无论他们以什么顺序加入到行动集中,行动集的顺序均按照下列顺序执行。如果行动集包含组行动,那么行动桶中的行动也按照下列顺序执行,交换机可以通过Apply-Actions指令修改行动执行顺序。
行动集与每个报文相关,默认为空,一个流表项可以使用Write-Actions指令或者Clear-Action指令修改行动集。行动集在表间被累加。当一个表项的指令集没有包含Goto-Table指令时,流水线处理就停止,报文行动集被执行。
4.11 行动列表(Action List)和行动(Actions)
行动列表:Apply-Actions指令和Packet-out消息中存在行动列表,行动效果累加,全部都会执行。
行动:包括必备动作、可选行动