Tcl代码:
# Kezhiheng, experiment 4, test RNG, 3 tcp flow # Usage: ns xx.tcl flowno seed if {$argc!=3} { puts "Usage: ns xx.tcl flowno_ seed_ queue_" puts "queue_ DropTail or RED" exit } set par1 [lindex $argv 0] set par2 [lindex $argv 1] set par3 [lindex $argv 2] #Create a simulator object set ns [new Simulator] set tracefd [open resultdata/zout-$par3-$par1-$par2.tr w] $ns trace-all $tracefd set namtracefd [open out.nam w] $ns namtrace-all $namtracefd proc finish {} { global ns tracefd namtracefd $ns flush-trace close $tracefd close $namtracefd # exec nam out.nam & exit 0 } # 3 TCP flow set nflow $par1 # Set router nodes set r1 [$ns node] set r2 [$ns node] $ns duplex-link $r1 $r2 1Mb 10ms $par3 $ns queue-limit $r1 $r2 10 # Set TCP src, dest, link 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 } # Set TCP agent and FTP traffic for {set i 1} {$i<=$nflow} {incr i} { set tcp($i) [new Agent/TCP] set sink($i) [new Agent/TCPSink] $ns attach-agent $s($i) $tcp($i) $ns attach-agent $d($i) $sink($i) $ns connect $tcp($i) $sink($i) set ftp($i) [new Application/FTP] $ftp($i) attach-agent $tcp($i) $ftp($i) set type_ FTP } set rng [new RNG] $rng seed $par2 set rvStart [new RandomVariable/Uniform] $rvStart use-rng $rng $rvStart set min_ 0.0 $rvStart set max_ 1.0 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" } $ns at 7.0 "finish" $ns run
从tr提取吞吐量数据的awk代码:
# Measure the throughput by the trace file BEGIN{ # program initialize init = 0; startT=0; endT=0; } { action = $1; time = $2; from = $3; to = $4; type = $5; pktsize = $6; flow_id = $8; src = $9; dst = $10; seq_no = $11; packet_id = $12; # Record pkttype=tcp, action=r, time 1s~5s if(action=="r" && type=="tcp" && time>=1.0 && time<=5.0 && \ ( (from==1 && to==3)||(from==1 && to==5)||(from==1 && to==7) ) ) { if(init==0) { startT = time; init = 1; } pkt_byte_sum += pktsize; endT=time; } } END { # When read over, start to calculate #printf("startT:%f,endT:%f\n",startT,endT); #printf("pkt_byte_sum:%d\n",pkt_byte_sum); time = endT-startT; throughput=pkt_byte_sum * 8 / time / 1000000; #printf("throughput:%.3f Mbps\n", throughput); printf("%.3f\n", throughput); }
求平均的awk代码:
# Measure the throughput by the trace file BEGIN{ # program initialize sum = 0; cnt = 0; } { thrpt = $1; cnt = cnt + 1; sum = sum + thrpt; } END { # When read over, start to calculate ave = sum/cnt; printf("%d %.3f\n", flowno, ave); }
综合的perl代码:
#!/usr/bin/perl #1. flowno, 1,3,5,7,9 #2. seed, 1,2,3,4,5 #3. zresult-flowno-seed, 5*5=25 files # flow max number, should be odd my $flowmax=15; my $queue="DropTail"; #my $queue=RED; for ($i=1; $i<=$flowmax; $i=$i+2) { print " i=$i\n"; for ($j=1; $j<=5; $j++) { system("ns rng_tcp.tcl $i $j $queue"); $f1="resultdata/zout-$queue-$i-$j.tr"; $f2="resultdata/zresult-$queue-$i"; system("awk -f rng_tcp.awk $f1 >> $f2"); print "j=$j\n"; } } #1. flowno, 1,3,5,7,9 #2. calc average print "Start to calc average...\n"; for ($i=1; $i<=$flowmax; $i=$i+2) { print "i=$i\n"; $f1="resultdata/zresult-$queue-$i"; system("awk -v flowno=$i -f ave.awk $f1 >> zres-$queue"); }
绘图代码:
#!/bin/bash gnuplot -persist<<EOF set terminal gif set output "thrpt.gif" set title "throughput RED vs DropTail" set xlabel "FTP flow number" set ylabel "throughput/kbps" #unset key plot "zres-DropTail" with linespoints, "zres-RED" with linespoints EOF
RED,DropTail,的对比图,不过似乎没什么区别,还应该比较队列长度和吞吐量的关系
说明:
1、Tcl可以使用下面的代码提供参数输入:
if {$argc!=3} { puts "Usage: ns xx.tcl flowno_ seed_ queue_" puts "queue_ DropTail or RED" exit } set par1 [lindex $argv 0] set par2 [lindex $argv 1] set par3 [lindex $argv 2]
2、perl代码里面可以实现tcp flow的设定,随机数的设定,queue的设定,代码:
# flow max number, should be odd my $flowmax=15; my $queue="DropTail"; #my $queue=RED;
3、由于大批量的数据结果有许多文件,可以放到文件夹中,文件夹要提前建立,tcl中open。。。不能建立文件夹
当时记得笔记:
测试了3条tcp流通过一条瓶颈链路时,链路的吞吐量 通过采用不同的随机启动时间,得到不同的试验结果,可以平均一下 ################################ 可完善地方: 使用shell #!/bin/bash ns rng_tcp.tcl awk -f rng_tcp.awk out.tr 如果ns xxx.tcl 这句可以带参数,那么就可以在shell中,写循环测试不同数量ftp流的吞吐率了 外层循环使用ftp流的数量 内层循环使用随机数种子 ################################### xx.tcl 后面可以带参数,tcl文件里还是$argc, $argv获取 使用perl可以实现ns命令的参数变化 system("ns rng_tcp.tcl $i $j"); > < 是输入输出重定向,创建新文件 >> << 也是输入输出重定向,追加旧文件 执行流程: ns_awk.pl : ns + awk(提取tr文件数据) total.pl : awk(求平均) plot.sh : 绘图 初步感受到了linux批处理的强大 ###################################### 下一步测试: 1.将结果文件放入文件夹中,tcl路径语法 要提前建立好文件夹,下面语句不能建立文件夹 set tracefd [open resultdata/zout-$par3-$par1-$par2.tr w] 2.将中间瓶颈链路的Queue机制改变,测试效果 RED vs DropTail 结果:针对不同tcp flow,两种queue策略的吞吐量没什么区别,应该比较吞吐量和平均队列长度的关系