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

通讯编程

开发平台:

Visual C++

  1. # ----------------------- Test XCP Performance ------------------------------#
  2. #
  3. # Author: Dina Katabi, dina@ai.mit.edu
  4. # Last Update : 7/16/2002
  5. #
  6. #-------------------------------------------------------------------------------#
  7. #-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- Utility Functions -*-*-*-*-*-*-*-*--*-*-*-*-*-*-*-*-#
  8. #--------- Creating the TOPOLOGY --------------------#
  9. #       n0                             
  10. #       :    Bottleneck            
  11. #       :  R0-----------------------R1
  12. #         /                            
  13. #       ni                         
  14. #
  15. Queue/XCP set tcp_xcp_on_ 1
  16. Agent/TCP set minrto_ 1
  17. proc set-red-params { qsize } {
  18. Queue/RED set thresh_ [expr 0.6 * $qsize]
  19. Queue/RED set maxthresh_ [expr 0.8 * $qsize]
  20. Queue/RED set q_weight_ 0.001
  21. Queue/RED set linterm_ 10
  22. Queue/RED set bytes_ false ;
  23. Queue/RED set queue_in_bytes_ false ;
  24. Agent/TCP set old_ecn_ true
  25. Queue/RED set setbit_     true
  26. }
  27. proc create-topology2 { BW delay qtype qsize numSideLinks deltaDelay } {
  28.     global ns 
  29.     
  30.     #Set the queue size to the pipe's size assuming the packet size is 1000 KByte
  31.     if { $qsize == 0 } { set qsize [expr round([expr ($BW / 8) * 2 * $delay])] }
  32.     set i 0
  33.     while { $i < 2 } {
  34. global R$i
  35. set R$i [$ns node]
  36. incr i
  37.     }
  38.     
  39.     $ns duplex-link $R0 $R1 [set BW]Mb [set delay]ms $qtype
  40.     $ns queue-limit $R0 $R1 $qsize
  41.     $ns queue-limit $R1 $R0 $qsize
  42.     # Give a global handle to the Bottleneck Queue to allow 
  43.     # setting the RED paramters
  44.     global Bottleneck rBottleneck
  45.     set  Bottleneck  [[$ns link $R0 $R1] queue] 
  46.     set  rBottleneck [[$ns link $R1 $R0] queue]
  47.     global l rl
  48.     set  l  [$ns link $R0 $R1]  
  49.     set  rl [$ns link $R1 $R0]
  50.     global all_links 
  51.     set all_links "$l $rl "
  52.     # The side links  have the same BW as the Bottleneck
  53.     set i 0
  54.     while { $i < $numSideLinks } {
  55. global n$i q$i rq$i l$i rl$i
  56. set n$i  [$ns node]
  57. $ns duplex-link [set n$i]  $R0  [set BW]Mb [expr $delay + $i * $deltaDelay]ms $qtype
  58. $ns queue-limit [set n$i]  $R0  $qsize
  59. $ns queue-limit $R0 [set n$i]   $qsize
  60. set  q$i   [[$ns link [set n$i]  $R0] queue] 
  61. set  rq$i  [[$ns link $R0 [set n$i]] queue]
  62. set  l$i    [$ns link [set n$i]  $R0] 
  63. set  rl$i   [$ns link $R0 [set n$i]]
  64. set all_links "$all_links [set l$i] [set rl$i] "
  65. incr i
  66.     }
  67. }
  68. #------- Sender Class :
  69. # This is essentially an ftp sender
  70. Class GeneralSender  -superclass Agent 
  71. # otherparams are "startTime TCPclass .."
  72. GeneralSender instproc init { id node rcvrTCP otherparams } {
  73.     global  ns
  74.     $self next
  75.     $self instvar tcp_ id_ ftp_ node_ tcp_rcvr_ tcp_type_
  76.     set id_ $id
  77.     set node_ $node
  78.     if { [llength $otherparams] > 1 } {
  79. set TCP [lindex $otherparams 1]
  80.     } else { 
  81. set TCP "TCP/Reno"
  82.     }
  83.     set   tcp_type_ $TCP
  84.     set   tcp_ [new Agent/$TCP]
  85.     $tcp_ set  packetSize_ 1000   
  86.     $tcp_ set  class_  $id
  87.     set   ftp_ [new Source/FTP]
  88.     $ftp_ set agent_ $tcp_
  89.     $ns   attach-agent $node $tcp_
  90.     $ns   connect $tcp_  $rcvrTCP
  91.     set   tcp_rcvr_ $rcvrTCP
  92.     set   startTime [lindex $otherparams 0]
  93.     $ns   at $startTime "$ftp_ start"
  94.     puts  "initialized Sender $id_ at $startTime"
  95. }
  96. GeneralSender instproc trace-xcp parameters {
  97.     $self instvar tcp_ id_ tcpTrace_
  98.     global ftracetcp$id_ 
  99.     set ftracetcp$id_ [open  xcp$id_.tr  w]
  100.     set tcpTrace_ [set ftracetcp$id_]
  101.     $tcp_ attach-trace [set ftracetcp$id_]
  102.     if { -1 < [lsearch $parameters cwnd]  } { $tcp_ tracevar cwnd_ }
  103.     if { -1 < [lsearch $parameters seqno] } { $tcp_ tracevar t_seqno_ }
  104. }
  105. #--- Command line arguments
  106. proc  set-cmd-line-args { list_args } {
  107.     global argv
  108.     set i 0
  109.     foreach a $list_args {
  110. global $a
  111. set $a  [lindex $argv $i]
  112. puts "$a = [set $a]"
  113. incr i
  114.     }
  115. }
  116. #-------------- Plotting functions -----------#
  117. # plot a xcp traced var
  118. proc plot-xcp { TraceName nXCPs  PlotTime what } {
  119.     if {[string compare $what "cwnd_"] == 0} {
  120. exec rm -f xgraph_cwnd.tcp
  121. set f [open xgraph_cwnd.tcp w]
  122. set a cwnd
  123.     } else {
  124. exec rm -f xgraph_seqno.tcp
  125. set f [open xgraph_seqno.tcp w]
  126. set a seqno
  127.     }
  128.     puts $f "TitleText: $TraceName"
  129.     puts $f "Device: Postscript"
  130.     foreach i $nXCPs {
  131. #the TCP traces are flushed when the sources are stopped
  132. exec rm -f temp.tcp 
  133.         exec touch temp.tcp
  134. global ftracetcp$i 
  135. if [info exists ftracetcp$i] { flush [set ftracetcp$i] }
  136.         set result [exec awk -v PlotTime=$PlotTime -v what=$what {
  137.     {
  138. if (( $6 == what ) && ($1 > PlotTime)) {
  139.     print $1, $7 >> "temp.tcp";
  140. }
  141.     }
  142. } xcp$i.tr]
  143.  
  144. puts "$i : $result"
  145. puts $f "$what$i 
  146. exec cat temp.tcp >@ $f
  147. puts $f "n"
  148. flush $f
  149.     }
  150.     close $f
  151.     exec xgraph  -nl -m  -x time -y $what xgraph_$a.tcp &
  152.     return 
  153. }
  154. # Takes as input the the label on the Y axis, the time it starts plotting, and the trace file tcl var
  155. proc plot-xcp-queue { TraceName PlotTime traceFile } {
  156.     
  157.     exec rm -f xgraph.xcp_queue
  158.     exec rm -f temp.q temp.a temp.p temp.avg_enqueued temp.avg_dequeued temp.x temp.y 
  159.     exec touch temp.q temp.a temp.p temp.avg_enqueued temp.avg_dequeued temp.x temp.y 
  160.     
  161.     exec awk -v PT=$PlotTime {
  162. {
  163.     if (($1 == "q" && NF>2) && ($2 > PT)) {
  164. print $2, $3 >> "temp.q"
  165.     }
  166.     else if (($1 == "a" && NF>2) && ($2 > PT)) {
  167. print $2, $3 >> "temp.a"
  168.     }
  169.     else if (($1 == "p" && NF>2) && ($2 > PT)) {
  170. print $2, $3 >> "temp.p"
  171.     }
  172. }
  173.     }  $traceFile
  174.     set ff [open xgraph.xcp_queue w]
  175.     puts $ff "TitleText: DROPTAIL XCP queue$TraceName"
  176.     puts $ff "Device: Postscript n"
  177.     puts $ff "queue
  178.     exec cat temp.q >@ $ff  
  179.     puts $ff n"ave_queue
  180.     exec cat temp.a >@ $ff
  181.     puts $ff n"prob_drop
  182.     exec cat temp.p >@ $ff
  183.     close $ff
  184.     exec xgraph  -P -x time -y queue xgraph.xcp_queue &
  185. }
  186. proc plot-red-queue { TraceName PlotTime traceFile } {
  187.     
  188.     exec rm -f xgraph.red_queue
  189.     exec rm -f temp.q temp.a temp.p temp.avg_enqueued temp.avg_dequeued temp.x temp.y 
  190.     exec touch temp.q temp.a temp.p temp.avg_enqueued temp.avg_dequeued temp.x temp.y 
  191.     
  192.     exec awk -v PT=$PlotTime {
  193. {
  194.     if (($1 == "Q" && NF>2) && ($2 > PT)) {
  195. print $2, $3 >> "temp.q"
  196.     }
  197.     else if (($1 == "a" && NF>2) && ($2 > PT)) {
  198. print $2, $3 >> "temp.a"
  199.     }
  200.     else if (($1 == "p" && NF>2) && ($2 > PT)) {
  201. print $2, $3 >> "temp.p"
  202.     }
  203. }
  204.     }  $traceFile
  205.     set ff [open xgraph.red_queue w]
  206.     puts $ff "TitleText: RED TCP queue$TraceName"
  207.     puts $ff "Device: Postscript n"
  208.     puts $ff "queue
  209.     exec cat temp.q >@ $ff  
  210.     puts $ff n"ave_queue
  211.     exec cat temp.a >@ $ff
  212.     puts $ff n"prob_drop
  213.     exec cat temp.p >@ $ff
  214.     close $ff
  215.     exec xgraph  -P -x time -y queue xgraph.red_queue &
  216. }
  217. proc plot-red {varname filename PlotTime} {
  218.     
  219.     exec rm -f temp.$filename
  220.     exec touch temp.$filename
  221.     
  222.     set result [exec awk -v PlotTime=$PlotTime -v what=$varname -v file=temp.$filename {
  223. {
  224.     if (( $1 == what ) && ($2 > PlotTime)) {
  225. print $2, $3 >> file ;
  226.     }  
  227. }
  228.     } ft_red_Bottleneck.tr]
  229.     exec xgraph -P -x time -y $filename temp.$filename
  230. }
  231. #-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- Initializing Simulator -*-*-*-*-*-*-*-*--*-*-*-*-*-*-*-*-#
  232. # BW is in Mbs and delay is in ms
  233. #set-cmd-line-args "seed qType BW nXCPs delay "
  234. set seed   472904
  235. set qType  XCP
  236. set BW     20; # in Mb/s
  237. set nXCPs  3; # Number of flows
  238. set delay  10; # in ms
  239. set ns          [new Simulator]
  240. $ns             use-scheduler Heap
  241. set rtg [new RNG]
  242. $rtg seed       $seed
  243. set f_all [open out.tr w]
  244. $ns trace-all $f_all
  245. set  qSize  [expr round([expr ($BW / 8.0) * 4 * $delay * 1.0])];#set buffer to the pipe size
  246. #set qSize [expr $qSize/4]
  247. set tracedXCPs       "0 1 2 3"
  248. set SimStopTime      30
  249. set PlotTime         0
  250. #---------- Create the simulation --------------------#
  251. # Create topology
  252. set-red-params $qSize
  253. create-topology2 $BW $delay $qType $qSize $nXCPs 0.0
  254. foreach link $all_links {
  255.     set queue [$link queue]
  256.     switch $qType {
  257. "XCP" {
  258. $queue set-link-capacity [[$link set link_] set bandwidth_];
  259. }
  260. "DropTail/XCP" {
  261. $queue set-link-capacity-Kbytes [expr [[$link set link_] set bandwidth_] / 8000];
  262. }
  263.     default {
  264.     puts "Incorrect qType $qType"
  265.     exit 0
  266.     }
  267.     }
  268. }
  269. # Create sources:
  270. set i 0
  271. while { $i < $nXCPs  } {
  272.     set StartTime [expr [$rtg integer 1000] * 0.001 * (0.01 * $delay) + $i  * 0.0] 
  273.     set rcvr_XCP      [new Agent/TCPSink/XCPSink]
  274.     $ns attach-agent  $R1 $rcvr_XCP
  275.     set src$i         [new GeneralSender $i [set n$i] $rcvr_XCP "$StartTime TCP/Reno/XCP"]
  276. #[[set src$i] set tcp_]  set  packetSize_ [expr 100 * ($i +10)]
  277. [[set src$i] set tcp_]  set  packetSize_ 1000
  278. [[set src$i] set tcp_]  set  window_     [expr $qSize * 10]
  279. incr i
  280. }
  281. set StartTime 0.0900000000000000023
  282. set rcvr_TCP [new Agent/TCPSink]
  283. $ns attach-agent $R1 $rcvr_TCP
  284. set src$i [new GeneralSender $i $n0 $rcvr_TCP "$StartTime TCP/Reno"]
  285. [[set src$i] set tcp_]  set  packetSize_ [expr 100 * ($i +10)]
  286. [[set src$i] set tcp_]  set  window_     [expr $qSize * 10]
  287. incr i
  288.  
  289. #---------- Trace --------------------#
  290. set i 0
  291. # Trace sources
  292. foreach i $tracedXCPs {
  293. [set src$i] trace-xcp "cwnd seqno"
  294. }
  295. # Trace Queues
  296. foreach queue_name "Bottleneck rBottleneck" {
  297. set queue [set "$queue_name"]
  298. switch $qType {
  299. "XCP" {
  300. global "ft_red_$queue_name"
  301. global "tcp_$queue_name"
  302. set "ft_red_$queue_name" [open ft_red_[set queue_name].tr w]
  303. $queue attach [set ft_red_$queue_name]
  304. set "tcp_$queue_name" [open tcp.tr w]
  305. set tcpq [$queue set vq_(1)]
  306. $tcpq attach [set tcp_$queue_name]
  307. $tcpq trace curq_
  308. $tcpq trace ave_
  309. $tcpq trace prob1_
  310. }
  311. "DropTail/XCP" {}
  312. }
  313. }
  314. #---------------- Run the simulation ------------------------#
  315. proc flush-files {} {
  316.     set files "f_all ft_red_Bottleneck ft_red_rBottleneck"
  317.     global tracedXCPs
  318.     foreach file $files {
  319.         global $file
  320.         if {[info exists $file]} {
  321.             flush [set $file]
  322.             close [set $file]
  323.         }   
  324.     }
  325.     foreach i $tracedXCPs {
  326. global src$i
  327.     set file [set src$i tcpTrace_]
  328. if {[info exists $file]} {
  329.             flush [set $file]
  330.             close [set $file]
  331.         }   
  332.     }
  333. }
  334. proc finish {} {
  335.     global ns 
  336.     if {[info exists f]} {
  337. $ns flush-trace
  338. close $f
  339.     }   
  340.     $ns halt
  341. }
  342. $ns at $SimStopTime "finish"
  343. $ns run
  344. flush-files
  345. #------------ Post Processing ---------------#
  346. set PostProcess 1
  347. if { $PostProcess } {
  348.     #--- Traced TCPs
  349. set TraceName "Flows --$qType-QS$qSize"
  350. plot-xcp      $TraceName  $tracedXCPs  0.0  "cwnd_"
  351. plot-xcp      $TraceName  $tracedXCPs  0.0  "t_seqno_"
  352. #plot-xcp-queue  $TraceName  $PlotTime   ft_red_Bottleneck.tr
  353. #plot-red-queue  $TraceName  $PlotTime   tcp.tr
  354. plot-red "u" util 0.0
  355. }