队列管理机制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
队列管理机制
一、实验目的:
学习DropTail和RED队列管理机制,以了解被动式和主动式队列管理机制的优缺点。
二、背景知识:
DropTail和被动式队列管理机制――TCL全局同步
RED和主动式队列管理机制:
计算公式:
avg=(1-w q)⨯avg+ w q⨯q w q为队列长度q的加权系统,0 1.0 max th P a= P b/(1-count⨯ P b) 对P b丢包概率的修正公式。其中,count记录了从上一个封包被丢弃后有多少封包进入队列。采用P a用意是希望能让封包丢弃概率的分布更均匀。 若想要有效地作用RED,适当选择w q≥1, max th>2⨯min th、max th>所有数据流中最大的封包大小。设置参数很有必要,更详细的设置方法可以参考文献[3]。 三、实验步骤 1.仿真的网络结构 在这个模拟的结构中,r1和r2是路由器,其中的链路是将采用DropTail和RED队列管理机制以作为效率分析的比较,频宽为56kbps,传递延迟的时间为10ms。其中的数据流数目可由用户在模拟时决定,下面的例子为10条TCP数据流。我们要比较的效率是这10条数据流的平均吞吐量、第一条数据流的端点到端点平均延迟时间和队列长度变化。 2.TCL程序代码 if{$argc!=2}{ puts “Usage: ns queue.tcl queuetype_noflows_” puts “Example: ns queue.tcl myfifo 10” puts “queuetype_: myfifo or RED” exit } set par1 [lindex $argv 0] set par2 [lindex $argv 1] #产生一个仿真的对象 set ns [new Simulator] #打开一个trace文件,用来记录封包传送的过程 set nd [open out-$par1-$par2.tr w] $ns trace-all $nd #定义一个结束的程序 proc finish{}{ global ns nd par2 tcp start $ns flush-trace close $nd set time [$ns now] set sum_thgpt 0 #throughput=收到Ack数*Packet Size(Bit)/传送时间 #收到Ack数=传送出Packet数 for {set i 0}{$i<$par2}{incr i}{ set ackno_($i) [$tcp($i) set ack_] set thgpt($i) [expr Rackno_($i)*1000.0*8.0/($time-$start($i))] #puts $thgpt($i) set sum_thgpt [expr $sum_thgpt+$thgpt($i)] } set avgthgpt [expt $sum_thgpt/$par2] puts “average throughput:$avgthgpt (bps)” exit 0 } for { set i 0}{$i<$par2}{incr i}{ set src($i) [$ns node] set dst($i) [$ns node] } #产生两个路由器 set r1 [$ns node] set r2 [$ns node] #把结点和路由器连接起来 for { set i 0}{$i<$par2}{incr i}{ $ns duplex-link $src($i) $r1 100Mb [expr ($i*10)]ms DropTail $ns duplex-link $r2 $dst($i) 100Mb [expr ($i*10)]ms DropTail } $ns duplex-link $r1 $r2 56k 10ms $par1 #设置r1到r2之间的Queue Size为50个封包大小 $ns queue-limit $r1 $r2 50 #把队列长度记录下来 set q_ [[$ns link $r1 $r2] queue] set queuechan [open q-$par1-$par2.tr w] $q_ trace curq_ if {$par1== “RED”}{ #使用packet mode $q_ set bytes_ false $q_ set queue_in_bytes_ false } $q_ attach $queuechan for {set i 0}{$i<$par2}{incr i}{ set tcp ($i) [$ns create-connection TCP/Reno $src($i) TCPSink $dst($i) 0] $tcp($i) set fid_ $i } #随机在0~1s之间决定数据流开始传送的时间 set rng [new RNG] $rng seed 1 set RVstart [new RandomVariable/Uniform] $RVstart set min_ 0 $RVstart set max_ 1 $RVstart use-rng $rng #决定开始传送的时间 for {set i 0}{$i<$par2}{incr i}{ set startT ($i) [expr [$RVstart value]] #puts “start T ($i) $startT ($i) sec” }