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

📄 2statemarkova.tcl

📁 一款用来进行网络模拟的软件
💻 TCL
字号:
#--------- Creating the TOPOLOGY --------------------##       n0                             #       : \   Bottleneck            #       :  R0-----------------------R1#         /                            #       ni                         #Agent/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 packetsize [expr 100 * ($i +10)]        set result [exec awk -v PlotTime=$PlotTime -v what=$what -v s=$packetsize {	    {		if (( $6 == what ) && ($1 > PlotTime)) {			tmp=$7*s			print $1, tmp >> "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-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: $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}proc MarkovErrorModel {lossylink durlist} {	puts [lindex $durlist 0]	puts [lindex $durlist 1]	set errmodel [new ErrorModel/TwoStateMarkov $durlist time]		$errmodel drop-target [new Agent/Null] 	$lossylink errormodule $errmodel}proc ComplexMarkovErrorModel {lossylink durlist} {	set errmodel [new ErrorModel/ComplexTwoStateMarkov $durlist time]		$errmodel drop-target [new Agent/Null] 	$lossylink errormodule $errmodel}#-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- 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  100; # in ms# define avg duration of blocked (state 1) and unblocked (state 0) states#set ubstate 11.2#set bstate 4.0#set ubstate 50.0#set bstate 1.0set m1_ubstate 27.0set m1_bstate 12.0set m2_ubstate 0.4set m2_bstate 0.4set ns          [new Simulator]$ns             use-scheduler Heapset rtg         [new RNG]$rtg seed       $seedset f_all [open out.tr w]$ns trace-all $f_all# for event-tracing$ns eventtrace-allset  qSize  [expr round([expr ($BW / 8.0) * 4 * $delay * 1.0])];#set buffer to the pipe sizeset tracedXCPs       "0 1 2"set SimStopTime      5000set PlotTime         0#---------- Create the simulation --------------------## Create topologycreate-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 0#while { $i < $nXCPs  } {#    set StartTime [expr [$rtg integer 1000] * 0.001 * (0.01 * $delay) + $i  * 0.0]     # set rcvr_XCP      [new Agent/TCPSink/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  window_     [expr $qSize * 10]#     incr i# }# add lossy link that models a 2 state markov modelset lossylink [$ns link $n0 $R0]set durlist "$m1_ubstate $m1_bstate $m2_ubstate $m2_bstate"ComplexMarkovErrorModel $lossylink $durlist#---------- Trace --------------------## Trace sources#foreach i $tracedXCPs {#	[set src$i] trace-xcp "cwnd seqno"#}# Trace Queues#foreach queue_name "Bottleneck rBottleneck" {# 	set queue [set "$queue_name"]# 	if {[$queue info class] == "Queue/XCP"} {# 		global "ft_red_$queue_name"# 		set "ft_red_$queue_name" [open ft_red_[set queue_name].tr w]		    # 		set xcpq $queue ;#[$queue set vq_(0)]# 		$xcpq attach       [set ft_red_$queue_name]# 	}# }#---------------- 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-red-queue  $TraceName  $PlotTime   ft_red_Bottleneck.tr #   plot-red "u" util 0.0 #   plot-red "q" queue 0.0}

⌨️ 快捷键说明

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