parking_lot_topo.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:16k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # ------- Test XCP Performance over a a sequence of bottlenecks  ---------------#
  2. #
  3. # Author: Dina Katabi <dk@mit.edu>
  4. # Last Update : 09/09/2002
  5. #
  6. # Descrp: parking lot topo
  7. #         
  8. Agent/TCP set minrto_ 1
  9.  #-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- Utility Functions -*-*-*-*-*-*-*-*--*-*-*-*-*-*-*-*-#
  10. #--------------- CC Eprimental TOPOLOGY: Control Transfer -------------------------------#
  11. # - This topology is useful for experimenting with the behavior of a 
  12. # connection when its bottleneck moves from one node to another
  13. #         
  14. #    n0 ------------ n1  ....    n[numHops-1]------------n[numHops] 
  15. #                    
  16. proc create-string-topology {numHops BW_list d_list qtype_list qsize_list } {
  17.     global ns 
  18.     
  19.     set numNodes [expr $numHops + 1 ]
  20.     # first sanity check
  21.     if { [llength $BW_list] !=  [llength $d_list] || [llength $qtype_list] !=  [llength $qsize_list]} {
  22. error "Args sizes don't match with $numHops hops"
  23. if { [llength $BW_list] != $numHops || $numHops != [llength $qsize_list]} {
  24.     puts "error in using proc create-string-topology"
  25.     error "Args sizes don't match with $numHops hops"
  26. }
  27.     }
  28. # compute the pipe assuming packet size is 1000 bytes, delays are in msec and BWs are in Mbits
  29. set forwarddelay 0; 
  30. global minBW; 
  31. set minBW [lindex $BW_list 0];
  32. for { set i 0} { $i < $numHops } { incr i } {
  33. set forwarddelay [expr $forwarddelay + [lindex $d_list $i]]
  34. if {$minBW > [lindex $BW_list $i] } { set $minBW [lindex $BW_list $i] }
  35. }
  36. set pipe [expr round([expr $minBW /8 * $forwarddelay * 2])]
  37. for { set i 0} { $i < $numNodes } { incr i } {
  38. global n$i
  39. set n$i [$ns node]
  40. }
  41.     
  42. for { set i 0} { $i < $numHops } { incr i } {
  43. set qsize [lindex $qsize_list $i]
  44. set bw    [lindex $BW_list $i]
  45. set delay [lindex $d_list $i]
  46. set qtype [lindex $qtype_list $i]
  47. puts "$i bandwidth $bw"
  48. if {$qsize == 0} { set qsize $pipe}
  49. $ns duplex-link [set n$i] [set n[expr $i +1]] [set bw]Mb [set delay]ms $qtype
  50. $ns queue-limit [set n$i] [set n[expr $i + 1]] $qsize
  51. $ns queue-limit [set n[expr $i + 1]] [set n$i] $qsize
  52. # Give a global handle to the Queues to allow setting the RED paramters
  53. global q$i;  set  q$i   [ [$ns link [set n$i] [set n[expr $i + 1]]]  queue]
  54. global rq$i; set  rq$i  [ [$ns link [set n[expr $i + 1]] [set n$i]] queue]
  55. global l$i;  set  l$i   [$ns link [set n$i] [set n[expr $i + 1]]]
  56. global rl$i; set  rl$i  [$ns link [set n[expr $i + 1]] [set n$i]]
  57. }
  58. }
  59. proc set-red-params { qsize } {
  60. #Queue/RED set thresh_ [expr 0.6 * $qsize]
  61. #Queue/RED set maxthresh_ [expr 0.8 * $qsize]
  62. #Queue/RED set q_weight_ 0.001
  63. Queue/RED set linterm_ 10
  64. Queue/RED set bytes_ false ;
  65. Queue/RED set queue_in_bytes_ false ;
  66. Agent/TCP set old_ecn_ true
  67. Queue/RED set setbit_     true
  68. }
  69. proc flush-files { files } {
  70.     foreach file $files {
  71. global "$file"
  72. if {[info exists $file]} {
  73.     puts "flush $file"
  74.     flush [set $file]
  75.     close [set $file]
  76. }   
  77.     }
  78. }
  79. #------- Sender Class :
  80. # This is essentially an ftp sender
  81. Class GeneralSender  -superclass Agent 
  82. # otherparams are "startTime TCPclass .."
  83. GeneralSender instproc init { id node rcvrTCP otherparams } {
  84.     global  ns
  85.     $self next
  86.     $self instvar tcp_ id_ ftp_ node_ tcp_rcvr_ tcp_type_
  87.     set id_ $id
  88.     set node_ $node
  89.     if { [llength $otherparams] > 1 } {
  90. set TCP [lindex $otherparams 1]
  91.     } else { 
  92. set TCP "TCP/Reno"
  93.     }
  94.     set   tcp_type_ $TCP
  95.     set   tcp_ [new Agent/$TCP]
  96.     $tcp_ set  packetSize_ 1000   
  97.     $tcp_ set  class_  $id
  98.     set   ftp_ [new Source/FTP]
  99.     $ftp_ set agent_ $tcp_
  100.     $ns   attach-agent $node $tcp_
  101.     $ns   connect $tcp_  $rcvrTCP
  102.     set   tcp_rcvr_ $rcvrTCP
  103.     set   startTime [lindex $otherparams 0]
  104.     $ns   at $startTime "$ftp_ start"
  105.     puts  "initialized Sender $id_ at $startTime"
  106. }
  107. GeneralSender instproc trace-xcp parameters {
  108.     $self instvar tcp_ id_ tcpTrace_
  109.     global ftracetcp$id_ 
  110.     set ftracetcp$id_ [open  xcp$id_.tr  w]
  111.     set tcpTrace_ [set ftracetcp$id_]
  112.     $tcp_ attach-trace [set ftracetcp$id_]
  113.     if { -1 < [lsearch $parameters cwnd]  } { $tcp_ tracevar cwnd_ }
  114.     if { -1 < [lsearch $parameters seqno] } { $tcp_ tracevar t_seqno_ }
  115. }
  116. #--- Command line arguments
  117. proc  set-cmd-line-args { list_args } {
  118.     global argv
  119.     set i 0
  120.     foreach a $list_args {
  121. global $a
  122. set $a  [lindex $argv $i]
  123. puts "$a = [set $a]"
  124. incr i
  125.     }
  126. }
  127. #-------------- Plotting functions -----------#
  128. # plot a xcp traced var
  129. proc plot-xcp { TraceName nXCPs  PlotTime what } {
  130.     exec rm -f  xgraph.tcp
  131.     set f [open xgraph.tcp w]
  132.     puts $f "TitleText: $TraceName"
  133.     puts $f "Device: Postscript"
  134.     foreach i $nXCPs {
  135. #the TCP traces are flushed when the sources are stopped
  136. exec rm -f temp.tcp 
  137.         exec touch temp.tcp
  138. global ftracetcp$i 
  139. if [info exists ftracetcp$i] { flush [set ftracetcp$i] }
  140.         set result [exec awk -v PlotTime=$PlotTime -v what=$what {
  141.     {
  142. if (( $6 == what ) && ($1 > PlotTime)) {
  143.     print $1, $7 >> "temp.tcp";
  144. }
  145.     }
  146. } xcp$i.tr]
  147.  
  148. puts "$i : $result"
  149. puts $f "$what$i 
  150. exec cat temp.tcp >@ $f
  151. puts $f "n"
  152. flush $f
  153.     }
  154.     close $f
  155.     exec xgraph  -nl -m  -x time -y $what xgraph.tcp &
  156.     return 
  157. }
  158. # Takes as input the the label on the Y axis, the time it starts plotting, and the trace file tcl var
  159. proc plot-red-queue { TraceName PlotTime traceFile } {
  160.     
  161.     exec rm -f xgraph.red_queue
  162.     exec rm -f temp.q temp.a temp.p temp.avg_enqueued temp.avg_dequeued temp.x temp.y 
  163.     exec touch temp.q temp.a temp.p temp.avg_enqueued temp.avg_dequeued temp.x temp.y 
  164.     
  165.     exec awk -v PT=$PlotTime {
  166. {
  167.     if (($1 == "Q" && NF>2) && ($2 > PT)) {
  168. print $2, $3 >> "temp.q"
  169.     }
  170.     else if (($1 == "a" && NF>2) && ($2 > PT)){
  171. print $2, $3 >> "temp.a"
  172.     }
  173.     else if (($1 == "p" && NF>2) && ($2 > PT)){
  174. print $2, $3 >> "temp.p"
  175.     }
  176. }
  177.     }  $traceFile
  178.     set ff [open xgraph.red_queue w]
  179.     puts $ff "TitleText: $TraceName"
  180.     puts $ff "Device: Postscript n"
  181.     puts $ff "queue
  182.     exec cat temp.q >@ $ff  
  183.     puts $ff n"ave_queue
  184.     exec cat temp.a >@ $ff
  185.     puts $ff n"prob_drop
  186.     exec cat temp.p >@ $ff
  187.     close $ff
  188.     exec xgraph  -P -x time -y queue xgraph.red_queue &
  189. }
  190. #-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- Initializing Simulator -*-*-*-*-*-*-*-*--*-*-*-*-*-*-*-*-#
  191. # BW is in Mbs and delay is in ms
  192. set-cmd-line-args " numHops PostProcess seed qType BW nAllHopsTCPs delay"
  193. set numNodes [expr $numHops + 1 ]
  194. set ns           [new Simulator]
  195. set rtg          [new RNG]
  196. $rtg seed        $seed
  197. #-----Global Variables-----------#
  198. #set  qType  Vq
  199. #set  BW     [expr 10.0 * 1]
  200. #set  delay  50
  201. set tracefd [open out.tr w]
  202. $ns trace-all $tracefd
  203. set  qSize  [expr round([expr ($BW / 8.0) * 2.0 * $delay * 10 ])]
  204. #set  qSize  [expr round([expr ($BW / 8.0) * $delay * 1000 ])]
  205. puts "queue is $qSize" 
  206. set  qEffective_RTT [expr  20 * $delay * 0.001]
  207. #set-red-params $qSize
  208. set BW2                  [expr $BW / 2.0]
  209. puts "BW2 = $BW2"
  210. set BW_list {}
  211. set qType_list {}
  212. set delay_list {}
  213. set qSize_list {}
  214. set nTCPsPerHop_list {}
  215. set StartTime_list {}
  216. for {set i 0} {$i < $numHops} {incr i} {
  217. lappend BW_list $BW
  218. lappend qType_list $qType
  219. lappend delay_list $delay
  220. lappend qSize_list $qSize
  221. lappend nTCPsPerHop_list 30
  222. lappend StartTime_list 0
  223. }
  224. set tracedQueues         ""
  225. set tracedXCPs           "0 1 2 3 4 5 6 7 8"
  226. #set nAllHopsTCPs         30; #num of TCPs crossing all hops
  227. set rTCPs                30; #traverse all of the reverse path
  228. set SimStartTime         0.0
  229. set SimStopTime          20
  230. set PlotTime             0
  231. #---------- Create the simulation --------------------#
  232. # Create topology
  233. create-string-topology $numHops $BW_list $delay_list $qType_list $qSize_list; #all except the first are lists
  234. set i 0;
  235. while { $i < $numHops } {
  236.     set qtype [lindex $qType_list $i]
  237.     set bw [lindex $BW_list $i]
  238.     switch $qtype {
  239. "RED" { 
  240.     foreach queue "[set q$i] [set rq$i]" {
  241. set-red-params $queue $qMinTh $qMaxTh $qWeight $qLinterm
  242.     }
  243. }
  244. "Vq" {
  245.     foreach link "[set l$i] [set rl$i]" {
  246. set queue                   [$link queue]
  247. $queue set ecnlim_          0.98
  248. $queue set limit_           $qSize
  249. $queue link_capacity_bits   [[$link set link_] set bandwidth_];
  250. $queue set queue_in_bytes_  1
  251. $queue set buflim_          1000
  252. $queue set alpha_           0.15
  253.     }
  254. }
  255. "REM" {
  256.     foreach link "[set l$i] [set rl$i]" {
  257. set queue                [$link queue]
  258. $queue set reminw_       0.01
  259. $queue set remgamma_     0.001 
  260. $queue set remphi_       1.001 
  261. set cap_in_bits          [[$link set link_] set bandwidth_]
  262. $queue set remupdtime_   [expr 0.01 / ($cap_in_bits/8000000.0)] 
  263. $queue set rempktsize_   1000
  264. $queue set rempbo_       [expr $qSize * 0.33]
  265.     }
  266. }
  267.     "DropTail" { }
  268.     "XCP" {
  269. foreach link "[set l$i] [set rl$i]" {
  270.     set queue                   [$link queue]
  271.     #set-red-params $queue $qMinTh $qMaxTh $qWeight $qLinterm
  272. $queue set-link-capacity [[$link set link_] set bandwidth_];
  273. }
  274. }
  275.     "CSFQ" {
  276.     foreach link "[set l$i]" {
  277. set queue   [$link queue]
  278. set ff      0
  279. while {$ff < $nAllHopsTCPs} {
  280.     # Second argument is the flow's wait
  281.     $queue init-flow $ff 1.0 [expr 1000 * $delay * 2 * 4]
  282.     incr ff
  283. }
  284. set j [expr (1000 * $i) + 1000 ]; 
  285. while { $j < [expr [lindex $nTCPsPerHop_list $i] + ($i + 1) * 1000]  } {
  286.     $queue init-flow $j 1.0 [expr 1000 * $delay * 2 * 4]
  287.     incr j
  288. }
  289. set kLink [expr 1000 * $delay * 2 * 4]
  290. set queueSize   [expr  $qSize * 1000 * 8]
  291. set qsizeThresh [expr  $queueSize * 0.4]
  292.     $queue init-link 1 $kLink $queueSize $qsizeThresh [[$link set link_] set bandwidth_] 
  293.     }
  294. foreach link "[set rl$i]" {
  295. set queue   [$link queue]
  296. set ff      $nAllHopsTCPs
  297. while {$ff < [expr $rTCPs + $nAllHopsTCPs ] } {
  298.     # Second argument is the flow's wait
  299.     $queue init-flow $ff 1.0 [expr 1000 * $delay * 2 * 4]
  300.     incr ff
  301. }
  302. set kLink [expr 1000 * $delay * 2 * 4]
  303. set queueSize   [expr  $qSize * 1000 * 8]
  304. set qsizeThresh [expr  $queueSize * 0.7]
  305. $queue init-link 1 $kLink $queueSize $qsizeThresh [[$link set link_] set bandwidth_] 
  306. }
  307. }
  308.     default {}
  309.     }
  310. incr i
  311. }
  312. # Create sources: 1) Long TCPs
  313. set i 0
  314. while { $i < $nAllHopsTCPs  } {
  315. set StartTime     [expr [$rtg integer 1000] * 0.001 * (0.01 * $numHops * $delay) + $SimStartTime] 
  316. if {$qType == "XCP" } {
  317. set rcvr_TCP      [new Agent/TCPSink/XCPSink]
  318. $ns attach-agent  [set n$numHops] $rcvr_TCP
  319. set src$i         [new GeneralSender $i $n0 $rcvr_TCP "$StartTime TCP/Reno/XCP"]
  320. puts "starttime=$StartTime"
  321. } else {
  322. set rcvr_TCP      [new Agent/TCPSink]
  323. $ns attach-agent  [set n$numHops] $rcvr_TCP
  324. set src$i         [new GeneralSender $i $n0 $rcvr_TCP "$StartTime TCP/Reno"]
  325.     }
  326.     [[set src$i] set tcp_]  set  window_     [expr $qSize * 10]
  327.     incr i
  328. }
  329. # 2) jth Hop TCPs; start at j*1000
  330. set i 0;
  331. while {$i < $numHops} {
  332.     set j [expr (1000 * $i) + 1000 ]; 
  333.     while { $j < [expr [lindex $nTCPsPerHop_list $i] + ($i + 1) * 1000]  } {
  334. set StartTime     [expr [lindex $StartTime_list $i]+[$rtg integer 1000] * 0.001 * (0.01 * $numHops * $delay)+ $SimStartTime] 
  335. if {$qType == "XCP" } {
  336.     set rcvr_TCP      [new Agent/TCPSink/XCPSink]
  337. $ns attach-agent  [set  n[expr $i + 1]] $rcvr_TCP
  338.     set src$j         [new GeneralSender $j [set n$i] $rcvr_TCP "$StartTime TCP/Reno/XCP"]
  339. puts "starttime=$StartTime"
  340. } else {
  341.     set rcvr_TCP      [new Agent/TCPSink]
  342.     $ns attach-agent  [set  n[expr $i + 1]] $rcvr_TCP
  343.     set src$j         [new GeneralSender $j [set n$i] $rcvr_TCP "$StartTime TCP/Reno"]
  344. }
  345. [[set src$j] set tcp_]  set  window_     [expr $qSize * 10]
  346. incr j
  347.     }
  348.     incr i
  349. }
  350. # 3) reverse TCP; ids follow directly allhops TCPs
  351. set i 0
  352. while {$i < $numHops} {
  353.     set l 0
  354.     while { $l < $rTCPs} {
  355. set s [expr $l + $nAllHopsTCPs + ( $i * $rTCPs ) ] 
  356. #puts "s=$s  rTCPs=$rTCPs  l=$l  All=$nAllHopsTCPs"
  357. set StartTime     [expr [$rtg integer 1000] * 0.001 * (0.01 * $numHops * $delay)+ 0.0] 
  358. if {$qType == "XCP" } {
  359.     set rcvr_TCP      [new Agent/TCPSink/XCPSink]
  360.     $ns attach-agent  [set  n$i] $rcvr_TCP
  361. set src$s         [new GeneralSender $s [set  n[expr $i + 1]] $rcvr_TCP "$StartTime TCP/Reno/XCP"]
  362. puts "starttime=$StartTime"
  363. } else {
  364.     set rcvr_TCP      [new Agent/TCPSink]
  365.     $ns attach-agent  [set  n$i]  $rcvr_TCP
  366.     set src$s         [new GeneralSender $s [set  n[expr $i + 1]] $rcvr_TCP "$StartTime TCP/Reno"]
  367. }
  368. [[set src$s] set tcp_]  set  window_     [expr $qSize * 10]
  369. incr l
  370.     }
  371.     incr i
  372. }
  373. #---------- Trace --------------------#
  374. # General
  375. #set f_all [open TR/out.tr w]
  376. #$ns trace-queue $n0 $n1 $f_all
  377. #$ns trace-queue $n1 $n2 $f_all
  378. #$ns trace-queue $n2 $n3 $f_all
  379. #$ns trace-queue $n3 $n4 $f_all
  380. #$ns trace-queue $n4 $n5 $f_all
  381. #$ns trace-queue $n5 $n6 $f_all
  382. #$ns trace-queue $n6 $n7 $f_all
  383. #$ns trace-queue $n7 $n8 $f_all
  384. #$ns trace-queue $n8 $n9 $f_all
  385. # Trace sources
  386. foreach i $tracedXCPs {
  387. [set src$i] trace-xcp "cwnd seqno"
  388. }
  389. # Trace Queues
  390. set i 0;
  391. while { $i < $numHops } {
  392.     set qtype [lindex $qType_list $i]
  393.     foreach queue_name "q$i rq$i" {
  394. set queue [set "$queue_name"]
  395. switch $qtype {
  396.     "DropTail" {}
  397.     "Vq" {}
  398.     "REM" {}
  399.     "CSFQ" {}
  400.     #"RED/XCP" {}
  401.     default { #RED and XCP
  402. global "ft_red_$queue_name"
  403.     set "ft_red_$queue_name" [open TR/ft_red_[set queue_name].tr w]
  404. $queue attach       [set ft_red_$queue_name]
  405. #$queue trace curq_
  406. #$queue trace ave_
  407. #$queue trace prob1_
  408.     }
  409. }
  410.     }
  411.     
  412.     #The following is done in the Queue Class
  413.     foreach queue_name "q$i" {
  414. puts "attaching a file to $queue_name $qType"
  415. set queue [set "$queue_name"]
  416. $queue queue-sample-everyrtt $qEffective_RTT
  417.     #global ft_trace_$queue_name
  418.     #set    ft_trace_$queue_name [open TR/ft_trace_[set queue_name].tr w]
  419.     #$queue queue-attach   [set ft_trace_$queue_name]
  420.     #$queue queue-trace-drops  
  421.     #$queue queue-trace-curq
  422.     }
  423. ### Trace Utilization
  424. #[set q$i] queue-set-link-capacity [[[$ns link [set n$i] [set n[expr $i +1]]] set link_] set bandwidth_]
  425. incr i
  426. }
  427. #---------------- Run the simulation ------------------------#
  428. set files "f_all ";set i 0;
  429. while { $i < $numHops } {
  430.     set files "$files ft_trace_q$i ft_trace_rq$i ft_q$i ft_rq$i  ft_red_q$i ft_red_rq$i "
  431.     incr i
  432. }
  433. foreach i $tracedXCPs {
  434.     set file [set src$i tcpTrace_]
  435.     set files "$files $file"
  436. }
  437. proc finish {} {
  438.     global ns 
  439.     if {[info exists f]} {
  440. $ns flush-trace
  441. close $f
  442.     }   
  443.     $ns halt
  444. }
  445. $ns at $SimStopTime "finish"
  446. $ns run
  447. flush-files $files
  448. #----------------- Post Processing---------------------------#
  449. if { $PostProcess } {
  450.     #--- Traced Flows
  451.     set TraceName "Flows --$qType-QS$qSize"
  452.     plot-xcp      $TraceName  $tracedXCPs  0.0  "cwnd_"
  453.     plot-xcp      $TraceName  $tracedXCPs  0.0  "t_seqno_"
  454. }
  455. if { $PostProcess } {    
  456.     #---- Queue 1 - Data
  457.     set i 0;
  458.     foreach i $tracedQueues {
  459. puts "Q$i"
  460. set TraceName "q$i--QS$qSize-Max$qMaxTh-Min$qMinTh"
  461. switch $qType {
  462.     "DropTail" {}
  463.     "Vq" {
  464. #plot-function-of-time $TraceName  0   TR/ft_trace_q$i.tr "vq_len"
  465. plot-function-of-time $TraceName  0   TR/ft_trace_q$i.tr "virtual_cap"
  466.     }
  467.     "XCP" {
  468. plot-function-of-time $TraceName  0   TR/ft_trace_q$i.tr "input_traffic_bytes_ BTA_ BTF_"
  469. plot-function-of-time $TraceName  0   TR/ft_trace_q$i.tr "BTA_not_allocated BTF_not_reclaimed"
  470. plot-red-queue1    $TraceName     0   TR/ft_red_q$i.tr
  471. plot-function-of-time $TraceName  0   TR/ft_trace_q$i.tr "Queue_bytes_"  
  472. plot-function-of-time $TraceName  0   TR/ft_trace_q$i.tr "avg_rtt_ Tq_"  
  473.     }
  474.     "RED" {
  475. plot-red-queue1       $TraceName  0  TR/ft_red_q$i.tr
  476.     }
  477.     "CSFQ" {
  478. plot-function-of-time $TraceName  0   TR/ft_trace_q$i.tr "rateAlpha_ rateTotal_"
  479. plot-function-of-time $TraceName  0   TR/ft_trace_q$i.tr "congested_"
  480. plot-function-of-time $TraceName  0   TR/ft_trace_q$i.tr "alpha_"
  481. plot-function-of-time $TraceName  0   TR/ft_trace_q$i.tr "qsizeCrt_"
  482. plot-function-of-time $TraceName  0   TR/ft_trace_q$i.tr "label"
  483.     }
  484.     default {}
  485. }
  486. queue-plot            $TraceName  0  [set ft_trace_q$i]  TR/ft_trace_q$i.tr
  487. plot-function-of-time $TraceName  0   TR/ft_trace_q$i.tr "u"
  488. incr i
  489.     }
  490. }
  491. set i 0 
  492. while { $i < $numHops} {
  493.     puts " q$i drops = [[set q$i]  queue-read-drops]"
  494.     puts " r$i drops = [[set rq$i] queue-read-drops]"
  495.     incr i
  496. }