DPDK基础入门(五):报文转发

news/2024/9/17 0:46:56/ 标签: linux, tcp/ip, 网络, dpdk

网络处理模块划分

  • Packet Input: 接收数据包,将其引入处理流程。
  • Pre-processing: 对数据包进行初步处理,例如基本的检查和标记。
  • Input Classification: 细化数据包的分类,例如基于协议或流进行分流。
  • Ingress Queuing: 将数据包放入队列中进行排队,通常采用FIFO(先进先出)策略。
  • Delivery/Scheduling: 根据队列的优先级和CPU的状态决定数据包的处理顺序。
  • Accelerator: 使用硬件加速功能来进行加解密或数据压缩等操作。
  • Egress Queuing: 在出口处对数据包进行基于QoS(服务质量)的调度。
  • Post Processing: 进行数据包的后处理,释放相关缓存。
  • Packet Output: 将处理完的数据包发送到网络中。

在这里插入图片描述
在深色软件部分可以通过提高算法的效率和结合CPU相关的并行指令来提升网络性能。

转发框架

传统的Network Processor(专用网络处理器)转发的模型可以分为run to completion(运行至终结,简称RTC)模型和pipeline(流水线)模型。

run to completion模型

它的核心思想是,当一个处理核心接收到一个数据包时,它会完整地处理这个数据包,从接收到输出,直到处理结束,不会将其交给其他核心或线程处理。这个模型有几个主要特点:

  • 完整处理:每个核心负责从输入到输出的整个数据包处理过程,减少了上下文切换和跨核心通信的开销。
  • 高性能:通过避免频繁的线程切换和数据包转发,降低了延迟,提高了处理效率。
  • 简单性:简化了数据包处理的模型,使得开发者可以更专注于优化单一核心的处理逻辑。

这种模型特别适合于高吞吐量的应用场景,例如网络交换和路由器,因为它最大限度地减少了延迟并提高了整体吞吐量。但是由于每个核上的处理能力其实都是一样的,并没有针对某个逻辑功能进行优化,因此在这个层面上与pipeline模型比较是不高效的。

在这里插入图片描述

pipeline模型

Pipeline模型在网络数据处理中的应用借鉴了工业上的流水线设计理念,其基本思想是将数据处理流程分解为多个独立的阶段,每个阶段专注于处理数据的一个特定部分。每个阶段通过队列将数据传递给下一个阶段,这种结构使得不同阶段的处理可以并行进行,从而提高整体处理效率。

在这个模型中,每个阶段可以被优化以处理特定类型的任务。例如,可以将CPU密集型的计算操作分配到专门的微处理引擎上,这些引擎能够提供高计算性能和效率。同时,将I/O密集型的操作分配到另一个微处理引擎上,这样可以优化I/O操作的处理能力。通过这种分离,模型可以充分利用不同处理引擎的特长,避免了单一引擎的瓶颈问题。

此外,Pipeline模型允许使用过滤器来动态地为不同的操作分配线程,这样可以根据处理负载和任务的需求调整资源分配。队列则起到缓冲和协调的作用,通过控制数据流速率,使得各个阶段的处理速率得到匹配,从而避免了过度的等待和资源闲置,优化了并发处理效率。

在这里插入图片描述

DPDK run to completion模型

在DPDK的轮询模式中主要通过一些DPDK中eal中的参数-c、-l、-l core s来设置哪些核可以被DPDK使用,最后再把处理对应收发队列的线程绑定到对应的核上。每个报文的整个生命周期都只可能在其中一个线程中出现。

run to completion 模型 虽然有许多优势,但是针对单个报文的处理始终集中在一个逻辑单元上,无法利用其他运算单元,并且逻辑的耦合性太强,而流水线模型正好解决了以上的问题。

DPDK pipeline模型

pipeline的主要思想就是不同的工作交给不同的模块,而每一个模块都是一个处理引擎,每个处理引擎都只单独处理特定的事务,每个处理引擎都有输入和输出,通过这些输入和输出将不同的处理引擎连接起来,完成复杂的网络功能,DPDK pipeline的多处理引擎实例和每个处理引擎中的组成框图:zoom out(多核应用框架)和zoom in(单个流水线模块)。

在这里插入图片描述

在这里插入图片描述

Zoom out的实例中包含了五个DPDK pipeline处理模块,每个pipeline作为一个特定功能的包处理模块。一个报文从进入到发送,会有两个不同的路径,上面的路径有三个模块(解析、分类、发送),下面的路径有四个模块(解析、查表、修改、发送)。

Zoom in的图示中代表在查表的pipeline中有两张查找表,报文根据不同的条件可以通过一级表或两级表的查询从不同的端口发送出去。

DPDK的pipeline是由三大部分组成的:

在这里插入图片描述
DPDK支持的不同类型的pipeline处理包括:

  • Packet I/O:处理网络数据包的输入和输出。
  • Flow Classification:根据数据包的特征将其分类到不同的流中。
  • Firewall:实现网络防火墙功能,控制数据包的访问权限。
  • Routing:决定数据包的转发路径。
  • Metering: 监测和测量网络流量。

doc\guides\sample_app_ug\ip_pipeline.rst中有 IP Pipeline 应用程序的一个例子

转发算法

除了良好的转发框架外,转发中很重要的一部分内容就是对报文字段的匹配和识别。DPDK 中主要用到了精确匹配(Exact Match)算法和最长前缀匹配(Longest Prefix Matching, LPM)算法来进行报文的匹配从而获得相应的信息。

精确匹配算法

精确匹配主要需要解决两个问题:进行数据的签名(哈希),解决哈希的冲突问题,DPDK中主要支持CRC32和J hash。

CRC 校验原理实际上就是在一个 p 位二进制数据序列之后附加一个 r 位二进制检验码,从而构成一个总长为 n=p+r 位的二进制序列。附加的检验码与数据序列的内容之间存在某种特定关系,通过检查这一关系,就可以实现对数据正确性的校验。

CRC中的多项式模 2 运行,实际上就是按位异或,不考虑进位、借位。当进行 CRC 校验时,发送方和接收方需要事先约定一个除数,即生成多项式,一般记作 G(x)。生成多项式的最高位与最低位必须是 1。

在 CRC32 算法上,DPDK 将数据流按照 8 字节 或 4 字节为单位,直接使用 IA 的硬件指令来一次处理,或使用查表的方法进行一次处理,利用空间换时间。

解决冲突

分离链表:所有发生冲突的项通过链式相连,在查找元素时需要遍历某个哈希桶下对应的整条链。不需要额外占用哈希桶,但是速度较慢。

开放地址:所有发生冲突的项自动往当前所对应可使用的哈希桶的下一个哈希桶进行填充。不需要链表操作,但有时会加剧冲突的发生。

DPDK 哈希桶的结构定义如下所示,每个桶可以盛 8 项,算是上述两种方法的一个折中。

#define RTE_HASH_BUCKET_ENTRIES		8
/** Bucket structure */
struct __rte_cache_aligned rte_hash_bucket {uint16_t sig_current[RTE_HASH_BUCKET_ENTRIES];RTE_ATOMIC(uint32_t) key_idx[RTE_HASH_BUCKET_ENTRIES];uint8_t flag[RTE_HASH_BUCKET_ENTRIES];void *next;
};

最长前缀匹配算法

DPDK 中 LPM 的具体实现综合考虑了空间和时间,由一张 224 条目的表和多张(配置指定) 28 条目的表组成。前者称为表 tlb24, 后者称为表 tlb8。

表条目和转发如下:

struct rte_lpm_tbl_entry {/*** Stores Next hop (tbl8 or tbl24 when valid_group is not set) or* a group index pointing to a tbl8 structure (tbl24 only, when* valid_group is set)*/uint32_t next_hop    :24;/* Using single uint8_t to store 3 values. */uint32_t valid       :1;   /**< Validation flag. *//*** For tbl24:*  - valid_group == 0: entry stores a next hop*  - valid_group == 1: entry stores a group_index pointing to a tbl8* For tbl8:*  - valid_group indicates whether the current tbl8 is in use or not*/uint32_t valid_group :1;uint32_t depth       :6; /**< Rule depth. */
};
/*** Lookup an IP into the LPM table.** @param lpm*   LPM object handle* @param ip*   IP to be looked up in the LPM table* @param next_hop*   Next hop of the most specific rule found for IP (valid on lookup hit only)* @return*   -EINVAL for incorrect arguments, -ENOENT on lookup miss, 0 on lookup hit*/
static inline int
rte_lpm_lookup(const struct rte_lpm *lpm, uint32_t ip, uint32_t *next_hop)
{unsigned tbl24_index = (ip >> 8);uint32_t tbl_entry;const uint32_t *ptbl;/* DEBUG: Check user input arguments. */RTE_LPM_RETURN_IF_TRUE(((lpm == NULL) || (next_hop == NULL)), -EINVAL);/* Copy tbl24 entry */ptbl = (const uint32_t *)(&lpm->tbl24[tbl24_index]);tbl_entry = *ptbl;/* Memory ordering is not required in lookup. Because dataflow* dependency exists, compiler or HW won't be able to re-order* the operations.*//* Copy tbl8 entry (only if needed) */if (unlikely((tbl_entry & RTE_LPM_VALID_EXT_ENTRY_BITMASK) ==RTE_LPM_VALID_EXT_ENTRY_BITMASK)) {unsigned tbl8_index = (uint8_t)ip +(((uint32_t)tbl_entry & 0x00FFFFFF) *RTE_LPM_TBL8_GROUP_NUM_ENTRIES);ptbl = (const uint32_t *)&lpm->tbl8[tbl8_index];tbl_entry = *ptbl;}*next_hop = ((uint32_t)tbl_entry & 0x00FFFFFF);return (tbl_entry & RTE_LPM_LOOKUP_SUCCESS) ? 0 : -ENOENT;
}
  • 检查输入参数:如果 lpm 或 next_hop 为 NULL,则返回 -EINVAL。
  • 查找 tbl24 表中的条目:根据 IP 地址的高 24 位索引,读取 tbl24 表中的条目。
  • 判断是否需要进一步查找 tbl8 表:如果 tbl24 条目指示存在扩展条目(由 RTE_LPM_VALID_EXT_ENTRY_BITMASK 标志表示),则根据 IP 地址和 tbl24 条目中的索引计算 tbl8 表中的条目位置,并读取对应条目。
  • 提取并返回结果:从条目中提取下一个跳转地址,并检查查找是否成功(通过 RTE_LPM_LOOKUP_SUCCESS 标志)。

http://www.ppmy.cn/news/1522630.html

相关文章

Dubbo 安全方面措施

在分布式系统中&#xff0c;安全性是一个至关重要的因素&#xff0c;特别是对于像 Dubbo 这样的高性能 RPC 框架&#xff0c;确保服务的安全性和数据传输的完整性至关重要。Dubbo 作为一个成熟的分布式服务框架&#xff0c;在安全性方面提供了多种措施和配置选项&#xff0c;帮…

uniapp 给画作生成画框

<template><ax-page class"privateCustom"><gui-page :customHeader"true" ref"guipage"><template #gHeader><aHeader title"个性定制" :showTitle"true" back"2"></aHeader&g…

深度学习与大模型第4课:使用多种模型在Pima印度糖尿病数据集上的分类效果评估

文章目录 技术博客&#xff1a;使用多种模型在Pima印度糖尿病数据集上的分类效果评估数据集介绍数据预处理模型一&#xff1a;逻辑斯谛回归&#xff08;Logistic Regression&#xff09;模型二&#xff1a;支持向量机&#xff08;SVM&#xff09;模型三&#xff1a;决策树&…

1、正则表达式

1、正则表达式是一种用于描述文本模式的工具。它是由字符和特殊符号组成的字符串&#xff0c;描述了模式的重复或者多个字符&#xff0c;于是就可以按照某种模式匹配一系列有相似特征的字符串。它主要的作用是将文本用某种可被计算机识别的模式表现出来&#xff0c;为高级的文本…

Helm Deploy Online Rancher v2.9.1

文章目录 准备安装查看下载 准备 $ kubectl get node NAME STATUS ROLES AGE VERSION kube-master01 Ready control-plane 19d v1.29.5 kube-node01 Ready <none> 19d v1.29.5 kube-node02 Ready <none&…

Tekton简介,安装和构建最简单ci/cd

简介 Tekton是一种基于k8的支持CI/CD的operator。 说到持续集成&#xff0c;我们比较熟悉的有jenkins&#xff0c;gitlab ci等&#xff0c;但只有Tekton是云原生的。 既然Tekton是一种operator&#xff0c;那就必须了解它的CRD&#xff0c;然后我们定义CR&#xff0c;让Tekt…

WebAPI (一)DOM树、DOM对象,操作元素样式(style className,classList)。表单元素属性。自定义属性。间歇函数定时器

文章目录 Web API基本认知一、 变量声明二、 DOM1. DOM 树2. DOM对象3. 获取DOM对象(1)、选择匹配的第一个元素(2)、选择匹配多个元素 三、 操作元素1. 操作元素内容2. 操作元素属性(1)、常用属性&#xff08;href之类的&#xff09;(2)、通过style属性操作CSS(3)、通过类名(cl…

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、…

golang hertz框架入门

两种模式新建项目 1、手动新建项目 2、使用hz工具新建项目 一、手动创建项目&#xff0c;并拉取框架 1、新建项目目录 hertz_demo_w 2、在项目跟目录新建main.go 文件 package mainimport ("context""github.com/cloudwego/hertz/pkg/app""github.…

API安全 | 发现API的5个小tips

在安全测试目标时&#xff0c;最有趣的测试部分是它的 API。API 是动态的&#xff0c;它们比应用程序的其他部分更新得更频繁&#xff0c;并且负责许多后端繁重的工作。在现代应用程序中&#xff0c;我们通常会看到 REST API&#xff0c;但也会看到其他形式&#xff0c;例如 Gr…

C# 使用国密SM4加密解密

首先需第三方Nuget包&#xff1a;Portable.BouncyCastle &#xff08;源码来自http://www.bouncycastle.org/csharp/&#xff09;&#xff0c;支持.NET 4,.NET Standard 2.0 目录 使用BouncyCastle指定填充方案 零填充&#xff08;Zero Padding&#xff09; PKCS7填充&…

MariaDB基本知识汇总

/* MariaDB 1、视图 2、临时表 3、自定义函数 4、存储过程 5、触发器 6、游标 7、变量声明与赋值 8、常用函数&#xff08;日期格式&#xff0c;Guid&#xff0c;判断&#xff0c;循环&#xff0c;XML格式操作&#xff09; 9、动态执行SQL 语句 10、开启执行计划 11、创建登录M…

AI智能分析/智慧安防EasyCVR视频汇聚平台新版本(V3.6.0)播放鉴权与播放限制时长的区别介绍

随着科技的飞速发展&#xff0c;视频技术已成为现代社会不可或缺的一部分&#xff0c;广泛应用于安防监控、娱乐传播、在线教育、电商直播等多个领域。EasyCVR视频汇聚平台作为视频技术的佼佼者&#xff0c;不断推陈出新&#xff0c;通过功能更新迭代&#xff0c;为用户提供更加…

什么是视频缓存服务器,它有哪些作用?

视频缓存服务器通常拥有大容量的存储空间和高速的读写能力&#xff0c;它通过缓存(即临时存储)用户经常访问的视频内容&#xff0c;来优化内容的分发过程。这种服务器通常部署在网络中的关键位置&#xff0c;如靠近用户接入点的位置&#xff0c;以降低用户访问视频内容时的网络…

rtsp服务器逻辑

定时器逻辑&#xff1a;比如H264文件是每隔40ms发送一帧数据。aac文件每隔23ms发送一个音频帧数据。 在sink的子类中有aac和h264的sink&#xff0c;在两个子类的构造函数中需要添加它们各自的触发时间。调用的函数时runEvery()&#xff0c;将这两个触发时间设置到了TimerManag…

【H2O2|全栈】关于HTML(1)认识HTML

HTML相关知识 目录 前言 准备工作 WEB前端是什么&#xff1f; HTML是什么&#xff1f; 如何运行HTML文件&#xff1f; 标签 概念 分类 双标签和单标签 行内标签和块标签 HTML文档结构 预告和回顾 UI设计相关 Markdown | Md文档相关 项目合作管理相关 后话 前…

数据结构之堆的创建

1、堆的概念及结构 1.1堆的概念 如果有一个关键码的集合K{k0,k1,k2,…,kn-1}&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中&#xff0c;并满足ki<k2i1且ki<k2i2&#xff08;或满足ki>k2i1且ki>k2i2&#xff09;&#xff0c;其中i0…

Vue2项目搭建:Vue2.7+Vite4+Pinia+TailwindCSS+Prettier+ESLint

目前 create-vue 和 Vite 都不提供 Vue2 项目的搭建&#xff0c;不想用 Vue CLI 和 webpack&#xff0c;于是就打算从 0 搭建一个工程化项目&#xff0c;支持组合式 API (Composition API) 写法&#xff0c;没有使用 TypeScript&#xff0c;有朋友需要的话我可以再完善一下。 N…

结构体小知识

目录 前言1.结构体数组1.1结构体数组理解1.2结构体数组知识运用1.3 -> 操作符 2. 知识拓展 前言 本期blog是对上一期指针知识的知识补充&#xff0c;如果各位大佬感兴趣的话&#xff0c;可以结合起来一起看&#xff01; 1.结构体数组 1.1结构体数组理解 结构体数组在本…

pytorch torch.nn.functional.one_hot函数介绍

torch.nn.functional.one_hot 是 PyTorch 中用于生成独热编码&#xff08;one-hot encoding&#xff09;张量的函数。独热编码是一种常用的编码方式&#xff0c;特别适用于分类任务或对离散的类别标签进行处理。该函数将整数张量的每个元素转换为一个独热向量。 函数签名 tor…