ovs源码阅读--元组空间搜索算法
关于TTS(元组空间搜索算法)的详细介绍可以参考OVS+DPDK Datapath 包分类技术这篇文章,本文只对该篇博客进行简单的介绍,案例和部分图片来自于OVS+DPDK Datapath 包分类技术
TTS算法主要组成部分
Rule : 单条的包过滤规则+动作
以下为具体的例子:
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中有多个字段,每个字段的形式为 :字段值/掩码前缀
Tuple : 使用相同的匹配字段+每个匹配字段都使用相同的掩码长度
以下为具体的例子:
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有如下特点:
- 使用相同的匹配字段
- 每个匹配字段都使用相同的掩码长度
Key:用于hash
以Tuple #2中的Rule #2为例说明一下,首先用tuple的掩码去与rule中的各个字段值,丢弃tuple不关心的位,得到:
ip_src=_ ip_dst=23.23.233 protocol=6 port_src=_ port_dst=23
然后把这些位拼接起来,就是哈希表的key,转换为二进制如下:
key = 0001 0111(23) 0001 0111(23) 1110 1001(233) 0000 0110(6) 0000 0000 0001 0111(23)
最后,用这个key去做散列,即是哈希表的索引
匹配过程
- 所有的rule都被分成了多个tuple,并存储在相应tuple下的哈希表中
- 当要对一个包进行匹配时,将遍历这多个tuple下的哈希表,一个一个查过去,查出所有匹配成功的结果,然后按一定策略在匹配结果中选出最优的一个。
下面以ovs中具体的事例进行说明:
- 首先添加一个rule #1,该rule创建的过程中会创建对应的掩码(mask FF.FF.FF.00),也就是TTS中的Tuple,然后rule与mask进行与操作生成key,通过key进行散列得到一个索引值,最终将该rule #1加入到hash表HT 1对应的索引中

可以看到,同一个哈希表中的mask都是相同的,也就是说每一个tuple对应一个表
- 接下来收到一个包packet #1,如下图所示,该包查找的过程中,会与所有的hash表进行匹配,由于目前只有一个表HT 1,所以该包会与HT 1对应的mask进行与运算,对其结果进行散列后查到对应表中的结果

- 同步骤1,此时又来了一个rule #2,按照同样的步骤,创建一个新的表HT 2

- 收到另一个包Packet #2,同步骤2进行查找,首先与HT 1对应的mask进行匹配查找,无法找到结果

然后与HT 2对应的mask进行查找,查询到对应的结果

通过上述步骤可以看出来,TTS中的时间复杂度与Tuple的数量相关,如果Tuple的数量越多,则耗费的时间越长,当Tuple的数量==表项的数量,此时等同于挨个遍历所有的表项
OVS与TTS
在上一篇博文中,其中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://www.cnblogs.com/yearsj/p/9520728.html
segmentfault对应博文:https://segmentfault.com/a/1190000016113797
ovs源码阅读--元组空间搜索算法的更多相关文章
- ovs源码阅读--流表查询原理
背景 在ovs交换机中,报文的处理流程可以划分为一下三个步骤:协议解析,表项查找和动作执行,其中最耗时的步骤在于表项查找,往往一个流表中有数目巨大的表项,如何根据数据报文的信息快速的查找到对应的流表项 ...
- ovs源码阅读--netlink使用
netlink netlink socket是一种用于用户态进程和内核态进程之间的通信机制.它通过为内核模块提供一组特殊的API,并为用户程序提供了一组标准的socket接口的方式,实现了全双工的通讯 ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
- 【原】AFNetworking源码阅读(四)
[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...
- 【原】AFNetworking源码阅读(三)
[原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...
- 【原】AFNetworking源码阅读(一)
[原]AFNetworking源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 AFNetworking版本:3.0.4 由于我平常并没有经常使用AFNetw ...
- [PHP源码阅读]explode和implode函数
explode和implode函数主要用作字符串和数组间转换的操作,比如获取一段参数后根据某个字符分割字符串,或者将一个数组的结果使用一个字符合并成一个字符串输出.在PHP中经常会用到这两个函数,因此 ...
- 【原】SDWebImage源码阅读(五)
[原]SDWebImage源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 前面的代码并没有特意去讲SDWebImage的缓存机制,主要是想单独开一章节专门讲 ...
- 【原】SDWebImage源码阅读(四)
[原]SDWebImage源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 SDWebImage中主要实现了NSURLConnectionDataDelega ...
随机推荐
- 1001. [BJOI2006]狼抓兔子【最小割】
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- MongoDb 物理位置应用实现
1代码实现 官方驱动2.7版本 1.1范围查找 /// <summary> /// 半径范围查找位置信息 /// </summary> /// <param name=& ...
- shell基础--cat命令的使用
一.cat的常用用法 1.总结 2.实验 (1).非交互式编辑 [root@~_~ day5]# cat > cattest.sh <<STOP > hello > ST ...
- Hive学习之路 (十)Hive的高级操作
一.负责数据类型 1.array 现有数据如下: 1 huangbo guangzhou,xianggang,shenzhen a1:30,a2:20,a3:100 beijing,112233,13 ...
- msf提权基础(一)
令牌(token)相当于系统的临时密钥(账号及密码) 加载incognito模块 meterpreter> use incognito meterpreter > list_tokens ...
- php数组函数array_column:不用循环就能提取多维数组内容
作为一个有多年PHP开发经验的码农,我也是前段时间才发现PHP处理数组有这么好用的函数, 至此之前,我处理数组的数据基本都是使用循环,记录一下两个函数的用法: array_column() 函数 返回 ...
- ISE14.7使用教程(一个完整工程的建立)
FPGA公司主要是两个Xilinx和Altera(现intel PSG),我们目前用的ISE是Xilinx的开发套件,现在ISE更新到14.7已经不更新了,换成了另一款开发套件Vivado,也是Xil ...
- C++编写DLL动态链接库的步骤与实现方法
原文:http://www.jb51.net/article/90111.htm 本文实例讲述了C++编写DLL动态链接库的步骤与实现方法.分享给大家供大家参考,具体如下: 在写C++程序时,时常需要 ...
- UWP Read write File -StorageFile
// private void MainPage_Loaded(object sender, RoutedEventArgs e) { GetFileAsync(); } public async v ...
- WPF 播放Flash
原文:WPF 播放Flash WPF中没有直接提供播放Flash的控件. 可以使用WebBrowser来打开,代码如下: <Window x:Class="Nankang.Itacat ...