从Linux学到NS2:(三)一个排队系统的仿真实例

原创 2018年04月16日 16:30:40

本篇问题:

       通过上篇对NS2各组件的了解和使用,本篇将更进一步地应用NS2,仿真得到一确定时延下队列溢出的概率,并附上Matlab算法和NS2代码。

1. 首先对上篇文章提到的问题进行明确和补充:

(1)进一步了解分裂对象模型:TclCL连接Tcl和C++的对象。Tcl类定义了解释器访问及通信方法,是解释器的真正实例;TclObject类储存bindings接口,绑定解释对象的实例变量(instance variables)和编译对象的C++成员变量(member variables)。每个对象由用户在解释器中创建,同时在编译层中创建相应投影对象(shadow object),映射机制在TclClass类中;

(2)OTcl变量任何变化都会被追踪到,并且要求当前C++与OTcl对应变量的值在解释器每次访问之后都保持一致(instvar类保证);

(3)创建解释类对象时,解释器执行其构造函数,同时传递用户设定的参数。相应地,NS2自动创建相应编译对象(投影对象的基类构造函数实现),返回对象的handler。

2. Matlab算法(研究Poisson流与EXPOO流聚合下,队列溢出概率与时延的关系):                                                     

%时刻i时队长L[i],泊松流的到达B[i],EXPOO流的到达slot[i],服务速度C[i]
delay=1:1:10;           %循环十次
i=1:1:M;                %在一确定时延下循环足够多次实验
L[i]=L[i-1]+slot[i]+B[i]-C[i]; %泊松流由随机种子输出
MaxL=delay*(lamda+Ron); %设最大队长为时延与泊松流和EXPOO流到达强度之和的乘积
L[i]>MaxL?overflow++:i++;
overflowP=overflow/M;   %得到该时延下的队列溢出概率

                                     EXPOO流                                                                  Xlabel:delay    Ylabel:overflowP 

3. NS2相关Tcl代码:

set ns [new Simulator]

//打开trace文件
set nd [open out.tr w]
$ns trace-all $nd
set namtracefd [open poisson.nam w]
$ns namtrace-all $namtracefd
//设置路由器(在ns2中,路由器就是节点),也可以设置各节点的orient和color
set r1 [$ns node]
set r2 [$ns node]
$ns duplex-link $r1 $r2 4.3kb 900ms DropTail
//设置r1与r2之间队列缓冲区的最大值为2.9个packet,每个packet的大小默认为40个字节,~/ns/tcl/lib/ns-default.tcl
$ns queue-limit $r1 $r2 2.9
//设置UDP的源节点和目的节点,并分别与两个路由器相连(创建链路)
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
$ns duplex-link $n0 $r1 10Mb 1ms DropTail
$ns duplex-link $n1 $r1 10Mb 1ms DropTail
$ns duplex-link $r2 $n2 1Mb 90ms DropTail
//建立UDP单向代理,udp为发送者,sink为接受者,并分别连接到相应节点上,然后建立UDP连接,在UDP建立应用    
    set udp0 [new Agent/UDP]
    set udp1 [new Agent/UDP]
    set sink0 [new Agent/Null]
set sink1 [new Agent/Null]
    $ns attach-agent $n0 $udp0
    $ns attach-agent $n1 $udp1
    $ns attach-agent $n2 $sink0
$ns attach-agent $n2 $sink1
    $ns connect $udp0 $sink0
    $ns connect $udp1 $sink1
//设置随机数产生器,便于确定EXPOO过程的初态
set rng [new RNG] 
$rng seed 1

set RVstart [new RandomVariable/Uniform]
$RVstart set min_ 0
$RVstart set max_ 1
$RVstart use-rng $rng
//在udp上建立应用,Poisson流量发生器,Poisson的产生方法见上一篇文章
set e [new Application/Traffic/Poisson]
$e attach-agent $udp0
$e set packetSize_ 890
$e set burst_time_ 0ms
$e set idle_time_ 2500ms
$e set rate_ 100k
    set startT1 [expr [$RVstart value]]
    puts "startT1 $startT1 sec"
    set endT1 [expr ($startT1 + 50)]
    puts "endT1 $endT1 sec"
//事件调度
    $ns at $startT1 "$e start"
    $ns at $endT1 "$e stop"
//建立EXPOO流量发生器
set f [new Application/Traffic/Exponential]
$f attach-agent $udp1
$f set packetSize_ 900
$f set burst_time_ 4200ms
$f set idle_time_ 600ms
$f set rate_ 1190
    set startT2 [expr [$RVstart value]]
    puts "startT2 $startT2 sec"
    set endT2 [expr ($startT2 + 50)]
    puts "endT2 $endT2 sec"
//事件调度
    $ns at $startT2 "$f start"
    $ns at $endT2 "$f stop"
//仿真结束,关闭所有文档
proc finish {} {
    global ns nd namtracefd
    $ns flush-trace
    close $nd
    close $namtracefd
    exec nam poisson.nam &   
    exit 0
}
//事件调度
$ns at 70.0 "finish"
//运行模拟
$ns run

已解决的问题:

1. 设计思路:

(1)仿真映射关系:

(理论到仿真做出的等效)

Matlab下的仿真NS2Tcl等效组件NS2nam视图效果
 最大队长路由之间队列缓冲区链路传输方块的长度
