Open vSwitch 数据包转发

 一、数据包转发流程

        Open vSwitch 数据包转发流程如下图所示,其中红色数字序号表示数据包转发的步骤顺序。        以下步骤为一个数据包通过 OVS 时的首次处理流程:(步骤序号和图中序号一一对应)

  1. OVS 从设备接口中获取数据包并交给 Datapath 内核模块进行流表匹配
  2. Datapath 检查数据包的头部信息以进行流表匹配,如果匹配成功,则根据转发规则进行转发。但是由于此处是首次处理,所以匹配不到相应的流表,那么就需要通过 upcall 调用让 vswitchd 守护进程生成新的流表(数据包通过 Netlink 传输至 vswitchd 守护进程)
  3. vswitchd 与控制器(一般是 SDN 控制器)通信获取流表(通过 OpenFlow 协议)
  4. vswitchd 将获取到的流表缓存到内核态的 Flow Table 中
  5. vswitchd 通过 reinject 将数据包送回 Datapath 中
  6. Flow Table 将内容同步至 Datapath 模块
  7. Datapath 根据生成的流表进行匹配,并根据相应规则进行数据包的处理,然后将处理后的数据包送至设备接口

        所以说,Open vSwitch 在进行数据包转发时,如果已经存在可以匹配的流表,就会直接转发;否则会通过 upcall 调用 vswitchd 守护进程和相关组件进行流表的生成,然后再进行转发。

        我们在之后的内容中着重考虑数据包的首次处理流程(1→2→3→4→5→6→7),因为数据包的非首次处理流程(1→7)已经包含在首次处理流程中了,一般就不再进行分类讨论。

二、ovs-vswitchd 转发流程实现

        交换机的核心功能之一就是数据包转发,所以 Open vSwitch 的数据包转发流程也是在 ovs-vswitchd 守护进程中实现的(主要是 upcall 调用这一系列的步骤)

        ovs-vswitchd 的逻辑架构如上图所示,其中可以将 upcall 调用这一系列的步骤,视为自底向上的调用后再自顶向下下发的过程,数据包流向如下图所示,其中直线为直接转发路径(1→7),曲线为首次处理(upcall 调用)路径(1→2→3→4→5→6→7)。

        可以发现,当流表可以直接匹配时,数据包不需要通过用户态,完全由内核态的 Datapath 模块实现转发,这也就是在 OVS 的总体架构 中关于 OVS 功能特点介绍时的 使用 Linux 内核模块的高性能转发 对应内容的一部分。


 三、ovs-vswitchd 虚拟交换机功能

        根据前一节的分析,ovs-vswitchd 主要通过主循环处 bridge 相关的内容(第二部分)实现交换机功能,下面分别对相关函数进行解读:(此处为了节约空间,对代码做了省略和细微调整)

(1)交换机初始化模块 bridge_init(remote)

void bridge_init(const char *remote) {
    /* Create connection to database. */
    idl = ovsdb_idl_create(remote, &ovsrec_idl_class, true, true);
    idl_seqno = ovsdb_idl_get_seqno(idl);
    ovsdb_idl_set_lock(idl, "ovs_vswitchd");
    ovsdb_idl_verify_write_only(idl);
    
    ......

    /* Register unixctl commands. */
    unixctl_command_register("qos/show-types", "interface", 1, 1,
                             qos_unixctl_show_types, NULL);
    unixctl_command_register("qos/show", "interface", 1, 1,
                             qos_unixctl_show, NULL);
    unixctl_command_register("bridge/dump-flows", "[--offload-stats] bridge",
                             1, 2, bridge_unixctl_dump_flows, NULL);
    unixctl_command_register("bridge/reconnect", "[bridge]", 0, 1,
                             bridge_unixctl_reconnect, NULL);
    lacp_init();
    bond_init();
    cfm_init();
    bfd_init();
    ovs_numa_init();
    stp_init();
    lldp_init();
    rstp_init();
    odp_execute_init();

    ifaces_changed = seq_create();
    last_ifaces_changed = seq_read(ifaces_changed);
    ifnotifier = if_notifier_create(if_change_cb, NULL);
    if_notifier_manual_set_cb(if_change_cb);
}

上述部分代码主要功能如下:

  • 创建与远程数据库的连接
  • 注册相关的 unixctl 命令
  • 初始化各种子系统,如:链路聚合控制协议 LACP,网卡绑定 bond,连续故障监测 CFM,双向转发检测 BFD,非一致内存访问 NUMA,生成树协议 STP,链路层发现协议 LLDP,快速生成树协议 RSTP,OpenFlow 数据平面 ODP 
  • 创建并初始化接口变更监控

