NS-2随机数产生器:
1.随机数产生器所产生的数值是由种子和分布所控制的,不同的种子或者是分布就会产生不同的随机数。当一个种子和分布决定之后,随机数产生器会产生一出一个由一长串不同数字所组成的表格,当需要一个随机数时,随机数产生器就会去选取这个表格中的一个数字,当需要另一个随机数时,随机数产生器就会去选取这个表格中第二个数字,依此类推。所以当使用种子和分布相同时,得到的随机数就会相同;若不同时,得到的随机数就会不同。在NS2中,若种子的值是0,表示每次执行程序的时候,随机数产生器都会产生出不同的表格,也就是说每次的得到随机数都不相同。
2.设置种子
3.设置分布
测试随机数产生器:
set
$rng
puts
set r1 [new RandomVariable/Pareto]
$r1
$r1
$r1
for {set i 1} {$i<=3} {incr i} {
}
puts
set r2 [new RandomVariable/Constant]
$r2
$r2
for {set i 1} {$i<=3} {incr i} {
}
puts
set r3 [new RandomVariable/Uniform]
$r3
$r3
$r3
for {set i 1} {$i<=3} {incr i} {
}
puts
set r4 [new RandomVariable/Exponential]
$r4
$r4
for {set i 1} {$i<=3} {incr i} {
}
puts
set r5 [new RandomVariable/HyperExponential]
$r5
$r5
$r5
for {set i 1} {$i<=3} {incr i} {
}
一个在网络仿真中应用到随机数产生器的完整实例:
1.仿真的网络结构图
2.效果评比指标:吞吐量(Throughput)
另外要补充一点的,在论文的实验中,在计算数据接收量并不是从模拟的起始时间就开始统计,而是让模拟经过一段时间,进入稳态才会开始统计。
3.TCL程序代码(lab4_2.tcl)
set ns [new Simulator]
#打开一个trace file,用来记录封装包传送过程
set nd [open out.tr w]
$ns trace-all $nd
#打开一个NAM记录文件
set nf [open out.nam w]
$ns namtrace-all $nf
#设置TCP flow的数目
set nflow 3
#设置路由器
set r1 [$ns node]
set r2 [$ns node]
$ns duplex-link $r1 $r2 1Mb 10ms DropTail
#设置queue limit为10个packet
$ns queue-limit $r1 $r2 10
#设置TCP的来源节点和目的节点
#建立来源和目的节点与路由器的链路
for { set i 1 } { $i<=$nflow } { incr i } {
set s($i) [$ns node]
set d($i) [$ns node]
$ns duplex-link $s($i) $r1 10Mb 1ms DropTail
$ns duplex-link $r2 $d($i) 10Mb 1ms DropTail
}
#建立TCP的联机,并在TCP联机上建立FTP应用程序
for { set i 1 } { $i<=$nflow } { incr i } {
}
set rng [new RNG]
$rng seed 1
set RVstart [new RandomVariable/Uniform]
$RVstart set min_ 0
$RVstart set max_ 1
$RVstart use-rng $rng
#由随机数产生器去决定每一条flow的起始时间(在0~1s之内)
#每条flow传输5s,并在指定的时间,让ftp开始传输和结束
for {set i 1} {$i<=$nflow} {incr i} {
set startT($i) [expr [$RVstart value]]
puts "startT($i) $startT($i) sec"
set endT($i) [expr ($startT($i)+5)]
puts "endT($i) $endT($i) sec"
$ns at $startT($i) "$ftp($i) start"
$ns at $endT($i) "$ftp($i) stop"
}
proc finish {} {
global ns nd nf
close $nd
close $nf
$ns flush-trace
exec nam out.nam &
exit 0
}
#在第7秒时去调用finish函数来结束模拟
$ns at 7.0 "finish"
#执行模拟
$ns run
4.分析awk程序代码(4_2.awk)
BEGIN{
}
{
#记录类型是tcp 动作是dequeue
#由于新增结点时,结点建立的顺序为r1 r2 s1 d1 s2 d2 s3 d3
#结点id就为0 1 2 3 4 5 6 7
#记录在这段时间中离开队列的封包大小总和(in bytes)
}
END {
#计算1.0-5.0s的平均带宽
}
5.执行方法:
$ns lab4_2.tcl
$awk -f 4_2.awk out.tr
6.执行结果:
startT:0.000000 endT:4.993908
pkt_byte_sum:491960
throughput:0.788 Mbps