OpenFlow Switch学习笔记(六)——Instructions和Actions

  本文主要重点讨论OpenFlow Switch规范的指令集,它们深刻影响着数据包在Switch中的处理行为,下面开始从以下几个部分谈起。

1、Instructions

  每一个Flow Entry里都包含有一系列的Instructions,这些Instructions会在与该Flow Entry成功匹配的数据包上执行,进而导致数据包头信息的修改、Action Set的更新或者改变Pipeline Processing的处理行为。Instructions大致有下列几种类型,OpenFlow Switch不需要支持所有的类型,但是加黑的类型必须得支持:

1)Meter meter_id:将数据包直接转发给指定的Meter处理。

2)Apply-Actions action(s):立即对数据包执行指定的action(s),而不是将这些action(s)更新到Actions Set中。这些action(s)可能会修改数据包的信息,它们以Action List的形式组织。

3)Clear-Actions:立即清除Actions Set中的所有action(s)。

4)Write-Actions action(s):将指定的action(s)合并到当前的Actions Set中;如果给定类型的action当前已经存在于Actions Set中,那么会覆写,否则直接加入。

5)Write-Metadata metadata/mask:将指定的metadata值写到当前的Metadata值域中。

6)Goto-Table next-table-id:指定了在Pipeline Processing中的下一张Flow Table。这里的table-id必须大于当前的Flow Table id,并且Pipeline的最后一张Flow Table中不能含有这个指令;如果仅有一张Flow Table的OpenFlow Switch也不能支持该指令。

  每一个Flow Entry里每种类型(如上列表)的Instruction最多只能有一个,并且这些Instructins必须得按照上述列表的顺序来依次执行。往往在实际上,唯一的限制就是 Meter 指令必须在 Apply-Actions  指令前执行,Clear-Actions 指令必须在 Write-Actions 指令前执行,Goto-Table 必须放在最后执行。

  一个OpenFlow Swtich必须拒绝它不能支持的Instructions的Flow Entry,并且发出一个unsupported flow error给Remote Controller。Flow Tables可能会不支持每一个match,每一个instruction或者每一个action。

2、Action Set

  Action Set是与每个数据包相关联的,初始时是一个空集合;一个Flow Entry可以通过Write-Actions或者Clear-Actions指令来修改Action Set,这个Action Set会在不同的Flow Table之间进行传递,当一个Flow Entry的Instructions里不包含Goto-Table指令时,那么整个Pipeline Processing就会在此Flow Entry停止,然后开始执行与该数据包关联的Action Set里所有的action(s)。

  同样地,一个Action Set里每种类型的action最多只有一个,action类型大致如下所示:

1)copy TTL inwards:在数据包上执行copy TTL inwards操作。

2)pop:pop出数据包里所有的tag。

3)push-MPLS:push MPLS tag到数据包里。

4)push-PBB:push PBB tag到数据包里。

5)push-VLAN:push VLAN tag到数据包里。

6)copy TTL outwards:在数据包上执行copy TTL outwards操作。

7)decrement TTL:降低数据包的TTL。

8)set:在数据包上执行set-fields操作。

9)qos:执行与qos相关的操作,比如set_queue。

10)group:转到指定的Group Table里继续执行其Action Bucket里的action(s)。

11)output:如果没有group action指定,那么将数据包转发到指定的port里。

  Apply-Actions指令会触发立即执行Action Set里的action(s),并且这些action(s)必须按照上述列表的顺序来依次执行,而不管这些action(s)加入到Action Set的顺序,另外output action一定要是最后执行的;如果一个Action Set里同时存在output action和group action,那么此时group action将优先被执行,而output action将会被忽略,反之,如果一个Action Set里都不存在output action和group action,那么该数据包将会被丢弃。如果OpenFlow Switch支持的情况下,Group Action Bucket是可以递归执行的,即Action Bucket是可以继续指定另一个Group。

3、Action List

   Apply-Actions指令和packet-out消息都包含有一个Action List,这些Action List里的action(s)会依照上文列表的顺序依次执行,并且执行的结果会立即累积地反映到数据包信息里,比如Action List里有两个push-VLAN的action,那么这两个VLAN tag都会被加入到数据包头里。如果Action List里包含有output action,那么基于当前状态的数据包会被克隆一份,进而该克隆体被转发到指定的port里;如果Action List里包含有group action,那么同样地基于当前状态的数据包会被克隆一份,进而该克隆体被转发到指定的Group里。

  当数据包的Apply-Actions指令执行完成后,Pipeline会继续在修改过的数据包上继续执行后续的处理,而Action Set不会因为Action List的执行被修改。

4、Actions

  OpenFlow Switch并不需要支持所有的Action类型,但是下面加黑的类型必须得支持:

1)Output:该action指将一个数据包转发到指定的OpenFlow Ports。

2)Set-Queue:该action指为一个数据包设置一个queue id。当一个数据包通过output action转发到某个port时,该queue id 决定了该数据包被放在哪个queue用来调度转发,此方式可以用来实现QoS支持。