(2)交换机运行模块 bridge_run();

void bridge_run(void) {
    ......

    cfg = ovsrec_open_vswitch_first(idl);

    ......
    
    /* Initialize the ofproto library.  This only needs to run once, but
     * it must be done after the configuration is set.  If the
     * initialization has already occurred, bridge_init_ofproto()
     * returns immediately. */
    bridge_init_ofproto(cfg);

    ......

    bridge_run__();

    ......

    run_stats_update();
    run_status_update();
    run_system_stats();
}

上述部分代码主要功能如下:

  • 打开 Open vSwitch 配置数据库(ovsdb 模块)并获取配置信息(cfg)
  • 初始化 ofproto 库(Open vSwitch 用于管理和配置 OpenFlow 交换机的核心组件)
  • 调用 bridge_run__() 函数执行 Open vSwitch 交换机的主要逻辑,如端口管理、MAC 学习、数据包转发等。
  • 更新相关信息,如:交换机统计信息、交换机状态和系统统计信息

上述相关函数都在 ovs-main/vswitchd/bridge.c 文件中。 

四、ovs-vswitchd 源码架构

        ovs-vswitchd 守护进程代码主要存放在 ovs-main/vswitchd/ 目录下,其中 ovs-vswitchd.c 文件是守护进程的主入口,bridge.c 文件实现了交换机相关的核心功能。

         在本文中,主要探讨了 ovs-vswitchd 守护进程的代码实现,而 OVS 虚拟交换机的核心功能实现并未得到充分讨论。下图为 ovs-vswitchd 的逻辑架构图,其中各个分层模块内容将在后续文章中分别介绍。

结语:

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

参考资料:

Open vSwitch 官网

Open vSwitch 源代码 GitHub

2015 FOSDEM - OVS Stateful Services

OVS - 数据包处理流程-CSDN博客

Open vSwitch 源码阅读笔记(1)OVS 的总体架构-CSDN博客

Open vSwitch v3.3.0 源代码阅读

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

 然而现在 Open vSwitch 对 DPDK 也提供了很好的支持,下图为使用 DPDK 时的 Open vSwitch 的总体架构。相对于上一个架构,使用 DPDK 的方案相当于将内核态的 Datapath 放到用户态去实现,进而提升网络性能(具体原因参见:)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GitHub狂揽6700 Star,Python进阶必备的案例、技巧与工程实践

当下是 Python 急剧发展的时代,越来越多的人开始学习和使用Pyhon,而大家也遇到了各种问题。这份手册清晰、细致地介绍了 Python 代码应该遵循的编程风格,并解释了背后的原理和机制。 入门 Python 语言相对简单,但写出优雅的代码并…

营造科技展厅主题氛围,多媒体应用有哪些新策略?

长久以来,展厅作为线下向公众传递信息的窗口,其设计风格与内容主题紧密相连,展现出千姿百态的面貌。然而,随着数字多媒体技术的日新月异,展厅不再仅仅是传统的信息展示平台,而是成为了引领内容展示潮流的风…

技术积累1:Java容错机制

如何优雅地重试 原创 赵九文 字节跳动技术团队 2021-01-05 10:01 背景 在微服务架构中,一个大系统被拆分成多个小服务,小服务之间大量 RPC 调用,经常可能因为网络抖动等原因导致 RPC 调用失败,这时候使用重试机制可以提高请求的…

git获取的项目无法运行

一、Unsupported engine 问题:在使用命令npm install下载依赖项的时候就遇到了这个问题,有帖子说多试几次,其实这是提示node版本问题,版本的更新出现兼容性问题,多试几次也没用。 解决方案: 更新node.js的…

HiWoo Cloud数据采集监控系统

在数字化、智能化的浪潮中,企业如何高效地管理其设备、优化生产流程、提升运营效率?答案或许就隐藏在HiWoo Cloud——这款数据采集监控系统中。今天,就让我们一起走进HiWoo Cloud的世界,探索它如何助力企业实现数字化转型&#xf…

7 -力扣高频 SQL 50 题(基础版)

7- 产品销售分析 I select product_name,year,price from Sales left join Product on Sales.product_id Product.product_id;

matlab模拟太阳耀斑喷发

代码 function simulate_solar_flare% 参数设置gridSize 100; % 网格大小timeSteps 200; % 时间步数dt 0.1; % 时间步长% 初始化网格[X, Y] meshgrid(linspace(-5, 5, gridSize));Z zeros(size(X));% 设置耀斑初始位置和强度flareCenter [0, 0]; % 耀斑中心位置flareRad…

