关于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有如下特点:

  1. 使用相同的匹配字段
  2. 每个匹配字段都使用相同的掩码长度

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中具体的事例进行说明:

  1. 首先添加一个rule #1,该rule创建的过程中会创建对应的掩码(mask FF.FF.FF.00),也就是TTS中的Tuple,然后rule与mask进行与操作生成key,通过key进行散列得到一个索引值,最终将该rule #1加入到hash表HT 1对应的索引中

可以看到,同一个哈希表中的mask都是相同的,也就是说每一个tuple对应一个表

  1. 接下来收到一个包packet #1,如下图所示,该包查找的过程中,会与所有的hash表进行匹配,由于目前只有一个表HT 1,所以该包会与HT 1对应的mask进行与运算,对其结果进行散列后查到对应表中的结果

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

  1. 收到另一个包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索引,具体的流程会在接下来的博客进行详细的介绍。

参考资料

OVS+DPDK Datapath 包分类技术

作者:yearsj

转载请注明出处:https://www.cnblogs.com/yearsj/p/9520728.html

segmentfault对应博文:https://segmentfault.com/a/1190000016113797

ovs源码阅读--元组空间搜索算法的更多相关文章

  1. ovs源码阅读--流表查询原理

    背景 在ovs交换机中,报文的处理流程可以划分为一下三个步骤:协议解析,表项查找和动作执行,其中最耗时的步骤在于表项查找,往往一个流表中有数目巨大的表项,如何根据数据报文的信息快速的查找到对应的流表项 ...

  2. ovs源码阅读--netlink使用

    netlink netlink socket是一种用于用户态进程和内核态进程之间的通信机制.它通过为内核模块提供一组特殊的API,并为用户程序提供了一组标准的socket接口的方式,实现了全双工的通讯 ...

  3. 【原】AFNetworking源码阅读(六)

    [原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...

  4. 【原】AFNetworking源码阅读(四)

    [原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...

  5. 【原】AFNetworking源码阅读(三)

    [原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...

  6. 【原】AFNetworking源码阅读(一)

    [原]AFNetworking源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 AFNetworking版本:3.0.4 由于我平常并没有经常使用AFNetw ...

  7. [PHP源码阅读]explode和implode函数

    explode和implode函数主要用作字符串和数组间转换的操作,比如获取一段参数后根据某个字符分割字符串,或者将一个数组的结果使用一个字符合并成一个字符串输出.在PHP中经常会用到这两个函数,因此 ...

  8. 【原】SDWebImage源码阅读(五)

    [原]SDWebImage源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 前面的代码并没有特意去讲SDWebImage的缓存机制,主要是想单独开一章节专门讲 ...

  9. 【原】SDWebImage源码阅读(四)

    [原]SDWebImage源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 SDWebImage中主要实现了NSURLConnectionDataDelega ...

随机推荐

  1. Apache服务器下使用 ab 命令进行压力测试

    ab是Apache超文本传输协议(HTTP)的性能测试工具. 其设计意图是描绘当前所安装的Apache的执行性能,主要是显示你安装的Apache每秒可以处理多少个请求. #ab -v可以看出其基本信息 ...

  2. BZOJ1076:[SCOI2008]奖励关(状压DP,期望)

    Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物, 每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的 ...

  3. [USACO08DEC]Patting Heads

    嘟嘟嘟 这题还是比较水的.首先O(n2)模拟显然过不了,那就换一种思路,考虑每一个数对答案的贡献,显然一个数a[i]会对后面的a[i] * 2, a[i] * 3,a[i] * 4……都贡献1,.那么 ...

  4. 第三部分 OpenStack镜像管理

    一.简介 很多源都有为OpenStack已经编译好的各种镜像了,您可以直接下载并通过使用这些镜像来熟悉OpenStack. 不过如果是为生产环境进行部署的话,您一定需要构建含有定制软件或配置的镜像文件 ...

  5. 20145203盖泽双 《Java程序设计》第五周学习总结

    20145203盖泽双 <Java程序设计>第五周学习总结 教材学习内容总结 1.Java中所有错误都会被打包为对象,运用try.catch,可以在错误发生时显示友好的错误信息,还可以在捕 ...

  6. ddt 测试用例UI运用

    import xlrd from selenium import webdriver import ddt import time import unittest class Excel(object ...

  7. ZOJ 2017 Quoit Design 经典分治!!! 最近点对问题

    Quoit Design Time Limit: 5 Seconds      Memory Limit: 32768 KB Have you ever played quoit in a playg ...

  8. spring MVC 后台token防重复提交解决方案

    看到公司有个部门提出了这个问题,补个粗略的解决方案... 1.编写拦截器 /** * Description: 防止重复提交 * * @Author liam * @Create Date: 2018 ...

  9. canvas 绘制双线技巧

    楔子 最近一个项目,需要绘制双线的效果,双线效果表示的是轨道(类似铁轨之类的),如下图所示: 负责这块功能开发的小伙,姑且称之为L吧,最开始是通过数学计算的方式来实现这种双线,也就是在原来的路径的基础 ...

  10. go 交叉编译,部署

    go web 部署 交叉编译 go 语言有个强大的地方就是 交叉编译 windows --cmd 设置环境变量-mac SET CGO_ENABLED=0 SET GOOS=darwin SET GO ...