Open vSwitch流表查找分析

2023-11-05

流表查找过程是Open vSwitch核心中的核心。在此之前,庾志辉写过关于对Open vSwitch(下文简称OVS)源代码分析的系列博客(链接如下:http://blog.csdn.net/yuzhihui_no1/article/details/39504139),时间是2014年9月25日,sdnlab前几个月时间也对这个OVS源代码分析系列进行了转载(链接如下:http://www.sdnlab.com/3206.html)。

文中的分析对于研究OVS的人来说有很大的帮助,减少了许多阅读代码的弯路,在这里对他表示感谢。有一点不足的是,由于庾志辉当时分析的应该是OVS2.0(或者2.1)的代码,之后OVS对其自身查表的过程进行了改进,因此当前OVS版本(2.4)中描述的查表算法与庾志辉当时分析的流表查找过程已经有了一些区别。为此,本文对新改进的OpenFlow流表查找算法进行分析,供大家参考、交流。在庾志辉博客中已经提到的内容就不在此赘述,主要讲一些区别(即OVS流表查找改进的地方)以及个人的一些理解。

背景

在一个网络交换设备中,报文的处理流程可简化为以下三个步骤:协议解析,表项查找,动作执行(包含转发、对报文的修改等动作),如图1所示。由于表项的数目可能很大,匹配的形式包括最长前缀匹配、精确匹配、范围匹配,设计高效的查表算法一直是网络研究人员追求的目标。表项查找设计涉及到两个方面:表项数据结构的组织和查表算法的执行。

图1 报文处理流程

OVS是部署在服务器内部,用于实现虚拟机之间交换的OpenFlow软件交换机。软件交换机通常运行在通用处理器(CPU)之上,因此其查表时间相比于用ASIC、TCAM、NP等硬件实现更慢。与传统的路由器、交换机不同,OpenFlow的匹配域包含了L2-L4等匹配域。由于匹配域增多,为了防止表项产生组合爆炸问题,OpenFlow规范中指出,其转发过程采用多级流水线查表设计。这样一来,OVS高效查表的难度和挑战进一步加大,其查表设计就显得尤为重要,直接影响软件转发的性能。

本文将从表项查找的两个方面,表项数据结构的组织(Megaflow Cache+Microflow Cache)和查表算法(元组空间搜索),对OVS的流表查找过程进行详细分析。

OpenFlow流Cache的设计改进过程

一直以来,流Cache是提高查表性能的有效手段,已经被广泛应用于报文查表加速。它将数据平面的转发路径分为快速路径(即流Cache)和慢速路径,利用流量局部特性,使得大部分报文命中快速路径中的表项,从而提高转发性能。OVS也采用了流Cache设计思路。

OpenFlow流Cache的组织架构改进经历了三个阶段。

在早期OVS的版本中,为缓解多级流表查表慢的问题,OVS在内核态采用Microflow Cache方法。Microflow Cache是基于Hash的精确匹配查表(O(1)),表项缓存了多级查表的结果,维护的是每条链接粒度的状态。Microflow Cache减少了报文进用户态查多级表的次数。一条流的首报文进入用户态查表后,后续的报文都会命中内核中的Microflow Cache,加快了查表速度。但是对于大量短流的网络环境来说,Microflow Cache命中率很低,导致大部分报文仍然需要到用户态进行多级流表查找,因此转发性能提升有限。

而后,为了解决Mircoflow Cache存在的问题,OVS采用Mircoflow Cache代替了Megaflow Cache。与Mircoflow Cache的精确Hash查表不同,Megaflow Cache支持带通配的查表,所以可减少报文至用户空间查表的次数。庾志辉的博客中当时分析的就是关于megaflow的数据结构和查表流程,相关内容不在此赘述,请看上文中的链接。但是,由于OVS采用元组空间搜索(下文介绍)实现Megaflow Cache的查找,所以平均查表次数为元组表的数量的一半。假设元组空间搜索的元组表链为m,那么平均查表开销为O(m/2)。Mircoflow Cache和Megaflow Cache查表开销对比为O(1)< O(m/2)。因此,Megaflow Cache相比于Mircoflow Cache,尽管减少了报文进用户空间查表的次数,但是增加了报文在内核态查表的次数。

为此,OVS当前版本采用Megaflow Cache+Microflow Cache的流Cache组织形式,仍保留了Microflow Cache作为一级Cache,即报文进入后首先查这一级Cache。只不过这个Microflow Cache含义与原来的Microflow Cache不同。原来的Microflow Cache是一个实际存在的精确Hash表,但是最新版本中的Microflow Cache不是一个表,而是一个索引值,指向的是最近一次查Megaflow Cache表项。那么报文的首次查表就不需要进行线性地链式搜索,可直接对应到其中一张Megaflow的元组表。这三个阶段的查表开销如表1所示。

表1 查表开销对比

流Cache的组织

查表开销

备注

Mircoflow Cache

O(1)

 

Megaflow Cache

O(m/2)

m为元组表的数量

Mircoflow Cache& Megaflow Cache

P*O(1)+(1-P)*O(m/2)

P为命中一级表的概率

Microflow Cache和Megaflow Cache的组织和关系由于和查表算法紧密关系,所以在下文分析完元组空间搜索后给出。

附带提两点。1,在OVS的NEWS文件夹中记录了每个版本更新的相关细节,包括流Cache的设计,所以读者可在里面搜索到OVS功能演进过程的所有信息。2,具体Megaflow的计算过程尽管不是本文讨论的范围,但的确非常精妙,有兴趣的读者可关注一下。

元组空间搜索算法

由于OpenFlow的匹配域扩展到了十二个字段甚至更多的字段,其协议解析后提取的查表关键字(即sw_flow_key)数据结构表示如图2所示。

图2 sw_flow_key数据结构

所以设计查找算法在性能、存储方面更具挑战。在防火墙、QoS等方面已经对多字段查表进行了大量的研究,若将匹配域中的每一个字段又被称为一个维度,多字段的软件查表算法大体上可以分为两类:单维组合分类算法和多维联合分类算法。单维组合查找算法的主要思想是:单独地对数据包每个字段进行匹配,并对每个字段的匹配结果进行合并从而找到最终匹配的规则,其代表包括递归流分类(RFC)、位向量(BV)等。多维联合分类查找算法的大致思想是不单独地考虑每个字段内部特点,而是简单地把包头的所有字段看作一个维度,进行联合查找,其代表包括决策树(Decision tree)、元组空间搜索(TSS)等。

由于OVS选择采用元组空间查找(Tuple Space Search,TSS),因此这里只重点介绍TSS算法,感兴趣的同学可百度其他算法。TSS算法的主要思想是,将所有规则按照各字段前缀长度的组合划分成比规则数目小得多的元组集合,然后在这些元组里进行哈希查找。举个例子,有如下规则集,如表2所示包含三个匹配域和10条对应的规则。表中R1-R10为规则,F1、F2、F3为三个匹配字段,每个字段均为4bit。

表2 规则集

规则

F1

F2

F3

R1

0***

01**

100*

R2

01**

1***

010*

R3

1***

01**

110*

R4

00**

0***

100*

R5

*

0101

*

R6

1***

10**

101*

R7

00**

1***

000*

R8

*

1101

*

R9

*

1001

*

R10

10**

1***

010*

用[x,y,z]中的x、y、z分别表示F1、 F2、F3的前缀长度。则10条规则表示如下。

表3 规则前缀集

规则

前缀组合[x,y,z]

R1

[1,2,3]

R2

[2,1,3]

R3

[1,2,3]

R4

[2,1,3]

R5

[0,4,0]

R6

[1,2,3]

R7

[2,1,3]

R8

[0,4,0]

R9

[0,4,0]

R10

[2,1,3]

由上表可知,规则可分为三类,R1、R3、R6∈[1,2,3],R5、R8、R9∈[0,4,0],R2、R4、R7、R10∈[2,1,3]。在不考虑规则优先级的情况下,TSS的查找表构造如图3所示。

图3 元组空间搜索表

所以最多只需要三次Hash查找,即可找到对应表项。可以看到TSS的一个最大优点是,当所有规则的各字段长度的组合相对较少时,TSS算法是很高效的。如例子中的,10条规则只需要3次hash查找即可。TSS的缺点是当所有规则的各字段的组合很多时,最坏情况下的搜索次数就变为n(n为规则的数量)。在上个例子中,假设所有规则的字段组合都不一致,那么TSS查表次数就为10,退化为最原始的顺序查表。因此,TSS的算法是否高效与转发规则的特征有直接的关系。

那么为什么OVS选择TSS,而不选择其他查找算法?论文[2]给出了以下三点解释:

(1)在虚拟化数据中心环境下,流的添加删除比较频繁,TSS支持高效的、常数时间的表项更新;
(2)TSS支持任意匹配域的组合;
(3)TSS存储空间随着流的数量线性增长。

综上原因,OVS选择了TSS查表算法,并对其进行了一些优化(优化的一些手段,例如优先级排序、分段hash查找等等,详见论文和源码)。结合上面所提到的Microflow Cache和Megaflow Cache,给出目前OVS中内核态查表的流程,如图4所示。

图4 OVS内核查表流程

图中红色标记的Mask_cache_array即为Microflow Cache,是个地址,存放的是上一次匹配命中的Megaflow中某个元组表的索引值。其结构如下。

Shell
1
2
3
4
struct mask_cache_entry {
u32 skb_hash ; / / SKB中五元组 hash后的值
u32 mask_index ; / /掩码数组 Mask _array的索引值
} ;

Mask_array是个指针数组,数组中每个元素存放的是掩码,每个掩码就代表一个元组表,。每条流的首报文都会遍历这个数组,相当于遍历所有的元组表。每个元组表采用hash的方式,用链式解决Hash冲突。

Shell
1
2
3
4
5
struct mask_array {
struct rcu_head rcu ; / / RCU控制
int count , max ; / /掩码数组的计数和最大值
struct sw_flow_mask __rcu * masks [ ] ; / /掩码存放的数组
} ;

以上就是目前OVS查表的分析,不足之处欢迎大家批评指正。

我们目前的工作

为进一步提高OVS转发效率,我们目前正致力于FAST(Fpga Accelerated Sdn swiTc)开源项目。FAST采用可编程硬件(FPGA)对OVS的处理流程进行卸载加速,并利用FPGA可重构的特性扩展SDN交换机的功能,提高OpenFlow的转发效能,推进SDN在实际环境中的部署。

总结和心得

一、实践是检验真理的唯一标准
OVS的论文中出现过这样的表述“我们根据实际部署后发现xxx这个更好”,说明对于算法或者优化机制的选择,有些时候是没有理论依据的,而是根据在实际测试的结果作出的。这点从上面采用元组空间搜索算法的理由也可以看出。换句话说,如果不是在虚拟化数据中心的应用场景中,OVS是否还采用这样的算法和优化查表机制,就该值得商榷了。
二、温故而知新
看大牛的论文时常觉得写得晦涩难懂,一点也不易读。但通常情况下是自己的姿势水平不够,相关的背景知识了解太少,基础不够,所以还要继续学习。

参考文章
文中的分析主要参考来源于两篇论文以及OVS2.4源码,如下:
[1] N. Shelly, E. Jackson, T. Koponen, N. McKeown, and J. Rajahalme. Flow Caching for High Entropy Packet Fields. In Proc. of HotSDN, 2014.

[2] Pfaff B, Pettit J, Koponen T, et al. The design and implementation of Open vSwitch[C]//12th USENIX Symposium on Networked Systems Design and Implementation. 2015.(NSDI 2015 Best Paper Award)

[3] Open vSwitch version 2.4. http://openvswitch.org/releases/openvswitch-2.4.0.tar.gz

作者简介:
毛健彪:国防科技大学计算机学院网络与信息安全研究所在读博士生,从事软件定义网络、数据中心网络等方面等研究。作者所在的课题组目前正在进行基于FPGA的SDN硬件交换机开源项目FAST的开发与推广,特别感谢国防科技大学计算机学院网络所徐东来工程师在OVS代码分析过程中的帮助和指导。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Open vSwitch流表查找分析 的相关文章

  • Python爬虫教学——简单爬取网页数据

    前言 本文是一篇介绍如何用Python实现简单爬取网页数据并导入MySQL中的数据库的文章 主要用到BeautifulSoup requests 和 pymysql 其中以网页 https jbk 39 net mxyy jbzs 为例 假
  • ATK&CK红队评估实战靶场(一)

    ATK CK红队评估实战靶场 一 的搭建和模拟攻击过程全过程 回到顶部 0x01 前言 本靶机环境是红日团队开源的一个红队实战测试环境 靶机下载地址如下 http vulnstack qiyuanxuetang net vuln detai
  • JS 中英文混合数字识别,我的第一个npm项目

    JS 中英文混合数字识别 转换混合的中英文 支持阿拉伯数字 中文数字 会计数字转换为数字 这个项目是emp script static的一部分 分出来作为独立项目使用 项目地址 https github com gdx1231 chines
  • 单元测试(JUint)

    单元测试概述 单元测试就是方法测试 Junit单元测试框架 JUnit是使用Java语言实现的单元测试框架 它是开源的 Java开发者都应当学习并使用JUnit编写单元测试 此外 几乎所有的IDE工具都集成了JUnit 这样我们就可以直接在
  • TensorFlow详解2原理

    一 从helloworld开始 二 Tensorflow编程模式 一般有两种编程模式 第一种是命令式编程 Torch 第二种是符号式编程 Tensorflow tensorflow比torch有相对的一定的优化 命令式编程实际上是一种最常见
  • Jason的暑期学习目标(已完善-改为其他方式)

    Jason的暑期学习目标 已完善 改为其他方式 玩转chatGPT了解清楚 python基础语法 python web开发学习 知乎未看 导师文章 英语六级备考 1 玩转chatGPT了解清楚 prompts engineering 方法论
  • ctfshow 网络迷踪(1-8) writeup

    ctfshow 网络迷踪 搜图引擎总结 新手上路 初学乍练 初学又练 初学再练 现拉现吃 初窥门径 狗哥去哪 国足加油 搜图引擎总结 https yandex com images https image baidu com https w
  • 排序算法之希尔排序

    希尔排序的基本思想是 设待排序元素序列有n个元素 首先取一个整数gap
  • 10年阿里测试大牛感悟——写给还在迷茫的朋友

    这两天和朋友谈到软件测试的发展 其实软件测试已经在不知不觉中发生了非常大的改变 前几年的软件测试行业还是一个风口 随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业 目前软件测试行业 缺口 已经基本饱和 当然 我说的是最基础的功能测试
  • C语言,用函数封装实现字符串匹配,例如:char str[]=”ababcabcdabcde” char str1[]=”abca” 输出子串在主串的下标

    实现字符串匹配 例如 char str ababcabcdabcde char str1 abca 输出子串在主串的下标 include
  • c语言中%s的作用,C语言中%c与%s的区别与划分详解

    c格式对应的是单个字符 s格式对应的是字符串 例 char a char b 20 scanf c a 只能输入一个字符 scanf s b 可以输入一串不超过20字符的字符串 c对应类型为char s对应类型为char 即字符串 用作输入
  • 控制流图(Control Flow Graph)-(CFG)

    1 定义 百度百科 控制流图 Control Flow Graph CFG 也叫控制流程图 是一个过程或程序的抽象表现 是用在编译器中的一个抽象数据结构 由编译器在内部维护 代表了一个程序执行过程中会遍历到的所有路径 它用图的形式表示一个过
  • rave report设置不同报表的打印机

    前几天用Fast report 进行了条形码打印 所有条形码的界面都设置好了 但是打印后的条形码不能被扫描枪识别到 由于使用的标签比较小 我也是根据标签的规格进行调整条形码的大小 进行了缩小一半 打印出来的条 空也都挺清晰的 但是就是不能识
  • 停更说明

    后期这个博客可能不太会更新文章了 因为后期会在个人公众号上输出有关渗透测试的相关文章 欢迎大家公众号搜索 想走安全的小白 进行关注 我们一起学习 一起进步 谢谢大家支持
  • 计算机视觉入门 - MacOS搭建Python的OpenCV环境并在VScode上使用的详细步骤(完整版)

    目录 过程 下载VScode编辑器 在VScode中安装Python插件 安装Python解释器 测试Python程序 安装wget插件 安装cmake插件 安装opencv 通过程序来测试opencv 运行成功 过程 下载VScode编辑
  • Detecting Twenty-thousand Classes using Image-level Supervision

    Detecting Twenty thousand Classes using Image level Supervision 摘要 背景方法 Preliminaries Detic 具有图像类别的检测器 loss 技术细节扩展 Grad
  • 台式机新装windows系统

    学校正版软件网页下载正版windows操作系统 windows官网下载U盘系统工具 根据电脑厂商按对应的Fn键启动bios设置 设置启动项为U盘启动 根据提示进行设置 新装操作系统后无法联网 没有以太网 参考https www xiaozh
  • provide和inject的用法

    1 provide与inject的功能 通过provide与inject 可以把一个祖先组件指定的数据和方法 传递给其所有子孙组件中 provide 和 inject 主要在开发高阶插件 组件库时使用 由于vue有 parent属性可以让子

随机推荐

  • Unity中用触摸控制物体旋转和放大

    using UnityEngine using System Collections using System IO public class ScaleAndRotate MonoBehaviour private Touch oldTo
  • Python编程从入门到实践(九)-文件和异常

    1 从文件中读取数据1 1 读取整个文件 要读取文件 需要一个包含几行文本的文件 下面首先来创建一个文件 它包含精确到小数点后30位的圆周率值 且在小数点后每10位处都换行 pi digits txt 3 1415926535 897932
  • Flink异步IO第一讲

    Async I O 是阿里巴巴贡献给社区的一个呼声非常高的特性 于1 2版本引入 主要目的是为了解决与外部系统交互时网络延迟成为了系统瓶颈的问题 对于实时处理 当需要使用外部存储数据染色的时候 需要小心对待 不能让与外部系统之间的交互延迟对
  • 起底高危RCE漏洞“Follina”:Windows系统无一幸免

    通告信息 上周末 独立网络安全研究团队 nao sec通过社交媒体表示 发现一份从白俄罗斯提交至分析服务网站VirusTotal的恶意微软Word文档 利用远程模板功能并通过 ms msdt MSProtocol URI模式执行恶意Powe
  • C/C++——new和delete的实现原理(详解)

    C C 内存管理 1 C C 内存分布 2 C语言中动态内存管理方式 2 1malloc calloc realloc free区别 3 C 中动态内存管理 new和delete 3 1new delete操作内置类型 3 2new del
  • AD22使用笔记+积累库

    一 前言 使用AD9习惯了 但是需求逐渐上来了就不够用了 好多快捷的新功能要新版本软件才能用 所以升级使用AD22 目录 1 添加层之后中间层无法布线 2 新增快捷方式Ctrl W布线 不用点图标了 二 环境 AD22 三 正文 1 添加层
  • [系统安全] 二十六.WannaCry勒索病毒分析 (2)MS17-010漏洞利用及蠕虫解析

    您可能之前看到过我写的类似文章 为什么还要重复撰写呢 只是想更好地帮助初学者了解病毒逆向分析和系统安全 更加成体系且不破坏之前的系列 因此 我重新开设了这个专栏 准备系统整理和深入学习系统安全 逆向分析和恶意代码检测 系统安全 系列文章会更
  • SSH和SSM的区别

    1 定义 SSH Spring Struts2 Hibernate spring 为事务层 Struts2为控制器 hibernate 负责持久层 SSM springMVC为控制器 spring 为事务层 MyBatis 负责持久 都是当
  • gerber 文件格式 [一]

    在电路设计这块 目前还绕不开 gerber 文件的工程交互 所以来了解一下 目前官网的文档gerber layer format specification revision 2022 02 en pdf gerber 文件是一个ascii
  • 时序预测

    时序预测 MATLAB实现具有外生回归变量的ARIMAX时间序列预测 含AR MA ARIMA SARIMA VAR对比 目录 时序预测 MATLAB实现具有外生回归变量的ARIMAX时间序列预测 含AR MA ARIMA SARIMA V
  • 机器学习(二)深度学习实战-使用Kera预测人物年龄

    问题描述 我们的任务是从一个人的面部特征来预测他的年龄 用 Young Middle Old 表示 我们训练的数据集大约有19906多张照片及其每张图片对应的年龄 全是阿三的头像 测试集有6636张图片 首先我们加载数据集 然后我们通过深度
  • 本地部署体验LISA模型(LISA≈图像分割基础模型SAM+多模态大语言模型LLaVA)

    GitHub地址 https github com dvlab research LISA 该项目论文paper reading https blog csdn net Transfattyacids article details 132
  • jquery.webcam进行摄像头拍照

    最近由于项目要进行人像采集 所以就涉及到在web页面调用摄像头 进行拍照来获取图片 可以初来乍到 这技术又不是杠杠滴 所以在面对这有实现想法 但是又没有实现手段的时候 还是按照往常惯例找度娘 这个搜索过程可谓是无比艰辛 由于关键字不准确迟迟
  • WDK李宏毅学习笔记第十八周01_Meta learning-MAML and Gradient descent as LSTM

    Meta learning MAML and Gradient descent as LSTM 文章目录 Meta learning MAML and Gradient descent as LSTM 摘要 1 Meta learning
  • LO Frequency Plan

    概述 LO DIV是位于VCO和mixer之间的模块 其作用是分频和驱动长走线 设计难点在于底噪 不同的band有不同的频率覆盖范围 为了减小VCO的设计难度需要选择合适的分频方案 E UTRA规定的band与频率的对应关系在3GPP或wi
  • GNU/Linux下有多少是GNU的?

    原文地址 http coolshell cn articles 4826 html more 4826 一个葡萄牙的学生写了一篇文章 How much GNU is there in GNU Linux GNU Linux下有多少是GNU的
  • java模拟HTTP请求工具

    import org slf4j Logger import org slf4j LoggerFactory import java io BufferedReader import java io DataOutputStream imp
  • sqli-labs/Less-10

    这一关提示我们使用布尔和时间盲注相结合的做法 我们先去判断一下注入类型 输入1 and 1 2 存在回显 为字符型 输入1 存在回显 而且回显还一模一样 输入1 存在回显 而且回显当然是一摸一样的啦 我怀疑一直都是如此输出 所以根本不能使用
  • j2ee规范认识

    完成了J2EE视频的学习 三个系列的视频感觉走的是那么的艰难 在懵懵懂懂中进行着 在视频进行的时候已经对J2EE以及EJB的大体框架进行笔记记录和框架整理 接下来对在学习过程中的一些关键点进行总结 J2EE是什么 要想知道J2EE是什么就要
  • Open vSwitch流表查找分析

    流表查找过程是Open vSwitch核心中的核心 在此之前 庾志辉写过关于对Open vSwitch 下文简称OVS 源代码分析的系列博客 链接如下 http blog csdn net yuzhihui no1 article deta