OPNET Modeler 例程——创建一个包交换网络
文章目录
- 一、例程简介
- 二、创建新的包格式
- 三、创建新的链路模型
- 四、创建中心交换节点模型
- 五、创建中心交换节点的进程模型
- 六、创建周边节点模型
- 七、创建周边节点进程模块
- 八、创建网络模型
- 九、收集统计量
- 十、配置并仿真
- 总结
一、例程简介
本例程将仿真一个简单的包交换网络,它包括四个周边节点和一个中心节点,周边节点用来产生业务,而中心节点将这些业务转交给相应的目的节点(周边节点中的一个),网络拓扑结构如下图所示。
上面的拓扑结构包含两种类型节点模型,即周边节点和中心交换节点。本例程的目的是仿真一个周边节点发出的业务能够通过中心交换节点路由至另一个目的周边节点。从中心交换节点中看,假设包是以随机的方式来自四个周边节点,每个包包含目的地址,目的地址可以用一个整数来表示不同的目的周边节点,中心节点接收到包后通过对目的地址的解析最后选择一个合适的发信机将包送往目的地。
网络的物理通信机制如下图所示。
每个节点至少包含一对点对点收发机,并且通过一条有线双工链路和另一对点对点收发机构成一个收发机组。每个这样的收发机组可以支持数据的双向传输,在中心交换节点中,配置了四对点对点收发机,从而在物理上能够支持与四个周边节点互联互通。
中心交换节点在OPNET中的节点模型如下图所示。
中心交换节点如何实现寻址和包交换呢?每个有向包流(以某个进程模型为参考,某个包流进入该进程或者离开该进程,因此称之为有向包流)有一个唯一的索引号,这个索引号总是和某个收信机(对应进入包流)或者某个发信机(对应离开包流)唯一对应,而收信机和发信机又和某个周边节点唯一对应,因此可以直接用流索引号作为交换包的依据。当然为了增强网络的稳健性,我们也可以建立一个目的地址和流索引(可以看作是物理地址)的映射表。为了简单起见,本例程将采用前一种方法实现寻址和包交换。
周边节点在OPNET中的节点模型如下图所示。
周边节点作为网络的业务源,其产生包,然后为每个包分配一个目的地址并且通过点对点发信机传输出去。周边节点同时也作为网络的业务终端,周边节点接收包并且统计其端对端延时。
OPNET Modeler 的精髓之一就是层次化建模的思想,在构建本网络时,将采用如下的层次化建模的步骤:定义包格式——>定义链路模型——>创建中心交换节点模型——>创建周边节点模型——>建立网络模型——>配置并仿真。
二、创建新的包格式
创建一个新的包格式,打开包格式编辑器,按照下图设置包域的属性。
设置完成后命名这个包格式并保存,关闭当前的编辑器。
三、创建新的链路模型
接下来创建一个新的链路模型,打开链路模型编辑器,支持的链路类型按照下图进行设置。
支持的链路类型选择 ptdup,表示该链路只支持点对点双工连接。
各项属性值的设置如下图所示,包格式选择前面自己创建的那个。
ecc model是错误纠错模式,这里选择ecc_zero_err,即取消链路的纠错功能;error model是链路的干扰模式,这里选择error_zero_err,即链路无干扰;prodel model是传播延时计算模式,这里选择dpt_prodel,即计算点对点传播延时;txdel model是传输延时计算模式,这里选择dpt_txdel,即计算点对点传输延时。
这里还要申明一下外部函数link_delay,对于OPNET9.0以上的版本,如果不申明该外部函数的话,在编译dpt_prodel时会因为找不到该函数而出现错误。
在File——>Declared External Files下找打外部函数link_delay,在其前面打勾即可,如下图所示。
点击OK,然后保存该链路模型。
四、创建中心交换节点模型
前面已经提到,中心交换节点包含四对发信机和收信机,一个中心交换处理进程,该进程用来按地址转交包。
首先创建一个节点模型,按照下图所示放置并命名各个对象。
在hub进程模块上右键选择显示连接即可查看各包流与hub的连接情况。
接下来需要定义收发信机的模型属性,按住Shift键,依次以鼠标左键单击所有的收发信机,注意不要选中包流线。选中后,在其中的一个收信机或发信机模块上单击鼠标右键,编辑其属性。
按照下图的标注依次设置数据速率为9600(与前面链路模型的设置保持一致),包格式选择前面新建的那一个,点击OK按钮即可,如下图所示。
在编辑完其中一个的属性之后,在Apply to selected objects前面打勾,将前面选中的8个收发信机都设置成这样,点击OK按钮。
接下来定义节点模型的界面属性,在Interfaces菜单中选择Node Interfaces,将该节点设置为固定节点,如下图所示进行设置。
然后保存该中心交换节点模型。
五、创建中心交换节点的进程模型
接下来为中心交换节点创建进程模型。
新建一个进程模型,打开进程编辑器,按照下图创建状态和转移线,并编辑转移线的条件设定,executive属性设置为route_pk()。
定义宏的代码如下。
#define PK_ARRVL (op_intrpt_type () == OPC_INTRPT_STRM)
PK_ARRVL条件判断 hub 进程接收的中断类型是否时流中端,在OPNET中以常量OPC_INTRPT_STRM表示流中端,如果进程异常的接收到其他类型的中断则状态会因为找不到转移条件而出错,因此为idle状态创建了一个指向自身的default的转移线,即其他条件不满足则该条件满足。
点击工具栏的函数块按钮,在其中键入下面的代码并保存。
static void route_pk(void){int dest_address;Packet* pkptr;FIN(route_pk()); //函数开始pkptr = op_pk_get (op_intrpt_strm ()); //从合适的输入流中取得包op_pk_nfd_get (pkptr, "dest_address", &dest_address); //析取包中的目的域,目的地址就是输出流索引op_pk_send (pkptr, dest_address); //将包发送给相应的收信机FOUT; //函数结束}
在编写函数时必须使用FIN(function begin)、FOUT(function out)、FRET(function return)等界定函数范围的标识符,而且必须使它们配对。
接下来更改进程属性,在Interfaces菜单中选择 Process Interfaces,按照下图设置属性值。
点击OK,保存该进程模型然后编译该进程,编译成功如下图所示。
下面需要把该进程模块指定给中心交换节点模型,在节点模型中的 hub 进程上右键编辑属性,将上面创建的进程模型指配给 hub 进程,如下图所示。
以上工作完成后保存该节点模型。
六、创建周边节点模型
当周边节点生成一个包时,它必须给这个包指定一个目的地址,然后将它发往中心节点。如果周边节点接收到一个包时,它必须计算该包的端对端延时。 因此周边节点必须包括一个业务生成模块、一个进程模块和一对点对点收发信机来完成这些任务。
周边节点模型按照下图所示放置并命名各个对象。
src模块的属性设置如下图所示。
接下来,需要改变收发信机的信道速率和支持的包格式,以匹配指定的链路模型。
按住Shift键,在周边节点模型中单击收信机和发信机,编辑其属性,过程与中心节点模型的类似,如下图所示。
在Interfaces菜单中选择Node Interfaces,将该节点设置为固定节点,如下图所示进行设置。
也可以对一些属性进行重命名操作,属性重命名可以简化复杂属性名称,或者扩展过于简化的名称,总之就是可以帮我们更好的理解该属性的作用或功能。
属性重命名的过程如下图所示。
此外,我们还可以指定一系列预定值给某个属性,这样属性的设置可以通过界面来选择,这将给用户提供方便。
为属性指定预定值有这样几个好处:限制属性取值的范围;用户可以直观地根据预定值的名称来选择相应的参数;用户不需要输入具体值,从下拉列表中选择即可。
下面为刚才更名的 source interarrival time 属性指定一些预定值,Symbol的Status变为suppress,添加四个预定值,如下图所示。
周边节点的许多属性与仿真无关,这里隐藏其他的属性,如下图所示。
设置完成后保存该周边节点模型。
七、创建周边节点进程模块
周边节点进程模块的功能是:为包分配目的地址并且发送出去;计算包的端对端延时。
创建一个新的进程模型,打开进程编辑器,按照下图创建状态和转移线,并编辑转移线的条件设定。
在init状态中,进程模型将加载一个从0-3的均匀分布概率函数。
xmt()转移执行函数产生将调用概率函数随即产生目的地址,并将其分配给来自业务生成模块的包,然后再将它发送出去。rcv()转移执行函数作用是在接收到包时计算其端对端延时,并且将结果写入全局统计量。
该进程模型中,定义宏的代码如下。
/* 定义包流 */
#define RCV_IN_STRM 0
#define SRC_IN_STRM 1
#define XMT_OUT_STRM 0
/* 条件宏定义 */
#define SRC_ARRVL (op_intrpt_type () == OPC_INTRPT_STRM && op_intrpt_strm () == SRC_IN_STRM)
#define RCV_ARRVL (op_intrpt_type () == OPC_INTRPT_STRM && op_intrpt_strm () == RCV_IN_STRM)
RCV_IN_STRM 和 SRC_IN_STRM 对应数据包的输入流索引号,而 XMT_OUT_STRM 为输出流索引号,输入输出都是相对当前进程模块(proc)而言的,它们对应与proc模块相连的某条包流,连接关系一旦确定,它们的索引号是常数。
点击工具栏的SV按钮定义状态变量,在对话框中输入下面的内容。
下面创建一个全局统计探针收集包的端对端延时的结果。
在进程模块中的 Interfaces——>Global Statistics 下按照下图所示声明一个全局统计量。
init 状态的入口执行代码如下。
address_dist = op_dist_load ("uniform_int", 0, 3);
ete_gsh = op_stat_reg ("ETE Delay", OPC_STAT_INDEX_NONE, OPC_STAT_GLOBAL);
点击工具栏FB按钮打开函数块编辑器,在其中键入下面的代码。
static void xmt (void){Packet* pkptr;FIN (xmt());pkptr = op_pk_get (SRC_IN_STRM); //从包流的输入流索引号获取数据包op_pk_nfd_set_int32 (pkptr, "dest_address", (int)op_dist_outcome (address_dist)); //通过调用均匀概率分布函数指针(address_dist,在上面的init状态下定义),产生一个随机值,并将该值设置为包的"dest_address"域op_pk_send (pkptr, XMT_OUT_STRM); //从包流的输出流索引号将包发送出去FOUT;}static void rcv (void){Packet* pkptr;double ete_delay;FIN (rcv());pkptr = op_pk_get (RCV_IN_STRM); //获取包指针ete_delay = op_sim_time() - op_pk_creation_time_get (pkptr); //当前仿真时间减去包的创建时间得到包的端对端延时op_stat_write (ete_gsh, ete_delay); //将计算的延时写入矢量结果文件中op_pk_destroy (pkptr); //销毁包FOUT;}
xmt()转移执行函数当SRC_ARRVL条件满足时(即包从业务生成模块到达proc模块)才执行,该函数在将包发送之前要为它分配一个目的地址。
rcv()转移执行函数当RCV_ARRVL条件满足时(即包从收信机到达proc模块)时执行,主要目的是计算端对端延时并写入全局统计探针。
按照下图设置进程界面的属性值。
保存该进程模型,回到周边节点模型编辑下,右键proc模块并为其指定刚才创建完成的周边节点的进程模块,如下图所示。
八、创建网络模型
前面已经建好了包模型、链路模型、中心交换节点模型、中心交换节点的进程模型、周边节点模型和周边节点的进程模型,接下来就是构建网络模型了。
File——>New——>Project 新建网络模型,首先在按照 Topology——>Subnets——>Create Fixed Subnets… 在项目编辑窗口中放置一个subnet的模型并给其命名,如下图所示。
双击这个子网模块进入它的内部,打开对象面板,搜索前面自己创建的中心交换节点模块和周边节点模块,按照下图依次放置节点模块。
搜索前面自己前面新建的链路模型,找到后依次把周边节点 0,1,2,3 和中心交换节点 hub 相连(按照顺序连接),如下图所示。
连接完成后需要先验证链路的连接是否正确,点击 Topology——>Verify Links,或者直接用 Ctrl+L 快捷键调出链路检查窗口,选择 Verify links,点击 OK 验证,如果线路上有叉,就说明链路不通,连接有问题,如下图所示。
这个时候就要检查是自己做的过程中哪步出错了,我就是没有给节点模型指配相应的进程模型,从而在验证链路的连接性时出现了错误。
九、收集统计量
接下来收集统计量,在工程窗口的空白处右键选择Choose Individual DES Statistics,勾选全局统计量ETE Delay,如下图所示。
在 node_0 和 hub 间的链路上右键,选择Choose Individual DES Statistics,按照下图勾选的选择上行和下行链路的利用率。
保存项目文件。
十、配置并仿真
在这个例程中,包的大小和收发信机的速率都是恒定的,因此期望端对端延时也应该固定不变。然而,如果包的产生速率足够快,就会导致部分包在发信机队列中堆积,这时包的端对端延时加大。如果包的产生速率不定,有可能造成业务突发,因此端对端延时也会受影响。为了模拟这些行为,需要配置 source interarrival time 仿真属性,下面将给它指定两个值。
在菜单栏的 DES——>Configure/Run Discrete Event Simulation (Advanced) 下配置仿真,打开窗口按下图所示配置仿真参数。
给 source interarrival time 属性赋值为4,这里的数值选择就是在前面创建周边节点模型时预设的四个值,即4,8,40,80。
复制这个仿真序列,并在该窗口下粘贴,将这个新粘贴的仿真序列 source interarrival time 属性赋值为40,其他的参数保持不变,如下图所示。
保存这两个配置的仿真序列,接下来就运行仿真,点击下图中仿真按钮,仿真完成会出现下面的窗口,说明仿真过程没有出错。
点击 View Results 按钮查看结果,先以 time_average 显示模式看上行链路的利用率,如下图所示。
下行链路的利用率如下图所示。
可以看出由于包的产生速率过小导致链路利用率很低。
下面查看全局统计量 ETE Delay 的情况,仿真序列1的结果如下图所示。
以离散的方式绘制仿真序列1的结果如下。
仿真序列2的结果如下。
以离散的方式绘制仿真序列2的结果如下。
通过对比发现仿真序列2的延迟相对仿真序列1来说好一点。
总结
以上就是 OPNET Modeler 实例——创建一个包交换网络的所有内容了,希望本文对你学习 OPNET Modeler 软件有一定的帮助!
本文参考书目:OPNET 网络仿真/陈敏编著. - 北京:清华大学出版社,2004
相关文章:

OPNET Modeler 例程——创建一个包交换网络
文章目录一、例程简介二、创建新的包格式三、创建新的链路模型四、创建中心交换节点模型五、创建中心交换节点的进程模型六、创建周边节点模型七、创建周边节点进程模块八、创建网络模型九、收集统计量十、配置并仿真总结一、例程简介 本例程将仿真一个简单的包交换网络&#…...

JSON 基础结构
什么是JSON JSON,说白了就是JavaScript用来处理数据的一种格式,这种格式非常简单易用。 JSON,大部分都是用来处理JavaScript和web服务器端之间的数据交换,把后台web服务器的数据传递到前台,然后使用JavaScript进行处…...

雷达基础知识
雷达频率划分 以下是按照频率和波长划分雷达频段的表格: 波段名称频率范围(GHz)波长范围(cm)应用领域VHF0.03 - 0.3100 - 10气象雷达、空管雷达、航空雷达UHF0.3 - 3100 - 10航空雷达、海上雷达、地面雷达、火控雷达…...

【二阶锥规划】考虑气电联合需求响应的气电综合能源配网系统协调优化运行【IEEE33节点】(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

qt 编译器 调试器
电脑版本:win10 64位 qt版本:based on Qt 5.14.0(msvc 2017, 32位) Qt Creator 4.11.0 qt安装包:qt-opensource-windows-x86-5.9.9.exe 安装过程一路next,安装完成后,默认使用的…...

低代码平台助力AIGC:让人工智能技术更加普及和高效
今年人工智能的风是吹了一波又一波,从ChatGPT到文心一言,短短四个多月的时间,GPT完成了从3.0、3.5到4.0的推新发布,一步步刷新了民众对于目前人工智能技术发展的认知底线,让人们直观地感受到了人工智能技术的蓬勃发展。…...

Qt中Model/View结构
Qt中Model/View结构 Model/View框架的核心思想是模型(数据)与视图(显示)相分离,模型对外提供标准接口存取数据,不关心数据如何显示,视图自定义数据的显示方式,不关心数据如何组织存…...

中纬ZOOM35全站仪参数和使用说明书
免棱镜测程采用全新EDM,明显提升测距功能。极细可见激光免棱镜测程最高可达1000m,同等测程下无棱镜精度较高。 绝对编码度盘中纬静态条码式码盘测角,开机无需初始化,利用同样技术的徕卡全站仪,测角精度可高达0.5&#…...

【Note5】网络,并发/IO,内存,linux/vi命令,正则,Hash,iNode,文件查找与读取,linux启动/构建
文章目录1.局域网:CSMA/CD2.互联网:ARP,DHCP,NAT3.TCP协议:telnet,tcpdump,syn/accept队列4.HTTPS协议:摘要(sha、md5、crc)。win对文件进行MD5校验用自带的c…...

华为MRS_HADOOP集群 beeline使用操作
背景 由于项目测试需要,计划在华为hadoop集群hive上创建大量表,并且每表植入10w数据,之前分享过如何快速构造hive大表,感兴趣的可以去找一下。本次是想要快速构造多表并载入一些数据。 因为之前同事在构造相关测试数据时由于创建…...

PCB模块化设计10——PCI-E高速PCB布局布线设计规范
目录PCB模块化设计10——PCI-E高速PCB布局布线设计规范1、PCI-E管脚定义2、PCI-E叠层和参考平面3、 PCB设计指南1、阻抗要求2、线宽线距3、长度匹配4、走线弯曲角度5、测试点、过孔、焊盘6、AC去耦电容放置方法7、金手指和连接器的注意事项8、其他的注意事项PCB模块化设计10——…...

Java简介
Java简介 Java是一种面向对象的编程语言,由Sun Microsystems于1995年发布。Java设计的初衷是为了开发可移植、高性能的应用程序。Java代码可以在不同的操作系统上运行,包括Windows、Linux、Mac等。 Java是一种广泛使用的编程语言,用于开发各…...

python框架有哪些,常用的python框架代码
Python的应用已经相当广泛了,可以做很多事情,而 Python本身就是一个应用程序,我们也可以说 Python是一个高级语言。由于 Python有很多包,所以我们不能把所有的 Python包都了解一下,也不能把所有的包都读一遍࿰…...

jsp设计简单的购物车应用案例
代码解释 <%request.setCharacterEncoding("UTF-8");if (request.getParameter("c1")!null)session.setAttribute("s1",request.getParameter("c1"));if (request.getParameter("c2")!null)session.setAttribute("…...

VueX是什么?好处?何时使用?
VueX相关1、VueX是什么?2、使用VueX统一管理状态的好处3、什么样的数据适合存储到Vuex中?1、VueX是什么? VueX是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间数据的共享。 如果没有VueX…...

第2章 封装组件初级篇(上)
1.环境搭建,在 vite 脚手架基础上集成 typescript 和 element-plus https://cn.vitejs.dev/guide/ 以下是开发过程中过使用到的包和版本号:package.json {"name": "m-components","version": "0.0.0","…...

uniapp image标签图片跑偏终极解决办法
目录uniapp image 的mode常用属性aspectFit 缩放显示图片全部aspectFill 缩放填满容器,但是图片可能显示不全widthFix 以宽度为基准,等比缩放长heightFix 以高度为基准,等比缩放宽uniapp image 的mode常用属性 uniapp当中,在imag…...

SpringMVC的响应处理
文章目录一、传统同步业务数据响应1. 请求资源转发2. 请求资源重定向3. 响应模型数据4. 直接回写数据二、前后端分离异步业务数据响应一、传统同步业务数据响应 Spring响应数据给客户端,主要分为两大部分: ⚫ 传统同步方式:准备好模型数据&am…...

静态词向量预训练模型
1、神经网络语言模型从语言模型的角度来看,N 元语言模型存在明显的缺点。首先,模型容易受到数据稀疏的影响,一般需要对模型进行平滑处理;其次,无法对长度超过 N 的上下文依赖关系进行建模。神经网络语言模型 (Neural N…...

永久免费CRM怎么选?有什么好用的功能?
在当今商业环境下,企业经营者们都希望能够找到一种方法来提高自己的生产力和盈利能力。一种非常有效的方法就是实现客户关系管理(CRM)。然而,由于很多传统的CRM解决方案价格昂贵,小企业和创业公司很难承担。那么&#…...

leetcode重点题目分类别记录(二)基本算法:二分,位图,回溯,动态规划,图论基础,拓扑排序
layout: post title: leetcode重点题目分类别记录(二)基本算法:二分,位图,回溯,动态规划,拓扑排序 description: leetcode重点题目分类别记录(二)基本算法:二…...

【JaveEE】多线程之定时器(Timer)
目录 1.定时器的定义 2.标准库中的定时器 2.1构造方法 2.2成员方法 3.模拟实现一个定时器 schedule()方法 构造方法 4.MyTimer完整代码 1.定时器的定义 定时器也是软件开发中的一个重要组件. 类似于一个 "闹钟". 达到一个设定的时间之后, 就执行某个指…...

【理论推导】变分自动编码器 Variational AutoEncoder(VAE)
变分推断 (Variational Inference) 变分推断属于对隐变量模型 (Latent Variable Model) 处理的一种技巧,其概率图如下所示 我们将 X{x1,...xN}X\{ x_1,...x_N \}X{x1,...xN} 看作是每个样本可观测的一组数据,而将对应的 Z{z1,...,zN}Z\{z_1,...,z_N…...

【哈希表:哈希函数构造方法、哈希冲突的处理】
预测未来的最好方法就是创造它💦 目录 一、什么是Hash表 二、Hash冲突 三、Hash函数的构造方法 1. 直接定址法 2. 除余法 3. 基数转换法 4. 平方取中法 5. 折叠法 6. 移位法 7. 随机数法 四、处理冲突方法 1. 开放地址法 • 线性探测法 …...

HTML5 应用程序缓存
HTML5 应用程序缓存 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本。这意味着,你可以在没有网络连接的情况下进行访问。 什么是应用程序缓存(Application Cache)? HTML5 引…...

全国计算机等级考试三级网络技术选择题考点
目录 第一章 网络系统结构与设计的基本原则 第二章 中小型网络系统总体规划与设计方法 第三章 IP地址规划技术 第四章 路由设计基础 第五章 局域网技术基础应用 第六/七章 交换机/路由器及其配置 第八章 无线局域网技术 第九章 计算机网络信息服务系统的安装与…...

Python和VC代码实现希尔伯特变换(Hilbert transform)
文章目录前言一、希尔伯特变换是什么?二、VC中的实现原理及代码示例三、用Python代码实现总结前言 在数学和信号处理中,**希尔伯特变换(Hilbert transform)**是一个对函数产生定义域相同的函数的线性算子。 希尔伯特变换在信号处…...

嵌入式C语言语法概述
1.gcc概述 GCC全称是GUN C Compiler 随着时代的发展GCC支持的语言越来越多,它的名称变成了GNU Compiler Collection gcc的作用相当于翻译官,把程序设计语言翻译成计算机能理解的机器语言。 (1)gcc -o gcc -o (其…...

蓝桥杯第19天(Python)(疯狂刷题第3天)
题型: 1.思维题/杂题:数学公式,分析题意,找规律 2.BFS/DFS:广搜(递归实现),深搜(deque实现) 3.简单数论:模,素数(只需要…...

【数据库连接,线程,ThreadLocal三者之间的关系】
一、数据库连接与线程的关系 在实际项目中,数据库连接是很宝贵的资源,以MySQL为例,一台MySQL服务器最大连接数默认是100, 最大可以达到16384。但现实中最多是到200,再多MySQL服务器就承受不住了。因为mysql连接用的是tcp协议&…...