NS 2.35コジヒョン書-実験9ノート-キュー管理メカニズム
4483 ワード
メモを覚えています.
現在、REDのリアルタイムと平均キュー長の表示が実現するが、表示される図形はwpiである.eduの中の动きは少し异なっています???
でもコジヒョンはmyfifoを使っていて、自分で書いたキューのはずです
droptailに変更すると、trファイルに関連付けられてエラーが発生します???解決策がわからない
DropTailキューはtraceが追跡されることをサポートしていないようで、traceがサポートされているかどうかはキューを実現するコードの中で体現されるべきで、REDには明らかにtraceの方面の内容があるため、DropTailの特性をテストしたいならば、REDのパラメータをDropTailの極端な情況に設定することができて、後でtraceがどのようにサポートするかを研究する時間があって、およびどのようにREDパラメータをDropTailの形式に設定します!
RED文献では、REDとdroptailの平均キュー長とスループットの関係を比較し、類似の図を作成したい
Tclコードは以下の通りです.
これはqueue traceファイルの内容です.
ここで、aは平均キュー長を表し、Qは現在のキュー長を表し、時にはaが複数あることが見られるが、Qは1つしかない.平均長が計算されているため、瞬時長は変化していない.瞬時長は2つの同じ長さがつながっていないからである.これは、後で抽出される時間長データの描画に影響を及ぼさず、gnuplotは自動的にx軸の時間描画を行います.
これはaとQを抽出するawkコードで、queue traceファイルからコンテンツを読み出し、それぞれaとQを異なるファイルに書き込むために使用されます.
Gnuplotのコード:
描画されたグラフィック:
図形の動きはwpiに似ていない.eduのグラフィック:指数重み付けの記憶因子が比較的大きいようで、平均キュー長は現在のキュー長の変換に伴って激しく変化しない.
現在、REDのリアルタイムと平均キュー長の表示が実現するが、表示される図形はwpiである.eduの中の动きは少し异なっています???
でもコジヒョンはmyfifoを使っていて、自分で書いたキューのはずです
droptailに変更すると、trファイルに関連付けられてエラーが発生します???解決策がわからない
DropTailキューはtraceが追跡されることをサポートしていないようで、traceがサポートされているかどうかはキューを実現するコードの中で体現されるべきで、REDには明らかにtraceの方面の内容があるため、DropTailの特性をテストしたいならば、REDのパラメータをDropTailの極端な情況に設定することができて、後でtraceがどのようにサポートするかを研究する時間があって、およびどのようにREDパラメータをDropTailの形式に設定します!
RED文献では、REDとdroptailの平均キュー長とスループットの関係を比較し、類似の図を作成したい
Tclコードは以下の通りです.
# Kezhiheng, exper 9, test DropTail and RED
if {$argc != 2} {
puts "Usage: ns queue.tcl queuetype_ noflow_"
puts "Example: ns queue.tcl DropTail 10"
puts "queuetype_: DropTail or RED"
exit
}
set par1 [lindex $argv 0]
set par2 [lindex $argv 1]
#Create a simulator object
set ns [new Simulator]
set tracefd [open zout$par1-$par2.tr w]
$ns trace-all $tracefd
set namtracefd [open out.nam w]
$ns namtrace-all $namtracefd
proc finish {} {
global ns tracefd namtracefd par2 tcp startT
$ns flush-trace
close $tracefd
close $namtracefd
set time [$ns now]
set sum_thrpt 0
#throughput=number of ack recv * pktsize / time
#number of ack recv = number of packet sent
for {set i 1} {$i<=$par2} {incr i} {
# ack_ tcp 、 , highest ACK received, 0,ns manual p194
set ackno_($i) [$tcp($i) set ack_]
# tcp packetSize_ 1000
set thrpt($i) [expr $ackno_($i)*1000*8/($time-$startT($i))]
puts $thrpt($i)
set sum_thrpt [expr $sum_thrpt+$thrpt($i)]
}
set avethrpt [expr $sum_thrpt/$par2]
puts "average throughput: $avethrpt (bps)"
#exec nam out.nam &
exit 0
}
# Set router nodes
set r1 [$ns node]
set r2 [$ns node]
$ns duplex-link $r1 $r2 56kb 10ms $par1
$ns queue-limit $r1 $r2 50
# Set TCP src, dest, link
for {set i 1} {$i<=$par2} {incr i} {
set s($i) [$ns node]
set d($i) [$ns node]
$ns duplex-link $s($i) $r1 10Mb 1ms DropTail
$ns duplex-link $r2 $d($i) 10Mb 1ms DropTail
}
#
set queuefd [open q-$par1-$par2.tr w]
set q_ [[$ns link $r1 $r2] queue]
$q_ trace curq_
$q_ trace ave_
$q_ attach $queuefd
# DropTail ,RED ,ns manual p74
if {$par1 == "RED"} {
# packet mode, not byte mode
$q_ set bytes_ false
$q_ set queue_in_bytes_ false
}
# Create tcp and ftp flow
for {set i 1} {$i<=$par2} {incr i} {
set tcp($i) [$ns create-connection TCP/Reno $s($i) TCPSink $d($i) 0]
$tcp($i) set fid_ $i
set ftp($i) [$tcp($i) attach-app FTP]
}
# Random start ftp flow
set rng [new RNG]
$rng seed 1
set rvStart [new RandomVariable/Uniform]
$rvStart use-rng $rng
$rvStart set min_ 0.0
$rvStart set max_ 1.0
for {set i 1} {$i<=$par2} {incr i} {
set startT($i) [expr [$rvStart value]]
puts "startT($i) $startT($i) sec"
$ns at $startT($i) "$ftp($i) start"
}
$ns at 200.0 "finish"
$ns run
View Code
#
set q_ [[$ns link $r1 $r2] queue]
[$ns link $r1 $r2], $link
[[$ns link $r1 $r2] queue] [$link queue], link queue
$q_ trace curq_, $queue trace
$q_ trace ave_
これはqueue traceファイルの内容です.
a 0.0515932 0.0288164
Q 0.0515932 1
a 0.0524252 0.0856189
Q 0.0524252 2
a 0.0891547 0.169601
Q 0.0891547 3
a 0.217742 0.251163
a 0.218574 0.359191
Q 0.218574 4
ここで、aは平均キュー長を表し、Qは現在のキュー長を表し、時にはaが複数あることが見られるが、Qは1つしかない.平均長が計算されているため、瞬時長は変化していない.瞬時長は2つの同じ長さがつながっていないからである.これは、後で抽出される時間長データの描画に影響を及ぼさず、gnuplotは自動的にx軸の時間描画を行います.
これはaとQを抽出するawkコードで、queue traceファイルからコンテンツを読み出し、それぞれaとQを異なるファイルに書き込むために使用されます.
BEGIN{
# program initialize
}
{
class = $1;
time = $2;
value = $3;
#
if(class=="a")
{
print time, value >> "tempa"
}
else if(class=="Q")
{
print time, value >> "tempq"
}
}
END {
# When read over, start to calculate
}
View Code
Gnuplotのコード:
#!/bin/bash
gnuplot -persist<<EOF
set terminal gif
set output "RED.gif"
set title "RED average and current queue size"
set xlabel "time"
set ylabel "queue size"
#unset key
plot "tempa" with linespoints, "tempq" with linespoints
EOF
View Code
描画されたグラフィック:
図形の動きはwpiに似ていない.eduのグラフィック:指数重み付けの記憶因子が比較的大きいようで、平均キュー長は現在のキュー長の変換に伴って激しく変化しない.