本篇问题:
通过上篇对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