📄 redlight.tcl
字号:
#set stopTime 120
set stopTime 10
set ns [new Simulator]
if {[llength $argv] > 0} {
set num_ftps [lindex $argv 0]
} else {
set num_ftps 1
}
#set num_ftps [lindex $argv 0]
if {[llength $argv] > 1} {
set num_webs [lindex $argv 1]
} else {
set num_webs 0
}
if {[llength $argv] > 2} {
set bottleneck [lindex $argv 2]
} else {
set bottleneck 1.5Mb
}
#set random_seed [lindex $argv 3]
set random_seed 0
set rtt 100ms
# ------- config info is all above this line ----------
set rtt [$ns delay_parse $rtt]
set bw [$ns bw_parse $bottleneck]
if {$bw <= 128000} {
set psize 552
} else {
set psize 1500
}
set bdp [expr round($bw*$rtt/(8*$psize))]
if {$bdp < 5} {
set bdp 5
}
# allow lots of nodes (more than 128)
#$ns set-address-format expanded
Trace set show_tcphdr_ 1
set startTime 0.0
#TCP parameters
Agent/TCP set window_ [expr $bdp*4]
set win_size 1
Agent/TCP set windowInit_ $win_size
set segsize [expr $psize-40]
set segperack 2
set delack 0.4
set lastsample 0
set client_addr 0
set no_of_inlines 3
#set filesize [expr $stopTime*$bw/8/2]
set filesize 10000000000
#buffersizes
set buffersize [expr $bdp*2]
set buffersize1 [expr $bdp*2]
#thresholds
set minthresh [expr round(0.3*$bdp)]
set maxthresh [expr round($minthresh + 1.0*$bdp)]
set sampling_interval [expr $psize*8/$bw]
# set sampling_interval 0.007
set si_per_rtt [expr $rtt/$sampling_interval]
for {set ptwo 2} {$ptwo < $si_per_rtt} {set ptwo [expr $ptwo*2]} { }
set QWT [expr 1./$ptwo]
puts "minthresh $minthresh maxthresh $maxthresh QWT $QWT sample $sampling_interval"
#set Flow_id 1
ns-random $random_seed;
puts $random_seed;
#ns-random 0
proc build_topology { ns which } {
global bw rtt bdp buffersize buffersize1 maxthresh minthresh QWT \
sampling_interval
# congested link
global n0 n1
set n0 [$ns node]
set n1 [$ns node]
set bdelay [expr $rtt/2. - [$ns delay_parse 25ms]]
# $ns duplex-link $n0 $n1 $bw $bdelay RED/New
$ns duplex-link $n0 $n1 $bw $bdelay RED
$ns duplex-link-op $n0 $n1 orient right
$ns duplex-link-op $n1 $n0 queuePos 0.5
$ns queue-limit $n0 $n1 $buffersize
$ns queue-limit $n1 $n0 $buffersize
set li_10 [[$ns link $n1 $n0] queue]
$li_10 set maxthresh_ $maxthresh
$li_10 set thresh_ $minthresh
$li_10 set q_weight_ $QWT
# $li_10 sampling_interval $sampling_interval
# $li_10 cancel_thresh 0
# $li_10 drop_interval $buffersize
# $li_10 set queue-in-bytes_ true
# $li_10 set bytes_ true
# $li_10 set mean_pktsize_ 1500
set li_01 [[$ns link $n0 $n1] queue]
$li_01 set maxthresh_ $maxthresh
$li_01 set thresh_ $minthresh
$li_01 set q_weight_ $QWT
# $li_01 set queue-in-bytes_ true
# $li_01 set bytes_ true
# $li_01 set mean_pktsize_ 1500
global num_ftps num_webs
set n [expr $num_ftps+$num_webs]
for {set k 1} {$k <= $n} {incr k 1} {
# clients
set j [expr ($k+1)]
set dly [expr ($k)]
set dly 1
global n$j
set n$j [$ns node]
set linkbw [expr $bw*10]
$ns duplex-link [set n$j] $n0 $linkbw ${dly}ms DropTail
$ns queue-limit [set n$j] $n0 $buffersize1
$ns queue-limit $n0 [set n$j] $buffersize1
set angle [expr $n>1? 0.75+($k-1)*.5/($n-1) : 1]
$ns duplex-link-op $n0 [set n$j] orient $angle
# servers
set j [expr $k+$n+1]
global n$j
set n$j [$ns node]
$ns duplex-link $n1 [set n$j] $linkbw 25ms DropTail
$ns queue-limit $n1 [set n$j] $buffersize1
$ns queue-limit [set n$j] $n1 $buffersize1
set angle [expr $n>1? fmod(2.25-($k-1)*.5/($n-1), 2) : 0]
$ns duplex-link-op $n1 [set n$j] orient $angle
}
}
proc build_ftpclient {cnd snd sftp startTime timeToStop Flow_id} {
global ns
global stopTime
set cli [get_ftpclient]
set ctcp [get_fulltcp]
$ctcp attach-application $cli
#set cli [$ctcp attach-app FTP]
$ctcp set fid_ $Flow_id
$cli tcp $ctcp
$ns attach-agent $cnd $ctcp
set stcp [get_fulltcp]
$stcp attach-application $sftp
$stcp set fid_ $Flow_id
$ns attach-agent $snd $stcp
$ns connect $ctcp $stcp
#$ctcp set dst_ [$stcp set addr_]
$stcp listen
$ns at $startTime "$cli start"
$ns at $timeToStop "$cli stop"
global ftplist
global ftplist
set ftplist($ctcp) $stcp
return $cli
}
proc get_ftpclient {} {
global client_addr
set cli [new Agent/BayTcpApp/FtpClient]
#set cli [new Agent/TcpApp/FtpClient]
$cli set addr_ [incr client_addr]
return $cli
}
proc get_fulltcp {} {
global segperack segsize delack
set atcp [new Agent/TCP/BayFullTcp]
#set atcp [new Agent/TCP/FullTcp]
$atcp set segsperack_ $segperack
$atcp set segsize_ $segsize
$atcp set interval_ $delack
return $atcp
}
proc uniform {a b} {
expr $a + (($b- $a) * ([ns-random]*1.0/0x7fffffff))
}
proc finish {} {
global ns PERL
$ns halt
$ns flush-trace
set wrap [expr 90 * 1000 + 40]
set file BayFullTCP
exec $PERL ../../bin/set_flow_id -s bay-out.tr | \
$PERL ../../bin/getrc -e -s 1 -d 0 | \
$PERL ../../bin/raw2xg -v -s 0.01 -m $wrap -t $file > temp.rands
exec xgraph -bb -tk -nl -m -x time -y packets temp.rands &
exit 0
}
$ns trace-all [open bay-out.tr w]
$ns namtrace-all [open bay-out.nam w]
$ns color 2 blue
$ns color 3 red
$ns color 4 yellow
$ns color 5 green
#build_topology $ns RED/New
build_topology $ns RED
set fname f${num_ftps}w${num_webs}b${bottleneck}.tr
#set fname /dev/fd/1
$ns trace-queue $n1 $n0 [open $fname w]
set nn [expr $num_ftps+$num_webs]
for {set k 1} {$k <= $num_ftps} {incr k 1} {
set j [expr $k+1]
set i [expr $j+$nn]
set sftp [new Agent/BayTcpApp/FtpServer]
#set sftp [new Agent/TcpApp/FtpServer]
$sftp file_size $filesize
build_ftpclient [set n$j] [set n$i] $sftp \
[expr ($k-1)*[uniform 0.0 2.0]] 225 $j
}
$ns at [expr $stopTime ] "finish"
$ns run
exit 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -