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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Example code for parameter changing in Vegas congestion control algorithm
  3. #
  4. # TCP-Linux module for NS2 
  5. #
  6. # Nov 2007
  7. #
  8. # Author: Xiaoliang (David) Wei  (DavidWei@acm.org)
  9. #
  10. # NetLab, the California Institute of Technology 
  11. # http://netlab.caltech.edu
  12. #
  13. # See a mini-tutorial about TCP-Linux at: http://netlab.caltech.edu/projects/ns2tcplinux/
  14. #
  15. #
  16. # Module: tcl/ex/tcp-linux/vegas_param_change.tcl
  17. #    This is an example on how to change parameters in congestion control algorithms
  18. # with TCP-Linux. This code uses TCP-Vegas as an example and demonstrates how to change
  19. # default parameter and individual parameter for a connection.
  20. #
  21. # The code simulates the scenario in which three vegas flows running together through the same bottleneck queue.
  22. # The default parameters alpha and beta are set to 40 (40/2=20 packets) at time 60 second.
  23. # (hence the queue length is expected to be 40/2*3 = 60 packets afterwards.)
  24. # The alpha beta  parameters of individual flow 3 is changed to 20 (20/2=10 packets) at time 120 second.
  25. # (hence the queue length is expected to be 40/2*2+20/2*1 = 50 packets afterwards, and the throughput
  26. # of flow 3 will be smaller than flow 1 and 2 afterwards)
  27. #
  28. #    The code outputs:
  29. # queue.trace: the queue length over time in the format of <time> <queue len>
  30. # p1.trace, p2.trace, p3.trace: the connection variables over time in format specified in sampling.tcl
  31. #
  32. #
  33. # After the simulation, run
  34. #    gnuplot gnuplot_vegas_param.script 
  35. # to generate figures on cwnd trajectory and queue trajectory.
  36. #
  37. #Create a simulator object
  38. set ns [new Simulator]
  39. #Create a bottleneck link.
  40. set router_snd [$ns node]
  41. set router_rcv [$ns node]
  42. $ns duplex-link $router_snd $router_rcv 10Mb 10ms DropTail
  43. $ns queue-limit $router_snd $router_rcv 10000
  44. # Create two flows sharing the bottleneck link
  45. for {set i 1} {$i<=3} {incr i 1} {
  46.   #Create the sending nodes,the receiving nodes.
  47.   set bs($i) [$ns node]
  48.   $ns duplex-link $bs($i) $router_snd 100Mb 1ms DropTail
  49.   set br($i) [$ns node]
  50.   $ns duplex-link $router_rcv $br($i) 100Mb 1ms DropTail
  51.   #setup sender side
  52.   set tcp($i) [new Agent/TCP/Linux]
  53.   $tcp($i) set timestamps_ true
  54.   $tcp($i) set window_ 100000
  55.   $ns at 0 "$tcp($i) select_ca vegas"
  56.   $ns attach-agent $bs($i) $tcp($i)
  57.   #set up receiver side
  58.   set sink($i) [new Agent/TCPSink/Sack1]
  59.   $sink($i) set ts_echo_rfc1323_ true
  60.   $ns attach-agent $br($i) $sink($i)
  61.   #logical connection
  62.   $ns connect $tcp($i) $sink($i)
  63.   #Setup a FTP over TCP connection
  64.   set ftp($i) [new Application/FTP]
  65.   $ftp($i) attach-agent $tcp($i)
  66.   $ftp($i) set type_ FTP
  67.   #Schedule the life of the FTP
  68.   $ns at 0 "$ftp($i) start"
  69.   $ns at 200 "$ftp($i) stop"
  70. }
  71. #change default parameters, all TCP/Linux will see the changes!
  72. $ns at 60 "$tcp(1) set_ca_default_param vegas alpha 40"
  73. $ns at 60 "$tcp(1) set_ca_default_param vegas beta 40"
  74. # confirm the changes by printing the parameter values (optional)
  75. $ns at 60 "$tcp(2) get_ca_default_param vegas alpha"
  76. $ns at 60 "$tcp(2) get_ca_default_param vegas beta"
  77. # change local parameters, only tcp(3) is affected. (optional)
  78. $ns at 120 "$tcp(3) set_ca_param vegas alpha 20"
  79. $ns at 120 "$tcp(3) set_ca_param vegas beta 20"
  80. # confirm the changes by printing the parameter values (optional)
  81. $ns at 120 "$tcp(3) get_ca_param vegas alpha"
  82. $ns at 120 "$tcp(3) get_ca_param vegas beta"
  83. #Schedule the stop of the simulation
  84. $ns at 201 "exit 0"
  85. set MonitorInterval 0.1
  86. set qmonfile [open "queue.trace" "w"]
  87. close $qmonfile
  88. set qmon [$ns monitor-queue $router_snd $router_rcv "" $MonitorInterval]
  89. source "sampling.tcl"
  90. proc monitor {interval} {
  91.     global ns tcp qmon
  92.     set nowtime [$ns now]
  93.     set id 0
  94.     for {set i 1} {$i<=3} {incr i 1} {
  95.        set id [expr $id+1]
  96.        monitor_tcp $ns $tcp($id) p$i.trace
  97.     }
  98.     monitor_queue $ns $qmon queue.trace
  99.     $ns after $interval "monitor $interval"
  100. }
  101. $ns at 0 "monitor $MonitorInterval"
  102. #Start the simulation
  103. $ns run