3)Drop:没有显示的action来表示丢弃数据包,作为替代方案,如果一个数据包的Action Set里没有output action,那么将此数据包将会被丢弃。

4)Group:将数据包转发到指定的Group继续处理。

5)Push-Tag / Pop-Tag:Switch应该有能力支持下列的push-tag/pop-tag的操作:

6)Set-Fields:不同的set-fields action以其不同的field type来唯一标识,通过它可以修改数据包头的某些值域信息,比如VLAN tag的修改等。

7)Change-TTL:该action可以修改数据包头的IPv4 TTL,IPv6 Hop Limit 或者 MPLS TTL等信息,具体如下:

时间: 2024-11-19 13:47:22

OpenFlow Switch学习笔记(六)——Instructions和Actions的相关文章

OpenFlow Switch学习笔记(一)——基础概念

OpenFlow Switch v1.4.0规范是在2013年10月14号发布,规范涵盖了OpenFlow Switch各个组件的功能定义.Controller与Switch之间的通信协议Open Flow Protocol等.下文主要是基于个人理解整理的一些学习笔记,理解不到位的地方还请大家多多指教. 一.基础概念图: 首先我们先看下Open Flow Switch的整体结构,以便有一个初步的感性认识,如下图所示: 从上面架构图中,我们可以看到Open Flow Switch主要是由以下几个部

OpenFlow Switch学习笔记(四)——Matching

这次我们着重详述来自于网络中的数据包在OpenFlow Switch中与Flow Entries的具体匹配过程,以及当出现Table Miss时的处理方式,下面就将从这两方面说起. 1.Matching 当一个来自于外部网络的数据包进入到OpenFlow Switch中时,OpenFlow Switch将会按照如下图所示的方式来处理这些数据包,如前面的学习笔记中讲述的那样,会先从Pipeline的第一个Flow Table首先进行Lookup,然后可能继续进入到其他的Flow Table进行Lo

OpenFlow Switch学习笔记(五)——Group Table、Meter Table及Counters

本文主要详述OpenFlow Switch的另外两个主要组件——Group Table和Meter Table,它们在整个OpenFlow Swtich Processing中也起到了重要作用. 1.Group Table Group Table给OpenFlow Switch提供了更加高级的数据包转发特性(比如select或者all),其由多个Group Entries组成,而每个Group Entry结构如下所示: 每个Group Entry根据其Group Identifier来唯一定位,

OpenFlow Switch学习笔记(三)——Flow Tables

这次我们主要讨论下OpenFlow Switch的核心组件之一——Flow Tables,以了解其内部的 matching 以及 action handling 机制.下文将会分为几个部分来逐步详述OpenFlow Switch内部数据包的流转机制. 1.Pipeline Processing 遵循OpenFlow Switch规范的OpenFlow交换机大致分为 OpenFlow-only 和 OpenFlow-hybrid 两类.OpenFlow-only 交换机仅仅只支持OpenFlow规

Linux System Programming 学习笔记(六) 进程调度

1. 进程调度 the process scheduler is the component of a kernel that selects which process to run next. 进程调度器需要使 处理器使用率最大化,并且提供 使多个进程并发执行的虚拟 Deciding which processes run, when, and for how long is the process scheduler's fundamental responsibility. 时间片:th

python之raw_input()(学习笔记六)

python之raw_input()(学习笔记六) 我们经常使用raw_input()读取用户的输入,如下例子所示: >>> name = raw_input('please input your name:'),截图如下: 下面简单说下,raw_input()与if搭配使用,脚本如下: #!/usr/bin/env python # -*- coding:utf-8 -*- birth = raw_input('birth:') if birth < 2000: print '0

swift学习笔记(六)析构过程和使用闭包对属性进行默认值赋值

一.通过闭包和函数实现属性的默认值 当某个存储属性的默认值需要定制时,可以通过闭包或全局函数来为其提供定制的默认值. 注:全局函数结构体和枚举使用关键字static标注    函数则使用class关键字标注 当对一个属性使用闭包函数进行赋值时,每当此属性所述的类型被创建实例时,对应的闭包或函数会被调用,而他们的返回值会被作为属性的默认值. ESC: Class SomeCLass{ let someProperty:SomeType={ //给someProperty赋一个默认值 //返回一个与

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)

Swift使用自动引用计数(ARC)来管理应用程序的内存使用.这表示内存管理已经是Swift的一部分,在大多数情况下,你并不需要考虑内存的管理.当实例并不再被需要时,ARC会自动释放这些实例所使用的内存. 另外需要注意的: 引用计数仅仅作用于类实例上.结构和枚举是值类型,而非引用类型,所以不能被引用存储和传递. swift的ARC工作过程 每当创建一个类的实例,ARC分配一个内存块来存储这个实例的信息,包含了类型信息和实例的属性值信息. 另外当实例不再被使用时,ARC会释放实例所占用的内存,这些