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

通讯编程

开发平台:

Visual C++

  1. #
  2. # A simple (but not too realistic) rate-based congestion control
  3. # scheme for Homework 3 in CS268.
  4. #
  5. # $Header: /cvsroot/nsnam/ns-2/tcl/ex/rc.tcl,v 1.4 1998/09/01 17:01:19 tomh Exp $
  6. #
  7. source timer.tcl
  8. set ns [new Simulator]
  9. proc build_topology { ns which } {
  10.         $ns color 1 red
  11.         $ns color 2 white
  12. foreach i "0 1 2 3" {
  13. global n$i
  14. set tmp [$ns node]
  15. set n$i $tmp
  16. }
  17. $ns duplex-link $n0 $n2 5Mb 2ms DropTail
  18. $ns duplex-link $n1 $n2 5Mb 2ms DropTail
  19. $ns duplex-link-op $n0 $n2 orient right-down
  20. $ns duplex-link-op $n1 $n2 orient right-up
  21. if { $which == "FIFO" } {
  22. $ns duplex-link $n2 $n3 1.5Mb 10ms DropTail
  23. } elseif { $which == "RED" } {
  24. $ns duplex-link $n2 $n3 1.5Mb 10ms RED
  25. } else {
  26. $ns duplex-link $n2 $n3 1.5Mb 10ms FQ
  27. }
  28. $ns duplex-link-op $n2 $n3 orient right
  29. $ns duplex-link-op $n2 $n3 queuePos 0.5
  30. }
  31. Class Agent/Message/Sender -superclass {Agent/Message Timer}
  32. Class Agent/Message/Receiver -superclass Agent/Message
  33. Agent/Message/Sender instproc init {} {
  34. $self next
  35. $self instvar cbr_ seq_ udp_
  36. set udp_ [new Agent/UDP]
  37. set cbr_ [new Application/Traffic/CBR]
  38. $cbr_ attach-agent $udp_
  39. set seq_ 1
  40. $self sched [$self randomize 0.05]
  41. }
  42. Agent/Message/Sender instproc randomize v {
  43. return [expr $v * (1.0 + [ns-random] / 2147483647.)]
  44. }
  45. Agent/Message/Sender instproc timeout {} {
  46. global ns
  47. $self send "probe [$ns now]"
  48. $self sched [$self randomize 0.05]
  49. }
  50. Agent/Message/Sender instproc handle msg {
  51. set type [lindex $msg 0]
  52. if { $type == "congested" } {
  53. $self decrease
  54. } else {
  55. $self increase
  56. }
  57. }
  58. Agent/Message/Sender instproc increase {} {
  59. $self instvar cbr_
  60. set delta [$cbr_ set interval_]
  61. set delta [expr 1.0 / (1.0 / $delta + 100)]
  62. $cbr_ set interval_ $delta
  63. }
  64. Agent/Message/Sender instproc decrease {} {
  65. $self instvar cbr_
  66. set delta [$cbr_ set interval_]
  67. set delta [expr 2 * $delta]
  68. $cbr_ set interval_ $delta
  69. }
  70. Agent/Message/Receiver instproc init {} {
  71. $self next
  72. $self instvar mon_ congested_
  73. set mon_ [new Agent/LossMonitor]
  74. $mon_ proc log-loss {} "$self log-loss"
  75. set congested_ 0
  76. }
  77. Agent/Message/Receiver instproc log-loss {} {
  78. global ns
  79. $self instvar congested_
  80. if !$congested_ {
  81. $self send "congested 0"
  82. set congested_ 1
  83. }
  84. }
  85. Agent/Message/Receiver instproc handle msg {
  86. $self instvar congested_
  87. if $congested_ {
  88. set congested_ 0
  89. } else {
  90. $self send "uncongested [lindex $msg 1]"
  91. }
  92. }
  93. proc build_conn { from to startTime } {
  94. global ns
  95. set src [new Agent/Message/Sender]
  96. set sink [new Agent/Message/Receiver]
  97. $ns attach-agent $from $src
  98. $ns attach-agent $to $sink
  99. $ns connect $src $sink
  100. $ns attach-agent $from [$src set udp_]
  101. $ns attach-agent $to [$sink set mon_]
  102. $ns connect [$src set udp_] [$sink set mon_]
  103. $ns at $startTime "[$src set cbr_] start"
  104. return [$src set udp_]
  105. }
  106. set f [open out.tr w]
  107. $ns trace-all $f
  108. set nf [open out.nam w]
  109. $ns namtrace-all $nf
  110. build_topology $ns FIFO
  111. set c1 [build_conn $n0 $n3 0.1]
  112. $c1 set class_ 1
  113. set c2 [build_conn $n1 $n3 0.1]
  114. $c2 set class_ 2
  115. $ns at 5.0 "finish"
  116. proc finish {} {
  117. global ns f nf
  118. $ns flush-trace
  119. close $f
  120. close $nf
  121. #XXX
  122. puts "running nam..."
  123. exec nam out.nam &
  124. exit 0
  125. }
  126. $ns run