NS2网络模拟计算吞吐量
吞吐量(throughput):单位时间内,所有目的节点的平均接受数据速率。
Throughput = (某段时间内所有目的节点的数据接受量) / 时间。
实验链路采用FIFO队列管理机制,三个源节点,三个目的节点,之间有三条FTP数据流,有两个路由器。
1 set ns [new Simulator]
2
3 #打开trace文件
4 set nd [open out.tr w]
5 $ns trace-all $nd
6
7 #设定TCP流的大小
8 set nflow 5
9
10 #设置路由器(在ns2中,路由器就是节点)
11 set r1 [$ns node]
12 set r2 [$ns node]
13 $ns duplex-link $r1 $r2 1Mb 10ms DropTail
14
15 #设置r1与r2之间队列缓冲区的最大值为10个packet,每个packet的大小默认为40个字节,~/ns/tcl/lib/ns-default.tcl
16 $ns queue-limit $r1 $r2 10
17
18 #设置TCP的源节点和目的节点,各三个,并分别与两个路由器相连
19 for {set i 1} {$i <= $nflow} {incr i} {
20 set s($i) [$ns node]
21 set d($i) [$ns node]
22
23 $ns duplex-link $s($i) $r1 10Mb 1ms DropTail
24 $ns duplex-link $d($i) $r2 10Mb 1ms DropTail
25 }
26
27 #建立TCP单向代理,tcp(i)为发送者,sink(i)为接受者,并分别连接到相应节点上,然后建立TCP连接,在TCP上建立FTP应用
28 for {set i 1} {$i <= $nflow} {incr i} {
29 set tcp($i) [new Agent/TCP]
30 set sink($i) [new Agent/TCPSink]
31 $ns attach-agent $s($i) $tcp($i)
32 $ns attach-agent $d($i) $sink($i)
33 $ns connect $tcp($i) $sink($i)
34
35 set ftp($i) [new Application/FTP]
36 $ftp($i) attach-agent $tcp($i)
37 $tcp($i) set type_ FTP
38 }
39
40 set rng [new RNG] ;#设置随机数产生器
41 $rng seed 1
42
43 set RVstart [new RandomVariable/Uniform]
44 $RVstart set min_ 0
45 $RVstart set max_ 1
46 $RVstart use-rng $rng
47
48
49 for {set i 1} {$i <= $nflow} {incr i} {
50 set startT($i) [expr [$RVstart value]]
51 puts "startT($i) $startT($i) sec"
52 set endT($i) [expr ($startT($i) + 5)]
53 puts "endT($i) $endT($i) sec"
54
55 $ns at $startT($i) "$ftp($i) start"
56 $ns at $endT($i) "$ftp($i) stop"
57 }
58
59 proc finish {} {
60 global ns nd
61
62 close $nd
63 $ns flush-trace
64 exit 0
65 }
66
67 $ns at 7.0 "finish"
68 $ns run
模拟结束,生成trace文件,可以用awk分析数据。在模拟时,节点的标号和节点的创建顺序有关,所以r1,r2,s1,d1,s2,d2,s3,s3...分别对应0,1,2,3,4,5,6,7,8...
TCL提供三种形式的置换:变量置换、命令置换、反斜杠置换。
命令置换:即用$符号。
命令置换:[]
反斜杠置换:类似C语言转义符。
除了使用反斜杠外,TCL 提供另外两种方法来使得解释器把分隔符和置换符等特殊字符当作普通字符,而不作特殊处理,这就要使用双引号和花括号({})。
TCL 解释器对双引号中的各种分隔符将不作处理,但是对换行符 及$和[]两种置换符会照常处理。
而在花括号中,所有特殊字符都将成为普通字符,失去其特殊意义,TCL 解释器不会对其作特殊处理。