OPNET Modeler 例程——ALOHA和CSMA的性能对比

news2024/10/2 10:38:24

文章目录

  • 概述
  • 一、创建 ALOHA 协议模型
  • 二、创建 CSMA 协议模型
  • 三、创建收信机进程和节点模型
  • 四、创建总线型链路模型
  • 五、创建网络模型
  • 六、查看仿真结果
  • 总结


概述

本例程以以太网为例论述总线型网络的建模方法,对数据链路层的 MAC 技术进行建模分析,并进行 ALOHA 和 CSMA 的网络性能对比。以太网是一种重要的计算机局域组网方式,采用了总线型的网络建模方法,节点通过总线进行信息的发送和接收。
ALOHA 协议是最基本的随机多址接入技术,CSMA 协议在其基础上增加了载波侦听的功能。关于 ALOHA 协议和 CSMA 协议的介绍可以参考文章:计算机网络——数据链路层介质访问控制。
总线模型是通过收、发节点对象和总线对象共同构建的,总线对象又分为总线(Bus)和总线接头(Tap)两种对象。发送节点通过总线发送机,将数据包传至总线接头,再由总线接头将包发送至总线中,在总线中进行数据传输与共享。接收机通过接头接收来自总 线的数据包,然后在接收节点中进行数据处理。总线收发的逻辑如下图所示。
在这里插入图片描述
CSMA 和 ALOHA 协议都是在发送节点中实现的,ALOHA 在发送过程中不侦听信道,因此发送节点不需要接收信号。而 CSMA 需要侦听信道后发送信号,因而既需要发送机也需要接收机。下图是 ALOHA 和 CSMA 发送节点模型的对比。
在这里插入图片描述
单箭头实线是包流线,在发送端将数据源经数据发送处理后送至发信机,在接收端将接收机收到的包传送至接收模块。单箭头虚线表示状态线,将接收机的信道忙或闲通知数据发送模块,实现信道侦听功能。双箭头虚线为逻辑线,关联收信机和发信机。
数据源模块负责随机产生数据包,可以通过 simple_source 进程模型实现。数据接收处理只需要将接收包销毁并释放内存即可,可以通过 sink 进程模型实现。
纯 ALOHA 的工作原理:站点只要产生帧,就立即发送到信道上,规定时间内若收到应答,表示发送成功,否则重发。
重发策略:等待一段随机的时间重发,如果再次冲突,则再等待一段随机时间,直到重发成功为止。
纯 ALOHA 中信道吞吐量和信道流量的关系: S = G e − 2 G S=Ge^{-2G} S=Ge2G
可以推知,当 G=0.5 时, S m a x = 1 2 e ≈ 0.18 S_{max}=\frac{1}{2e}≈0.18 Smax=2e10.18
1-坚持 CSMA 的工作原理:发送节点在发送信息帧之前,必须侦听媒体是否处于空闲状态,当信道忙或发生冲突时,要发送帧的站点,不断持续侦听,一有空闲便可发送,若收到应答,表示发送成功,否则重发。
重发策略:不断持续侦听,一有空闲便可发送,直到重发成功为止。
1-坚持 CSMA 中信道吞吐量和信道流量的关系: S = G ( 1 + G ) e − G G + e − G S=\frac{G(1+G)e^{-G}}{G+e^{-G}} S=G+eGG(1+G)eG
可以推知,当 G=1 时, S m a x = 0.5 S_{max}=0.5 Smax=0.5


一、创建 ALOHA 协议模型

ALOHA 发送处理模块的进程模型如下图所示。
在这里插入图片描述
添加整型状态变量max_packet_count。
在进程编辑器的 Interface——>Global Attributes下按照下图设置。
在这里插入图片描述
头块中的代码如下。

/*input stream from generator module.*/
#define IN_STRM 0
/*output stream from generator module.*/
#define OUT_STRM 0
/*condition macros*/
#define PKT_ARVL (op_intrpt_type()==OPC_INTRPT_STRM)
/*global variables*/
extern int subm_pkts;

初始化入口执行代码如下。

/*get the maximum packet count set at simulation run-time*/
op_ima_sim_attr_get_int32("max packet count",&max_packet_count);

tx_pkt 状态的入口执行代码如下。

Packet* out_pkt;
out_pkt=op_pk_get(IN_STRM);
op_pk_send(out_pkt,OUT_STRM);
++subm_pkts;
/*发送数据包总量等于系统仿真最大的数据包值时,结束仿真*/
if(subm_pkts==max_packet_count)
	{
	op_sim_end("max packet count reached.","","","");
	}

