原版OpenFlow Switch Specification Version 1.3.0 (Wire Protocol 0x04) June 25, 2012 包含两部分,前一部分是交换机规范,共6个章节,可以简称为“规范”;后一部分是将OpenFlow协议本身作为附件,可以认为是整体第7章,可以简称为“协议”。
本系列作为中文版,基本忠实原文语句和术语,大部分关键词都是中英文对照。将规范和协议再切分为2部分,共4篇完整呈现。
OpenFlow 交换机规范 1.3.0 第一部分 1-5章
https://www.jianshu.com/p/acfeae1771b3
OpenFlow 交换机规范 1.3.0 第二部分 6章
https://www.jianshu.com/p/82e238eb8d14
OpenFlow协议第一部分
https://www.jianshu.com/p/7eb86d164d26
OpenFlow协议第二部分
https://www.jianshu.com/p/9cc08c698106
1 概述
本文档描述了对 OpenFlow 交换机的要求。我们建议在阅读这个规范之前,请先阅读最新版本的OpenFlow白皮书。白皮书可以在浏览ONF网站(https://www.opennetworking.org/standards/open-flow)。此规范内容涵盖交换机的构成和基本功能,以及从远程交换机管理 OpenFlow 交换机的OpenFlow协议。
2 交换机部件
一个OpenFlow交换机由一个或多个流表和一个组表组成,执行流量包的查找(匹配)和转发,一个OpenFlow通道到一个外部控制器(图1)。交换机同控制器通信,控制器通过OpenFlow协议管理交换机。
使用OpenFlow协议,控制器可以主动或被动地增加,修改和删除流表中的项。交换机的每个流表包含流表项集合;每个流表项由匹配域,计数器,指令集去匹配数据包(图2)。
匹配从第一个流表开始,并可能会继续匹配其它流表 ( 见 5.1 )。 流表项匹配数据包是按照优先级的顺序,从每个表的第一个匹配项开始(见 5.3 )。如果找到一个匹配项,那么与流表项相关的指令就被执行。如果在流表中未找到匹配项, 这次匹配的结果则取决于漏表(table-miss)流表项的配置:如, 数据包可能通过 OpenFlow 信道被转发到控制器、 丢弃、 或者可以继续到下一个流表(见 5.4)。
流表项相关联的指令(Instructions)包含动作(actions)或修改流水线处理(pipeline processing)(见 5.9 )。 包含在指令中的动作(actions)描述了数据包转发,数据包的修改和组表处理。流水线处理指令( Pipeline processing instructions)允许数据包被发送到随后的表进行进一步的处理,并允许在前后表之间以元数据(in the form of metadata)信息进行通信。当与一个匹配的流表项相关联的指令集没有后续表(next table)时,表流水线停止处理;这时该数据包通常会被修改和转发(见5.10 )。
流表项可能把数据包转发到某个端口(port)。 这个端口通常是一个物理端口(physical port),也可能是一个交换机定义的逻辑端口( logical port),或者一个Openflow本规范定义的保留端口(reserved port )(见 4.1 )。保留端口可以指定通用的转发行为,如发送到控制器(sending to the controller)、泛洪(flooding)或使用非 OpenFlow 的方法转发( forwarding using non-OpenFlow methods),如 “ 普通normal”交换机转发处理(见 4.5 ),而交换机定义的逻辑端口,可以是指定的链路汇聚组(link aggregation groups),隧道(tunnels)或环回接口(loopback interfaces)(见 4.4 )。
与流表项相关的动作,也可直接把数据包发送到组,进行额外的处理(见 5.6 )。 组表示一组泛洪的指令集,以及更复杂的转发(如多路径multipath,快速重路由fast reroute,链路聚合 link aggregation) 。作为间接(indirection)的通用层, 组也使多个流表项转发到同一个标识者a single identifier (例如 IP 转发到一个共同的下一跳next hop) 。 这种抽象使跨越多个流表项(across flow entries)的相同输出动作变得非常有效。
组表( group table)包含若干组表项(group entries),每个组表项包含一系列依赖于组类型(group type)的特定语义(specific semantics )动作桶(action buckets)(见5.6.1 )。一个或多个动作桶里的动作(action buckets)会作用到发送到该组的数据包。
只要正确的匹配和指令语义(instruction semantics)保持不变,交换机设计者可以任意的实现内部结构。 例如,当一个流表项使用一个所有组来转发至多个端口,交换机设计人员可以在硬件转发表中用一个单一的位掩码bitmask去实现。 另一个例子是匹配;如果 OpenFlow 交换机是通过不同数量的硬件表进行物理实现的,那么流水线就会被暴露。
3 名词解释
本节介绍了关键的 OpenFlow 规范术语:
- 字节Byte:一个 8 位位组。
- 数据包Packet:以太网帧,包括报头和有效载荷。
- 端口Port:数据包进入和离开 OpenFlow 流水线(见 4.1 )。可以是一个物理端口,由交换机定义的一个逻辑端口,或由 OpenFlow 的协议定义的一个保留端口。
- 流水线Pipeline:在一个 openflow 交换机中提供匹配、转发和数据包修改功能的相连流表的集合。
- 流表Flow Table:流水线的一个阶段,包含若干流表项。
- 流表项Flow Entry: 在流表中用于匹配和处理数据包的一个元素。 它包含用于匹配数据包的匹配字段、匹配次序的优先级,跟踪数据包的计数器,以及应用的指令集。
- 匹配字段Match Field:用来匹配数据包的字段,包括包头,进入端口,元数据值。一个匹配字段可能会进行通配符匹配(匹配任何值)或者在某些情况下通过位掩码进行匹配。
- 元数据Metadata:一个可屏蔽寄存器的值,用于携带信息从一个表到下一个表。
- 指令Instruction:指令存在于流表项中,当数据包匹配流表项时,指令用来描述 OpenFlow 的处理方式。指令要么改变流水线处理,如指导包匹配另一个流表,要么包含一组添加到动作集的动作,或包含一组立即应用到数据包的动作。
- 动作Action:是一种操作,可将数据包转发到一个端口或修改数据包,如 TTL字段减 1。动作可以是与流表项相关联的指令集的一部分,或者是与组表项相关联的动作桶的一部分。我们可以将动作积累在数据包的动作集里,也可以立即将动作应用到该数据包。
- 动作集Action Set:与数据包相关的动作集合,在数据包被每个表处理的时候这些动作可以累加,在指令集指导数据包退出处理流水线的时候这些动作会被执行。
- 组 Group:一系列的动作桶和选择一个或者多个存储段应用到每个数据包的手段。
- 动作桶 Action Bucket:动作和相关参数的集合,为组而定义的。
- 标记 Tag:一个头部,可以通过压入动作插入到数据包或者通过弹出动作进行移除。
- 最外层的标记Outermost Tag:一个数据包最开始出现的标记。
- 控制器 Controller:与 OpenFlow 交换机使用 OpenFlow 协议交互的实体。
- 计量Meter: 一个交换机元件, 可以测量和控制数据包的速度。 当通过计量的数据包速率或字节速率超过预定义的阈值时,计量触发计量带。如果计量带丢弃该数据包,它则被称为一个限速器。
4 OpenFlow端口
本节介绍了 OpenFlow 的端口的概念和 OpenFlow 支持的各类端口。
4.1 OpenFlow 端口(ofport)
OpenFlow 的端口是 OpenFlow 处理机和网络其余部分之间传递数据包的网络接口。OpenFlow 交换机之间通过 OpenFlow 端口在逻辑上相互连接。
OpenFlow 交换机提供一定数量的 OpenFlow 端口,开放给 OpenFlow 的处理机。 OpenFlow的端口集合与交换机硬件中提供的网络端口组可能不是一一对应,有些网络接口可能被OpenFlow 禁用, OpenFlow 交换机可能定义额外的端口。
OpenFlow 的数据包从入端口(ingress port)接收,经过 OpenFlow 的流水线处理(见 5.1 ),可将它们转发到一个输出端口(output port)。 入端口是数据包的属性(property), 它贯穿整个 OpenFlow 流水线, 并代表数据包是从哪个 OpenFlow 交换机的端口上接收的。当匹配数据包的时候,入端口会被用到(见 5.3 )。OpenFlow 流水线可以决定使用哪个输出动作,在哪个输出端口发送数据包(见 5.12 ),还定义了数据包怎样传回到网络。
一个 OpenFlow 交换机必须支持三种类型的 OpenFlow 的端口:物理端口(Physical ports),逻辑端口(logical ports)和保留端口(reserved ports)。
4.2 标准端口 Standard ports
OpenFlow 的标准端口为物理端口,逻辑端口,本地LOCAL保留端口(其他保留的端口除外) 。
标准端口可以被用作入口和出端口, 它们可在组里使用 (见 5.6 ),都有端口计数器 (见 5.8 )。
4.3 物理端口 Physical ports
OpenFlow 的物理端口为交换机定义的端口,对应于一个交换机的硬件接口。例如,以太网交换机上的物理端口与以太网接口一一对应。
在有些部署中, OpenFlow 交换机可以是被交换机的硬件虚拟化的。在这些情况下,一个OpenFlow 物理端口可以代表一个与交换机硬件接口对应的虚拟切片(virtual slice)。
4.4 逻辑端口 Logical ports
OpenFlow 的逻辑端口为交换机定义的端口,并不直接对应一个交换机的硬件接口。 逻辑端口是更高层次的抽象概念, 可以是交换机中非 OpenFlow 方式的端口(如链路汇聚组, 隧道,环回接口)。
逻辑端口可能包括数据包封装,可以映射到不同的物理端口。这些逻辑端口的处理动作
相对于 openflow 处理机来说必须是透明的,而且这些端口必须像硬件端口一样与 openflow处理机互通。
物理端口和逻辑端口之间的唯一区别是: 一个逻辑端口的数据包可能有一个叫做隧道 ID的额外的元数据字段与它相关联(见 7.2.3.7 );而当一个逻辑端口上接收到的分组被发送到控制器时,其逻辑端口和底层的物理端口都要报告给控制器(见 7.4.1 )。
4.5 保留端口 Reserved ports
OpenFlow 的保留端口由本规范定义。它们指定通用的转发动作,如发送到控制器,泛洪,或使用非 OpenFlow 的方法转发,如“正常norma”交换机处理。
一个交换机不需支持所有的保留端口,只支持那些标记为“ Required ”的保留端口。
Required: ALL: 表示交换机可转发指定数据包到所有端口,它仅可用作输出端口。 在这种情况下,数据包被复制后发送到所有的标准端口,不包括数据包的入端口和端口被配置为 OFPPC_NO_FWD 。
Required: CONTROLLER:表示 OpenFlow 控制器的控制通道,它可以用作一个入端口或作为一个出端口。 当用作一个出端口, 数据包封装进输入包消息, 并使用 OpenFlow 协议发送(见 A.4.1 )。当用作一个入口端口,确认数据包来自控制器。
Required: TABLE: 表示 openflow 流水线的开始。这个端口仅在输出包消息(packet-out message)的动作列表里的输出行为时候有效,此时交换机提交报文给第一流表使数据包可以通过正则 OpenFlow 流水线(regular OpenFlow pipeline)处理。
Required: IN_PORT:代表数据包的进入端口。当数据包通过它的入端口发送出去的话,只能用作输出端口。(只有一个输出口时,也能通过输入端口发送数据包)
Required: ANY: 特别值,用在未指定端口的 OpenFlow 命令(端口通配符) 。既不能作为入口端口,也不能作为一个输出端口。
Optional: LOCAL: 表示交换机的本地网络栈和管理栈。可以用作一个入口端口或作为一个输出端口。远程实体通过本地端口与交换机和网络服务互通,而不是通过一个独立的控制网络。利用一组合适的默认流表项,本地端口被用来实现一个带内控制器连接。
Optional: NORMAL:代表传统的,非 OpenFlow 流水线(见 5.1 )。仅可用于为一个输出端口,使用普通normal的流水线处理数据包。 如果交换机不能从 OpenFlow 流水线转发数据包到普通normal流水线,它必须表明它不支持这一动作。
Optional: FLOOD: 表示使用普通流水线处理进行泛洪(见 5.1 )。只作为一个输出端口,一般可以将数据包发往所有标准端口, 但不能发往入端口或 OFPPS_BLOCKED状态的端口。交换机也可以通过数据包的 VLAN ID 选择哪些端口泛洪。
纯OpenFlow-only交换机不支持 NORMAL端口和 FLOOD端口,而 OpenFlow-hybrid 交换机均支持上述这两种端口 (见 5.1 )。 FLOOD端口转发数据包依赖交换机的实现和配置, 若使用类型all的组(a group of type all)可以使能转发,则可以使控制器能更灵活地实现泛洪(见5.6.1 )。
5 OpenFlow表
本节描述流表和组表的组件,以及匹配和动作处理的机制。
5.1 流水线处理 Pipeline Processing
OpenFlow兼容的交换机有两种类型:单一型OpenFlow-only 和 混合型 OpenFlow-hybrid 。
单一型交换机 只支持 OpenFlow 操作,在这些交换机中的所有数据包都由 OpenFlow流水线处理,否则不能被处理。
混合型交换机 支持 OpenFlow 的操作和普通的以太网交换操作,即传统的 L2以太网交换、 VLAN 隔离、 L3 路由( IPv4 的路由, IPv6 路由)、ACL和 QoS处理。这种混合交换机应该提供一个 OpenFlow 外的分类机制,使流量路由 routes traffic到 OpenFlow 流水线或普通normal流水线。 例如,某个交换机可以使用 VLAN标记或根据数据包的输入端口, 来决定是否使用一个流水线或另外一个流水线,或者可引导所有数据包都到 OpenFlow 流水线进行处理。 这种分类机制超出了本规范的范围。一个 OpenFlow-hybrid 交换机也允许数据包通过 NORMAL和 FLOOD保留端口从 OpenFlow流水线转移到普通流水线处理(见 4.5 )。
每个 OpenFlow 交换机的流水线(OpenFlow pipeline)包含多个流表(multiple flow tables),每个流表包含多个流表项(multiple flow entries)。 OpenFlow 的流水线处理定义了数据包如何与那些流表进行交互(参见图 2)。 OpenFlow 交换机至少需要一个流表, 可选更多的流表。 只有单一流表的 OpenFlow 交换机是有效的, 而且在这种情况下流水线处理进程可以大大简化。
OpenFlow 交换机的流表按顺序编号的,从 0 开始。流水线处理总是从第一流表开始:数据包首先与流表 0 的流表项匹配。其他流表根据第一个表的匹配结果来调用。
被一个流表处理时, 数据包与流表中的流表项进行匹配, 从而选择一个流表项 (见 5.3 )。如果匹配了流表项,则执行在该流表项里的指令;这些指令可能明确指导数据包传递到另一个流表(使用 Goto 指令,见 5.9 ),在那里同样的处理被重复执行。一个流表项只能指向大于自己表号的流表,换句话说,流水线处理只能前进而不能后退。显然,流水线的最后一个表项可以不包括 GOTO指令。如果匹配的流表项并没有指向另一个流表, 流水线处理将停止在该表中。当流水线处理停止,数据包被与之相关的动作集处理,通常是被转发(见 5.10 )。
如果数据包在流表中没有匹配到流表项, 这是一个漏表(table miss)。漏表行为取决于表的配置(见 5.4 )。一个流表中的漏表项可以指定如何处理无法匹配的数据包:可以选择丢弃,传递到另一个表,或利用输入包消息通过控制信道发送到控制器去(见 6.1.2 )。
5.2 流表
一个流表中包含多个流表项。
每个流表项包含:
匹配字段 match fields: 对数据包匹配。 包括入端口 ingress port和数据包的头部packet headers, 以及由前一个表指定的可选的元数据。
优先级 priority:流表项的匹配次序 。
计数器 counters:数据包匹配时更新计数。
指令 instructions:修改动作集或流水线处理。
超时 timeouts:最大时间计数值或流在交换机中失效之前的剩余时间 。
cookie :由控制器选择的不透明数据值。 控制器用来过滤流统计数据、 流修改和流删除,但处理数据包时不能使用。
流表项通过匹配字段和优先级决定:在一个流表中匹配字段和优先级共同确定唯一的流表项。所有字段通配 (所有字段省略) 和优先级等于 0 的流表项被称为 table-miss 流表项(见5.4 )。
5.3 匹配 Matching
当接收一个数据包,OpenFlow 交换机执行图 3 所示的功能。 交换机开始对第一个流表进行查找,并基于流水线处理,也可能在其它流表中(见 5.1 )执行表查找。
数据包匹配字段是从数据包中提取的。 用于表查找的数据包匹配字段依赖于数据包类型,也就是包括各种数据包头部字段,如以太网源地址或 IPv4 目的地址(见 7.2.3 )。除了通过数据包报头中进行匹配,也可以通过入端口和元数据字段进行匹配。元数据可以用来在一个交换机的不同表里面传递信息。数据包匹配字段表示数据包的当前状态,如果在前一个表中使用 Apply-Actions 改变了数据包的报头,那么这些变化也会在数据包匹配字段中反映。
如果数据包中用于查找的匹配字段值匹配了流表项定义的字段, 就表示这个数据包匹配了此流表项。 如果流表项字段的值是 ANY(字段省略),它就可以匹配包头部的所有可能的值。
如果交换机支持对指定的匹配字段进行任意的的位掩码,这些掩码可以更精确地进行匹配。
数据包与表进行匹配,而且只有匹配数据包的最高优先级的表项必须被选择,此时与所选流表项相关的计数器也会被更新,所选流表项的指令集也会被执行。如果多个匹配的流表项具有相同的最高优先级,所选流表项则被确定为未定义表项。只有控制器记录器在流信息中没有设置 OFPFF_CHECK_OVERLAP 位并且增加了重复的表项的时候,这种情况才能出现。
如果交换机配置中包含 OFPC_FRAG_REASM标志(见 7.3.2 ),则在流水线处理前 IP 碎片必须被重新组装。
当交换机接收到一个格式不正确或损坏的数据包,此版本的规范没有定义预期的行为。
5.4 漏表 Table-miss
每一个流表必须支持 table-miss 的流表项来处理漏表。 table-miss 表项指定如何处理在流表中与其他流表项未匹配的数据包(见 5.1 ),比如把数据包发送给控制器、丢弃数据包或直接将包扔到后续的表。
table-miss 流表项也有它的匹配字段和优先级 (见 5.2 ),它通配所有匹配字段 (所有字段省略),并具有最低的优先级( 0) 。table-miss 流表项的匹配可能不属于正常范围内流表支持 的匹 配, 例如 精确 匹配 表可 能不 支持 在其 他流 表项 中使 用通 配符 ,但必须支持table-miss 流表项通配所有字段。 table-miss 流表项可能不具备正常流表项(见 7.3.5.5 )相同的能力。 table-miss 流表项必须至少支持利用 CONTROLLER保留端口将数据包发送到控制器(见 4.5 ),和使用 Clear-Actions 指令(见 5.9 )丢弃数据包。为了和早期版本规范一致,如果可能,在实现中鼓励支持引导包给后续的表。
table-miss 表项的行为在许多方面像任何其他流表项:默认情况下,在流表中不存在table-miss 表项。控制器可以在任何时候添加或删除它 (见 6.4 ),而且它可能会超时失效 (见5.5 )。table-miss 流表项像期望的那样,利用它的匹配字段和优先级匹配表中的数据包。
table-miss 流表项可以匹配流表中其他表项中不能匹配的数据。当数据包与 table-miss 表项匹配时, table-miss 表项指令就会执行(见 5.9 )。如果该 table-miss 表项直接将数据包通过 CONTROLLER保留端口发送到控制器(见 4.5 ),那么数据包输入的原因必须标识出table-miss 表项(见 7.4.1 )。
如果该 table-miss 表项不存在,默认情况下,流表项无法匹配的数据包将被放弃(丢弃)。交换机配置时,例如使用OpenFlow 配置协议,可以覆盖此默认值,指定其他行为。
5.5 流表项删除 Flow Removal
流表项可以通过两种方式在流表中删除,一个是通过控制器的请求,一个是利用交换机的流超时机制。
交换机的流超时机制独立于控制器,由交换机根据流表项的状态和配置来运行。每个流的表项具有一个和它相关的 idle_timeout 和 hard_timeout 值。如果 hard_timeout 值不为零,交换机必须注意的流表项的老化时间,因为交换机可能删除该项。一个非零 hard_timeout字段可能在规定数秒后引起流表项被删除,无论有多少数据包与之匹配。如果给定非零
idle_timeout 的值,交换机必须注意与流的最后一个数据包到达的时间,可能后面需要删除这个流表项。 当在规定数秒内没有匹配数据包时, 一个非零 idle_timeout 字段将引起流表项删除。交换机必须实现流表项超时就会从流表中删除的功能。
控制器可以主动发送 DELETE流表修改消息( OFPFC_DELETE,或 OFPFC_DELETE_STRICT见 6.4 ),从流表中删除流表项。
流表项被删除时,不管是控制器或流表项超时引起的,交换机必须检查流表项的OFPFF_SEND_FLOW_REM 标志。如果该标志被设置,该交换机必须将流删除消息发送到控制器。
每个流删除消息中包含一个完整的流表项描述、 清除的原因 (超时或删除) ,在清除时的流表项的持续时间,在清除时的流的统计数据。
5.6 组表 Group Table
一个组表包括若干组表项。 一个流表项指向一个组的能力使得 openflow 可以实现额外的转发方法(例如选择部分和所有) 。
每个组表项(见表2)由组编号确定,具体内容包含:
- 组编号 group identifier:一个 32 位的无符号整数,唯一标识该组
- 组类型 group type:确定组语义(参见 5.6.1 节)
- 计数器 counters:当数据包被组处理时更新
- 动作桶 action buckets:有序的动作桶,其中的每个动作桶包含了一组要执行的动作和相关参数。
5.6.1 组类型 Group Types
交换机只支持那些标记为“ Required ”的组类型,控制器可以查询交换机支持哪些“Optional ”组类型。
. Required: all: 执行组中的所有存储段。这个组用于多播或广播的转发。数据包为每个存储段都有效地复制一份,然后被每个存储段处理。如果某个存储段中明确地指导数据包发往入端口,那么这个复制的包被丢弃。如果控制器记录器希望数据包从入端口转发出去,那么这个组必须包含一个额外的存储段, 这个存储段包含到 OFPP_IN_PORT保留端口的输出动作。
- Optional: select: 执行组中的一个存储段。基于交换机计算选择算法(如利用用户配置的 元组/ 数组 的哈希算法或简单的循环算法) ,数据包被组中的一个存储段处理。选择算法的所有配置和状态都在 OpenFlow 外部运行。 选择算法实现可以使用等负荷分配, 也可以选择根据存储段权重进行。当组中存储段所指定的端口出现故障时,交换机可对剩余部分(具有转发到有效端口行为的)限制选择存储段,而不是丢弃数据包。此行为可能会减少数据包在链路或交换机的中断。
- Required: indirect: 执行此组中定义的一个存储段。这个组只支持单一的存储段。
允许多个流表项或者组指向一个共同的组编号, 这样可以使转发更快, 更高效的汇聚 (例如:下一跳 IP 转发)。对于只有一个存储段的所有组,组类型应该是相同的。
- Optional: fast failover: 执行第一个有效的存储段。每一个动作桶与控制其有效性的一个指定端口 / 或组相关。 组定义的存储段是有序的, 首选选择与有效的端口或者组相关的第一个存储段。这个组类型可以使交换机改变转发,而无需通知控制器。如果没有有效的存储段,数据包将被丢弃。组类型必须实行有效机制(见 6.5 )。
5.7 计量表 Meter Table
一个计量表包含若干计量表项, 确定每个流的计数。 每个流的计数可以使 OpenFlow 实现各种简单的 QoS操作,如限速,并且可以结合每个端口队列(见 5.12 )来实现复杂的 QoS构架,如 DiffServ 。
计量器可以测试数据包分配的速率,并可以控制数据包的速率。计量器直接连接到流表项(而不是被连接到端口的队列) 。任意的流表项可以在它的指令集中定义一个计量器(见5.9 ),计量器测量和控制和它有关的所有流表项的总速率。在同一个表中可以使用多个计量器,但必须使用专用的方式(流表项分离设置) 。在连续的流表中,对于同样的数据包集合,可以使用多个计量器。
每个计量表项(见表 3)由其计量标识符来区分,其包含:
- 计量器标识符 meter identifier:一个 32 位的无符号整数唯一识别
- 计量带 meter bands:计量带的无序列表,其中每个计量带指定带速和处理数据包的方式
- 计数器 counters:计量器处理数据包时进行更新计数。
5.7.1 计量带 Meter bands
每个计量器可能有一个或多个计量带。每个带指定所用的速率和数据包处理的方式。单个计量带以当前测量的计量速率处理数据包。当测量速率超过最高配置速率的时候,计量器就启用计量带。若当前的速率比任何指定的计量带速率率低,就没有计量带需要工作。
每个计量带(见表 4)用速率来识别,包括:
- 带类型 band type:定义了数据包如何处理
- 速率 rate:用于计量器选择计量带,也就是计量带可以启用的最低速率
- 计数器 counters:当计量带处理数据包时更新计数
- 类型的特定参数 type specific arguments:带类型的可选参数
在本 规范 里带类 型没有 “Required” 。控制器可以查询交换机支持的计量带类型“Optional” - Optional: drop: 丢弃数据包。可以用来定义速率限制带。
- Optional: dscp remark: 增加数据包的 IP 头部 DSCP字段丢弃的优先级。可用于定义一个简单的 DiffServ 策略。
5.8 计数器 Counters
每一个流表,流表项,端口,队列,组,组存储段,计量器和计量带都会修改计数器。
OpenFlow-compliant 计数器可以在软件中实现, 也可以通过查询硬件计数器获取计数进行有限范围的修改。 表 5 中包含了 openflow 规范中定义的计数器集。 交换机不要求支持所有的计数器,只有那些标记为“ Required ”是必须支持的。
持续时间指的是流表项,端口,组,队列或计量器在交换机中已安装的时间数值,而且必须精确到秒。 Received Errors 字段是表 5 里定义的所有收到的和冲突的错误总和,也包括表里未列出的其它错误。
计数器都是无符号值,可以环回且没有溢出指示。如果交换机里没有指定值的计数器,则其值必须设置成字段的最大值(无符号数就是 -1 ) 。
5.9 指令 Instructions
每个流表项中包含一组指令集,当一个数据包匹配表项时指令就会被执行。这些指令可导致数据包,动作组和 / 或流水线处理发生改变。
交换机不需要支持所有类型的指令, 只需支持下面那些标记为“ Required Instruction ”。
控制器可查询交换机支持的 “Optional Instruction”。
. Optional Instruction: Meter meter_id : 将包转给指定的计量器。计量的结果可能会丢弃这个数据包(依赖于计量器的配置和状态) 。
. Optional Instruction: Apply-Actions action(s): 立即执行指定的动作,而不改变动作集。 在两个表之间传递或者执行同类型的多个动作的时候, 这个指令可用来修改数据包。
这些动作被指定为一个动作列表(见 5.11 )。
Optional Instruction: Clear-Actions: 立即清除动作集中的所有动作。
Required Instruction: Write-Actions action(s): 将指定的动作添加到当前的动作集中。 如果动作存在于当前集合中,则进行覆盖,否则进行追加。
-
Optional Instruction: Write-Metadata metadata / mask : 在元数据字段写入掩码的元数据数值。 掩码指的是元数据寄存器应进行修改的比特。
(new_metadata=old_metadata&~mask|value&mask)。
Required Instruction: Goto-Table next-table-id: 指示流水线处理的下一张表。表ID 必须大于当前表 ID。流水线最后一张表的流表项不能含有这个指令 (见 5.1 )。Openflow 交换机若只有一个流表则不需要实现这个指令。
流表项所属的指令集中每个类型的单个指令都有个最大值。指令就是按照上述列表中指定的顺序来执行。实际上,有限定的是: Meter 指令在 Apply_Actions 指令前执行,
Clear_Actions 指令在 Write_Actions 指令前执行, Goto_Table 最后执行。
如果流表项不能执行相关指令,交换机必须拒绝这个流表项。这种情况,交换机必须返回一个不支持的流错误信息(见 6.4 )。流表不一定支持每个匹配,每个指令或每个动作。
5.10 动作集 Action Set
动作集是与每个数据包相关的, 默认情况下是空的。 一个流表项可以使用 Write-Action指令或者与特殊匹配有关的 Clear-Action 指令来修改动作集。 动作集在表间被传递。 当一个流表项的指令集没有包含 Goto-Table 指令时, 流水线处理就停止了, 然后数据包的动作集执行其动作。
动作集中每个类型的动作有一个最大值。 set_field 动作用字段类型来标识, 因此动作集对每个字段类型的 set_field 动作(即,多个字段可被设置)有个最大值。当同一个类型需要多个动作时,例如,压入多个 MPLS标签或弹出多个 MPLS标签,应使用 Apply_Actions 指令(见 5.11 )。
动作集中所有的动作,不管它们以什么顺序添加到动作集中,动作的顺序均按照下列顺序执行。如果动作集包含组动作,那么组动作桶中的动作也按照下列顺序执行。当然,交换机也可以支持通过 Apply-Actions 指令任意修改动作执行顺序。
- copy TTL inwards: 向数据包内复制 TTL 的动作
- pop: 从数据包弹出所有标记的动作
- push-MPLS: 向数据包压入 MPLS标记的动作
- push-PBB: 向数据包压入 PBB标记的动作
- push-VLAN: 向数据包压入 VLAN标记的动作
- copy TTL outwards: 向数据包外复制 TTL 的动作
- decrement TTL: 将数据包的 TTL 字段减 1
- set: 数据包使用所有的 set_field 动作
- qos: 使用所有的 QOS动作,如对数据包排队
- group: 如果指定了组动作,那么按顺序执行组动作桶里的动作。
- output: 如果没有指定组动作,数据包就会按照 output 动作中指定的端口转发。
动作集中的 output 是最后执行的。如果在一个动作集里group动作和output动作都存在,则group动作优先。如果两者均不存在,数据包将被丢弃。 如果交换机支持的话, 组的执行是递归recursive的执行;一个group bucket可指定另外group,在这种情况下,动作执行可以通过配置贯穿全部指定组。
5.11 动作列表 Action List
Apply-Actions指令和Packet-out 消息包含一个动作列表。动作列表的含义与Openflow1.0 规范是一致的。 动作列表中的动作按照列表中的次序执行,并立即作用到数据包。
动作列表中的动作从第一个动作开始执行,动作都是按序执行的。动作的结果是叠加的,比如动作列表中有两个 push VLAN动作, 就会有两个 VLAN头加到数据包中。如果动作列表有一个输出output动作,一个从现状的复制包转发给期望端口。如果列表包含组动作,相关的组buckets就会现状的复制包处理。
一个 Apply_Actions 指令执行完一个动作列表后,流水线继续处理已修改的数据包(见5.1 )。数据包的动作集本身在动作列表执行的时候没有改变。
5.12 动作 Actions
交换机不要求支持全部的动作类型,只需支持下面列表中标记为“Required Action”的类型即可。控制器也能查询一个交换机所支持的“Optional Action”动作类型。
Required Action: Output. output动作转发数据包到指定Openflow 端口(见 4.1)。Openflow交换机必须支持转发到物理端口,交换机定义的逻辑端口和必需的保留端口(见 4.5 )。
Optional Action: Set-Queue. 为一个数据包设置队列 ID。当数据包使用output动作转发到一个端口,队列ID决定数据包哪个队列绑定到这个端口调度和转发。转发行为受队列配置控制,并用来提供Qos服务支持(见 7.2.2 )。
Required Action: Drop. 没有明确的动作代表丢弃(drop),换句话说,动作集中没有output动作的数据包都将被drop。当流水线处理时空指令集或空动作桶,或执行Clear_Actions指令,都会导致drop这个结果。
Required Action: Group. 通过指定的组处理数据包,准确的解释依靠组类型。
Optional Action: Push-Tag/Pop-Tag. 交换机可具有表 6 所示的压入/弹出标记的能力。
为了和已有网络更好结合,建议支持压入/弹出VLAN标记的能力。
最新的压入标记应插入到最外侧有效位置作为最外侧的标记。当压入一个新VLAN标记,应作为最外侧标记来插入,位于以太头部后面,其它标记前面。同样的,当压入一个新 MPLS标记,也应作为最外侧标记来插入,位于以太头部后面,其它标记前面。
当多个压入动作添加到数据包动作集,按照动作集定义的规则依次作用到数据包,开始时 MPLS,接着是 PBB,后面是 VLAN(见 5.10)。当一个动作列表中有多个压入动作,按照列表次序(见 5.11 )作用到数据包。
注意: 5.12.1 节所涉及的信息都是默认字段值。
Optional Action: Set-Field. 不同 Set-Field 动作由它们的字段类型来标识,并对数据包中头部字段分别修改数值。 当要求不很严格时, 若支持使用 Set-Field 动作进行重写头部各字段将非常有益于 Openflow 的实现。为了和已有网络更好结合,建议支持 VLAN修改动作。Set-Field 动作应一直作用到头部可能的最外侧(例如, “set VLAN ID”动作一直设置VLAN标记的最外侧 ID),除非该字段类型指定其它值。
-
Optional Action: Change-TTL.不同 Change-TTL 动作修改数据包中的 IPV4 TTL、IPV6 HopLimit 或 MPLSTTL。当要求不很严格时,表 7 所示的动作非常有益于 Openflow 中路由功能的实现。
Openflow 交换机检查出携带无效 IP TTL 或 MPLS TTL 的数据包并拒绝接收。不是每个数据包都需要检查 TTL 是否有效,但是每次数据包完成 TTL 减 1 动作后应在最短时间内检查。交换机可能会改变其异步配置(见 6.1.1)),利用输入包消息通过控制信道发送携带无效TTL 的数据包给控制器(见 6.1.2)。
5.12.1 字段压入的默认值
当执行一个压入push动作时,表 8 中所有字段指定的值应从已有外部头复制给新建外部头。表 8中所列的新字段与已有字段不一致的应设置为 0。Openflow set_field 动作不能修改的字段用初始化成合适的协议数值。
在压入操作之后,可通过指定的 “set” 动作对新建头部的某些字段进行设置。
后续链接
第6章
https://www.jianshu.com/p/82e238eb8d14
OpenFlow协议第一部分
https://www.jianshu.com/p/7eb86d164d26
OpenFlow协议第二部分
https://www.jianshu.com/p/9cc08c698106