从模拟MMU设计一个路由表的失败到DxR的回归

2023-11-23 06:40

本文主要是介绍从模拟MMU设计一个路由表的失败到DxR的回归,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在前几天写的一篇文字中,我描述了一次失败的经历,对于很在乎过程的我,描述下来就是成功。然而,我不得不回退到DxR,研究一下它的本质而不是其算法思 想。之所以失败,是因为我的逆反心理在作怪,我真的没有研究DxR的本质就开始动手,无疑于打一场毫无准备且对对手完全不了解的恶仗,如果不适可而止,其 结果必然和当初死磕Bloom一样悲惨!

DxR的本质

DxR并没有发明什么新的算法,它之所以高效是因为它分离了路由项中的路由前缀和下一跳这两个基本元素。在这个的基础上,它就可以采用三张表来实现自己的既高效又占用空间小的目的。我来总结一下:

DxR算法的前提:分离了路由前缀和下一跳。

这 个前提及其重要!分离前缀和下一跳可以消除数据冗余,构建查找表的目标就从构建单纯的查找匹配表转换成了构建IPv4地址的某一段区间和下一跳表的映射关 系,这就直接导致了区间查找。我们来看一下很类似的Trie树查找算法,这个算法中路由前缀和下一跳是作为一个“路由项”绑定在一起的,因此查找的过程就 是一个精确匹配+回溯的过程。而DxR算法则消除了回溯的过程。

DxR算法的设施:直接索引表,区间表,下一跳表。

这个我后面还会说,但记住,这不是核心,这只是一种实现方式。

DxR算法表设计:直接索引表的意义

直接索引表合并了巨大的IPv4地址区间,以便区间表在合并后的少的多的区间中更快速地进行搜索,两个表的目的都是指向下一跳表的索引。这就建立了区间到下一跳的映射。

用路由前缀将IPv4地址空间分割成区间

如 果到此为止你还不知道DxR算法是什么,那也无所谓,其实它的思想很简单。路由表的最终结果就是将某个连续地址段对应到某个下一跳(不允许不连续掩码 了...),因此路由表实际上是将整个IPv4地址空间分割成了若干个区间,每个区间只和一个下一跳关联。我把那篇关于记录失败经历的文章中一个正确的图 贴如下:


wKiom1T28_uxdDKGAAJLDeTlt38622.jpg


拿 着目标IP地址当索引,向右走,碰到的第一个路由项就是结果。最长掩码的逻辑完全体现在插入/删除过程中,即从左到右前缀依次变短,长前缀的路由项会盖在 短前缀的路由项的前面,这就是核心思想。虽然我现在已经否定了拿IPv4地址直接去做索引,但是核心思想并没有变,即“拿XX映射到具体的下一跳”,在那 篇失败记录中,XX是IPv4地址索引,而在正确的做法中,XX是区间。其实在HiPac防火墙中,也正是使用了这个思想,即区间查找。在HiPac算法 中,区间就是match域,而下一跳对应Rule。
       那么,DxR算法就是针对上述图示的一步步优化。为了更好的说明DxR,我再次给出上图的变换形式:


wKiom1T29BuiGWZlAAGGAi7dFRU067.jpg


区间查找

如 果按照上面的图示,整个IPv4地址空间被分割成了N个区间,路由查找的最终目标是将某个IPv4地址对应到某个区间中!到此为止,其实工作已经完成了。 但是有个前提,那就是你要找出或者自己实现一个高性能的“区间匹配算法”!,即建立一个区间表,内部保存N个区间项,每个区间项对应一个下一跳索引,比如 区间m对应下一跳C,我们的目标是给定一个IPv4地址,判断它属于哪个区间。这样的算法比比皆是,自己实现一个似乎也不难,比如二分法,哈希算法等,所 以本文不关注这些。然而DxR似乎并不满足这个发现,当然我也不满足。DxR似乎希望找到一种更加优化的方式实现这个区间匹配。
       在给出DxR的框架之前,到此为止,我们发现,DxR实质上就是使用了区间匹配来将一个目标IPv4地址对应到一个区间,然后取出该区间对应的下一跳!

划分子区间

