一个Openflow交换机包括一个或者多个流表flow table和一个组表group table。每个流表中每个流条目包括三个部分:(1) 匹配match—使用ingress port,packet header以及前一个flow table传递过来的metadata;(2) 计数counter---对匹配成功的包进行计数;(3) 操作instruction—修改action set或者流水线处理.
数据包从第一个流表开始匹配,可能会经历多个流表,这叫做流水线处理pipeline processing。流水线处理的好处就是允许数据包被发送到接下来的流表中做进一步处理或者元数据信息在表中流动。首先,找到流表中优先级最高的流条目完成匹配,这将根据ingress port,包头packet header,以及有上一个流表指定的metadata三类匹配域进行。如果某个数据包成功匹配了流表中某个流条目,则更新这个流条目的conter计数,同时这个流条目中的instruction操作将被应用生效。
Pipeline processing终结于instruction中没有指定下一个流表,这时数据包通常会被所带有的动作集合action set处理后转发。
如果数据包发生table miss现象,通常会通过控制通道和packet-in消息发送给控制器。
组表里往往代表一组额外的处理,如flooding、multipath、fast reroute、link aggregation。
这一节主要讲述流表flow table和组表grouptable的组成,以及数据包的匹配和处理动作。
首先(a)图可以看出,每个数据包是经过流水线pipeline进行处理的,经历多个flow table的匹配,然后最后在执行action动作后被转发出去;
(事实上,现在的交换机貌似也是这种pipeline processing的,并且openflow交换机可以通过预留的NORMAL端口转向现有交换机的normal pipeline处理。)
那么在每个flow table中是如何处理的呢?主要分为三步:(1) 匹配match。找到流表中优先级最高的流条目完成匹配,这将根据ingress port,包头packet header,以及有上一个流表指定的metadata三类匹配域进行。(2) 指令instruction。根据匹配到的流条目增删改指令集,包括修改包、更新包的匹配域、更新动作集合action set、更新传递给下一个流表的metadata;(3) 发送。将匹配的数据和动作集发送给下一个流表。当一个数据包匹配了某个流表条目时,需要执行这个flow entry中的instruction指令,这些instruction指令将改变数据包、action set动作集合或者流水线处理顺序。
典型的instruction指令包括以下五类:应用动作apply-action,清空动作clear-action,写动作write-action,写源数据write metadata以及转向动作goto。
6.1 Action Set
首先每个数据包都有一个ActionSet.这个ActionSet初始为空,中间可能被每个匹配的flow entry中的Write-Action或Clear-Action指令instruction进行修改,最后在pipleline processing结束的时候被执行。
ActionSet中包含以下九类的action:copy TTL inwards, pop, push, copy TTL outwards, decrement TTL, set, qos,group, output。每个Action Set中只能一类只能有一个action,并且严格按照上述顺序执行。
6.2 Action List
其次,在Apply-Action指令以及Packet-out消息中都有ActionList,用于对数据包立即执行action,并且按照Action List里面指定的顺序执行,与action的类别无关。
6.3 Action
Action包含以下几类:output,set-queue,drop,group,push/pop,set-field,change-TTLOpenflow支持三类消息:
1 Controller-to-Switch
控制器所发起的消息,又分为以下五类:
1) Feature:查询交换机能力;
2) Configuration:设置或者查询配置参数;
3) Modify-State:增删改流表或者组表条目,设置交换机端口属性
4) Read-State
5) Packet-Out: 比较复杂一些。这个消息用于控制器指定从交换机的特定端口发送数据包,或者用于转发通过Packet-in消息接收到的数据包。
Packet-out消息中包含一个完整的数据包或者指针,以及action.
6) Barrier:用于控制器保证消息的依赖关系或者接收notification
2 Asynchronous
交换机发起的消息,分为以下四类:
1) Packet-In:对于出现flowentry mismatch的数据包,交换机向控制器发送packet-in事件。
数据包本身要么被完全包含在packet-in消息中,要么被buffer在交换机中,反正都是等着控制器的Packet-out事件来处理就对了。
2) Flow-Removed: 交换机通知控制器已经没有了某个流表条目
3) Port-Status:当端口配置或者状态变化时通知控制器
4) Error
3 Sysmetic
两方都可以发起的消息,不用协商,分为以下三类:
1) Hello:交换机和控制器建立起连接后的维护消息
2) Echo:是Echorequest和reply的配对,常用语检查liveness,测量延迟和带宽
3) Experimenter:一个交换机可以连接多个Equal状态的控制器,多个Slave状态的控制器以及最多一个Master状态的控制器。
为了确保在Master/Slave转换过程中出现消息乱序,引入了generation-id。