OpenFlow标准分析

来源:互联网 发布:淘宝 发卡 编辑:程序博客网 时间:2024/06/06 13:12

OpenFlow协议涉及两个网络元素:OpenFlow Controller(控制器)和OpenFlow Switch(交换机)。OpenFlow协议有一部分运行在Controller上,另一部分运行在Switch上。这个协议具体定义了交换机转发面的功能部件,Controller如何来控制Switch以及Switch如何来反馈Controller的一系列过程,以及两者之间通信的消息类型和消息格式,同时还有一系列的标准术语。

OpenFlow交换机转发面内部(即交换芯片)可以认为在逻辑上由两部分组成:端口(Port)和流表(Flow Table)。跟Controller通信的通道(Controller Channel)可以认为是一个特殊的Port。一个交换机可以有很多种端口,也可以有很多级流表。

流(Flow):所谓的流,就是指在一段时间内,经过同一个网络的一系列具有相同属性的顺序发送的报文集合。流是可以被老化的,所以哪怕是具有相同属性的报文,如果隔了足够长的时间又去发(假设这个时间已经超过了流的老化时间,那么对于交换机来说,这已经是一条新的流了。这就是为什么要在流的定义中加上“一段时间内”这个定语。

流表(Flow Table):流表就是芯片中一张张的转发表,每张流表都由很多条流表项(Flow Entry)组成,比如一张流表有16K,就是说这张流表有16K条流表项。

流表项(Flow Entry):流表项是流表的最小单位,每条流表项对应了网络中传输的一条流。流表项是OpenFlow中最核心的元素,根据OpenFlow标准,每条流表项的组成部分如下:
| Match Field | Priority | Counter | Instruction | Timeout | Cookie |
也就是说每条流表项有6个组成部分,分别是:
1。Match Field(匹配字段)
2。Priority(优先级)
3。Counter(计数器)
4。Instruction(指令)
5。Timeout(超时时间)
6。Cookie(附属属性)
注意,这里的流表项的组成部分是指Controller和交换机之间传输的数据结构,是对流表项的逻辑描述,并不是跟芯片转发表中的实际字段一一对应。

流表查找的过程通俗地讲就是对进来的报文,用该流表指定的字段去进行匹配查找,如果匹配到了一条流表项,那就执行这条流表项所规定的指令。

匹配字段(Match Field):匹配字段包括报文本身的信息(比如MacDa、MacSa、Vlan、IPDA、IPSA等)以及跟报文关联的字段(比如报文进来的Port,前一张流表传过来的属性数据)。同一张流表里面不同的流表项的匹配字段可以是不同的,也可以是相同的。

优先级(Priority):一个报文在流表中进行匹配查找的时候,是从上到下顺序查找的,谁放在前面谁就可以被优先匹配到,优先级就是用来标志流表项之间的顺序关系的,优先级相同的流表项是平等的,没有顺序关系,谁先谁后都一样。Controller往交换机下发流表项的时候,用优先级来告诉交换机该条流表项在流表中存放的相对位置。

计数器(Counter):计数器是管理员用来观察监控网络负载情况的非常重要的工具,原则上每条流表项都应该对应一个计数器,来表示属于这条流的报文已经收到了多少个以及各种其他统计数据(比如多少字节、多少错误的包等)。

**指令(Instruction):**OpenFlow里面定义的指令有好几种:
(1)Meter:用来测量该Flow的速率并执行相应的动作。按照OpenFlow标准术语,每个Meter包含几个Band,每个Band对应一个Rate和动作,Band的意思就是如果所测量的Flow的速率超过了指定的Rate,就执行相应的动作。
(2)Apply-Action:立即对报文执行一个Action List(动作列表)里面所指定的所有Action,这些Action执行的结果可能影响也可能不影响下一级流表查找。
(3)Write-Action:并不立即对报文执行动作,而是把一个Action List里面的多个Action放到一个Action Set(动作集合)里面去。等到所有流表都处理完了,再一次性处理这个Action Set里面所有的Action。如果两个不同的流所放的Action有冲突,那么后面的覆盖前面的。只支持单流表的时候这个指令等同于Apply-Action。
(4)Clear-Action:如果某条流想把前面所有流表处理后产生的Action Set都清除掉,那就要执行Clear-Action的指令。只支持单流表的时候这个指令无意义。
(5)Write-metadata:metadata可意译为“描述信息”,简单地讲,就可以认为是代表一条流的独一无二的特征ID,用来在多级流表之间传递以达到关联多级流表的目的。
(6)Goto-Table:继续下一级指定流表的处理。这个Instruction是所有Instruction中唯一required(即要求必须支持的)的Instruction,其他都是可选的。只支持单流表的时候这个指令无意义。

超时时间(Timeout):每条流表项都可以被老化,Timeout就是表示该流的老化时间。OpenFlow定义了两种老化时间,hard timeout和idle timeout,前者表示从该流表项创建开始,到了这么长时间之后,无条件删除;后者则表示如果在这么长时间内没有任何报文匹配过该流表项,那就把它删除。前者可以靠软件来做,后者必须有硬件协助。

附属属性(Cookie):Cookie是被Controller用来向Switch来传递流表项相关的操作信息的,比如修改Flow、删除Flow等。这个属性不会在报文转发的时候被使用,仅仅用于Controller和交换机之间传递消息。

动作(Action):Action是应用到一个报文上的最小原子操作,宏观来看包括两大类,报文编辑和报文转发。

动作列表(Action List):一个Instruction可能会指定对一个报文执行多个Action,这里的多个Action是在一个Action List里面指定的。

动作集合(Action Set):Write-Action这个指令是将流所指定的Actions放到一个动作集合里面去,而不是马上执行这些动作,等到了所有流表都处理完,再一次性执行这个动作集合里面的所有动作。只支持单流表的时候Action Set无意义。

0 0
原创粉丝点击