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

通讯编程

开发平台:

Visual C++

  1. # a simple script to test working of ARQ/HDLC (goBackN and selrepeat)
  2. # using a single TCP flow
  3. # loss model for urban and rural(open) from Lincoln labs paper added  
  4. #
  5. set val(chan)           Channel/Sat                 ;#Channel Type
  6. set val(netif)          Phy/Sat            ;# network interface type
  7. set val(mac)            Mac/Sat                 ;# MAC type
  8. set val(ifq)            Queue/DropTail  ;# interface queue type
  9. #set val(ll)             LL/Sat/HDLC                    ;# link layer type
  10. #set val(ll)             LL/Sat
  11. #set val(err)            MarkovErrorModel
  12. #set val(err)            UrbanComplexMarkovErrorModel
  13. set val(err)            RuralComplexMarkovErrorModel
  14. #set val(err)             UniformErrorProc
  15. set val(bw_up)          10Mb
  16. set val(bw_down)        10Mb
  17. set val(x) 250
  18. set val(y) 250
  19. #set durlistA        "11.2 4.0"      ;# unblocked and blocked state duration avg value
  20. set durlistA        "22.0 26.0 2.9 2.7" ; # for urban model
  21. set durlistB        "27.0 12.0 0.4 0.4"  ;# for complexmarkoverror model
  22. set BW 10; # in Mb/s
  23. set delay 254; # in ms
  24. # Set the queue length (in packets)
  25. #set qlen [expr round([expr ($BW / 8.0) * $delay * 2])]; # set buffer to pipe size
  26. # set sat link bandwidth and delay
  27. Mac set bandwidth_ 10Mb
  28. LL set delay_ 125ms
  29. set val(bdp) [expr 10000/8.0 * 125/100]
  30. LL/Sat/HDLC set window_size_ $val(bdp) 
  31. LL/Sat/HDLC set queue_size_ $val(bdp)
  32. LL/Sat/HDLC set timeout_ 0.26
  33. #LL/Sat/HDLC set max_timeouts_ 5
  34. # set selective repeat on; its GoBackN by default
  35. #LL/Sat/HDLC set selRepeat_ 1
  36. set qlen $val(bdp)
  37. puts "queue len = $qlen"
  38. set val(ifqlen) $qlen
  39. proc start_time {} {return 0; }
  40. # proc start_time {} {return [expr ([eval ns-random] / 2147483647.0) * 0.1]}
  41. proc UniformErrorProc {} {
  42. global val
  43. set errObj [new ErrorModel]
  44. $errObj unit bit
  45. #$errObj FECstrength $val(FECstrength) 
  46. #$errObj datapktsize 512
  47. #$errObj cntrlpktsize 80
  48. return $errObj
  49. }
  50. proc MarkovErrorModel {} {
  51. global durlistA
  52. puts [lindex $durlistA 0]
  53. puts [lindex $durlistA 1]
  54. set errmodel [new ErrorModel/TwoStateMarkov $durlistA time]
  55. #$errmodel drop-target [new Agent/Null]
  56. return $errmodel
  57. }
  58. proc UrbanComplexMarkovErrorModel {} {
  59. global durlistA
  60. set errmodel [new ErrorModel/ComplexTwoStateMarkov $durlistA time]
  61. #$errmodel drop-target [new Agent/Null] 
  62. return $errmodel
  63. }
  64. proc RuralComplexMarkovErrorModel {} {
  65. global durlistB
  66. set errmodel [new ErrorModel/ComplexTwoStateMarkov $durlistB time]
  67. #$errmodel drop-target [new Agent/Null] 
  68. return $errmodel
  69. }
  70. proc stop {} {
  71.     global ns_ tracefd
  72.     $ns_ flush-trace
  73.     close $tracefd
  74. }
  75. proc setup {tcptype queuetype sources qlen duration file seed c_sources delay rate ecn run retries} {
  76. global val traces ns_ tracefd
  77. if {$retries == "NULL"} {
  78. set val(ll) LL/Sat
  79. } else {
  80. set val(ll) LL/Sat/HDLC
  81. LL/Sat/HDLC set max_timeouts_ $retries
  82. }
  83. # Initialize Global Variables
  84. ns-random $seed
  85. set ns_ [new Simulator]
  86. set tracefd     [open case0.tr w]
  87. $ns_ trace-all $tracefd
  88. $ns_ eventtrace-all
  89. $ns_ rtproto Static
  90. # Create sat n(0)
  91. # configure node, please note the change below.
  92. $ns_ node-config -satNodeType geo 
  93.     -llType $val(ll) 
  94.     -ifqType $val(ifq) 
  95.     -ifqLen $val(ifqlen) 
  96.     -macType $val(mac) 
  97.     -phyType $val(netif) 
  98.     -channelType $val(chan) 
  99.     -downlinkBW $val(bw_down) 
  100.     -wiredRouting ON 
  101.     -agentTrace ON
  102. set n(0) [$ns_ node]
  103. $n(0) set-position -95
  104. $ns_ node-config -satNodeType terminal
  105. #set n(100) [$ns_ node]
  106. #$n(100) set-position 37.9 -122.3; # Berkeley
  107. set n(101) [$ns_ node]
  108. $n(101) set-position 42.3 -71.1; # Boston
  109. # Add GSLs to geo satellites
  110. #$n(100) add-gsl geo $val(ll) $val(ifq) $val(ifqlen) $val(mac) $val(bw_up) 
  111.     #   $val(netif) [$n(0) set downlink_] [$n(0) set uplink_]
  112. $n(101) add-gsl geo $val(ll) $val(ifq) $val(ifqlen) $val(mac) $val(bw_up) 
  113.     $val(netif) [$n(0) set downlink_] [$n(0) set uplink_]
  114. $n(101) interface-errormodel [$val(err)]
  115. #$ns_ unset satNodeType_
  116. # create regular routers
  117. #set n(99) [$ns_ node]    ;#....node 3
  118. #set n(102) [$ns_ node]   ;#....node 4
  119. # determine the actual queutype and save the one asked for 
  120.     # assign queueing parameters -- simulate random drop with RED
  121. if { [string match RandomDrop* $queuetype ] } then {
  122. set queuetype [join 
  123.    [concat "RED" 
  124. [string range $queuetype [string length "RandomDrop"] end ]]
  125.    "" ]
  126. Queue/$queuetype set thresh_ [expr 2* $qlen]
  127. Queue/$queuetype set maxthresh_ [expr 2* $qlen]
  128. # added for ECN comparison
  129. Queue/$queuetype set setbit_ $ecn
  130. } elseif { [string match RED* $queuetype ] } then {
  131. #added by nirav
  132. Queue/$queuetype set bytes_ false
  133. Queue/$queuetype set queue_in_bytes_ false
  134. # Queue/$queuetype set q_weight_ = -1
  135. # Queue/$queuetype set max_p = 1
  136. Queue/$queuetype set gentle_ true
  137. #added by nirav
  138. #Queue/$queuetype set thresh_ [expr $qlen * 0.5]
  139. #Queue/$queuetype set maxthresh_ [expr $qlen * 0.75]
  140. Queue/$queuetype set thresh_ 0
  141. Queue/$queuetype set maxthresh_ 0
  142. # added for ECN comparison
  143. Queue/$queuetype set setbit_ $ecn
  144. }
  145. # UDP
  146. #set udp [new Agent/UDP]
  147.   # $ns_ attach-agent $n(0) $udp
  148. #   set cbr [new Application/Traffic/CBR]
  149. #    $cbr set packetSize_ 512
  150.    #$cbr set interval_ 3.75ms
  151.    # $cbr set rate_ 10Mb
  152. #   #$cbr set maxpkts_ 2000
  153.    # $cbr attach-agent $udp
  154. #    set null [new Agent/Null]
  155. #    $ns_ attach-agent $n(101) $null
  156. #    $ns_ connect $udp $null
  157. #    $ns_ at 0.0 "$cbr start"
  158. Agent/$tcptype set window_ $val(bdp)
  159. #  # TCP
  160.   set tcp [$ns_ create-connection $tcptype $n(0) TCPSink/Sack1 $n(101) 0]
  161.   set ftp [new Application/FTP]
  162.   $ftp attach-agent $tcp
  163.   $ns_ at 0.0 "$ftp start"
  164. # tracing for sat links
  165. $ns_ trace-all-satlinks $tracefd
  166. # setup routing
  167. set satrouteobject_ [new SatRouteObject]
  168. $satrouteobject_ compute_routes
  169. # trace for tcp parameters
  170. $tcp trace cwnd_
  171. $tcp trace t_seqno_
  172. #$tcp trace ndatapack_
  173. #$tcp trace nrexmitpack_
  174. set tracef [open "$file.tcp_trace.$run" "w"]
  175. $tcp attach $tracef 
  176. # trace queue
  177. #$ns_ trace-queue $n(0) $n(101) [open "$file.queue1" w]
  178. # Stop the sim at $duration
  179. puts "duration = $durationn"
  180. $ns_ at $duration "stop"
  181. $ns_ at $duration "puts "NS EXITING..." ; $ns_ halt"
  182. # start up.
  183. puts "Starting Simulation..."
  184. $ns_ run
  185. }
  186. proc plot-ontime {} {
  187. exec rm -f ontime
  188. exec touch ontime
  189. global file tracef
  190. if [info exists tracef] { flush [set tracef] }
  191. exec awk -v field=STATE -v off=1 {
  192. {
  193. if (($5 == $field) && ($6 == $off)) {
  194. {ot += $8};
  195. { print ot >> ontime; } 
  196. }
  197. } case0.tr
  198. }
  199.             
  200. # traces are the set of info to be put out
  201. set traces [ list "TCP" "queue" ]
  202. # this boring code sets the given parameters from teh command line in order or
  203. # assigns defaults if they're not given.
  204. if { [llength $argv]>0} then { set run [lindex $argv 0]}
  205. else {set run 1 }
  206. if { [llength $argv]>1} then { set retries [lindex $argv 1]}
  207. else {set retries 50 }
  208. if { [llength $argv]>2} then { set model [lindex $argv 2]}
  209. else {set model "urban" }
  210. if { [llength $argv]>3} then { set sources [lindex $argv 3]}
  211. else {set sources 1}
  212. if { [llength $argv]>4} then { set duration [lindex $argv 4]}
  213. else {set duration 300}
  214. if { [llength $argv]>5} then { set file [lindex $argv 5]}
  215. else {set file "case0"}
  216. if { [llength $argv]>6} then { set qlen [lindex $argv 6]}
  217. else {set qlen 50 }
  218. if { [llength $argv]>7} then { set tcptype [lindex $argv 7]}
  219. else {set tcptype "TCP/Newreno"}
  220. if { [llength $argv]>8} then { set queuetype [lindex $argv 8]}
  221. else {set queuetype "RED"}
  222. if { [llength $argv]>9} then { set seed [lindex $argv 9]}
  223. else {set seed 12345}
  224. if { [llength $argv]>10} then { set c_sources [lindex $argv 10]}
  225. else {set  c_sources 0}
  226. if { [llength $argv]>11} then { set delay [lindex $argv 11]}
  227. else {set delay "10ms"}
  228. if { [llength $argv]>12} then { set rate [lindex $argv 12]}
  229. else {set rate "100k"}
  230. if { [llength $argv]>13} then { set ecn [lindex $argv 13]}
  231. else {set ecn 1 }
  232. # Start the sim
  233. puts "retries=$retries, sources=$sources, duration=$duration, file=$file, qlen=$qlen, tcptype=$tcptype, queuetype=$queuetype, seec=$seed, c_sources=$c_sources"
  234. setup $tcptype $queuetype $sources $qlen $duration $file $seed $c_sources $delay $rate $ecn $run $retries