网络服务ftp实验

网络服务之ftp vsftpd的安装和配置 rpm -qc vsftpd #检查vsftpd安装包是否存在,存在即不需要安装 yum install -y vsftpd #yum 安装vsftpdcd /etc/vsftpd ls #切换到安装好vsftpd目录下查看文件cp vsftpd.conf vsftpd.conf.bak.20240604 #将vsftpd的…

9 个步骤内快速完成 SEO 审核

SEO审计对于提高网站在搜索引擎结果中的性能和可见性至关重要。这种系统评估涉及仔细检查各种元素,从关键字和页面优化到网站结构和页面速度等技术方面。在本指南中,我们将概述执行全面 SEO 检查器的 12 个基本步骤,帮助您确定优势、劣势和改…

一篇文章讲透排序算法之归并排序

0.前言 本篇文章将详细解释归并排序的原理,以及递归和非递归的代码原理。 一.概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使…

消费者api编写教程

1.基本属性配置 输入new Properties().var 回车 //创建属性Properties properties new Properties();//连接集群properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"node1:9092,node2:9092");//反序列化properties.put(ConsumerConfig.KEY_DESERIALIZER_CL…

springboot配置

springboot配置 配置文件分类 springboot提供了多种属性配置方式 application.xml(只有老的spring项目使用)application.propertiesapplication.yml(或yaml) 优先级:properties>yml>yaml 配置文件 pom.xml★ 在Spring Boot项目中,pom.xml文件是Maven项目…

随便用css换个渐变的太阳

来源于GPT4o&#xff1a;代码来源 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>渐变色上半圆…

javaScript垃圾回收机制(垃圾数据是如何自动回收的)

一.javaScript数据类型存储 若想了解javaScript的垃圾数据是如何自动回收的&#xff0c;首先我们应该先简单知道一下关于javascript的数据垃圾数据是如何存储的&#xff08;JavaScript的内存机制&#xff09;。 1.JavaScript的数据类型 JavaScript是一种弱类型的、动态的语言 …

基于t-SNE的泰坦尼克号数据集降维

目录 1. 作者介绍2. 算法介绍2.1 t-SNE介绍2.2.SNE基本原理2.3.拥挤问题2.4.t-SNE基本原理2.5.t-SNE算法过程 3. 泰坦尼克号数据集降维实验3.1.数据集介绍3.2 任务介绍3.3 代码实现3.4 实验结果 参考连接 1. 作者介绍 刘方星&#xff0c;男&#xff0c;西安工程大学电子信息学…

数仓建模—指标拆解和选取

数仓建模—指标拆解和选取 第一节指标体系初识介绍了什么是指标体系 第二节指标体系分类分级和评价管理介绍了指标体系管理相关的,也就是指标体系的分级分类 这一节我们看一下指标体系的拆解和指标选取,这里我们先说指标选取,其实在整个企业的数字化建设过程中我们其实最…

一条sql的执行流程

文章地址 https://blog.csdn.net/qq_43618881/article/details/118657040 连接器 请求先走到连接器&#xff0c;与客户端建立连接、获取权限、维持和管理连接 mysql缓存池 如果要查找的数据直接在mysql缓存池里面就直接返回数据 分析器 请求已经建立了连接&#xff0c;现在…

Spark Streaming 概述及入门案例

一、介绍 1. 不同的数据处理 从数据处理的方式&#xff1a; 流式数据处理(Streaming)批量数据处理(Batch) 从数据处理的延迟&#xff1a; 实时数据处理(毫秒级别)离线数据处理(小时或天级别) 2. 简介 SparkStreaming 是一个准实时(秒或分钟级别)、微批量的数据处理框架Spa…

代码随想录算法训练营第28天(py)| 回溯 | 93.复原IP地址、78.子集、90.子集II

93.复原IP地址 力扣链接 给定一个只包含数字的字符串&#xff0c;复原它并返回所有可能的 IP 地址格式。 有效的IP地址不能含有前导0&#xff0c;共有4个字段&#xff0c;且每个字段不能超过255 思路 class Solution:def restoreIpAddresses(self, s: str) -> List[str]:r…

异或炸弹(easy)(牛客小白月赛95)

题目链接: D-异或炸弹&#xff08;easy&#xff09;_牛客小白月赛95 (nowcoder.com) 题目&#xff1a; 题目分析&#xff1a; 一看 还以为是二维差分的题呢 到后来才发现是一维差分问题 这里的距离是 曼哈顿距离 dis abs(x - xi) abs(y - yi) 暴力的做法 就是枚举 n * n 个…