时延直接设置链路时延链路传输方块的间隔
服务速度直接设置链路传输速度链路传输方块的移速
EXPOOEXPOO流量发生器size_ 900bytes包长
“On”状态 EXPOO参数burst_tine_显示包传输
“Off”状态EXPOO参数idle_time_ 不显示包传输

                     泊松流                                      EXPOO等效泊松流                                         size_ 890bytes包长

(2)网络拓扑:

# n0 - 
#      | - r1 - r2 - n2
# n1 -

(3) 队列调度策略:

Droptail:比较简单,本次初步仿真时采用;

RED:主要计算平均队长和计算丢弃分组概率,以后仿真时考虑使用该策略。

2. 给出nam视图仿真结果:


其中,节点0、1为路由,节点2、3上绑定了发送方UDP,并分别绑定了EXPOOPoisson流量发生器,节点4上的Agent为Null(UDP接收方),注意图中的时间指针TIME,显示了所指时刻各链路上包传输情况。图中链路监测标记顺序如下:

0->1:(节点0到1的丢包情况)

3→0:(节点3到0的发包情况)

2->0:(节点2到0的发包情况)

1->4:(节点1到4的收包情况)

横向为时间轴。

3. 根据仿真结果计算队列溢出概率:

(1)NS2运行到如下图时间时的包传输状态(标记8为即将Drop的包):

   

(2)包丢失(标记8):

          

【注】:在trace文件中查询第一列为d的包丢失,提取命令为:gawk ‘$1~d {print $0}’ out.tr,进而得到丢包个数(队列溢出次数),最终得到队列溢出概率。

(3)结论:丢包数(overflow)=3;收包数=27;丢包概率overflowP= 3/(3+27=0.1=10%

存在的问题:

        本文只给出了研究确定时延下队列溢出的一次仿真实验,没有对不同时延下的队列溢出进行对比分析;流量发生器产生数据的强度比较低,仿真时长设置的特别大(70s)但服务包的总数(30个)并不是很多。

任务:

       单看一组数据是没有意义的 ,要改变时延约束,通过NS2仿真研究时延与队列溢出概率的关系;利用好trace文件,根据包的发送和接收间隔来获取时延;可以尝试在接收节点4上只绑定一个Null让其与两个UDP发送方连接。仿真研究时延与服务超时概率的关系(无限长队列)。

关于补充的问题再推荐几篇文章:NS内部类继承关系:https://blog.csdn.net/bbs375/article/details/72799630

                                                            理解OTcl/TclCL(很详细很专业):https://blog.csdn.net/ysynhtt/article/details/38684751

                                                            各种队列管理机制:https://blog.csdn.net/zengxiantao1994/article/details/53079958


 

如何将一个文件分割成多个小文件

如何将一个文件分割成多个小文件作者:徐景周下载实例代码(http://www.csdn.net/cnshare/soft/6/6235.shtm) 你也许会遇到到这样一个问题?当你有一个较大的软件,而...
  • jz_x
  • jz_x
  • 2002-01-11 17:37:00
  • 1205

linux下ns2下载、安装与环境…

原文地址:linux下ns2下载、安装与环境变量设置作者:学习and学习ns2各版本官网下载地址:http://ftp.isi.edu/nsnam/dist/                    ...
  • Sun19910114
  • Sun19910114
  • 2014-08-19 16:26:31
  • 3589

离散事件仿真简例——银行排队系统

为什么要仿真 说起为什么需要仿真,理由可以列举很多,简要来说,它是在纯数学建模和实际系统的优缺点之间的一个折中。相对数学模型来说,仿真不需要高深的数学技巧,也不需要作过多的简化和假设,并且在求解复杂...
  • loveRooney
  • loveRooney
  • 2013-09-09 20:39:34
  • 7258

NS2网络仿真环境的搭建和使用

一实验概述: 1学会安装和使用NS2;熟悉NS2的文档结构;掌握NS2的仿真环境、使用界面和操作方法。 2学会安装NS2仿真环境和配置。 3了解NS2的工作原理和程序组成。 4熟悉NS2中的脚...
  • qq_28012315
  • qq_28012315
  • 2015-08-29 12:50:45
  • 1581

ns2模拟仿真的一般过程及要点

ns2模拟仿真的一般过程及要点   在这里简单介绍ns2模拟仿真中的一般过程及要点 1)添加ns2的新组件,TclCL机制的实现及新组件的C++实现 最为关键的一步,该步将研究...
  • u010533400
  • u010533400
  • 2016-11-23 15:21:27
  • 1147

ns-2.34安装包

  • 2013年04月16日 14:05
  • 41.25MB
  • 下载

M/M/1排队系统仿真 matlab实验报告

  • 2012年06月27日 11:32
  • 927KB
  • 下载

proteus下仿真排队叫号机系统原理图(完整版)

  • 2012年09月01日 16:56
  • 121KB
  • 下载

理发馆排队问题系统仿真

  • 2010年04月17日 15:44
  • 87KB
  • 下载

flexsim排队系统仿真模型

  • 2015年07月27日 23:06
  • 31KB
  • 下载
收藏助手
不良信息举报
您举报文章:从Linux学到NS2:(三)一个排队系统的仿真实例
举报原因:
原因补充:

(最多只允许输入30个字)