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

本篇问题:

       通过上篇对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,进而得到丢包个数(队列溢出次数),最终得到队列溢出概率。计算丢包的awk代码:

/*附部分trace文件内容*/
+ 48.151231 3 0 exp 900 ------- 0 3.0 4.1 1424 1448 //大小900bytes的包为poisson包,序号1424,id:1448
- 48.151231 3 0 exp 900 ------- 0 3.0 4.1 1424 1448
r 48.152951 3 0 exp 900 ------- 0 3.0 4.1 1424 1448
+ 48.152951 0 1 exp 900 ------- 0 3.0 4.1 1424 1448
d 48.152951 0 1 exp 900 ------- 0 3.0 4.1 1424 1448
+ 48.174988 2 0 exp 890 ------- 0 2.0 4.0 24 1449   //890为EXPOO流的包,有独自的排序24,id:1449
- 48.174988 2 0 exp 890 ------- 0 2.0 4.0 24 1449
+ 48.175231 3 0 exp 900 ------- 0 3.0 4.1 1425 1450
- 48.175231 3 0 exp 900 ------- 0 3.0 4.1 1425 1450
r 48.1767 2 0 exp 890 ------- 0 2.0 4.0 24 1449
+ 48.1767 0 1 exp 890 ------- 0 2.0 4.0 24 1449
d 48.1767 0 1 exp 890 ------- 0 2.0 4.0 24 1449
r 48.176951 3 0 exp 900 ------- 0 3.0 4.1 1425 1450
+ 48.176951 0 1 exp 900 ------- 0 3.0 4.1 1425 1450
d 48.176951 0 1 exp 900 ------- 0 3.0 4.1 1425 1450
/*获取丢包数与目的节点4最后的收包数(节点较多且设置了多跳时,正确处理trace文件算法的逻辑性要更强)*/
BEGIN {
#初始化发包、丢包数
   overflow = 0;
   sum = 0;
}
{
   action = $1;destnode = $4;
#统计收包总数
   if ( action == "+"&&destnode="4") sum++;            
#统计丢包数
   if ( action == "d") overflow++;
}
END {
   printf("number of packets sent:%d lost:%d\n", sum, overflow);
}
(3)结论:丢包数(overflow)=3;收包总数(sum)=27;丢包概率overflowP= 3/(27+3)=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://blog.chinaunix.net/uid-9195812-id-2006765.html

阅读更多
个人分类: 摸爬滚打NS2
上一篇从Linux学到NS2:(二)搭建NS2中重要组件
下一篇从Linux学到NS2:(三)de番外
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