Open vSwitch 数据包处理流程

一、Open vSwitch 数据包转发模式

        Open vSwitch 根据不同的模块使用,主要分为两种数据包的转发模式:Datapath 模式和 DPDK 模式,这两种模式的主要区别在于:

  •  Datapath 模式:
    •  使用内核空间的网络栈进行数据包的转发
    • 性能相对较低,但配置和管理相对简单
    • 适用于一般的虚拟化部署场景
  • DPDK 模式:
    •  使用 DPDK 库在用户空间进行数据包的转发
    • 性能更高,但配置和管理相对复杂
    • 适用于对性能要求更高的场景,如高吞吐量的网络功能虚拟化(NFV)部署

        这里需要注意的是,Datapath 模式工作在内核空间,而 DPDK 模块工作在用户空间。在实际应用中,具体使用哪种模式需要取决于具体的部署需求和环境。一般来说,如果对性能要求不太高,可以选择 Datapath 模式;而对于需要更高性能的场景,比如NFV部署,则应该选择 DPDK 模式。

二、Datapath 模式下的数据包转发流程

(1)数据包处理流程

        Open vSwitch 在 Datapath 模式下的数据包流程如下图所示:

        图中红色数字序号表示数据包转发的步骤顺序,以下步骤序号和图中红色序号一一对应:

1、数据包接收

        Open vSwitch 从设备接口中获取数据包并交给 Datapath 内核模块。在收到数据包后,Datapath 模块负责检查数据包的头部信息以进行流表匹配,如果匹配成功,则根据转发规则进行转发;如果匹配不到相应的流表,那么就需要通过 upcall 调用让 vswitchd 守护进程生成新的流表。

2、upcall 调用

        数据包在 Datapath 模块无法匹配到流表的情况下,通过 upcall 调用,并将该数据包通过 Netlink 传输到 vswitchd 守护进程。

3、流表获取

        vswitchd 守护进程与控制器(一般是 SDN 控制器)通信,控制器将相应的流表通过 OpenFlow 协议发回 vswitchd 守护进程。

4、流表下发

        vswitchd 守护进程将获取到的流表缓存到内核态的 Flow Table 中。

5、reinject 发回数据包

        vswitchd 守护进程将数据包送回 Datapath 模块中,即将数据包重新注入到 OVS 的数据包处理流程中。

6、流表同步

        Flow Table 将缓存的流表内容同步至 Datapath 模块,以备查询。

7、数据包发送

        Datapath 模块检查数据包的头部信息以进行流表匹配,将匹配成功的数据包根据相应规则进行数据包的处理,然后将处理后的数据包送至设备接口发出。

(2)数据包路径

        根据数据包能否在 Datapath 模块立刻匹配到相应流表,Open vSwitch 在进行数据包转发时会用到两种不同的流程,分别称为快速路径慢速路径,如下图所示:

(1)快速路径

        如果在 Datapath 模块中已经存在可以匹配的流表,则数据包会直接转发,对应处理流程中的(1→7)步骤。很容易发现,在这种情况下数据包完全由内核空间处理,是不需要经过用户态的,所以效率相对会比较高,所以我们称为快速路径,对应上图中的直线。快速路径一般为数据包的非首次处理流程(因为之前有过类似的包已经生成好了流表)。

(2)慢速路径

        如果在 Datapath 模块中无法匹配相应的流表,则需要 OVS 先生成流表,再将数据包根据流表进行转发,此时对应处理流程中的(1→2→3→4→5→6→7)步骤。在这过程中需要将数据包发送至用户态,并通过 vswitchd 守护进程进行一系列的操作,再将数据包发回,效率相对较低,所以我们称为慢速路径,对应上图中的曲线。慢速路径一般为数据包的首次处理流程(因为之前没有过类似的包,需要生成新的流表)。

三、DPDK 模式下的数据包转发流程

        Open vSwitch 在 DPDK 模式下的数据包流程如下图所示:

        相对于 Open vSwitch 在 Datapath 模式下的数据包流程,DPDK 使用用户态的网络栈,绕过了内核网络协议栈(Datapath 模块)的开销,从而实现了更高的数据包转发性能。然而从本质上将,数据包处理的步骤区别不大,主要的不同在于将原本在内核态进行的数据包的匹配和操作逻辑转移到了用户态。

        对于快速路径而言,DPDK 可以避免内核网络协议栈带来的性能开销,如系统调用、上下文切换等。对于慢速路径而言,DPDK 采用了零拷贝的数据传输机制,数据包可以直接在内存中传输,而不需要在用户态和内核态之间进行拷贝,大幅降低了数据传输的开销。

结语:

        通常情况下,我们所说的 Open vSwitch 数据包转发流程指的是在 Datapath 模式下的数据包流程,因为这个是最经典也是最常见的。不过 DPDK 模式提供了一种全新的思路,令 OVS 的整体性能有了较大的提升,将会是未来的发展趋势。出于学习和一般场景的使用 Datapath 模式足以花费珍贵而有限的事件,并且二者在流程和结构上大同小异,所以本系列文章主要以 Datapath 模式为主进行撰写,之后也会更新 DPDK 模式的相关内容。

        由于本人水平有限,以上内容如有不足之处欢迎大家指正(评论区/私信均可)。

参考资料:

Open vSwitch 官网

Open vSwitch 源代码 GitHub

2015 FOSDEM - OVS Stateful Services

Open vSwitch v3.3.0 源代码阅读

OVS - 数据包处理流程_ovs的工作流程-CSDN博客

Open vSwitch 2.3.90 源码阅读笔记(上) | SDNLAB

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/24179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

理解和实现 LRU 缓存置换算法

引言 在计算机科学中,缓存是一种用于提高数据访问速度的技术。然而,缓存空间是有限的,当缓存被填满时,就需要一种策略来决定哪些数据应该保留,哪些应该被淘汰。LRU(最近最少使用)算法是一种广泛…

UML实现图-部署图

概述 部署图(Deployent Diagram)描述了运行软件的系统中硬件和软件的物理结构。部署图中通常包含两种元素:节点和关联关系,部署图中每个配置必须存在于某些节点上。部署图也可以包含包或子系统。 节点是在运行时代表计算机资源的物理元素。节点名称有两种:简单名和…

android studio开发时提示 TLS 握手错误解决办法

我用的是windows,遇到了这错误, The server may not support the clients requested TLS protocol versions: (TLSv1.2, TLSv1.3). You may need to configure the client to allow other protocols to be used. For more on this, please refer to http…

苍穹外卖笔记-08-套餐管理-增加,删除,修改,查询和起售停售套餐

套餐管理 1 任务2 新增套餐2.1 需求分析和设计接口设计setmeal和setmeal_dish表设计 2.2 代码开发2.2.1 根据分类id查询菜品DishControllerDishServiceDishServiceImplDishMapperDishMapper.xml 2.2.2 新增套餐接口SetmealControllerSetmealServiceSetmealServiceImplSetmealMa…

c++替换字符或字符串函数

在C中,有多种方法可以替换字符串或字符。下面是一些常用的方法: 使用replace函数: replace函数可以替换字符串中的指定字符或子字符串。它的用法如下: string str "Hello World"; str.replace(str.find("World&qu…

Nginx03-动态资源和LNMP介绍与实验、自动索引模块、基础认证模块、状态模块

目录 写在前面Nginx03案例1 模拟视频下载网站自动索引autoindex基础认证auth_basic模块状态stub_status模块模块小结 案例2 动态网站(部署php代码)概述常见的动态网站的架构LNMP架构流程数据库Mariadb安装安全配置基本操作 PHP安装php修改配置文件 Nginx…

AI做的2024年高考数学试卷,答案对吗?

2024年高考数学考试已经结束,现在呈上数学真题及AI给出的解答。供各位看官欣赏。 总的来说,人工做题两小时,AI解答两分钟。 但是,AI做的答案是否正确,那就要各位看官来评判了! 注:试卷来源于…

【Linux】另一种基于rpm安装yum的方式

之前的163的镜像源504网关异常了,网上找到的方法基本都是基于apt,或是基于apt-get。找到了大佬帮忙装了一下,记录如下: wget https://vault.centos.org/7.9.2009/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm…

2024年5大制作AI电子手册工具推荐

AI电子手册作为一种结合了人工智能技术和传统电子手册功能的新型工具,逐渐成为了企业进行知识管理和信息传递的重要工具,为企业提高效率、优化用户体验。在本文中,LookLook同学将简单介绍一下什么是AI电子手册、对企业有什么好处,…

JAVA面试中,面试官最爱问的问题。

Optional类是什么?它在Java中的用途是什么? Java中的Optional类是一个容器类,它用于封装可能为空的对象。在Java 8之前,空值检查是Java编程中一个常见的问题,尤其是在处理返回单个值的方法时。Optional类提供了一种更…

电源变压器的作用和性能

电源变压器的主要作用是改变输入电压的大小,通常用于降低电压或升高电压,以便适应不同设备的需求。它们还可以提供隔离,使得输出电路与输入电路之间电气隔离,从而提高安全性。性能方面,电源变压器需要具有高效率、低温…

Unity3D测量距离实现方法(一)

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、Unity距离测量1-1 制作预制体1-2 编写测量的脚本 👉二、鼠标点击模型进行测量👉二、字体面向摄像机的方法👉二、最短距离测量方法👉三、壁纸分享…

Python中的装饰器链(decorator chain)是什么

在Python中,装饰器是一种高级功能,它允许你在不修改函数或类代码的情况下,为它们添加额外的功能。装饰器通常用于日志记录、性能测量、权限检查等场景。当多个装饰器应用于同一个函数或类时,它们会形成一个装饰器链(de…

Go语言中,公司gitlab私有仓库依赖拉取配置

为什么要考虑私有仓库 Go语言目前都已经采用了官方统一的 go modules 来管理依赖,后续也不太可能出现比较乱的生态, 因此了解下如何让这个依赖管理正常工作是非常必要的。 对于Github或者其他公有仓库,依赖管理是非常直接和方便的,设置好GO…

C++ 依赖的C库查看和下载

依赖库查询:ldd 指令 # ldd libcyber.solinux-vdso.so.1 (0x0000ffff86b52000)libopt_proto.so > /home/caros/cyberrt/lib/libopt_proto.so (0x0000ffff84c4a000)libboost_filesystem.so.1.73.0 > /opt/orin/usr/local/lib/libboost_filesystem.so.1.73.0 (…

Java版工程项目管理平台:以源码驱动,引领工程企业数字化转型

在当今数字化时代,随着企业的扩张和业务的增长,传统的工程项目管理方法已显不足。为了提升管理效率、减轻工作负担、增强信息处理的快速性和精确度,工程企业亟需借助数字化技术进行转型升级。本文将向您展示一款基于Spring Cloud、Spring Boo…

SS2D反向传播问题记录【未解决】

使用SS2D写了一个简单的神经网络进行训练,但是训练报错: NotImplementedError: You must implement either the backward or vjp method for your custom autograd.Function to use it with backward mode AD. 环境: CUDA11.8 torch2.0.0 mam…

AI大模型日报#0607:10家国产大模型、GPT-4o挑战高考作文 | OpenAI公开破解GPT-4新方法

导读:AI大模型日报,爬虫LLM自动生成,一文览尽每日AI大模型要点资讯!目前采用“文心一言”(ERNIE 4.0)、“零一万物”(Yi-Large)生成了今日要点以及每条资讯的摘要。欢迎阅读&#xf…

TS 系列:使用元祖生成联合类型

需求:有这么个需求,我们有两个数组,一个记录扑克牌花色,一个记录扑克牌点数,需要有一个函数,传递两个值,根据传递的值生成扑克牌,需要我们定义参数的类型检查。 思路:肯…

2024速通python之python高阶技巧

文章目录 一、闭包1.什么是闭包2.优缺点3.nonlocal关键字 二、装饰器1.什么是装饰器2.举例3.传统方式4.装饰器方式5.语法糖写法 三、多线程1.线程参数2.多线程编程 四、网络编程1.Socket服务端编程2.Socket客户端编程 「章节总览」       【2024速通python之python基础…