⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xcp-tcp.tcl

📁 ns-2的文件包。多多下载
💻 TCL
字号:
# ----------------------- Test XCP Performance ------------------------------### Author: Dina Katabi, dina@ai.mit.edu# Last Update : 7/16/2002##-------------------------------------------------------------------------------##-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- Utility Functions -*-*-*-*-*-*-*-*--*-*-*-*-*-*-*-*-##--------- Creating the TOPOLOGY --------------------##       n0                             #       : \   Bottleneck            #       :  R0-----------------------R1#         /                            #       ni                         #Queue/XCP set tcp_xcp_on_ 1Agent/TCP set minrto_ 1proc set-red-params { qsize } {	Queue/RED set thresh_ [expr 0.6 * $qsize]	Queue/RED set maxthresh_ [expr 0.8 * $qsize]	Queue/RED set q_weight_ 0.001	Queue/RED set linterm_ 10	Queue/RED set bytes_ false ;	Queue/RED set queue_in_bytes_ false ;	Agent/TCP set old_ecn_ true	Queue/RED set setbit_     true}proc create-topology2 { BW delay qtype qsize numSideLinks deltaDelay } {    global ns         #Set the queue size to the pipe's size assuming the packet size is 1000 KByte    if { $qsize == 0 } { set qsize [expr round([expr ($BW / 8) * 2 * $delay])] }    set i 0    while { $i < 2 } {	global R$i	set R$i [$ns node]	incr i    }        $ns duplex-link $R0 $R1 [set BW]Mb [set delay]ms $qtype    $ns queue-limit $R0 $R1 $qsize    $ns queue-limit $R1 $R0 $qsize    # Give a global handle to the Bottleneck Queue to allow     # setting the RED paramters    global Bottleneck rBottleneck    set  Bottleneck  [[$ns link $R0 $R1] queue]     set  rBottleneck [[$ns link $R1 $R0] queue]    global l rl    set  l  [$ns link $R0 $R1]      set  rl [$ns link $R1 $R0]    global all_links     set all_links "$l $rl "    # The side links  have the same BW as the Bottleneck    set i 0    while { $i < $numSideLinks } {	global n$i q$i rq$i l$i rl$i	set n$i  [$ns node]	$ns duplex-link [set n$i]  $R0  [set BW]Mb [expr $delay + $i * $deltaDelay]ms $qtype	$ns queue-limit [set n$i]  $R0  $qsize	$ns queue-limit $R0 [set n$i]   $qsize	set  q$i   [[$ns link [set n$i]  $R0] queue] 	set  rq$i  [[$ns link $R0 [set n$i]] queue]	set  l$i    [$ns link [set n$i]  $R0] 	set  rl$i   [$ns link $R0 [set n$i]]	set all_links "$all_links [set l$i] [set rl$i] "	incr i    }}#------- Sender Class :# This is essentially an ftp senderClass GeneralSender  -superclass Agent # otherparams are "startTime TCPclass .."GeneralSender instproc init { id node rcvrTCP otherparams } {    global  ns    $self next    $self instvar tcp_ id_ ftp_ node_ tcp_rcvr_ tcp_type_    set id_ $id    set node_ $node    if { [llength $otherparams] > 1 } {	set TCP [lindex $otherparams 1]    } else { 	set TCP "TCP/Reno"    }    set   tcp_type_ $TCP    set   tcp_ [new Agent/$TCP]    $tcp_ set  packetSize_ 1000       $tcp_ set  class_  $id    set   ftp_ [new Source/FTP]    $ftp_ set agent_ $tcp_    $ns   attach-agent $node $tcp_    $ns   connect $tcp_  $rcvrTCP    set   tcp_rcvr_ $rcvrTCP    set   startTime [lindex $otherparams 0]    $ns   at $startTime "$ftp_ start"    puts  "initialized Sender $id_ at $startTime"}GeneralSender instproc trace-xcp parameters {    $self instvar tcp_ id_ tcpTrace_    global ftracetcp$id_     set ftracetcp$id_ [open  xcp$id_.tr  w]    set tcpTrace_ [set ftracetcp$id_]    $tcp_ attach-trace [set ftracetcp$id_]    if { -1 < [lsearch $parameters cwnd]  } { $tcp_ tracevar cwnd_ }    if { -1 < [lsearch $parameters seqno] } { $tcp_ tracevar t_seqno_ }}#--- Command line argumentsproc  set-cmd-line-args { list_args } {    global argv    set i 0    foreach a $list_args {	global $a	set $a  [lindex $argv $i]	puts "$a = [set $a]"	incr i    }}#-------------- Plotting functions -----------## plot a xcp traced varproc plot-xcp { TraceName nXCPs  PlotTime what } {    if {[string compare $what "cwnd_"] == 0} {	exec rm -f xgraph_cwnd.tcp	set f [open xgraph_cwnd.tcp w]	set a cwnd    } else {	exec rm -f xgraph_seqno.tcp	set f [open xgraph_seqno.tcp w]	set a seqno    }    puts $f "TitleText: $TraceName"    puts $f "Device: Postscript"    foreach i $nXCPs {	#the TCP traces are flushed when the sources are stopped	exec rm -f temp.tcp         exec touch temp.tcp	global ftracetcp$i 	if [info exists ftracetcp$i] { flush [set ftracetcp$i] }        set result [exec awk -v PlotTime=$PlotTime -v what=$what {	    {		if (( $6 == what ) && ($1 > PlotTime)) {		    print $1, $7 >> "temp.tcp";		}	    }	} xcp$i.tr] 	puts "$i : $result"	puts $f \"$what$i 	exec cat temp.tcp >@ $f	puts $f "\n"	flush $f    }    close $f    exec xgraph  -nl -m  -x time -y $what xgraph_$a.tcp &    return }# Takes as input the the label on the Y axis, the time it starts plotting, and the trace file tcl varproc plot-xcp-queue { TraceName PlotTime traceFile } {        exec rm -f xgraph.xcp_queue    exec rm -f temp.q temp.a temp.p temp.avg_enqueued temp.avg_dequeued temp.x temp.y     exec touch temp.q temp.a temp.p temp.avg_enqueued temp.avg_dequeued temp.x temp.y         exec awk -v PT=$PlotTime {	{	    if (($1 == "q" && NF>2) && ($2 > PT)) {		print $2, $3 >> "temp.q"	    }	    else if (($1 == "a" && NF>2) && ($2 > PT)) {		print $2, $3 >> "temp.a"	    }	    else if (($1 == "p" && NF>2) && ($2 > PT)) {		print $2, $3 >> "temp.p"	    }	}    }  $traceFile    set ff [open xgraph.xcp_queue w]    puts $ff "TitleText: DROPTAIL XCP queue$TraceName"    puts $ff "Device: Postscript \n"    puts $ff \"queue    exec cat temp.q >@ $ff      puts $ff \n\"ave_queue    exec cat temp.a >@ $ff    puts $ff \n\"prob_drop    exec cat temp.p >@ $ff    close $ff    exec xgraph  -P -x time -y queue xgraph.xcp_queue &}proc plot-red-queue { TraceName PlotTime traceFile } {        exec rm -f xgraph.red_queue    exec rm -f temp.q temp.a temp.p temp.avg_enqueued temp.avg_dequeued temp.x temp.y     exec touch temp.q temp.a temp.p temp.avg_enqueued temp.avg_dequeued temp.x temp.y         exec awk -v PT=$PlotTime {	{	    if (($1 == "Q" && NF>2) && ($2 > PT)) {		print $2, $3 >> "temp.q"	    }	    else if (($1 == "a" && NF>2) && ($2 > PT)) {		print $2, $3 >> "temp.a"	    }	    else if (($1 == "p" && NF>2) && ($2 > PT)) {		print $2, $3 >> "temp.p"	    }	}    }  $traceFile    set ff [open xgraph.red_queue w]    puts $ff "TitleText: RED TCP queue$TraceName"    puts $ff "Device: Postscript \n"    puts $ff \"queue    exec cat temp.q >@ $ff      puts $ff \n\"ave_queue    exec cat temp.a >@ $ff    puts $ff \n\"prob_drop    exec cat temp.p >@ $ff    close $ff    exec xgraph  -P -x time -y queue xgraph.red_queue &}proc plot-red {varname filename PlotTime} {        exec rm -f temp.$filename    exec touch temp.$filename        set result [exec awk -v PlotTime=$PlotTime -v what=$varname -v file=temp.$filename {	{	    if (( $1 == what ) && ($2 > PlotTime)) {		print $2, $3 >> file ;	    }  	}    } ft_red_Bottleneck.tr]    exec xgraph -P -x time -y $filename temp.$filename}#-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- Initializing Simulator -*-*-*-*-*-*-*-*--*-*-*-*-*-*-*-*-## BW is in Mbs and delay is in ms#set-cmd-line-args "seed qType BW nXCPs delay "set seed   472904set qType  XCPset BW     20; # in Mb/sset nXCPs  3; # Number of flowsset delay  10; # in msset ns          [new Simulator]$ns             use-scheduler Heapset rtg [new RNG]$rtg seed       $seedset f_all [open out.tr w]$ns trace-all $f_allset  qSize  [expr round([expr ($BW / 8.0) * 4 * $delay * 1.0])];#set buffer to the pipe size#set qSize [expr $qSize/4]set tracedXCPs       "0 1 2 3"set SimStopTime      30set PlotTime         0#---------- Create the simulation --------------------## Create topologyset-red-params $qSizecreate-topology2 $BW $delay $qType $qSize $nXCPs 0.0foreach link $all_links {    set queue [$link queue]    switch $qType {	"XCP" {		$queue set-link-capacity [[$link set link_] set bandwidth_];	}	"DropTail/XCP" {		$queue set-link-capacity-Kbytes [expr [[$link set link_] set bandwidth_] / 8000];	}	    default {		    puts "Incorrect qType $qType"		    exit 0	    }    }}# Create sources:set i 0while { $i < $nXCPs  } {    set StartTime [expr [$rtg integer 1000] * 0.001 * (0.01 * $delay) + $i  * 0.0]     set rcvr_XCP      [new Agent/XCPSink]    $ns attach-agent  $R1 $rcvr_XCP    set src$i         [new GeneralSender $i [set n$i] $rcvr_XCP "$StartTime TCP/Reno/XCP"]	#[[set src$i] set tcp_]  set  packetSize_ [expr 100 * ($i +10)]	[[set src$i] set tcp_]  set  packetSize_ 1000	[[set src$i] set tcp_]  set  window_     [expr $qSize * 10]	incr i}set StartTime 0.0900000000000000023set rcvr_TCP [new Agent/TCPSink]$ns attach-agent $R1 $rcvr_TCPset src$i [new GeneralSender $i $n0 $rcvr_TCP "$StartTime TCP/Reno"][[set src$i] set tcp_]  set  packetSize_ [expr 100 * ($i +10)][[set src$i] set tcp_]  set  window_     [expr $qSize * 10]incr i #---------- Trace --------------------#set i 0# Trace sourcesforeach i $tracedXCPs {	[set src$i] trace-xcp "cwnd seqno"}# Trace Queuesforeach queue_name "Bottleneck rBottleneck" {	set queue [set "$queue_name"]	switch $qType {		"XCP" {			global "ft_red_$queue_name"			global "tcp_$queue_name"			set "ft_red_$queue_name" [open ft_red_[set queue_name].tr w]			$queue attach [set ft_red_$queue_name]						set "tcp_$queue_name" [open tcp.tr w]			set tcpq [$queue set vq_(1)]			$tcpq attach [set tcp_$queue_name]			$tcpq trace curq_			$tcpq trace ave_			$tcpq trace prob1_					}		"DropTail/XCP" {}	}}#---------------- Run the simulation ------------------------#proc flush-files {} {    set files "f_all ft_red_Bottleneck ft_red_rBottleneck"    global tracedXCPs    foreach file $files {        global $file        if {[info exists $file]} {            flush [set $file]            close [set $file]        }       }    foreach i $tracedXCPs {	global src$i	    set file [set src$i tcpTrace_]	if {[info exists $file]} {            flush [set $file]            close [set $file]        }       }}proc finish {} {    global ns     if {[info exists f]} {	$ns flush-trace	close $f    }       $ns halt}$ns at $SimStopTime "finish"$ns runflush-files#------------ Post Processing ---------------#set PostProcess 1if { $PostProcess } {    #--- Traced TCPs	set TraceName "Flows --$qType-QS$qSize"	plot-xcp      $TraceName  $tracedXCPs  0.0  "cwnd_"	plot-xcp      $TraceName  $tracedXCPs  0.0  "t_seqno_"		#plot-xcp-queue  $TraceName  $PlotTime   ft_red_Bottleneck.tr	#plot-red-queue  $TraceName  $PlotTime   tcp.tr	plot-red "u" util 0.0}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -