关于TTS(元组空间搜索算法)的详细介绍能够参考OVS+DPDK Datapath 包分类技术这篇文章,本文只对该篇博客进行简单的介绍,其中案例和部分图片来自于OVS+DPDK Datapath 包分类技术html
如下为具体的例子:算法
1 Rule #1: ip_src=192.168.0.0/16 ip_dst=0/0 protocol=0/0 port_src=0/0 port_dst=0/0 2 Rule #2: ip_src=0/0 ip_dst=23.23.233.0/24 protocol=6/8(TCP) port_src=0/0 port_dst=23/16 3 Rule #3: ip_src=0/0 ip_dst=11.11.233.0/24 protocol=17/8(UDP) port_dst=0/0 port_dst=4789/16 4 Rule #4: ip_src=10.10.0.0/16 ip_dst=0/0 protocol=0/0 port_src=0/0 port_dst=0/0
能够看到一个rule中有多个字段,每一个字段的形式为 :字段值/掩码前缀segmentfault
如下为具体的例子:spa
1 Tuple #1: ip_src_mask=16 ip_dst_mask=0 protocol_mask=0 port_src_mask=0 port_dst_mask=0 2 Tuple #2: ip_src_mask=0 ip_dst_mask=24 protocol_mask=8 port_src_mask=0 port_dst_mask=16
tuple是将有相同规则的rule进行合并,例如上述rule #1和rule #4能够当作是同一个tuple #1,由于其每一个字段的掩码都相同,因此tuple有以下特色:code
以Tuple #2中的Rule #2为例说明一下,首先用tuple的掩码去与rule中的各个字段值,丢弃tuple不关心的位,获得:htm
ip_src=_ ip_dst=23.23.233 protocol=6 port_src=_ port_dst=23
而后把这些位拼接起来,就是哈希表的key,转换为二进制以下:blog
key = 0001 0111(23) 0001 0111(23) 1110 1001(233) 0000 0110(6) 0000 0000 0001 0111(23)
最后,用这个key去作散列,便是哈希表的索引索引
下面以ovs中具体的事例进行说明:图片
能够看到,同一个哈希表中的mask都是相同的,也就是说每个tuple对应一个表
而后与HT 2对应的mask进行查找,查询到对应的结果ip
经过上述步骤能够看出来,TTS中的时间复杂度与Tuple的数量相关,若是Tuple的数量越多,则耗费的时间越长,当Tuple的数量==表项的数量,此时等同于挨个遍历全部的表项
在上一篇博文中,其中Megaflow Cache的实现就是采用了TTS,在以下图中,每一个megaflow cache的表项对应TTS中的rule
具体的实现结构以下图,在最新的ovs中采用的是Mircroflow cache和Megaflow Cache结合的方式,其中能够看到Megaflow Cache是经过链表的形式进行组合的,sw_flow_mask结构体至关因而mask(TTS中的tuple),sw_flow结构体至关因而rule,其中Microflow cache中存放的是上次访问的sw_flow_mask索引,具体的流程会在接下来的博客进行详细的介绍。
做者: yearsj
转载请注明出处: https://segmentfault.com/a/11...