进程接口的属性设置如下图所示。
在这里插入图片描述
ALOHA 节点模型如下图所示。
在这里插入图片描述
gen 模块的属性设置见下图。
在这里插入图片描述
确保两条包流线的 src stream 和 dest stream 都是 src stream[0] 和 dest stream[0]。
节点接口的设置如下图所示。
在这里插入图片描述


二、创建 CSMA 协议模型

另存 ALOHA 发送处理模块的进程模型并重新命名,在其基础上修改状态转移图如下。
在这里插入图片描述
只有头块部分的代码添加了几行,如下。

/*input stream from generator module.*/
#define IN_STRM 0
/*output stream from generator module.*/
#define OUT_STRM 0
/*condition macros*/
#define PKT_ARVL (op_intrpt_type()==OPC_INTRPT_STRM)
/*input statistics indices*/
#define CH_BUSY_STAT 0
/*condition macros*/
#define FREE (op_stat_local_read(CH_BUSY_STAT)==0.0)
#define PKTS_QUEUED (!op_strm_empty(IN_STRM))
#define CH_GOES_FREE (op_intrpt_type()==OPC_INTRPT_STAT)
/*global variables*/
extern int subm_pkts;

除此之外,其余部分的设置与 ALOHA 发送处理模块的进程模型一致。
CSMA 节点模型如下图所示。
在这里插入图片描述
该节点模型也是在 ALOHA 节点模型的基础上修改,sink 模块的进程模型指配为 sink,橘色关联线可有可无,红色的状态线属性设置如下图所示。
在这里插入图片描述


三、创建收信机进程和节点模型

本例程中,ALOHA 和 CSMA 使用的收信机模型是一样的,下面进行创建。
收信机的进程模型如下图所示。
在这里插入图片描述
定义一个整型的状态变量 rcvd_pkts,并在初始化进入代码中添加如下代码。

rcvd_pkts=0;

头块代码如下。

#define IN_STRM 0
#define PKT_RCVD (op_intrpt_type()==OPC_INTRPT_STRM)
#define END_SIM (op_intrpt_type()==OPC_INTRPT_ENDSIM)
int subm_pkts=0;

函数块代码如下。

/*this function gets the received packet,destroys it,and logs the incremented received packet total.*/
static void proc_pkt(void)
	{
	Packet* in_pkt;
	FIN(proc_pkt());
	/*get packet from bus receiver input stream*/
	in_pkt=op_pk_get(IN_STRM);
	/*destroy the received packet.*/
	op_pk_destroy(in_pkt);
	/*increnment the count of received packet*/
	++rcvd_pkts;
	FOUT;
	}

/*this function writes channel triffic and throughput statistics at the end of simulation.*/
static void record_stats(void)
	{
	double cur_time;
	FIN(record_stats());
	cur_time=op_sim_time();
	op_stat_scalar_write("Channel Traffic G",(double)subm_pkts/cur_time);
	op_stat_scalar_write("Channel Throughput S",(double)rcvd_pkts/cur_time);
	FOUT;
	}

进程接口的属性设置如下图所示。
在这里插入图片描述
收信机的节点模型如下图所示。
在这里插入图片描述
为 rx_proc 模块指配进程模型,节点接口中hidden所以属性,设置为仅支持固定节点。


四、创建总线型链路模型

新建一个仅支持总线和总线接口链路模型,按照下图设置,保存该模型。
在这里插入图片描述


五、创建网络模型

新建一个工程文件,建立一个 Office 场景,尺寸设为 700m × 700m。
在对象面板里把前面创建的发送节点、接收节点和链路模型添加到当前场景的面板中。
在菜单栏选择 Topology——>Rapid Configuration,选择 Bus,按照下图所示设置各项参数。
在这里插入图片描述
然后选中某一条tap,右键选择 Select Similar Links,然后编辑其属性,将其 model 设置为前面自己新建的链路模型,勾选底部Apply to selected objects,点击 OK 即可。
在对象面板中找到接收节点模型,将其添加到项目中,并选择自己创建的链路模型中的总线接头,连接总线和节点。
完成后的 ALOHA 网络模型如下图所示。
在这里插入图片描述
全局属性 max packet count 的值设为 1000。
在这里插入图片描述
对象属性 Packet Interarrival Time 设置为多指数型随机变量,均值为20,30,40,…,170,180。
在这里插入图片描述
仿真时间设置为 3 小时。
以上设置完成后复制场景,在复制的场景里去除掉原有的 ALOHA 发送节点,加入 CSMA 发送节点,执行方法是选中其中一个,然后右键选择相似的节点,再右键其中的一个,将其节点模型选为 CSMA 的即可,然后勾选底部 Apply to selected objects,点击 OK 即可。
完成后的 CSMA 网络模型如下图所示。
在这里插入图片描述
注意给总线接头增加接收功能,由于 CSMA 需要侦听信道后发送信号,因而既需要发送机也需要接收机,其箭头是双向的。


六、查看仿真结果

仿真参数在前面已经设置好了,只要运行仿真即可。
采用 ALOHA 协议仿真后的结果如下图所示。
在这里插入图片描述
上图中的 X 轴是信道业务量,Y 轴是吞吐量,仿真随机种子数是1280。由仿真结果可知,在采用 ALOHA 协议仿真时,随着业务量的增大,吞吐量先增大然后减小。
采用 CSMA 协议仿真后的结果如下图所示。
在这里插入图片描述
上图中的 X 轴是信道业务量,Y 轴是吞吐量,仿真随机种子数是1500。由仿真结果可知,在采用 CSMA 协议仿真时,随着业务量的增大,吞吐量的增长速率慢慢变小,然后趋于稳定。
点击 Show 后可以设置将两个曲线绘制到一起,如下图所示。
在这里插入图片描述
也可以右击编辑图形属性,修改左上方的 title。
从上图的仿真结果可以看出,采用 ALOHA 协议最大的吞吐量不会超过0.18,而采用 CSMA 协议最大的吞吐量不会超过0.5。总体对比来说,CSMA 的性能要比 ALOHA 的性能好很多。
随机数种子的数量大小也会对吞吐量曲线的走向产生影响,大家可以自己试试。


总结

以上就是 OPNET Modeler 例程——ALOHA 和 CSMA 性能对比的所有内容了,希望本文能够让你了解 ALOHA 和 CSMA 的区别!
参考文章:基于OPNET的通信网仿真/郜林著. ——西安:西安电子科技大学出版社,2018.2

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

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

相关文章

【多线程】常见的锁策略

✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 ✨每日一语:老当益壮,宁移白首之心;穷且益坚,不坠青云之志。 目 录 🏳️一. 乐观锁 vs 悲观锁🏴二. 普通的互…

【数据分析之道-NumPy(七)】numpy字符串函数

文章目录 专栏导读1、函数说明2、add()函数3、multiply()函数4、center()函数5、capitalize()函数6、title()函数7、lower()函数8、upper()函数9、split()函数10、splitlines()函数11、strip()函数12、join()函数 专栏导读 ✍ 作者简介:i阿极,CSDN Pytho…

2023-04-16 学习记录--C/C++-邂逅C/C++

一、固定格式 ⭐️ stdio的理解: abbr.标准输入输出&#xff08;standard input/output&#xff09;。 #include <stdio.h> int main() {... // 表达式return 0; }二、printf语句&#xff08;输出语句&#xff09; ⭐️ &#xff08;一&#xff09;、前提【重要】 注意&a…

小程序组件化开发

前言 随着小程序的普及&#xff0c;越来越多的开发者开始使用小程序进行开发&#xff0c;而小程序的组件化开发已经成为了一种标配的开发模式。本文将深入介绍小程序组件化开发的相关知识&#xff0c;包括组件的定义、生命周期、通信和使用等方面&#xff0c;帮助大家更好地理解…

小程序WebSocket详解

1&#xff0c;什么是WebSocket&#xff1f; WebSocket是一种用于在Web浏览器和服务器之间进行双向通信的协议&#xff0c;而小程序WebSocket是在小程序中使用WebSocket协议进行双向数据通信的一种技术。它可以在单个TCP连接上进行全双工通信&#xff0c;实现实时、高效的数据通…

cesium加载geoserver发布的mvt服务

cesium 本身并不支持矢量切片的加载&#xff0c;所以需要借助其他工具进行解析。在Canvas中把矢量瓦片绘制好了&#xff0c;以图片形式像WMTS一样向Cesium提供图片服务就行了&#xff0c;当然也可以采用中间件的形式在后台把服务渲染好再以服务形式提供给前端。 方法1&#xf…

第八回:如何使用Stack Widget

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了GirdView Widget,本章回中将介绍 Stack这种Widget&#xff0c;闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 在Flutter中Stack主要用来叠加显示其它的Widget&#xff0c;类似我们日常生活中的楼层或者…

【Unity3D】魔方

