对OpenFlow组表(group table)的理解

OpenFlow是根据stage的流水线定义的,每个stage都是一个流表(Flow table)。

流表:当数据包到达一个stage的时候,会执行“match-and-act”,检查该flow table中是否含有特定的flow entry与数据包header的相应字段匹配。如果找到匹配项,则将该条flow entry对应的instructions在数据包上执行(或者加入数据包的action set中,最后一起执行)。

为什么需要组表呢?

举两个例子:

1. 发送数据包副本

        假如你想发送两份数据包的副本(copy),一个副本发送到目标地址,另一个副本发送到网络分析器,这个时候需要对这两个副本做不同的封装--一个副本需要添加VLAN header,另一个不需要(或者需要添加不同的VLAN ID)。如果在组表中做这个,你需要在所有的流表中创建不同的表项用于不同的封装;当你添加或者删除网络分析器时,需要找到所有的相应流表项并且进行修改。

        如果用组表呢?创建一个ALL的组将所有的目标地址和网络分析器包含进去,group table中的每一个表项都有对于其特定的副本所要执行的actions:添加VLAN,设置不同的VLAN ID等等。当flow table查找到这条表项时,将packet转发至这个组表中,如果中途添加或者删除网络分析器,只需要在组表中进行修改而不需要动流表。

2. 容错能力-备用端口/路径

        想象这么一个场景,如果一个数据包应该在端口1离开交换机,但是这个端口down掉了,你想要将数据包通过端口2发送出去。如果用流表的话,当端口1down掉,需要找到所有含有“发往端口1”的流表项,全部修改成端口2,这个操作是很复杂的。这个时候,需要定义一个“1st live” group来表示这种容错行为,然后将所有的流表项的规则指向该组表。只要端口1正常,group会把所有的数据包发往端口1,如果端口1 down掉,将所有数据包发往端口2,流表没有任何变化。

OpenFlow支持的组表类型

Indirect:执行该group中一个已定义的bucket, 该组仅支持一个bucket。 允许多个流表项或组表项指向一个公共的组(例如IP转发的下一跳)。 这是最简单的group类型,交换机通常比较支持这种类型的group。

All:执行该group中所有的bucket。这种类型的group用来进行multicast和broadcast。为每个bucket克隆一份数据包,然后分别执行每个bucket中的actions。

Select:执行该group中的一个bucket。基于一种选择算法(用户定义的哈希算法或者轮询算法)选择group中的一个bucket对数据包执行actions。这种选择算法应该尽量支持负载均衡并且为每个bucket提供一个权重用于分配。当一个bucket指定的端口down掉,交换机应该将选择限制在剩下的正常的bucket中而不是丢掉,这是为了减少链路中断。

Fast failover:执行第一个活动的bucket。 每个action bucket都与控制其活动性的特定端口和/或组相关联。 按照group定义的顺序评估bucket,并选择与活动端口/组关联的第一个bucket。 这个group类型使交换机可以更改转发行为而无需往返于控制器。 如果没有bucket,则丢弃数据包。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值