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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 1994-1997 Regents of the University of California.
  3. # All rights reserved.
  4. #
  5. # Redistribution and use in source and binary forms, with or without
  6. # modification, are permitted provided that the following conditions
  7. # are met:
  8. # 1. Redistributions of source code must retain the above copyright
  9. #    notice, this list of conditions and the following disclaimer.
  10. # 2. Redistributions in binary form must reproduce the above copyright
  11. #    notice, this list of conditions and the following disclaimer in the
  12. #    documentation and/or other materials provided with the distribution.
  13. # 3. All advertising materials mentioning features or use of this software
  14. #    must display the following acknowledgement:
  15. # This product includes software developed by the Computer Systems
  16. # Engineering Group at Lawrence Berkeley Laboratory.
  17. # 4. Neither the name of the University nor of the Laboratory may be used
  18. #    to endorse or promote products derived from this software without
  19. #    specific prior written permission.
  20. #
  21. # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24. # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31. # SUCH DAMAGE.
  32. #
  33. #
  34. # This file contains contrived scenarios and protocol agents
  35. # to illustrate the basic srm suppression algorithms.
  36. # It is not an srm implementation.
  37. #
  38. # $Header: /cvsroot/nsnam/ns-2/tcl/ex/srm-demo.tcl,v 1.14 2000/02/18 10:41:49 polly Exp $
  39. #
  40. # updated to use -multicast on by Lloyd Wood. dst_ needs improving
  41. set ns [new Simulator -multicast on]
  42. # cause ACKs to get dropped
  43. Queue set limit_ 6
  44. foreach k "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14" {
  45.  set node($k) [$ns node]
  46. }
  47. set f [open out.tr w]
  48. $ns trace-all $f
  49. set nf [open out.nam w]
  50. $ns namtrace-all $nf
  51. $ns color 1 red
  52. $ns color 2 white
  53. $ns color 3 blue
  54. $ns color 4 yellow
  55. $ns color 5 LightBlue
  56. proc makelinks { bw delay pairs } {
  57. global ns node
  58. foreach p $pairs {
  59. set src $node([lindex $p 0])
  60. set dst $node([lindex $p 1])
  61. $ns duplex-link $src $dst $bw $delay DropTail
  62. $ns duplex-link-op $src $dst orient [lindex $p 2]
  63. }
  64. }
  65. makelinks 1.5Mb 10ms {
  66. { 9 0 right-up }
  67. { 9 1 right }
  68. { 9 2 right-down }
  69. { 10 3 right-up }
  70. { 10 4 right }
  71. { 10 5 right-down }
  72. { 11 6 right-up }
  73. { 11 7 right }
  74. { 11 8 right-down }
  75. }
  76. makelinks 1.5Mb 40ms {
  77. { 12 9 right-up }
  78. { 12 10 right }
  79. { 12 11 right-down }
  80. }
  81. makelinks 1.5Mb 10ms {
  82. { 13 12 down } 
  83. }
  84. makelinks 1.5Mb 50ms {
  85. { 14 12 right }
  86. }
  87. $ns duplex-link-op $node(12) $node(14) queuePos 0.5
  88. $ns duplex-link-op $node(10) $node(3) queuePos 0.5
  89. set mproto DM
  90. set mrthandle [$ns mrtproto $mproto {}]
  91. Class Agent/Message/MC_Acker -superclass Agent/Message
  92. Agent/Message/MC_Acker set packetSize_ 800
  93. Agent/Message/MC_Acker instproc recv msg {
  94. set type [lindex $msg 0]
  95. set from_addr [lindex $msg 1]
  96. set from_port [lindex $msg 2]
  97. set seqno [lindex $msg 3]
  98. puts "Agent/Message/MC_Acker::recv $msg, $from_addr"
  99. $self set dst_addr_ $from_addr
  100. $self set dst_port_ $from_port
  101. $self send "ack $from_addr $seqno"
  102. }
  103. Class Agent/Message/MC_Sender -superclass Agent/Message
  104. Agent/Message/MC_Sender instproc recv msg {
  105. $self instvar addr_ sent_
  106. set type [lindex $msg 0]
  107. if { $type == "nack" } {
  108. set seqno [lindex $msg 2]
  109. if ![info exists sent_($seqno)] {
  110. $self send "data $addr_ $seqno"
  111. set sent_($seqno) 1
  112. }
  113. }
  114. }
  115. Agent/Message/MC_Sender instproc init {} {
  116. $self next
  117. $self set seqno_ 1
  118. }
  119. Agent/Message/MC_Sender instproc send-pkt {} {
  120. $self instvar seqno_ agent_addr_ agent_port_
  121. $self send "data $agent_addr_ $agent_port_ $seqno_"
  122. incr seqno_
  123. }
  124. set grp [Node allocaddr]
  125. set sndr [new Agent/Message/MC_Sender]
  126. $sndr set packetSize_ 1400
  127. $sndr set dst_addr_ $grp
  128. $sndr set dst_port_ 0
  129. $sndr set class_ 1
  130. $ns at 1.0 {
  131. global rcvr node
  132. foreach k "0 1 2 3 4 5 6 7 8" {
  133. set rcvr($k) [new Agent/Message/MC_Acker]
  134. $ns attach-agent $node($k) $rcvr($k)
  135. $rcvr($k) set class_ 2
  136. $node($k) join-group $rcvr($k) $grp
  137. }
  138. $node(14) join-group $sndr $grp
  139. }
  140. Class Agent/Message/MC_Nacker -superclass Agent/Message
  141. Agent/Message/MC_Nacker set packetSize_ 800
  142. Agent/Message/MC_Nacker instproc recv msg {
  143. set type [lindex $msg 0]
  144. set from [lindex $msg 1]
  145. set seqno [lindex $msg 2]
  146. puts "Agent/Message/MC_Nacker::recv $msg"
  147. $self instvar dst_ ack_
  148. if [info exists ack_] {
  149. set expected [expr $ack_ + 1]
  150. if { $seqno > $expected } {
  151. set dst_ $from
  152. $self send "nack $from $seqno"
  153. }
  154. }
  155. set ack_ $seqno
  156. }
  157. Class Agent/Message/MC_SRM -superclass Agent/Message
  158. Agent/Message/MC_SRM set packetSize_ 800
  159. Agent/Message/MC_SRM instproc recv msg {
  160. $self instvar dst_ ack_ nacked_ random_
  161. global grp
  162. set type [lindex $msg 0]
  163. set from [lindex $msg 1]
  164. set seqno [lindex $msg 2]
  165. if { $type == "nack" } {
  166. set nacked_($seqno) 1
  167. return
  168. }
  169. if [info exists ack_] {
  170. set expected [expr $ack_ + 1]
  171. if { $seqno > $expected } {
  172. set dst_ $grp
  173. if [info exists random_] {
  174. global ns
  175. set r [expr ([ns-random] / double(0x7fffffff) + 0.1) * $random_]
  176. set r [expr [$ns now] + $r]
  177. $ns at $r "$self send-nack $from $seqno"
  178. } else {
  179. $self send "nack $from $seqno"
  180. }
  181. }
  182. }
  183. set ack_ $seqno
  184. }
  185. Agent/Message/MC_SRM instproc send-nack { from seqno } {
  186. $self instvar nacked_ dst_
  187. global grp
  188. if ![info exists nacked_($seqno)] {
  189. set dst_ $grp
  190. $self send "nack $from $seqno"
  191. }
  192. }
  193. $ns at 1.5 {
  194. global rcvr node
  195. foreach k "0 1 2 3 4 5 6 7 8" {
  196. $node($k) leave-group $rcvr($k) $grp
  197. $ns detach-agent $node($k) $rcvr($k)
  198. delete $rcvr($k)
  199. set rcvr($k) [new Agent/Message/MC_Nacker]
  200. $ns attach-agent $node($k) $rcvr($k)
  201. $rcvr($k) set class_ 3
  202. $node($k) join-group $rcvr($k) $grp
  203. }
  204. }
  205. $ns at 3.0 {
  206. global rcvr node
  207. foreach k "0 1 2 3 4 5 6 7 8" {
  208. $node($k) leave-group $rcvr($k) $grp
  209. $ns detach-agent $node($k) $rcvr($k)
  210. delete $rcvr($k)
  211. set rcvr($k) [new Agent/Message/MC_SRM]
  212. $ns attach-agent $node($k) $rcvr($k)
  213. $rcvr($k) set class_ 3
  214. $node($k) join-group $rcvr($k) $grp
  215. }
  216. }
  217. $ns at 3.6 {
  218. global rcvr node
  219. foreach k "0 1 2 3 4 5 6 7 8" {
  220. $rcvr($k) set random_ 2
  221. }
  222. }
  223. $ns attach-agent $node(14) $sndr
  224. foreach t {
  225. 1.05
  226. 1.08
  227. 1.11
  228. 1.14
  229. 1.55
  230. 1.58
  231. 1.61
  232. 1.64 
  233. 1.85
  234. 1.88
  235. 1.91
  236. 1.94
  237. 2.35
  238. 2.38
  239. 2.41
  240. 2.44
  241. 3.05
  242. 3.08
  243. 3.11
  244. 3.14
  245. 3.65
  246. 3.68
  247. 3.71
  248. 3.74
  249. } { $ns at $t "$sndr send-pkt" }
  250. proc reset-rcvr {} {
  251. global rcvr
  252. foreach k "0 1 2 3 4 5 6 7 8" {
  253. $rcvr($k) unset ack_
  254. }
  255. }
  256. $ns at 2.345 "reset-rcvr"
  257. Class Agent/Message/Flooder -superclass Agent/Message
  258. Agent/Message/Flooder instproc flood n {
  259. while { $n > 0 } {
  260. $self send junk
  261. incr n -1
  262. }
  263. }
  264. set m0 [new Agent/Message/Flooder]
  265. $ns attach-agent $node(10) $m0
  266. set sink0 [new Agent/Null]
  267. $ns attach-agent $node(3) $sink0
  268. $ns connect $m0 $sink0
  269. $m0 set class_ 4
  270. $m0 set packetSize_ 1500
  271. $ns at 1.977 "$m0 flood 10"
  272. set m1 [new Agent/Message/Flooder]
  273. $ns attach-agent $node(14) $m1
  274. set sink1 [new Agent/Null]
  275. $ns attach-agent $node(12) $sink1
  276. $ns connect $m1 $sink1
  277. $m1 set class_ 4
  278. $m1 set packetSize_ 1500
  279. $ns at 2.375 "$m1 flood 10"
  280. $ns at 3.108 "$m1 flood 10"
  281. $ns at 3.705 "$m1 flood 10"
  282. $ns at 2.85 "reset-rcvr"
  283. $ns at 3.6 "reset-rcvr"
  284. $ns at 5.0 "finish"
  285. proc finish {} {
  286. global ns f
  287. $ns flush-trace
  288. close $f
  289. puts "running nam..."
  290. exec nam out.nam &
  291. exit 0
  292. }
  293. $ns run