如 果针对每一个到来数据包的目标IPv4地址都要在N个区间中做匹配,似乎不太优雅。如果能将这N个区间划分为若干个子区间,那么每次匹配时匹配的区间数量 将会大大减少,比如N为100,如果能将整个IPv4地址空间划分为20个相等的子区间,那么每次匹配的区间数量将会是5个,而不是100个!!但是这里 又有一个前提,那就是划分子区间的开销一定要能被由于减少区间数量而带来的收益抵消掉,并且收益要更大!
       这个时候,如果你深入理解二级页表就好办了,一个页目录项包含1024个页表项,一个页表项指向一个4096字节大小的页面。其中页目录就把整个32位虚 拟地址空间分割成了1024个相同大小的区间段,每一个区间段的大小为4096*1024,32位虚拟地址对应32位IPv4地址,事情不就是这样吗?不 过,二级页表或多级页表解决的是稀疏地址的问题,如果是一级的页表,那么中间会有很多的“洞”,这是因为进程如何安排虚拟地址在内核和MMU看来是管不了 的。而对于目前我们遇到的问题,采用类似的分级方式是为了划分子区间从而提高每次区间匹配的效率,注意,这并不是以索引为目的的,我错误的将索引作为了目 的而不是手段,于是跌到了万劫不复的深渊!
       但是,对于IPv4地址,并不采用10bit(这是考虑到虚拟地址寻址的特点以及页面的大小而设定的)这样的划分法,而是采用k bit划分法,注意,路由表并不存在页面的概念!如果k等于16,那么就把IPv4地址的高16位就成了一个索引,由于低16位的存在且自由取值,那么每 一个索引表项包括16位涵盖的IPv4地址数量,即65535个IPv4地址。目前的区间查找表变成了下面的样子:


wKioL1T29UuSVUrSAAJQ9y_FSIc085.jpg


要知道,IPv4地址高16位地址可以一下子索引出子区间,这是一个瞬间的操作!然后下面的问题就是“如何合理布局这些子区间”。

子区间布局

如何将子区间布局成紧凑的结构事关重大,因为紧凑的数据结构意味着可以载入CPU Cache!
       以上面最后一幅图为例子,我们当然希望所有的区间依然连续存放,这样似乎是紧凑的唯一方式。我们把这个紧凑的合并后的子区间表叫做区间表,如下图所示:


wKiom1T29EyTfwpuAADYt6uJOLI717.jpg


这个时候,IPv4地址的高16位索引表怎么可以区分出自己索引的那囊括65535个地址的区间到底要分割为哪些子区间呢?答案当然是指示一个起始位置和区间数量了。如果我们把所有的图示展示成一种最终的方式,那么请看下图:


wKiom1T29GDx0IN3AAJxgwe5Yz8917.jpg


以 上的图仅仅包含三个表,一个索引表,一个区间表,另外还有一个下一跳表。关于下一跳表图中没有画出,这是因为它的内容不固定,可以仅仅是一个IP地址,也 可以有设备信息以及状态信息等,也可以是一个链表,用于负载均衡,当然,也可以指向别的东西。其中最关键的就是前两个表,即索引表和区间表。这两张表都可 以放在很紧凑的空间中,占用很小的内存,这两张表将以最大的能力毛遂自荐以被载入CPU Cache。

DxR到底是个什么样子的

有点不好意思。因为上面说着说着就把该说的全部说了。
       其实,DxR就是上面的那幅图所表达的!只是在DxR中:

1.DxR中的x指的就是上文中的k,在我的例子中,我取的是16,实际上它可以取别的值。但是一般而言,大于等于16吧。
2.图中索引表的第三部分,即编码优化数据,这部分可以优化定义,使得这些表更加紧凑。
3.如果索引表中定位的区间表的区间数量为1,那么索引表可以直接指向下一跳索引。

总 的来讲,k值越大,索引表占据的空间越大,如果k值取32,那就不好意思了,索引表项为4G个,区间表不复存在,因为所有的IP地址到下一跳的映射都明细 化了,这就是我自己那次模拟MMU的设计最终的结果,总之,索引表越大,就有越多的IP地址到下一跳的映射明细化,区间表的大小在统计意义上就会越小,这 也是空间换时间的体现...固定索引表大小的时候,区间表的大小是不固定的,取决于你的路由表的路由项布局,因此要想好好使用DxR,没有一点路由规划能 力是不行的,比如你要尽量使用诸如汇总之类的技巧,为了使得路由可以汇总,你可能会还需要重新布线,让可以汇总的路由可以共用同一接口相连的下一跳,这又 涉及到了一些路由分发的能力,特别是你在混用动态路由和静态路由的时候。总之,IP路由是比较复杂的,涉及到了综合的能力,算法,IP地址的理解,地址规 划,路由分发,动态路由,配置命令,甚至综合布线...
       我并没有说这个表如何增删改,这个我觉得是可以自己分析的,它主要受到动态路由的影响,毕竟,如果线路状态不是经常变化,路由表一般也是稳定的。



本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1617340

这篇关于从模拟MMU设计一个路由表的失败到DxR的回归的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

SprinBoot+Vue网络商城海鲜市场的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计