OpenvSwitch系列之九 Group表

Open vSwitch系列之一 Open vSwitch诞生
Open vSwitch系列之二 安装指定版本ovs
Open vSwitch系列之三 ovs-vsctl命令使用
Open vSwitch系列之四 ovs-ofctl命令使用
Open vSwitch系列之五 网桥特性功能配置
Open vSwitch系列之六 vlan隔离
Open vSwitch系列之七 meter表限速
Open vSwitch系列之八 vxlan隧道
Open vSwitch系列之九 Group表
Open vSwitch系列之十 调用北向接口下发流表
OpenvSwitch系列之十一 ovs-dpdk

简介

组表是openflow1.1之后引入的一个高级功能,可以解决在特定场景下需要很多流表才能完成的动作。

组表的能力

1. 节省流表空间

组表的能力就可以存储多个动作,当匹配到一个合适的动作后可以执行多个动作,优化了流表一个匹配+一个动作的工作模式。

2. 数据包复制

组表可以将进入的流量复制成多份,并对每一份单独处理。特定场合下如流量分析,可以一边将流量正常转发,一边将流量导入到某一个分析机中。

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

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

4. 负载分流

组表可以选择动作中的某一个动作执行,在负载的场景下就可以通过转发到不同的端口实现后端流量负载。

组表结构

组表的结构图如下

一个组表包含多个组条目。组条目的能力是让openflow能够实现额外的转发能力。

 | Group Identifier | Group Type | Counters | Action Buckets|

Group Identifier:一个32bit无符号的整形,用来表示组表在交换机中的身份
Group Type: 确定组的类型
Counters: 当数据包被组处理时跟新数值
Action Buckets: 一个动作桶的有序列表,每一个桶包含多个动作可以去执行。动作桶中的动作是无重复的结合。

组表可以包含0个或多个动作桶,除了 indirect 类型的桶只能有一个动作。一个组表没有动作桶默认是丢弃数据。
一个桶的典型使用是包含一个可以修改数据包的动作和一个将数据转发到另一个端口的动作。动作桶也可以包含一个动作,这个动作可以调用另一个组的,前提是交换机支持这种组表调用链。一个没有动作桶的组表是合法的,一个动作桶没有转发动作或别的动作,会默认丢弃掉匹配的数据包。

组表的类型:

  • all: 执行组表中所有的动作。这种类型通常被用在组播或者广播转发。数据包非常高效的复制给每一个桶。每一个数据都被组表中的动作桶执行。如果一个动作是直接将数据包转发到进入的端口,这个包的复制会被放弃。如果控制器中写入了转发到进端口的流表,组表必须包含一个转发动作为OFPT_IN_PORT的保留动作。

  • select: 执行组表中的一个动作桶。数据包被组表中一个单个的桶处理,具体是哪一个动作通取决于交换机的选择算法。所有关于选择算法的配置和状态都是独立于OpenFlow协议之外的。

  • indirect: 执行组表中的一个定义的动作桶。这种组表只支持一个动作桶。允许多个流表条目或者组表指向这个id,支持更快,更高校的聚合。这种组类型是所有组类型中最高效的方式。

  • fast failover: 执行第一个活动的桶。每个动作桶和特殊的端口或组表有关系,可以控制动作桶的存活。动作桶有序的定义在组表中,第一个和活动的端口有关系的桶会被选择。这种类型可以修改交换机的流表而不需要控制器下发流表。如果没有动作桶是活动的,数据包会被丢弃。

类型验证

all

  1. 用mininet新建一个拓扑,一个交换机,下面挂4个主机
    mn --topo single,4

  1. 删除所有流表然后下发组表,引用组表
ovs-ofctl del-flows s1
ovs-ofctl add-group s1 group_id=1,type=all,bucket=output:2,bucket=output:3,bucket=output:4 -O openflow11
ovs-ofctl add-flow s1 in_port=1,action=group:1 -O openflow11


  1. 验证类型为all的功能
    type=all,组表将选择动作桶里所有的的动作。首先打开h4,打开wireshark,抓取网卡上的数据。

在h1上ping h2,流量会经过交换机,被流表匹配到,然后交给组表。组表会将ping的数据包复制多份,发给每一个动作去处理。流量会从2、3、4这三个端口都转发出去,所以在h4上能够看到icmp的数据包。

select

仍然使用上面的的拓扑,一个交换机连接4个主机。

ovs-ofctl add-group s1 group_id=2,type=select,bucket=output:2,bucket=output:3,bucket=output:4 -O openflow11
ovs-ofctl add-flow s1 in_port=1,action=group:1 -O openflow11

type=select,组表在动作桶中随机选择一个动作去执行,可以看到下在h2、h3、h4中监听的tcpdump中h4有流量捕获。在h1中ping 10.0.0.2,最后流量通过组表的select转发到h4上。

fast failover

通过fast failover这个名字就能发现该类型是一个快速恢复的类型。具体来说就是当转发的端口down掉之后组表能够感知到并且切换到另一个up的端口。
由于构建场景比较复杂,还没有实现该功能的演示。

ovs-ofctl add-group s1 group_id=0,type=ff,bucket=weight:0,watch_port:2,watch_group:0,actions=output:2,bucket=weight:0,watch_port:3,watch_group:0,actions=output:3 -O openflow11

具体可以参加该使用案例:http://voip.netlab.uky.edu/grw2018ky/handout/Khayam_FFO_Clemson.pdf

posted @ 2020-11-30 16:39  金色旭光  阅读(5539)  评论(2编辑  收藏  举报