?? http-single.tcl
字號:
## Copyright (c) 1997 Regents of the University of California.# All rights reserved.# # Redistribution and use in source and binary forms, with or without# modification, are permitted provided that the following conditions# are met:# 1. Redistributions of source code must retain the above copyright# notice, this list of conditions and the following disclaimer.# 2. Redistributions in binary form must reproduce the above copyright# notice, this list of conditions and the following disclaimer in the# documentation and/or other materials provided with the distribution.# 3. All advertising materials mentioning features or use of this software# must display the following acknowledgement:# This product includes software developed by the MASH Research# Group at the University of California Berkeley.# 4. Neither the name of the University nor of the Research Group may be# used to endorse or promote products derived from this software without# specific prior written permission.# # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF# SUCH DAMAGE.## This file contributed by Curtis Villamizar <curtis@ans.net>, May 1997.# Maintainer: John Heidemann <johnh@isi.edu>.### WARNING: This code uses the compatibility library and so should not# be used as an example. Hopefully at some time in the future it will# be updated.## Create a three node test environment## c1 -------- isp1 -------- s1# 28.8kb 1.54mb# modemdelay netdelay#proc create_testnet { } { global testnet set testnet(c1) [ns node] set testnet(isp1) [ns node] set testnet(s1) [ns node] set testnet(L1) \ [ns_duplex $testnet(c1) $testnet(isp1) \ $testnet(modemspeed) $testnet(modemdelay) $testnet(qtype)] ns_duplex $testnet(isp1) $testnet(s1) \ $testnet(netspeed) $testnet(netdelay) drop-tail [lindex $testnet(L1) 0] set queue-limit $testnet(modemqueue) [lindex $testnet(L1) 1] set queue-limit $testnet(modemqueue) if {$testnet(qtype) == "red"} { set redlink [ns link $testnet(c1) $testnet(isp1)] $redlink set thresh [expr $testnet(modemqueue) * 0.25] $redlink set maxthresh [expr $testnet(modemqueue) * 0.85] $redlink set q_weight 0.001 $redlink set wait_ 1 $redlink set dropTail_ 1 }}proc tcpDump { tcpSrc interval } { proc dump { src interval } { ns at [expr [ns now] + $interval] "dump $src $interval" puts [ns now]/ack=[$src get ack] } ns at 0.0 "dump $tcpSrc $interval"}proc trigger { xresults } { global testnet flows # NEEDSWORK: should we really indirect once down results like this? set results "[lindex $xresults 0]" set type [lindex $results 0] if { $type != "-" && $type != "d" } { return; } set id [lindex $results 7] set counter [format "count%d" $id] if { [info exists flows($counter)] } { incr flows($counter) } else { set flows($counter) 1 } if { $type != "-" } { return; } set got [expr 1 + [lindex $results 10]] set isrunning isrunning$id if { $id == 0 } { if { $got == $testnet(httpsize) } { puts [format "http flow completed at %s" [lindex $results 1]] incr flows(flows_running) -1 set flows($isrunning) 0 } } else { if { $got == $testnet(inlinesize) } { puts [format "inline%d completed at %s" $id [lindex $results 1]] incr flows(flows_running) -1 incr flows(inlines_running) -1 set flows($isrunning) 0 } } set flows(persist) 1 if { $flows(count0) >= 1 } { while {$flows(inlines_started) < $flows(inlines_needed) \ && $flows(flows_running) < $flows(flows_allowed) \ && $flows(inlines_running) < $flows(inlines_allowed) } { incr flows(inlines_started) incr flows(flows_running) incr flows(inlines_running) set ident $flows(inlines_started) set nextflow inline$ident if {$flows(persist)} { for {set j 0} {$j < $ident} {incr j} { set isrunning isrunning$j if {$flows($isrunning) == 0} { set thisflow tcp$ident if {$j == 0} { set otherflow tcp0 } else { set otherflow tcp$j } $flows($thisflow) persist $flows($otherflow) break } } } $flows($nextflow) start set isrunning isrunning$ident set flows($isrunning) 1 puts [format "trigger at %s: start %d" \ [lindex $results 1] $flows(inlines_started)] } }}proc openTrace { stopTime testName } { exec rm -f out.tr temp.rands set traceFile [open out.tr w] ns at $stopTime "close $traceFile ; finish $testName" set T [ns trace] $T attach $traceFile return $T}proc finish file { global testnet flows set f [open temp.rands w] puts $f "TitleText: $file" puts $f "Device: Postscript" set total 0 for { set i 0 } { $i <= $flows(inlines_needed) } { incr i } { set counter [format "count%d" $i] set got $flows($counter) incr total $got puts [format "flow %d : %d packets" $i $got] } set needed [expr $testnet(httpsize) \ + ( $flows(inlines_needed) * $testnet(inlinesize) )] set discard [expr $total - $needed] puts [format "%d sent : %d needed : %d discarded : %d %%" \ $total $needed $discard [expr 100 * $discard / $needed]] if { $testnet(dograph) == 0 } { exit 0 } exec rm -f temp.p temp.d exec touch temp.d temp.p # # split queue/drop events into two separate files. # we don't bother checking for the link we're interested in # since we know only such events are in our trace file # exec awk { { if (($1 == "-" ) && \ ($5 == "tcp" || $5 == "ack") && \ ($8 == 0 || ($8 == 4 && $11 <= 6))) \ print $2, $8 + ($11 % 90) * 0.01 } } out.tr > temp.p1 exec awk { { if (($1 == "-" ) && \ ($5 == "tcp" || $5 == "ack") && \ ($8 == 1 || ($8 == 4 && $11 > 6 && $11 <= 26))) \ print $2, $8 + ($11 % 90) * 0.01 } } out.tr > temp.p2 exec awk { { if (($1 == "-" ) && \ ($5 == "tcp" || $5 == "ack") && \ ($8 == 2 || $8 == 3 || ($8 == 4 && $11 > 26))) \ print $2, $8 + ($11 % 90) * 0.01 } } out.tr > temp.p3 exec awk { { if ($1 == "d") print $2, $8 + ($11 % 90) * 0.01 } } out.tr > temp.d puts $f \"packets flush $f exec cat temp.p1 >@ $f flush $f puts $f [format "\n\"1st-inline\n"] flush $f exec cat temp.p2 >@ $f flush $f puts $f [format "\n\"other-2\n"] flush $f exec cat temp.p3 >@ $f flush $f # insert dummy data sets so we get X's for marks in data-set 4 # puts $f [format "\n\"skip-1\n0 1\n\n\"skip-2\n0 1\n\n"] puts $f [format "\n\"drops\n"] flush $f # # Repeat the first line twice in the drops file because # often we have only one drop and xgraph won't print marks # for data sets with only one point. # exec head -1 temp.d >@ $f exec cat temp.d >@ $f close $f exec xgraph -bb -tk -nl -m -x time -y packet temp.rands & exit 0}proc init_tcp_flow {taskid flowid id size} { global testnet flows set flow [ns_create_connection tcp-reno \ $testnet(s1) tcp-sink $testnet(c1) $id] $flow set window $testnet(window) $flow set packet-size $testnet(mss) $flow set maxcwnd $testnet(window) set flows($flowid) $flow set flows($taskid) [$flow source ftp] $flows($taskid) set maxpkts_ $size # tcpDump $flow $testnet(dumpincr)}proc setup_http_test {} { global testnet global flows create_testnet init_tcp_flow http tcp0 0 $testnet(httpsize) ns at 0.0 "$flows(http) start" set flows(isrunning0) 1 set flows(flows_running) 1 set flows(count0) 0 for { set i 1 } { $i <= $flows(inlines_needed) } { incr i } { set nexttask [format "inline%d" $i] set nextflow [format "tcp%d" $i] init_tcp_flow $nexttask $nextflow $i $testnet(inlinesize) } # trace only the bottleneck link set traceme [openTrace $testnet(testlimit) test_http] set bottleneck [ns link $testnet(isp1) $testnet(c1)] $bottleneck trace $traceme $bottleneck callback { trigger }}proc set_globals {} { global testnet set testnet(netspeed) 1.54mb set testnet(modemspeed) 28.8kb set testnet(netdelay) 150ms set testnet(modemdelay) 50ms set testnet(mss) 512 set testnet(window) 64 set testnet(httpsize) 6 set testnet(inlinesize) 40 set testnet(modemqueue) 6 set testnet(dumpincr) 5.0 set testnet(testlimit) 50.0 set testnet(dograph) 0 set testnet(qtype) drop-tail global flows set flows(inlines_started) 0 set flows(inlines_needed) 3 set flows(flows_running) 0 set flows(flows_allowed) 4 set flows(inlines_running) 0 set flows(inlines_allowed) $flows(flows_allowed)}proc process_args {} { global argc argv testnet flows for {set i 0} {$i < $argc} {incr i} { set arg [lindex $argv $i] switch x$arg { x-window { incr i set testnet(window) [lindex $argv $i] } x-graph { set testnet(dograph) 1 puts "match" } x-delayN { incr i set testnet(netdelay) [lindex $argv $i] } x-delayM { incr i set testnet(modemdelay) [lindex $argv $i] } x-mss { incr i set testnet(mss) [lindex $argv $i] } x-httpsize { incr i set testnet(httpsize) [lindex $argv $i] } x-inlinesize { incr i set testnet(inlinesize) [lindex $argv $i] } x-queue { incr i set testnet(modemqueue) [lindex $argv $i] } x-dumpincr { incr i set testnet(dumpincr) [lindex $argv $i] } x-testlimit { incr i set testnet(testlimit) [lindex $argv $i] } x-inlines { incr i set flows(inlines_needed) [lindex $argv $i] } x-maxflow { incr i set flows(flows_allowed) [lindex $argv $i] } x-maxinline { incr i set flows(inlines_allowed) [lindex $argv $i] } x-red { set testnet(qtype) red } x-sfq { set testnet(qtype) sfq } default { puts [format "unrecognized argument: %s" [lindex $argv $i]] exit 1 } } }}set_globalsprocess_argssetup_http_test# ns gen-mapns run
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -