zoukankan      html  css  js  c++  java
  • CoDel Test Script

    This TCL script is retrieved from http://www.pollere.net/CoDel.html in November 2013 :)

    # Codel test script v120513
    
    # Run this to run CoDel AQM tests.
    # ns codel.tcl f w c {b}Mb s d r
    # where:
    #   f = # ftps
    #   w = # PackMime connections per second
    #   c = # CBRs
    #   b = bottleneck bandwidth in Mbps
    #   s = filesize for ftp, -1 for infinite
    #   d = dynamic bandwidth, if non-zero, changes (kind of kludgey)
    #       have to set the specific change ratios in this file (below)
    #   r = number of "reverse" ftps
    
    set stopTime 300
    set ns [new Simulator]
    
    # These are defaults if values not set on command line
    
    set num_ftps 1
    set web_rate 0
    set revftp 0
    set num_cbrs 0
    #rate and packetSize set in build_cbr
    set bottleneck 3Mb
    #for a 10MB ftp
    set filesize 10000000
    set dynamic_bw 0
    set greedy 0
    
    # Parse command line
    
    if {$argc >= 1} {
        set num_ftps [lindex $argv 0]
        if {$argc >= 2} {
            set web_rate [lindex $argv 1]
            if {$argc >= 3} {
                set num_cbrs [lindex $argv 2]
                if {$argc >= 4} {
                    set bottleneck [lindex $argv 3]
                    if {$argc >= 5} {
                        set filesize [lindex $argv 4]
                        if {$argc >= 6} {
                            set dynamic_bw [lindex $argv 5]
                            if {$argc >= 7} {
                                set revftp [lindex $argv 6]
                            }
                        }
                    }
                }
            }
        }
    }
    
    set bw [bw_parse $bottleneck]
    if { $revftp >= 1} {
        set num_revs $revftp
    } else {
        set num_revs 0
    }
    puts "ftps $num_ftps webrate $web_rate cbrs $num_cbrs bw $bw filesize $filesize reverse $num_revs"
    
    # experiment settings
    set psize 1500
    if { $bw < 1000000} { set psize 500 }
    set nominal_rtt [delay_parse 100ms]
    set accessdly 20
    set bdelay 10 
    set realrtt [expr 2*(2*$accessdly + $bdelay)]
    puts "accessdly $accessdly bneckdly $bdelay realrtt $realrtt bneckbw $bw"
    
    # CoDel values
    # interval to keep min over
    set interval [delay_parse 100ms]
    # target in ms.
    set target [delay_parse 5ms]
    
    global defaultRNG
    $defaultRNG seed 0
    ns-random 0
    #$defaultRNG seed 54321
    #ns-random 23145
    
    # ------- config info is all above this line ----------
    
    #bdp in packets, based on the nominal rtt
    set bdp [expr round($bw*$nominal_rtt/(8*$psize))]
    
    Trace set show_tcphdr_ 1
    set startTime 0.0
    
    #TCP parameters - have to set both for FTPs and PackMime
    
    Agent/TCP set window_ [expr $bdp*16]
    Agent/TCP set segsize_ [expr $psize-40]
    Agent/TCP set packetSize_ [expr $psize-40]
    Agent/TCP set windowInit_ 4
    Agent/TCP set segsperack_ 1
    Agent/TCP set timestamps_ true
    set delack 0.4
    Agent/TCP set interval_ $delack
    
    Agent/TCP/FullTcp set window_ [expr $bdp*16]
    Agent/TCP/FullTcp set segsize_ [expr $psize-40]
    Agent/TCP/FullTcp set packetSize_ [expr $psize-40]
    Agent/TCP/FullTcp set windowInit_ 4
    Agent/TCP/FullTcp set segsperack_ 1
    Agent/TCP/FullTcp set timestamps_ true
    Agent/TCP/FullTcp set interval_ $delack
    
    
    Agent/TCP/Linux instproc done {} {
        global ns filesize
    #this doesn't seem to work, had to hack tcp-linux.cc to do repeat ftps
        $self set closed_ 0
    #needs to be delayed by at least .3sec to slow start
        puts "[$ns now] TCP/Linux proc done called"
        $ns at [expr [$ns now] + 0.3] "$self send $filesize"
    }
    
    # problem is that idle() in tcp.cc never seems to get called...
    Application/FTP instproc resume {} {
        puts "called resume"
        global filesize
        $self send $filesize
    #   $ns at [expr [$ns now] + 0.5] "[$self agent] reset"
        $ns at [expr [$ns now] + 0.5] "[$self agent] send $filesize"
    }
    
    Application/FTP instproc fire {} {
        global filesize
        $self instvar maxpkts_
        set maxpkts_ $filesize
        [$self agent] set maxpkts_ $filesize
        $self send $maxpkts_
        puts "fire() FTP"
    }
    
    #buffersizes
    set buffersize [expr $bdp]
    set buffersize1 [expr $bdp*10]
    
    Queue/CoDel set target_ $target
    Queue/CoDel set interval_ $interval
    
    #set Flow_id 1
    
    proc build_topology { ns which } {
        # nodes n0 and n1 are the server and client side gateways and
        # the link between them is the congested slow link. n0 -> n1
        # handles all the server to client traffic.
        #
        # if the web_rate is non-zero, node n2 will be the packmime server cloud
        # and node n3 will be the client cloud.
        #
        # num_ftps server nodes and client nodes are created for the ftp sessions.
        # the first client node is n{2+w} and the first server node is n{2+f+w}
        # where 'f' is num_ftps and 'w' is 1 if web_rate>0 and 0 otherwise.
        # servers will be even numbered nodes, clients odd
        # Warning: the numbering here is ridiculously complicated
    
        global bw bdelay accessdly buffersize buffersize1 filesize node_cnt
        set node_cnt 2
    
        # congested link
        global n0 n1
        set n0 [$ns node]
        set n1 [$ns node]
        $ns duplex-link $n0 $n1 $bw ${bdelay}ms CoDel
        $ns duplex-link-op $n0 $n1 orient right
        $ns duplex-link-op $n0 $n1 queuePos 0.5
        $ns duplex-link-op $n1 $n0 queuePos 1.5
        $ns queue-limit $n0 $n1 $buffersize
        $ns queue-limit $n1 $n0 $buffersize
        set node_cnt 2
    
        #dynamic bandwidth
        # these are the multipliers for changing bw, times initial set bw
        # edit these values to get different patterns
        global stopTime dynamic_bw
        array names bw_changes
        set bw_changes(1) 0.1
        set bw_changes(2) 0.01
        set bw_changes(3) 0.5
        set bw_changes(4) 0.01
        set bw_changes(5) 1.0
    
        puts "bottleneck starts at [[[$ns link $n0 $n1] link] set bandwidth_]bps"
        for {set k 1} {$k <= $dynamic_bw} {incr k 1} {
            set changeTime [expr $k*$stopTime/($dynamic_bw+1)]
            set f $bw_changes($k)
            set newBW [expr $f*$bw]
            puts "change at $changeTime to [expr $newBW/1000000.]Mbps"
            $ns at $changeTime "[[$ns link $n0 $n1] link] set bandwidth_ $newBW"
            $ns at $changeTime "[[$ns link $n1 $n0] link] set bandwidth_ $newBW"
            $ns at $changeTime "puts $newBW"
        }
    
        set li_10 [[$ns link $n1 $n0] queue]
        set li_01 [[$ns link $n0 $n1] queue]
    
        set tchan_ [open /tmp/redqvar.tr w]
        $li_01 trace curq_
        $li_01 trace d_exp_
        $li_01 attach $tchan_
    
        global num_ftps web_rate num_cbrs greedy num_revs
        set linkbw [expr $bw*10]
    
        set w [expr $web_rate > 0]
        if {$w} {
            global n2 n3
        #server
            set n2 [$ns node]
            $ns duplex-link $n2 $n0 $linkbw ${accessdly}ms DropTail
            $ns queue-limit $n2 $n0 $buffersize1
            $ns queue-limit $n0 $n2 $buffersize1
    
        #client
            set n3 [$ns node]
            $ns duplex-link $n1 $n3 $linkbw ${accessdly}ms DropTail
            $ns queue-limit $n1 $n3 $buffersize1
            $ns queue-limit $n3 $n1 $buffersize1
            set node_cnt 4
        }
        #need to fix the angles if use nam
        for {set k 0} {$k < $num_ftps} {incr k 1} {
            # servers
            set j $node_cnt
            global n$j
            set n$j [$ns node]
            if {$greedy > 0 && $k == 0} {
                $ns duplex-link [set n$j] $n0 $linkbw 1ms DropTail
            } else {
                $ns duplex-link [set n$j] $n0 $linkbw ${accessdly}ms DropTail
            }
            $ns queue-limit [set n$j] $n0 $buffersize1
            $ns queue-limit $n0 [set n$j] $buffersize1
            set angle [expr $num_ftps>1? 0.75+($k-1)*.5/($num_ftps-1) : 1]
            $ns duplex-link-op $n0 [set n$j] orient $angle
            incr node_cnt
    
            # clients
            set j $node_cnt
            global n$j
            set n$j [$ns node]
            set dly [expr ${accessdly} +($k+1)]
            $ns duplex-link $n1 [set n$j] $linkbw  ${dly}ms  DropTail
            $ns queue-limit $n1 [set n$j] $buffersize1
            $ns queue-limit [set n$j] $n1 $buffersize1
            set angle [expr $num_ftps>1? fmod(2.25-($k-1)*.5/($num_ftps-1), 2) : 0]
            $ns duplex-link-op $n1 [set n$j] orient $angle
            incr node_cnt
        }
        for {set k 0} {$k < $num_cbrs} {incr k 1} {
            # servers
            set j $node_cnt
            global n$j
            set n$j [$ns node]
            $ns duplex-link [set n$j] $n0 $linkbw ${accessdly}ms DropTail
            $ns queue-limit [set n$j] $n0 $buffersize1
            $ns queue-limit $n0 [set n$j] $buffersize1
    #       set angle [expr $num_cbrs>1? 0.75+($k-1)*.5/($num_cbrs-1) : 1]
            $ns duplex-link-op $n0 [set n$j] orient $angle
            incr node_cnt
    
            # clients
            set j $node_cnt
            global n$j
            set n$j [$ns node]
            $ns duplex-link $n1 [set n$j] $linkbw  ${accessdly}ms  DropTail
            $ns queue-limit $n1 [set n$j] $buffersize1
            $ns queue-limit [set n$j] $n1 $buffersize1
    #       set angle [expr $num_cbrs>1? fmod(2.25-($k-1)*.5/($num_ftps-1), 2) : 0]
            $ns duplex-link-op $n1 [set n$j] orient $angle
            incr node_cnt
        }
        #reverse direction ftps
        for {set k 0} {$k < $num_revs} {incr k 1} {
            # clients
            set j $node_cnt
            global n$j
            set n$j [$ns node]
            $ns duplex-link [set n$j] $n0 $linkbw ${accessdly}ms DropTail
            $ns queue-limit [set n$j] $n0 $buffersize1
            $ns queue-limit $n0 [set n$j] $buffersize1
            set angle [expr $num_ftps>1? 0.75+($k-1)*.5/($num_ftps-1) : 1]
            $ns duplex-link-op $n0 [set n$j] orient $angle
            incr node_cnt
    
            # servers
            set j $node_cnt
            global n$j
            set n$j [$ns node]
            set dly [expr ($accessdly)*1.1 +($k+1)]
            $ns duplex-link $n1 [set n$j] $linkbw  ${dly}ms  DropTail
            $ns queue-limit $n1 [set n$j] $buffersize1
            $ns queue-limit [set n$j] $n1 $buffersize1
            set angle [expr $num_ftps>1? fmod(2.25-($k-1)*.5/($num_ftps-1), 2) : 0]
            $ns duplex-link-op $n1 [set n$j] orient $angle
            incr node_cnt
        }
    }
    
    proc build_cbr {cnd snd startTime timeToStop Flow_id} {
        global ns
        set udp [$ns create-connection UDP $snd LossMonitor $cnd $Flow_id]
        set cbr [new Application/Traffic/CBR]
        $cbr attach-agent $udp
        # change these for different types of CBRs
        $cbr set packetSize_ 100
        $cbr set rate_ 0.064Mb
        $ns at $startTime "$cbr start"
        $ns at $timeToStop "$cbr stop"
    }
    
    # cnd is client node, snd is server node
    proc build_ftpclient {cnd snd startTime timeToStop Flow_id} {
        
        global ns filesize greedy revftp
        set ctcp [$ns create-connection TCP/Linux $snd TCPSink/Sack1 $cnd $Flow_id]
        $ctcp select_ca cubic
        set ftp [$ctcp attach-app FTP]
        $ftp set enableResume_ true
        $ftp set type_ FTP 
    
    #set up a single infinite ftp with smallest RTT
        if {$greedy > 0 || $filesize < 0} {
            $ns at $startTime "$ftp start"
            set greedy 0
        } else {
            $ns at $startTime "$ftp send $filesize"
        }
        $ns at $timeToStop "$ftp stop"
    }
    
    proc build_webs {cnd snd rate startTime timeToStop} {
        set CLIENT 0
        set SERVER 1
    
        # SETUP PACKMIME
        set pm [new PackMimeHTTP]
        $pm set-TCP Sack
        $pm set-client $cnd
        $pm set-server $snd
        $pm set-rate $rate;                    # new connections per second
        $pm set-http-1.1;                      # use HTTP/1.1
    
        # create RandomVariables
        set flow_arrive [new RandomVariable/PackMimeHTTPFlowArrive $rate]
        set req_size [new RandomVariable/PackMimeHTTPFileSize $rate $CLIENT]
        set rsp_size [new RandomVariable/PackMimeHTTPFileSize $rate $SERVER]
    
        # assign RNGs to RandomVariables
        $flow_arrive use-rng [new RNG]
        $req_size use-rng [new RNG]
        $rsp_size use-rng [new RNG]
    
        # set PackMime variables
        $pm set-flow_arrive $flow_arrive
        $pm set-req_size $req_size
        $pm set-rsp_size $rsp_size
    
        global ns
        $ns at $startTime "$pm start"
        $ns at $timeToStop "$pm stop"
    }
    
    proc uniform {a b} {
        expr $a + (($b- $a) * ([ns-random]*1.0/0x7fffffff))
    }
    
    proc finish {} {
        global ns
        $ns halt
        $ns flush-trace
        exit 0
    }
    
    # $ns namtrace-all [open out.nam w]
    # $ns color 2 blue
    # $ns color 3 red
    # $ns color 4 yellow
    # $ns color 5 green
    
    build_topology $ns CoDel
    
    #$ns trace-queue $n0 $n1 [open out_n0ton1.tr w]
    #set fname f${num_ftps}w${web_rate}b${bottleneck}.tr
    set fname f.tr
    puts $fname
    $ns trace-queue $n0 $n1 [open /tmp/$fname w]
    #reverse direction
    #$ns trace-queue $n1 $n0 [open /tmp/$fname w]
    
    set node_cnt 2
    if {$web_rate > 0} {
        build_webs $n3 $n2 $web_rate 0 $stopTime
        set node_cnt 4
    }
    
    for {set k 1} {$k <= $num_ftps} {incr k 1} {
        set j $node_cnt
        incr node_cnt
        set i $node_cnt
        build_ftpclient [set n$i] [set n$j]  
             $startTime $stopTime $i
    #        [expr 1.0*($k-1)] $stopTime $i
    #        [expr $startTime+($k-1)*[uniform 0.0 2.0]] $stopTime $i
        incr node_cnt
    }
    
    for {set k 1} {$k <= $num_cbrs} {incr k 1} {
        set j $node_cnt
        incr node_cnt
        set i $node_cnt
        build_cbr [set n$i] [set n$j]  
             [expr $startTime+($k-1)*[uniform 0.0 2.0]] $stopTime $i
        incr node_cnt
    }
    
    #for reverse direction, give client smaller number
    for {set k 1} {$k <= $num_revs} {incr k 1} {
        set j $node_cnt
        incr node_cnt
        set i $node_cnt
        build_ftpclient [set n$j] [set n$i] $startTime $stopTime $j
        incr node_cnt
    }
    
    $ns at [expr $stopTime ] "finish"
    $ns run
    exit 0
    
  • 相关阅读:
    php中奖概率算法
    phpize: command not found
    使用Mobile_Detect来判断访问网站的设备:安卓,平板,电脑
    jsonp应用
    数组转换一
    PhpStorm2016.3激活
    svn冲突问题详解 SVN版本冲突解决详解
    Pythono 实现 Permutation
    ubuntu 挂载优盘
    Customize R initiallization in Mac
  • 原文地址:https://www.cnblogs.com/F-32/p/3444116.html
Copyright © 2011-2022 走看看