1 需求实现 绘制魔方 中基于OpenGL ES 实现了魔方的绘制&#xff0c;实现较复杂&#xff0c;本文基于 Unity3D 实现了 2 ~ 10 阶魔方的整体旋转和局部旋转&#xff0c;详细需求如下&#xff1a; 用户通过选择魔方阶数&#xff0c;渲染指定阶数的魔方&#xff0c;并且可以自动打…

强化学习原理及应用作业之动态规划算法【SYSU_2023SpringRL】

强化学习原理及应用作业之动态规划算法【SYSU_2023SpringRL】 题目描述:任务一:动态规划方法一、策略迭代算法1、代码2、结果3、思路讲解策略评估策略提升二、价值迭代算法1、代码2、结果3、思路讲解算法整个流程总结题目描述: 本次实践作业将在以下环境进行: 该环境由一…

doris学习之路(一)初识Doris

Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;以极速易用的特点被人们所熟知&#xff0c;仅需亚秒级响应时间即可返回海量数据下的查询结果&#xff0c;不仅可以支持高并发的点查询场景&#xff0c;也能支持高吞吐的复杂分析场景。基于此&#xf…

win10+Ubuntu双系统安装教程

1、下载Ubuntu镜像文件 Ubuntu各个版本的安装镜像文件可以从华为云下载&#xff1a; http://repo.huaweicloud.com/ubuntu-releases/ Ubuntu桌面版的安装镜像文件名为&#xff1a;ubuntu-<版本号>-desktop-amd64.iso 2、下载安装镜像工具 用win32diskImage 网址为Win…

初始c++语法

我们在C语言的基础之上进行c语言的学习。对于我们的c语言来说&#xff0c;c兼容C语言&#xff0c;所以我们以前编写的C语言的程序在c平台上也是可以运行的。唯一不同的就是我们的c对于我们C语言的部分语法做出了优化以及引入了面向对象的概念。所以在刚开始学习c的时候我们可以…

真题详解(归并)-软件设计(五十三)

真题详解&#xff08;UML部署图&#xff09;-软件设计&#xff08;五十二)https://blog.csdn.net/ke1ying/article/details/130233656 语句覆盖<判定覆盖<条件覆盖<路径覆盖。 2、ISO/IEC 9126软件质量模型中对软件质量定义&#xff1a; 易测试性、易分析性、稳定性、…

【FPGA-Spirit_V2】基于FPGA的循迹小车-小精灵V2开发板

&#x1f389;欢迎来到FPGA专栏~基于FPGA的循迹小车 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能…

Contrastive Representation Learning 对比表征学习(二)关键成分

原文翻译自这里 关键成分 大量数据增强 给定一训练样本&#xff0c;在计算其相关损失之前通常需要数据增强技术为该样本添加噪声。适度的数据增强设定对于学习一个优秀的&#xff0c;泛化性好的嵌入特征是至关重要的。其在不改变语义信息的同时将些微变量引入到样本之中&…

Windows环境下实现设计模式——备忘录模式(JAVA版)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天总结一下Windows环境下如何编程实现备忘录模式&#xff08;设计模式&#xff09;。 不知道大家有没有这样的感觉&#xff0c;看了一大堆编程和设计模式的书&#xff0c;却还是很难理解设计模式&#xff…

【使用ChatGPT自动化】批量转换.csv文件为.xlsx文件

第1次提问&#xff1a; 我&#xff1a;我想使用Python批量转换.csv文件为.xlsx文件&#xff0c;请你提供代码 它&#xff1a;好的&#xff0c;以下是使用Python批量转换.csv文件为.xlsx文件的代码&#xff1a; import os import glob import pandas as pddef csv_to_xlsx(pa…

MATLAB数值运算(六)

目录 实验目的 实验内容 原创代码&#xff0c;仅供参考&#xff0c;不要直接CV呀 ~_~ 实验目的 1&#xff09;掌握定义符号对象和创建符号表达式的方法&#xff1b; 2&#xff09;掌握符号运算基本命令和规则&#xff1b; 3&#xff09;掌握符号表达式的运算法则以及符号矩阵…

A100 Jeston TX1TX2使用教程-接口说明

EdgeBox_Umate_A100是一款嵌入式人工智能计算机&#xff0c;能够为各类终端设备赋予人工智能的能力&#xff0c;降低终端智能的开发门槛。EdgeBox_Umate_A100搭载了移动处理器——NVIDIA Jetson TX1&#xff0c;并且兼容TX2&#xff0c;是最适合边缘计算的高性能平台。 A100 算…

【Javascript - 力扣每日一题】13. 罗马数字转整数

题目描述 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即为两个并列的 1 。12 写做 XII &#xff0c;即为…