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

通讯编程

开发平台:

Visual C++

  1. # The topology replicates the one used by Nirav in his paper
  2. # no loss added  
  3. #
  4. set val(chan)           Channel/Sat                 ;#Channel Type
  5. set val(netif)          Phy/Sat            ;# network interface type
  6. set val(mac)            Mac/Sat                 ;# MAC type
  7. set val(ifq)            Queue/DropTail  ;# interface queue type
  8. #set val(ifq)            Queue/XCP
  9. set val(ll)             LL/Sat/HDLC                    ;# link layer type
  10. set val(err)            MarkovErrorModel
  11. #set val(err)            ComplexMarkovErrorModel
  12. #set val(err)             UniformErrorProc
  13. set val(bw_up)          10Mb
  14. set val(bw_down)        10Mb
  15. set val(x) 250
  16. set val(y) 250
  17. #Experimrnting with shorted values
  18. #set durlistA     "11.2 0.1"
  19. set durlistA        "11.2 4.0"      ;# unblocked and blocked state duration avg value
  20. set durlistB        "27.0 12.0 0.4 0.4"  ;# for complexmarkoverror model
  21. #set BW 10; # in Mb/s
  22. #set delay 254; # in ms
  23. # Set the queue length (in packets)
  24. #set qlen [expr round([expr ($BW / 8.0) * $delay * 2])]; # set buffer to pipe size
  25. # set sat link bandwidth and delay
  26. Mac set bandwidth_ 10Mb
  27. LL set delay_ 125ms
  28. set val(bdp) [expr 10000/8.0 * 125]
  29. #set val(bdp) [expr 10000/8.0 * 125 * 0.5]
  30. #set val(bdp) [expr 10000/8.0 * 125 * 2]
  31. LL/Sat/HDLC set window_size_ $val(bdp) 
  32. # set selective repeat on; its GoBackN by default
  33. LL/Sat/HDLC set selRepeat_ 1
  34. set qlen $val(bdp)
  35. puts "queue len = $qlen"
  36. set val(ifqlen) $qlen
  37. proc start_time {} {return 0; }
  38. # proc start_time {} {return [expr ([eval ns-random] / 2147483647.0) * 0.1]}
  39. proc UniformErrorProc {} {
  40. global val
  41. set errObj [new ErrorModel]
  42. $errObj unit bit
  43. #$errObj FECstrength $val(FECstrength) 
  44. #$errObj datapktsize 512
  45. #$errObj cntrlpktsize 80
  46. return $errObj
  47. }
  48. proc MarkovErrorModel {} {
  49. global durlistA newrng_
  50. #set errmodel [new ErrorModel/TwoStateMarkov $durlistA time]
  51. set rv0 [new RandomVariable/Exponential]
  52. set rv1 [new RandomVariable/Exponential]
  53. $rv0 use-rng $newrng_
  54. $rv1 use-rng $newrng_
  55. $rv0 set avg_ [lindex $durlistA 0]
  56. $rv1 set avg_ [lindex $durlistA 1]
  57. set errmodel [new ErrorModel/TwoState $rv0 $rv1 time]
  58. #$errmodel drop-target [new Agent/Null]
  59. return $errmodel
  60. }
  61. proc ComplexMarkovErrorModel {} {
  62. global durlistB newrng_
  63. set em [new ErrorModel/ComplexTwoStateMarkov $durlistB time $newrng_]
  64. $em drop-target [new Agent/Null] 
  65. return $em
  66. }
  67. proc stop {} {
  68.     global ns_ tracefd
  69.     $ns_ flush-trace
  70.     close $tracefd
  71. }
  72. proc setup {tcptype queuetype sources qlen duration file seed c_sources delay rate ecn} {
  73. global val traces ns_ tracefd newrng_
  74. # Initialize Global Variables
  75. #ns-random $seed
  76. set ns_ [new Simulator]
  77. set newrng_ [new RNG]
  78. $newrng_ seed $seed
  79. set tracefd     [open arq.tr w]
  80. $ns_ trace-all $tracefd
  81. $ns_ eventtrace-all
  82. $ns_ rtproto Static
  83. # Create sat n(0)
  84. # configure node, please note the change below.
  85. $ns_ node-config -satNodeType geo 
  86.     -llType $val(ll) 
  87.     -ifqType $val(ifq) 
  88.     -ifqLen $val(ifqlen) 
  89.     -macType $val(mac) 
  90.     -phyType $val(netif) 
  91.     -channelType $val(chan) 
  92.     -downlinkBW $val(bw_down) 
  93.     -wiredRouting ON
  94. set n(0) [$ns_ node]
  95. $n(0) set-position -95
  96. $ns_ node-config -satNodeType terminal
  97. set n(100) [$ns_ node]
  98. $n(100) set-position 37.9 -122.3; # Berkeley
  99. set n(101) [$ns_ node]
  100. $n(101) set-position 42.3 -71.1; # Boston
  101. # Add GSLs to geo satellites
  102. $n(100) add-gsl geo $val(ll) $val(ifq) $val(ifqlen) $val(mac) $val(bw_up) 
  103.     $val(netif) [$n(0) set downlink_] [$n(0) set uplink_]
  104. $n(101) add-gsl geo $val(ll) $val(ifq) $val(ifqlen) $val(mac) $val(bw_up) 
  105.     $val(netif) [$n(0) set downlink_] [$n(0) set uplink_]
  106. $n(101) interface-errormodel [$val(err)]
  107. $ns_ unset satNodeType_
  108. # create regular routers
  109. set n(99) [$ns_ node]    ;#....node 3
  110. set n(102) [$ns_ node]   ;#....node 4
  111. # determine the actual queutype and save the one asked for 
  112.     # assign queueing parameters -- simulate random drop with RED
  113. if { [string match RandomDrop* $queuetype ] } then {
  114. set queuetype [join 
  115.    [concat "RED" 
  116. [string range $queuetype [string length "RandomDrop"] end ]]
  117.    "" ]
  118. Queue/$queuetype set thresh_ [expr 2* $qlen]
  119. Queue/$queuetype set maxthresh_ [expr 2* $qlen]
  120. # added for ECN comparison
  121. Queue/$queuetype set setbit_ $ecn
  122. } elseif { [string match RED* $queuetype ] } then {
  123. #added by nirav
  124. Queue/$queuetype set bytes_ false
  125. Queue/$queuetype set queue_in_bytes_ false
  126. # Queue/$queuetype set q_weight_ = -1
  127. # Queue/$queuetype set max_p = 1
  128. Queue/$queuetype set gentle_ true
  129. #added by nirav
  130. #Queue/$queuetype set thresh_ [expr $qlen * 0.5]
  131. #Queue/$queuetype set maxthresh_ [expr $qlen * 0.75]
  132. Queue/$queuetype set thresh_ 0
  133. Queue/$queuetype set maxthresh_ 0
  134. # added for ECN comparison
  135. Queue/$queuetype set setbit_ $ecn
  136. }
  137. $ns_ duplex-link $n(99) $n(100) 10Mb 1ms $queuetype
  138. $ns_ duplex-link $n(101) $n(102) 10Mb 1ms $queuetype
  139. # Just to shut ns up about the uninitialized cwnd_frac_variable.
  140. Agent/TCP set cwnd_frac_ 100;
  141. # window needs to be big for long bw delays - it's a max value for cwnd_
  142. # initially set at 20 packets.
  143. #Agent/TCP/Reno set window_ 2000;
  144. #Agent/TCP/Reno set window_ $val(bdp)
  145. Agent/$tcptype set window_ $val(bdp)
  146. # create nodes for sources and c_sources
  147. puts "sources = $sources"
  148. puts "c_sources = $c_sources"
  149. for { set i 1 } {$i <= [expr 2* [expr $sources+$c_sources]]} {incr i} {
  150. set n($i) [$ns_ node]
  151. }
  152. # connect sources and sinks to routers at 100 Mb/s
  153. for {set i 1} {$i<=$sources} {incr i} {
  154. $ns_ duplex-link $n($i) $n(99) 100Mb 1ms $queuetype
  155. $ns_ duplex-link $n(102) $n([expr $i+$sources+$c_sources]) 100Mb 1ms $queuetype
  156. }
  157. # connect cross traffic sources and sinks
  158. for {set i [expr $sources+1]} {$i<= [expr $c_sources+$sources]} {incr i} {
  159. $ns_ duplex-link $n($i) $n(99) 10Mb 2ms $queuetype
  160. $ns_ duplex-link $n(100) $n([expr $i+$sources+$c_sources]) 10Mb 2ms $queuetype
  161. }
  162. # Setup traffic flow between nodes
  163. # Create source and sink Agents and connect them
  164. for {set i 1} {$i<= [expr $sources+$c_sources]} {incr i} {
  165. # Create the sender agent
  166. set T($i) [new Agent/$tcptype]
  167. # If Ecn is on set it in the sender
  168. if { $ecn } { $T($i) set ecn_ 1 }
  169. set hstcpflag 0
  170. if {$hstcpflag==1} {
  171. puts "creating high-speed connection"
  172. set tcp($i) [$ns_ create-highspeed-connection TCP/Reno $n($i) TCPSink $n([expr $i+$c_sources+$sources]) $i]
  173. if { $ecn } { $tcp($i) set ecn_ 1 }
  174. } else {
  175. puts "cerating normal $T($i) connection"
  176. set tcp($i) [$ns_ create-connection $tcptype $n($i) TCPSink $n([expr $i+$c_sources+$sources]) $i]
  177. if { $ecn } { $tcp($i) set ecn_ 1 }
  178. }
  179. if {$hstcpflag==1} {
  180. [set tcp($i)] set windowOption_ 8
  181. [set tcp($i)] set low_window_ 12.5
  182. [set tcp($i)] set high_window_ 12500
  183. [set tcp($i)] set high_p_ 0.0000096
  184. [set tcp($i)] set high_decrease_ 0.1
  185. puts "windowOption = [$tcp($i) set windowOption_]"
  186. puts "low_window = [$tcp($i) set low_window_]"
  187. puts "high_window = [$tcp($i) set high_window_]"
  188. puts "high_p_ = [$tcp($i) set high_p_]"
  189. puts "high_decrease = [$tcp($i) set high_decrease_]"
  190. }
  191. set F($i) [new Application/FTP]
  192. $F($i) attach-agent $tcp($i)
  193. $ns_ at [expr [start_time]+[expr ($i-1)*2]] "$F($i) start"
  194. }
  195. # tracing for sat links
  196. $ns_ trace-all-satlinks $tracefd
  197. # If TCP is in the $traces variable, ask the TCP aganets to trace their
  198. # cwnd_ & seqno_ variable to a file of teh form $file.tcp_trace.source_number
  199. if { [lsearch $traces "TCP"] != -1 } {
  200. for {set i 1} {$i<= [expr $sources+$c_sources]} {incr i} {
  201. $tcp($i) trace cwnd_
  202. $tcp($i) trace t_seqno_
  203. $tcp($i) attach [open "$file.tcp_trace.$i" "w"]
  204. }
  205. }
  206. # set queue size to pipe size
  207. $ns_ queue-limit $n(99) $n(100) $val(ifqlen)
  208. $ns_ queue-limit $n(101) $n(102) $val(ifqlen)
  209. # If $traces includes "queue" use the trace-quere facility to put the queue
  210.     # trace out into $file.queue1.  See the docs for the format.
  211. if { [lsearch $traces "queue"] != -1 } {
  212. $ns_ trace-queue $n(99) $n(100) [open "$file.queue1" "w"]
  213. }
  214. # setup routing
  215. set satrouteobject_ [new SatRouteObject]
  216. $satrouteobject_ compute_routes
  217. # Stop the sim at $duration
  218. puts "duration = $durationn"
  219. $ns_ at $duration "stop"
  220. $ns_ at $duration "puts "NS EXITING..." ; $ns_ halt"
  221. # start up.
  222. puts "Starting Simulation..."
  223. $ns_ run
  224. }
  225. # traces are the set of info to be put out
  226. set traces [ list "TCP" "queue" ]
  227. # this boring code sets the given parameters from teh command line in order or
  228. # assigns defaults if they're not given.
  229. if { [llength $argv]>0} then { set sources [lindex $argv 0]}
  230. else {set sources 1}
  231. if { [llength $argv]>1} then { set duration [lindex $argv 1]}
  232. else {set duration 100}
  233. if { [llength $argv]>2} then { set file [lindex $argv 2]}
  234. else {set file "no-loss"}
  235. if { [llength $argv]>3} then { set qlen [lindex $argv 3]}
  236. else {set qlen 50 }
  237. if { [llength $argv]>4} then { set tcptype [lindex $argv 4]}
  238. else {set tcptype "TCP/Reno"}
  239. if { [llength $argv]>5} then { set queuetype [lindex $argv 5]}
  240. else {set queuetype "RED"}
  241. if { [llength $argv]>6} then { set seed [lindex $argv 6]}
  242. else {set seed 0}
  243. if { [llength $argv]>7} then { set c_sources [lindex $argv 7]}
  244. else {set  c_sources 0}
  245. if { [llength $argv]>8} then { set delay [lindex $argv 8]}
  246. else {set delay "10ms"}
  247. if { [llength $argv]>9} then { set rate [lindex $argv 9]}
  248. else {set rate "100k"}
  249. if { [llength $argv]>10} then { set ecn [lindex $argv 10]}
  250. else {set ecn 1 }
  251. # Start the sim
  252. puts "sources=$sources, duration=$duration, file=$file, qlen=$qlen, tcptype=$tcptype, queuetype=$queuetype, seec=$seed, c_sources=$c_sources"
  253. setup $tcptype $queuetype $sources $qlen $duration $file $seed $c_sources $delay $rate $ecn