文章目录
- 概述
- 一、创建 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=Ge−2G
可以推知,当 G=0.5 时,
S
m
a
x
=
1
2
e
≈
0.18
S_{max}=\frac{1}{2e}≈0.18
Smax=2e1≈0.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+e−GG(1+G)e−G
可以推知,当 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