OpenFlow 系列文章链接归类:
文章目录
前言
在这篇文章里我们了解一下openflow1.3的全部特性
一、什么是openflow
SDN
的一个核心思想
就是“转发、控制分离”
,要实现转、控分离,就需要在控制器与转发器之间建立一个通信接口标准
,允许控制器直接访问和控制转发器的转发平面。OpenFlow
引入了“流表”
的概念,转发器通过流表来指导数据包的转发。控制器正是通过OpenFlow提供的接口在转发器上部署相应的流表,从而实现对转发平面的控制。
二、名词解释
Packet
: 一种因特网框架,包含包头
和负载
。Port
: packet 进入和流出的地方,可以为物理口
、switch定义的逻辑口
或者 openflow协议规定的保留端口
。Pipeline
: openflow 交换机内的整个流表中的一段流
,用于进行包的匹配
、转发
与修改
。Flow Table
: 容纳多段流
的一张总表
。Flow Entry
: 流表中用于匹配和处理数据包
的元素。它包含一组用于匹配数据包
的匹配字段,一个用于匹配优先级
的优先级,一组用于跟踪数据包的计数器
,以及一组用于应用的指令
。Match Field
: 数据包匹配的字段,包括数据包头
、入站端口
、以及元数据
值。匹配字段
可以是通配符
(匹配任何值) 在某些情况下是位掩码
。Metadata
: 一组可以带掩码的数据
,用于在不同的表之间传递数据。Instruction
: 当包命中
flow entry时,instruction可以修改
pipeline的处理流程
,
例如:将信息包定向到另一个流表,或者包含要添加到操作集的一组操作,或者包含 要立即应用到信息包的一组操作。Action
: 可以操作包发往
某个port
,或者修改包
,action可以作用于instruction
中 也可以作用于group的bucket
中。
例如:递减包中的TTL值Action Set
: 关联包的一组动作
,可以在每个flow table处理完包时进行一个累积,当instruction组操作包退出pipeline时执行
。Group``: 包含
一个或多个action bucket` 的组。Action Bucket
: 内含多个action
的聚合,action bucket 作用于group内。Tag
: 可以通过push和pop
操作向header中添加或清除
的一个标记
。Outermost Tag
: 最靠近packet进入时候的标签
。Controller
: 使用OpenFlow协议与OpenFlow交换机交互的一个控制器
。Meter
: 负责控制
交换机上面包的流速
,如果包的流速超过
meter预设的阈值
,则会触发meter band
去进行丢包
处理,也被称为Rate Limiter。
三、openflow消息类型
通道中传输的OpenFlow消息类型
包括以下三种:
Controller-to-Switch
消息:由控制器发出、OpenFlow交换机接收并处理的消息,主要用来管理或获取OpenFlow交换机状态
。Asynchronous
消息:由OpenFlow交换机发给控制器,用来将网络事件或者交换机状态变化
更新到控制器。Symmetric
消息:可由OpenFlow交换机发出也可由控制器发出,也不必通过请求建立,主要用来建立连接
、检测对方是否在线
等。
四、openflow组件
OpenFlow port
OpenFlow port可以连接:
- 物理口
- 由switch定义的逻辑口
- 保留端口
物理口就相当于实际存在的网口,逻辑口是switch定义出来的一个虚拟的口,
其中 物理口 和 逻辑口的区别在于, 逻辑口的packet会多出一个tunnel ID 的元数据,当逻辑的packet 进行 packet-in 传给控制器时,会把逻辑口的physical_port和logic_port一并上报。
保留端口用于和控制器、泛洪、或者发往非OpenFlow交换机
openflow pipeline
pipeline
流程:
- 在当前table根据匹配域和优先级选择一条flow;
- 执行该flow内的动作(包括:修改包,更新field、执行action、更新元数据);
- 发往下一张table。
flow 结构
flow 结构
match fields
: 匹配数据包,匹配的字段包含inport,header,以及前面table写入的元数据;priority
: 优先级,数字越大,优先级越高;counters
: 计数器,记录经过这条flow的包数量;instructions
执行动作或者管道处理;timeouts
: 一条flow的存活时间;cookie
: 由控制器创建的一个不透明的数据,用于过滤flow的一个标记。
flow 过期
idle_timeout
: 当一段时间(idle_timeout)内不再收到packet,则删除该flow;hard_timeout
: 从下发此条flow开始的一段时间(hard_timeout)后,强制删除该flow。
match
当packet未匹配上流的行为有:
- 通过通道上报到
controller
- 直接
drop
- 进入到
下一个table
进行匹配
group
group 结构
group identifier
:group
的一个uint32
唯一标识group type
: 用于辨别该group的模式(all、select、indirect、fast failover)counters
: 计数器,记录过这个group的包的数量action buckets
: 一组bucket
的有序列表,每个bucket
又有一系列的动作以及对应参数
group 模式
all
: 包会被克隆,发往group内所有的bucket里被执行;select
: 包只会选择group内一个bucket进行执行,选择方式根据switch上的选择算法,通过这种方式进行负载均衡;indirect
: group内只有一个bucket,这样做的好处是能够让多条flow,都来执行相同的bucket,能够更好的进行收敛;fast failover
: 执行第一个有效的bucket,每一个bucket都和控制其存活状态的特定的端口或者group相关联,这种模式的好处在于,可以不通过controller来让switch自己进行流量转发的重新定向,这种group模式必须实现一个存活机制。
Meter
meter 结构
meter identifier
: meter的uint32唯一标识符meter bands
: 每个meter band 标记了band 的带宽,以及包的处理方式counters
: 计数器,统计通过的包数量
meter bands 结构
band type
: 标记包要如何处理;rate
: 标记着meter band能够选择的最低速率,用于指导meter如何选择去meter band;counters
: 标记 meter band 处理过的包数量;type specific arguments
: 一些 band 的可选参数:
-drop
: 可以用来定义一个速率限制 band;
-dscp remark
降低报文的IP头中DSCP字段的丢弃优先级,可以被用作定义一个DiffServ策略器;
Instructions
每一个Flow Entry里都包含有一系列的Instructions,这些Instructions会在与该Flow Entry成功匹配的数据包上执行,进而导致数据包头信息的修改、Action Set的更新或者改变Pipeline Processing的处理行为。
Meter meter_id
:将数据包直接转发给指定的Meter处理。Apply-Actions action(s)
:立即对数据包执行指定的action(s),而不是将这些action(s)更新到Actions Set中。这些action(s)可能会修改数据包的信息,它们以Action List的形式组织。Clear-Actions
:立即清除Actions Set中的所有action(s)。Write-Actions action(s)
:将指定的action(s)合并到当前的Actions Set中;如果给定类型的action当前已经存在于Actions Set中,那么会覆写,否则直接加入。Write-Metadata metadata/mask
:将指定的metadata值写到当前的Metadata值域中。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。
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类型大致如下所示:
copy TTL inwards
:在数据包上执行copy TTL inwards操作。pop
:pop出数据包里所有的tag。push-MPLS
:push MPLS tag到数据包里。push-PBB
:push PBB tag到数据包里。push-VLAN
:push VLAN tag到数据包里。copy TTL
outwards:在数据包上执行copy TTL outwards操作。decrement TTL
:降低数据包的TTL。set
:在数据包上执行set-fields操作。qos
:执行与qos相关的操作,比如set_queue。group
:转到指定的Group Table里继续执行其Action Bucket里的action(s)。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。
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的执行被修改。
Actions
OpenFlow Switch并不需要支持所有的Action类型,但是下面加黑的类型必须得支持:
Output
:该action指将一个数据包转发到指定的OpenFlow Ports。Set-Queue
:该action指为一个数据包设置一个queue id。当一个数据包通过output action转发到某个port时,该queue id 决定了该数据包被放在哪个queue用来调度转发,此方式可以用来实现QoS支持。Drop
:没有显示的action来表示丢弃数据包,作为替代方案,如果一个数据包的Action Set里没有output action,那么将此数据包将会被丢弃。Group
:将数据包转发到指定的Group继续处理。Push-Tag / Pop-Tag
:Switch应该有能力支持( VLAN MPLS PBB )
的push-tag/pop-tag的操作:Set-Fields
:不同的set-fields action以其不同的field type来唯一标识,通过它可以修改数据包头的某些值域信息,比如VLAN tag的修改等。Change-TTL
:该action可以修改数据包头的IPv4 TTL,IPv6 Hop Limit 或者 MPLS TTL等信息
参考
https://opennetworking.org/wp-content/uploads/2014/10/openflow-spec-v1.3.0.pdf
https://info.support.huawei.com/info-finder/encyclopedia/zh/OpenFlow.html
https://www.cnblogs.com/CasonChan/p/4626099.html