DPDK LPM库(学习笔记)

news2025/7/18 8:19:15

1 LPM库

DPDK LPM库组件为32位的key实现了最长前缀匹配(LPM)表查找方法,该方法通常用于在IP转发应用程序中找到最佳路由匹配。

2 LPM API概述

LPM组件实例的主要配置参数是要支持的最大规则数。 LPM前缀由一对参数(32位Key,深度)表示,深度范围为1到32。LPM规则由LPM前缀和与该前缀关联的一些用户数据表示。 该前缀用作LPM规则的唯一标识符。 在此实现中,用户数据的长度为1字节,称为下一跳,与其在路由表条目中存储下一跳ID的主要用途相关。

LPM组件主要方法有:

  • 添加LPM规则:LPM规则作为输入参数。如果表中不存在具有相同前缀的规则,则新规则将添加到LPM表中。如果表中已经存在具有相同前缀的规则,则将更新该规则的下一跳。如果没有可用的存储空间,则会返回错误。
  • 删除LPM规则:LPM规则的前缀作为输入参数。如果LPM表中存在具有指定前缀的规则,则将其删除。
  • 查找LPM规则:提供32位Key作为输入。该算法用于选择给定Key的最佳匹配的LPM规则,并返回该规则的下一跳。如果LPM表中存在多个具有相同32位Key的规则,则该算法将深度最大的规则选为最佳匹配规则,这意味着输入Key和该规则Key之间具有最高有效位的匹配。

3 实现细节

当前实现使用DIR-24-8算法的一种变体,该算法以内存使用量为代价来提高LPM查找速度。 该算法允许执行查找操作,通常只需一次内存读访问。从统计上看,即便是不常出现的情况,当即最佳匹配规则的深度大于24时,查找操作也仅需要两次内存读访问。 因此,LPM查找操作的性能在很大程度上取决于特定内存位置是否存在于处理器高速cache中。

主要数据结构使用以下元素构建:

  • 具有2 ^ 24个条目的表。
  • 具有2 ^ 8个条目的多个表(RTE_LPM_TBL8_NUM_GROUPS)。

第一张表称为tbl24,使用要查找的IP地址的前24位进行索引,第二张表称为tbl8,使用IP地址的最后8位进行索引。这意味着,根据尝试将传入数据包的IP地址与tbl24中存储的规则进行匹配的结果,我们可能需要在第二级继续查找过程。

由于tbl24的每个条目都可能指向tbl8,因此理想情况下,我们将有2 ^ 24个tbl8,这与具有2 ^ 32个条目的单个表相同。 由于资源限制,这是不可行的。 相反,这种方法就是利用了超过24位的规则非常少的这一特定。通过将这个过程分为两个不同的表/级别并限制tbl8的数量,我们可以大大降低内存消耗,同时保持非常好的查找速度(大部分时间仅一个内存访问)。

tbl24中的条目包含以下字段:

  • 下一跳,或指向tbl8的索引
  • 有效标志
  • 外部条目标志
  • 规则深度(长度)

第一个字段可以包含指示查找过程应该继续的tbl8的索引,或者如果已经找到最长的前缀匹配,则可以是下一跳本身。 这两个标志分别用于确定条目是否有效以及搜索过程是否已完成。 规则的深度或长度指的是存储在特定条目中的规则的位数。

tbl8中的条目包含以下字段:

  • 下一跳
  • 有效标志
  • 有效组
  • 规则深度

下一跳和深度包含与tbl24中相同的信息。 这两个标志分别显示条目和表是否有效。

另一个主要数据结构是一个包含有关规则(IP和下一跳)的主要信息的表。 这是一个更高级别的表,用于不同的事物:

  • 在添加或删除之前,无需实际执行查找即可检查规则是否已经存在。
  • 删除时,检查是否存在包含要删除的规则。 这很重要,因为主数据结构必须相应更新。

3.1 添加

添加规则时,存在不同的可能性。 如果规则的深度恰好是24位,则:

  • 使用规则(IP地址)作为tbl24的索引。
  • 如果条目无效(即它尚未包含规则),则更新下一跳的值,将有效标志设置为1(表示该条目正在使用),将外部条目标志设置为0(表示查找查找过程结束,因为这是匹配的最长前缀)。

如果规则的深度恰好是32位,则:

  • 使用规则的前24位作为tbl24的索引。
  • 如果该条目无效(即它尚未包含规则),则寻找一个空闲的tbl8,将tbl8的索引设置为此值,将有效标志设置为1(表示该条目正在使用),并将外部条目标志为1(意味着查找过程必须继续,因为规则尚未被完全探测)。

如果规则的深度为其他任何值,则必须执行前缀扩展。 这意味着将规则复制到所有条目(只要这些条目不被使用),这也会导致匹配。

学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂
更多DPDK相关学习资料有需要的可以自行报名学习,免费订阅,久学习,或点击这里加qun免费
领取,关注我持续更新哦! ! 

举一个简单的例子,假设深度为20位。 这意味着将导致匹配的IP地址的前24位有2 ^(24-20)= 16个不同的组合。 因此,在这种情况下,我们将完全相同的条目复制到这些组合之一所索引的每个位置。

通过这样做,我们确保在查找过程中,如果存在与IP地址匹配的规则,则可以在一个或两次内存访问中找到该规则,具体取决于我们是否需要移至下一张表。 前缀扩展是该算法的关键之一,因为它可以通过添加冗余来极大地提高速度。

3.2 查找

查找过程更加简单快捷:

  • 使用IP地址的前24位作为tbl24的索引。 如果该条目未使用,则表明我们没有与此IP匹配的规则。 如果有效且外部入口标志设置为0,则返回下一跳。
  • 如果有效且外部入口标志设置为1,则我们使用tbl8索引查找要检查的tbl8,并将IP地址的最后8位用作此表的索引。 同样,如果该条目未使用,则我们没有与此IP地址匹配的规则。 如果有效,则返回下一跳。

3.3 规则数限制

规则数量受到诸多不同因素的限制。第一个是规则的最大数量,它是通过API传递的参数。一旦达到此数目,除非删除一个或多个规则,否则就无法在路由表中添加更多规则。

第二个原因是算法的固有局限性。如前所述,为避免高昂的内存消耗,编译时间限制了tbl8的数量(此值默认为256)。如果我们用尽了tbl8,我们将无法再添加任何规则。对于特定的路由表,需要多少个是很难预先确定的。

每当我们有一个深度大于24的新规则时,并且此规则的前24位与先前添加的规则的前24位不同,就会消耗tbl8。如果相同,那么新规则将与前一个规则共享相同的tbl8,因为这两个规则之间的唯一区别是在最后一个字节之内。

默认值为256情况下,我们最多可以有256个长度超过24位,且前三个字节都不同的规则。由于路由长度超过24位的不多,因此在大多数设置中这不是问题。即使是,也可以通过修改tbl8的数量来解决。

3.4 用例:IPv4转发

LPM算法用于实现实现IPv4转发的路由器使用的无类域间路由(CIDR)策略。

3.5 References

  • DPDK官方编程指南:25. LPM Library — Data Plane Development Kit 20.02.1 documentation
  • RFC1519 Classless Inter-Domain Routing (CIDR): an Address Assignment and Aggregation Strategy http://www.ietf.org/rfc/rfc1519
  • Pankaj Gupta, Algorithms for Routing Lookups and Packet Classification, PhD Thesis, Stanford University, 2000 (http://klamath.stanford.edu/~pankaj/thesis/ thesis_1sided.pdf )

原文链接:https://www.cnblogs.com/realjimmy/p/12918685.html 

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

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

相关文章

React源码分析3-render阶段(穿插scheduler和reconciler)

本章将讲解 react 的核心阶段之一 —— render阶段,我们将探究以下部分内容的源码: 更新任务的触发更新任务的创建reconciler 过程同步和异步遍历及执行任务scheduler 是如何实现帧空闲时间调度任务以及中断任务的 触发更新 触发更新的方式主要有以下几…

Leetcode第21题:合并两个有序链表

生命无罪,健康万岁,我是laity。 我曾七次鄙视自己的灵魂: 第一次,当它本可进取时,却故作谦卑; 第二次,当它在空虚时,用爱欲来填充; 第三次,在困难和容易之…

面试官:你说说 Mysql 索引失效有哪些场景?

前言 SQL 写不好 加班少不了 日常工作中SQL 是必不可少的一项技术 但是很多人不会过多的去关注SQL问题。 一是数据量小,二是没有意识到索引的重要性。本文主要是整理 SQL失效场景,如果里面的细节你都知道,那你一定是学习能力比较好的人&am…

基于Docker的网络安全靶场搭建

背景介绍 在学习网络安全技术过程中,我们往往需要有一个自己的操作机与多个用来搭建环境的靶机,使用VM虚拟机模拟资源占用较大,成本高、局限性大且使用十分不便。 这时我们可以使用一台安装好Docker环境的linux虚拟机来完成桌面版操作机与WEB靶机的搭建与实验操作。 Docker…

Linux操作系统~进程替换,exec系列函数的使用

目录 1.概念/原理 (1).替换原理 (2).子进程调用execl执行程序替换,为什么父进程不受影响? (3).exec*返回值 2.替换函数exec execl execv execlp execvp的(execv…

Android Studio App开发之网络通信中使用POST方式调用HTTP接口实现应用更新功能(附源码 超详细必看)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、POST方式调用HTTP接口 POST方式把接口地址与请求报文分开,允许使用自定义的报文格式,由此扩大了该方式的应用场景。POST请求与GET请求主要有三处编码差异 1:在调用setRequestMethod方…

Kafka 消息队列 ( 一 ) 基本概念

0.MQ(message queue) 消息中间件 生活中的问题 : 快递员 给 你 送东西, 你必须 在家等着, (效率低) 可以 把东西 放 指定 的 地方(菜鸟驿站) , 你自己去取 , 指定 的地点(菜鸟驿站) 就是 MQ 消息队列中间件 0.1.开发中的问题 0.1.1.异步问题 0.1.2.业务解耦 0.1.3.流量削…

2. 信息在计算机中存储的格式

目录 一、信息存储: 1. 空间大小定义 2. 不同进制的转换方法 3. 各种数据类型所占字节数 4. 字节顺序 5. 字符串存储 6. 代码的二进制表示 7. 布尔代数运算 8. 逻辑运算 9. 移位运算 二、 整数表示 1. 有符号与无符号表示 1.1 表示范围 1.2 补码编码的…

C语言日记 35 拷贝构造函数

书P132: 拷贝构造函数的作用是 用已存在的对象初始化另一对象,两对象类类型应一样 在这里我们可以看到, 他对被拷贝的对象的要求只有“已存在的对象,两对象类类型一样”,也就是说他这里也没有说我们不能跨区域&…

使用 Spring Cloud Loadbalancer 实现客户端负载均衡

使用 Spring Cloud Loadbalancer 实现客户端负载均衡 作者:Grey 原文地址: 博客园:使用 Spring Cloud Loadbalancer 实现客户端负载均衡 CSDN:使用 Spring Cloud Loadbalancer 实现客户端负载均衡 背景 在Spring Cloud G 版…

为什么 think-cell 图表中的标签显示为白色矩形?

有些标签的背景错误地变成白色,或显示幻灯片背景。当前版本的 PowerPoint 不会出现此问题。 •使用 PowerPoint 2007 打开 .ppt 文件并单击标签内部时,将显示正确的标签背景,但是在保存后重新打开该文件时,会返回不正确…

分布式系统的 38 个知识点

天天说分布式分布式,那么我们是否知道什么是分布式,分布式会遇到什么问题,有哪些理论支撑,有哪些经典的应对方案,业界是如何设计并保证分布式系统的高可用呢? 1. 架构设计 这一节将从一些经典的开源系统架…

5G无线技术基础自学系列 | 物理随机接入信道

素材来源:《5G无线网络优化实践》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 PRACH信道用于传输前导Preamble序列。gNB…

逆向-破零64位版本

// 排版有点乱&#xff0c;没有图片直观。 #include <stdio.h> #include <stdlib.h> #include <string.h> int f_14a2(int *va, int vb) { /*14a2: f3 0f 1e fa endbr64 14a6: 55 push %rbp 14a7:…

[附源码]java毕业设计基于Web的美食网站的设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【背景渐变】 —— 就算没接触过也能 一遍学会哦

前期回顾 ​回顾 前期 把你喜欢css动画嵌入到浏览器中 —— css动画 项目_0.活在风浪里的博客-CSDN博客常用酷炫动画999合集&#xff0c;代码直接复制可用&#xff0c;总用你想找的&#xff0c;快来抱走吧&#xff0c;三连&#xff0c;停&#xff01;听鹅说&#xff0c;下…

2009年408大题总结

2009年408大题第41题第42题第43题第44题第45题第46题第47题第41题 这个最容易想到的方法就是举反例&#xff0c;但是我们可以分析一下&#xff0c;每一次都取最短的路径&#xff0c;实际上就是贪心策略的应用——每次都是最优&#xff0c;但是最终的结果却一般不是最优&#xf…

第十一节:抽象类和接口【java】

目录 &#x1f947;1. 抽象类 &#x1f4d8;1.1 抽象类概念 &#x1f4d2;1.2 抽象类语法 &#x1f4d7; 1.3 抽象类特性 &#x1f3f9;2. 接口 &#x1f4d9;2.1 接口的概念 &#x1f4d5;2.2 语法规则 &#x1f4d2;2.3 接口使用 &#x1f50e;2.3.1USB接口例子 &a…

【Google Colab】使用手册、教程;使用 Google Colab 免费使用 python 服务器

Colaboratory 是一个 Google 研究项目&#xff0c;旨在帮助传播机器学习培训和研究成果。它是一个 Jupyter 笔记本环境&#xff0c;不需要进行任何设置就可以使用&#xff0c;并且完全在云端运行。Colaboratory 笔记本存储在 Google 云端硬盘中&#xff0c;并且可以共享&#x…

超详细图解kafka生产消费流程

目录&#xff1a; 一条消息在kafka是如何生产的&#xff1f; 一条消息在kafka是如何存储的&#xff1f; 一条消息在kafka是如何消费的&#xff1f; Kafka为什么高性能&#xff1f; Kafka为什么高可用&#xff1f; 一&#xff0e;一条消息在kafka是如何存储的&#xff1f; …