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

通讯编程

开发平台:

Visual C++

  1. # Scripts for bandwidth-asymmetry simulations.  Uses util.tcl (must be in
  2. # this directory).
  3. source util.tcl
  4. # set up simulation
  5. set ns [new Simulator]
  6. set n0 [$ns node]
  7. set n1 [$ns node]
  8. set n2 [$ns node]
  9. set n3 [$ns node]
  10. set f [open out.tr w]
  11. $ns trace-all $f
  12. #$ns use-scheduler List
  13. set tcptrace [open tcp.tr w] 
  14. set sinktrace [open sink.tr w]
  15. set redtrace [open red.tr w]
  16. set qtrace [open q.tr w]
  17. set graph 0
  18. set connGraphFlag("") 0
  19. set maxdelack 25
  20. set maxburst 0
  21. set upwin 0
  22. set downwin 100
  23. set tcpTick 0.1
  24. set ackSize 6
  25. set rbw 28.8Kb
  26. set rqsize 10
  27. set qsize 10
  28. set rgw "DropTail"
  29. set nonfifo 1
  30. set acksfirst false
  31. set filteracks false
  32. set reconsacks false
  33. set replace_head false
  34. set q_wt 0.1
  35. set rand_drop false
  36. set prio_drop false
  37. set randomize 1
  38. set startTime 0
  39. set midtime 0
  40. set stop 50
  41. Agent/AckReconsClass set deltaAckThresh_ 2
  42. Agent/AckReconsClass set ackInterArr_ 0.010
  43. Agent/AckReconsClass set ackSpacing_ 0.010
  44. Agent/AckReconsClass set delack_ 2
  45. Agent/AckReconsClass set adaptive_ 1
  46. Agent/AckReconsClass set alpha_ 0.25
  47. Agent/AckReconsClass set lastTime_ 0
  48. Agent/AckReconsClass set lastAck_ 0
  49. Agent/AckReconsClass set lastRealTime_ 0
  50. Agent/AckReconsClass set lastRealAck_ 0
  51. Queue set limit_ $qsize 
  52. proc printUsage {} {
  53. puts "Usage: "
  54. exit
  55. }
  56. proc finish {ns traceall tcptrace graph connGraphFlag midtime} {
  57.  # upvar $connGraphFlag graphFlag 
  58.  
  59. $ns flush-trace
  60. close $traceall
  61. flush $tcptrace
  62. close $tcptrace
  63. # exec perl ~/src/ns-2/bin/trsplit -f -pt tcp out.tr
  64. # exec perl ~/src/ns-2/bin/trsplit -f -pt ack out.tr
  65. exit 0
  66. }
  67. # read user options and act accordingly
  68. set count 0
  69. while {$count < $argc} {
  70. set arg [lindex $argv $count]
  71. incr count 2
  72. switch -exact '$arg' {
  73. '-graph' {
  74. set graph 1
  75. incr count -1
  76. continue
  77. }
  78. '-r' {
  79. set randomize 1
  80. incr count -1
  81. continue
  82. }
  83. '-mda' {
  84. set maxdelack [lindex $argv [expr $count-1]]
  85. continue
  86. }
  87. '-acksz' {
  88. set ackSize [lindex $argv [expr $count-1]]
  89. continue
  90. }
  91. '-mb' {
  92. set maxburst [lindex $argv [expr $count-1]]
  93. continue
  94. }
  95. '-win' {
  96. set downwin [lindex $argv [expr $count-1]]
  97. continue
  98. }
  99. '-upwin' {
  100. set upwin [lindex $argv [expr $count-1]]
  101. continue
  102. }
  103. '-tk' {
  104. set tcpTick [lindex $argv [expr $count-1]]
  105. continue
  106. }
  107. '-rbw' {
  108.  set rbw [lindex $argv [expr $count-1]]
  109. continue
  110. }
  111. '-rq' {
  112. set rqsize [lindex $argv [expr $count-1]]
  113. continue
  114. }
  115. '-q' {
  116. set qsize [lindex $argv [expr $count-1]]
  117. Queue set limit_ $qsize 
  118. continue
  119. }
  120. '-nonfifo' {
  121. set nonfifo 1
  122. incr count -1
  123. continue
  124. }
  125. '-noecn' {
  126. Agent/TCP set disable_ecn_ 1
  127. incr count -1
  128. continue
  129. }
  130. '-red' {
  131. set rgw "RED"
  132. incr count -1
  133. continue
  134. }
  135. '-rd' {
  136. set rand_drop true
  137. incr count -1
  138. continue
  139. }
  140. '-pd' {
  141. set prio_drop true
  142. incr count -1
  143. continue
  144. }
  145. '-g' {
  146. set g [lindex $argv [expr $count-1]]
  147. Agent/TCP/Asym set g_ g
  148. continue
  149. }
  150. '-qwt' {
  151. set q_wt [lindex $argv [expr $count-1]]
  152. continue
  153. }
  154. '-acksfirst' {
  155. set acksfirst true
  156. incr count -1
  157. continue
  158. }
  159. '-afil' {
  160. set filteracks true
  161. incr count -1
  162. continue
  163. }
  164. '-recons' {
  165. set reconsacks true
  166. incr count -1
  167. continue
  168. }
  169. '-noadap' {
  170. Agent/AckReconsClass set adaptive_ 0
  171. incr count -1
  172. continue
  173. }
  174. '-replace_head' {
  175. set replace_head true
  176. incr count -1
  177. continue
  178. }
  179. '-mid' {
  180. set midtime [lindex $argv [expr $count-1]]
  181. continue
  182. }
  183. '-stop' {
  184. set stop [lindex $argv [expr $count-1]]
  185. continue
  186. }
  187. default {
  188. incr count -2
  189. }
  190. switch -exact '$arg' {
  191. '-dn' {
  192. set direction "down"
  193. }
  194. '-up' {
  195. set direction "up"
  196. }
  197. '-2way' {
  198. set direction "2way"
  199. }
  200. default {
  201. puts "arg $arg"
  202. printUsage
  203. exit
  204. }
  205. }
  206. incr count 1
  207. set arg [lindex $argv $count]
  208. switch -exact '$arg' {
  209. '-asym' {
  210. set type "asym"
  211. }
  212. '-asymsrc' {
  213. set type "asymsrc"
  214. }
  215. '-reno' {
  216. set type "reno"
  217. }
  218. '-reno2' {
  219. set type "reno2"
  220. }
  221. default {
  222. printUsage
  223. puts "arg $arg"
  224. exit
  225. }
  226. }
  227. incr count 1
  228. set arg [lindex $argv $count]
  229. set startTime $arg
  230. incr count 1
  231. set connGraph 0 
  232. set arg [lindex $argv $count]
  233. if { $arg == "-graph" } {
  234. set connGraph 1
  235. incr count 1
  236. }
  237. if { $direction == "down" } {
  238. set src $n0
  239. set dst $n3
  240. } elseif { $direction == "up" } {
  241. set src $n3
  242. set dst $n0
  243. } elseif { $direction == "2way" } {
  244. puts "2-way"
  245. set src $n0
  246. set dst $n3
  247. set src2 $n3
  248. set dst2 $n0
  249. }
  250. if { $randomize } { 
  251. ns-random 0
  252. }
  253. for { set i 0 } { $i < 2 } { incr i } {
  254. if { $type == "asym" } {
  255. set tcp($i) [createTcpSource "TCP/Reno/Asym" $maxburst $tcpTick $downwin]
  256. set rgw "RED"
  257. $tcp($i) set damp_ 0
  258. $tcp($i) set g_ 0.125
  259. set sink($i) [createTcpSink "TCPSink/Asym" $sinktrace $ackSize $maxdelack]
  260. } elseif { $type == "asymsrc" } {
  261.  set tcp($i) [createTcpSource "TCP/Reno/Asym" $maxburst $tcpTick $downwin]
  262.  $tcp($i) set damp_ 0
  263.  $tcp($i) set g_ 0.125
  264.  set sink($i) [createTcpSink "TCPSink" $sinktrace $ackSize]
  265.  } elseif { $type == "reno" } {
  266.  set tcp($i) [createTcpSource "TCP/Reno" $maxburst $tcpTick $downwin]
  267.  set sink($i) [createTcpSink "TCPSink" $sinktrace $ackSize]
  268.  } elseif { $type == "reno2" } {
  269.  set tcp($i) [createTcpSource "TCP/Reno" 0 $tcpTick $downwin]
  270.  set sink($i) [createTcpSink "TCPSink/DelAck" $sinktrace $ackSize]
  271.  }
  272.  }
  273.  Agent/AckReconsClass set size_ [$tcp(0) set packetSize_]
  274.  if { $direction == "up" && $upwin != 0 } {
  275.  $tcp(0) set window_ $upwin
  276.  }
  277.  if { $direction == "2way" } {
  278.  set ftp(1) [createFtp $ns $src2 $tcp(1) $dst2 $sink(1)]
  279.  }
  280.  set ftp(0) [createFtp $ns $src $tcp(0) $dst $sink(0)]
  281.  setupTcpTracing $tcp(0) $tcptrace
  282.  # setupGraphing $tcp $connGraph connGraphFlag
  283.  # puts "ftp $ftp ftp2 $ftp2"
  284.  $ns at $startTime "$ftp(0) start" 
  285.  set offset [uniform 5 10]
  286.  puts "rev conn at $offset"
  287.  set s2 [expr $startTime + $offset]
  288.  if { $direction == "2way"} {
  289.  $ns at $s2 "$ftp(1) start" 
  290.  }
  291.  # puts "starting ftp2 at $s2"
  292.  }
  293. if { $nonfifo && $rgw == "RED" } {
  294. set rgw "RED/Semantic"
  295. }
  296. # topology
  297. #
  298. #      10Mb, 1ms       10Mb, 5ms       10Mb, 1ms
  299. #  n0 ------------ n1 ------------ n2 ------------ n3
  300. #                     28.8Kb, 50ms 
  301. #
  302. $ns duplex-link $n0 $n1 10Mb 1ms DropTail
  303. $ns simplex-link $n1 $n2 10Mb 5ms DropTail
  304. $ns simplex-link $n2 $n1 $rbw 50ms $rgw
  305. $ns duplex-link $n2 $n3 10Mb 1ms DropTail
  306. # configure reverse bottleneck queue
  307. puts "nonfifo $nonfifo rqsize $rqsize fqsize $qsize"
  308. configQueue $ns $n2 $n1 $rgw $qtrace $redtrace $rqsize $nonfifo $acksfirst $filteracks $replace_head $prio_drop $rand_drop
  309. configQueue $ns $n1 $n0 DropTail 0 0 20 $nonfifo false false false false false $reconsacks
  310. # end simulation
  311. $ns at $stop "finish $ns $f $tcptrace $graph connGraphFlag $midtime"
  312. $ns run