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
CoDel Test Script的更多相关文章
- 从Script到Code Blocks、Code Behind到MVC、MVP、MVVM
刚过去的周五(3-14)例行地主持了技术会议,主题正好是<UI层的设计模式——从Script.Code Behind到MVC.MVP.MVVM>,是前一天晚上才定的,中午花了半小时准备了下 ...
- 页面中多个script块之间的关系
一:函数声明与函数定义表达式在函数调用间的区别 <script type="text/javascript"> doA(); var doA = function(a ...
- javaScript中的小细节-script标签中的预解析
首先介绍预解析,虽然预解析字面意思很好理解,但是却是出坑出的最多的地方,也是bug经常会有的地方,利用好预解析的特性可以解决很多问题,并且提高代码的质量及数量,浏览器在解析代码前会把变量的声明和函数( ...
- ABP源码分析三十七:ABP.Web.Api Script Proxy API
ABP提供Script Proxy WebApi为所有的Dynamic WebApi生成访问这些WebApi的JQuery代理,AngularJs代理以及TypeScriptor代理.这些个代理就是j ...
- shell script 执行常用的两种方式
2016-11-17 直接输入脚本名执行 ./script #!/bin/bash# /root/shell/001 # 2016-11-17 test for script running name ...
- js原生跨域--用script标签实现
刚刚从培训班学习完,总想写一下东西,自从进入了这个院子,每次出现问题,总是能找到一些答案,给我一些帮助. 作为新手,就写一下简单的吧,院子里面有很多大牛, 说句实话,他们的很多代码我都看不懂. 我就写 ...
- script标签中defer和async属性的区别
这篇文章来源于JS高级程序设计第三版中关于script标签的介绍,结合查阅的资料写下的学习笔记. 向html页面中插入javascript代码的主要方法就是通过script标签.其中包括两种形式,第一 ...
- java script第一篇(按钮全选的实现)
今天刚学了java script,记录下学习新知识的点滴.以下是操作步骤.鉴于我是初级者,如有错误,恳请读者指正.万分谢谢. 1.新建一个文档(用NotePad软件,为了使得在浏览器中打开不是乱码,在 ...
- script在html中的摆放位置
以前一直觉得script在html中的任何位置都可以,今天做一个需求的时候才更正了自己的错误思想啊--script的位置也不是随便放的. 首先是想实现一个select标签,有是和无两个option,但 ...
随机推荐
- c - 给分数分级别
/* 题目: 学习成绩>=90 分的同学用 A 表示, 80-89 分之间的用 B 表示,70-79 分的用 C 表示, 60-69 分用 D表示,小于60分用E表示. 分析: 使用swith. ...
- 网页上facebook分享功能的具体实现
1,一个链接: 参数是要分享的页面的链接 代码如下: <a style="width:35px; height:40px; position:relative; top:10px; l ...
- 关于iOS应用管理之九宫格的坐标计算以及与UIScrollView的结合
关于九宫格的布局以及坐标的计算,对于大多数的iOS初学者甚至有一定能力的学者来说都是一大难题,在此写者通过自己的开发经验以及多次应用,把自己的所学所得分享给大家,就通过应用管理来进行浅谈一二. ...
- sql用户权限
登录 1)右键根目录属性 点下面的sql server 和 windows 身份验证模式 2)安全性右键新建,选择登陆 去掉 那个"用户下次登陆是必须改密码" ,下面默认数据库改为 ...
- 学习OpenSeadragon之二 (界面缩放与平移规则设置)
OpenSeadragon入门了解请看第一篇:http://www.cnblogs.com/yingjiehit/p/4362377.html OpenSeadragon给我们提供了很多的可选界面元素 ...
- 平方和与立方和 AC 杭电
平方和与立方和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- 自己动手开发编译器(五)miniSharp语言的词法分析器
稍微说明一点,整型常量和上面的标识符的词法,在调用lex.DefineToken时都多传了一个参数.这个参数是可选的描述信息,如果不传会直接使用正则表达式的字符串形式.而标识符的正则表达式有4万多个字 ...
- 前端MVC学习笔记(一)——MVC概要与angular概要、模板与数据绑定
一.前端MVC概要 1.1.库与框架的区别 框架是一个软件的半成品,在全局范围内给了大的约束.库是工具,在单点上给我们提供功能.框架是依赖库的.AngularJS是框架而jQuery则是库. 1.2. ...
- android禁用光感按键
用RE浏览器打开/system/usr/keylayout下的qwerty.kl文件, 找到key 158 BACK key 139 MENU key 102 HOME 分别在其之前加下#号,如下: ...
- Unity3D添加Admob广告
重要提示: 貌似play2014年8月之后不会再支持admob的SDK方式的广告了.github上已经有了 Unity AdMob (Google Play Services) ...