Open vSwitch 数据包处理流程

2024-06-08 01:36

本文主要是介绍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

这篇关于Open vSwitch 数据包处理流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040879

相关文章

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

Python处理函数调用超时的四种方法

《Python处理函数调用超时的四种方法》在实际开发过程中,我们可能会遇到一些场景,需要对函数的执行时间进行限制,例如,当一个函数执行时间过长时,可能会导致程序卡顿、资源占用过高,因此,在某些情况下,... 目录前言func-timeout1. 安装 func-timeout2. 基本用法自定义进程subp

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.