openvswitch 中的conjunction

CONJUNCTION 联合字段

一个单独的OpenFlow流只能匹配某个字段的一个值。然而,多有需求需要匹配一个或多个字段中的一组值。
为将单个字段与一个范围进行匹配,这很简单,向流表添加多个流,每个流一个值。

例如,可以使用以下流,匹配发送IP源地址为a、b、c或d的数据包到OpenFlow控制器:
ip,ip_src=a actions=controller
ip,ip_src=b actions=controller
ip,ip_src=c actions=controller
ip,ip_src=d actions=controller
类似地,匹配带有IP目的地址的数据包e, f, g或h的流到OpenFlow控制器:
ip,ip_dst=e actions=controller
ip,ip_dst=f actions=controller
ip,ip_dst=g actions=controller
ip,ip_dst=h actions=controller

在单个流表中安装上述所有流将产生一个析取效应,当ip_src∈{a,b,c,d}或ip_dst∈{e,f,g,h}或两者都满足。
(如果上述两组流都出现在流表中,他们应该有不同的优先级,
因为OpenFlow规定,当单个包能匹配两个具有相同优先级的流时,结果是未定义的。)

另一方面,假设希望结合起来匹配,当ip_src∈{a,b,c,d}且ip_dst∈{e,f,g,h}。
这需要4 × 4 = 16个流表,ip_src和ip_dst的每个可能配对对应一个。
对于小示例来说,这是可以接受的,扩展到更大的集合或更多的维度是不能接受的。

联合是内置在Open vSwitch中。联合单个的OpenFlow流表流向更高级别的联合流。
每个组对应一个维度,每个流在组中匹配维度的一个可能值。
一个流匹配了每一个组的某一个值,就是匹配了联合流。

联合流的id是一个32位值,它必须在OpenFlow表中是唯一的。
给每一个n≥2的维度分配一个唯一的从1到n的数字,顺序并不重要。
添加一个流到流表中,并把维度的可能值(id, k/n)作为流的操作动作。
其中k是流的当前维度,n是联合流的总维度。

当满足指定联合流的匹配条件,OpenvSwitch将conj_id设置为指定的ID,再次搜索流表。

下面的流程提供了一个示例。
conj_id=1234 actions=controller
ip,ip_src=10.0.0.1 actions=conjunction(1234, 1/2)
ip,ip_src=10.0.0.4 actions=conjunction(1234, 1/2)
ip,ip_src=10.0.0.6 actions=conjunction(1234, 1/2)
ip,ip_src=10.0.0.7 actions=conjunction(1234, 1/2)
ip,ip_dst=10.0.0.2 actions=conjunction(1234, 2/2)
ip,ip_dst=10.0.0.5 actions=conjunction(1234, 2/2)
ip,ip_dst=10.0.0.7 actions=conjunction(1234, 2/2)
ip,ip_dst=10.0.0.8 actions=conjunction(1234, 2/2)

细节说明:

* 	例子中每个维度的值只有一种形式,维度1是ip_src,维度2是ip_dst
	实际上每个维度可以包含完全不同的类型
	
*	一条流可以在每个维度同时匹配多个字段,例如同时匹配 ip 和 port

*	一条流可以匹配多个联合流的动作,例如
	ip_src ∈ {a,b} and ip_dst ∈ {d,e} 
	ip_src ∈ {b,c} and ip_dst ∈ {f,g}
	对于ip_src=b,可能会匹配两个动作中的某一个

*	联合流的id是唯一的,组成联合流的所有流是在同一个表、同一个优先级的情况下
	否则视为不同的联合流

*	联合流的构成不能重叠,流量不能同时匹配到两个联合流,否则意想不到结果

*	搜索conj_id是和其他字段一样的,可以在场景下完成不同动作
	避免在联合流内匹配conj_id防止递归

*	conj_id处理和其他字段一样,例如
	conj_id=1234,ip actions=mod_nw_src:1.2.3.4,controller
	
*	组成联合流的统计不会增加字节和数据包,空闲时间和硬超时可能会更加有用

*	不建议在conj_id匹配后,再匹配其他字段,会有多余搜索,建议加到某个或多个维度里

*	Openvswitch规定一定要大于2个维度,不然就没有必要了

*	每个维度应该有1个以上的流组成,但Openvswitch不会强制,也就是维度可以是0个流
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值