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

通讯编程

开发平台:

Visual C++

  1. #source ../../../lan/ns-lan.tcl
  2. source ../../../ex/asym/util.tcl
  3. source ../../../ex/tcp-fs/web.tcl
  4. Queue/RED set q_weight_ 0.1
  5. # set up simulation
  6. set ns [new Simulator]
  7. set numsrc 31
  8. set numdst 31
  9. for {set i 0} {$i < $numsrc} {incr i} {
  10. set n(0$i) [$ns node]
  11. }
  12. set n(1) [$ns node]
  13. set n(2) [$ns node]
  14. for {set i 0} {$i < $numdst} {incr i} {
  15. set n(3$i) [$ns node]
  16. }
  17. set dir "."
  18. set trace_opened 0
  19. set graph 0
  20. set phttpAllFlag 0
  21. set httpseqAllFlag 0
  22. set connGraphFlag("") 0
  23. set maxdelack 25
  24. set maxburst 0
  25. set upwin 0
  26. set tcpTick 0.1
  27. set ackSize 40
  28. set fbw 1.5Mb
  29. set rbw 28.8Kb
  30. set fqsize -1
  31. set rqsize -1
  32. set qsize 10
  33. set fgw "DropTail"
  34. set rgw "DropTail"
  35. set acksfirst false
  36. set filteracks false
  37. set replace_head false
  38. set midtime 0
  39. set window 100
  40. set burstwin 0
  41. set webwin 0
  42. set nonfifo 0
  43. set priority_drop false
  44. set random_drop false
  45. set random_ecn false
  46. set count_bytes_acked false
  47. set fixed_period 0
  48. set fixed_period_except_first 0
  49. set fgw_q_weight -1
  50. set rgw_q_weight -1
  51. set burstsz 5
  52. set firstburstsz 0
  53. set pause 5
  54. set monitorq 0
  55. set donttrace 0
  56. set traceq 0
  57. set duration 30
  58. set delay 50ms
  59. set seed -1
  60. set topology "fs"
  61. set turnontime -1
  62. set turnofftime -1
  63. set schedDisp $FINE_ROUND_ROBIN
  64. set overhead 0
  65. set f 0
  66. set tcptrace 0
  67. set sinktrace 0
  68. set redtrace 0
  69. set queuetrace 0
  70. set numimg 4
  71. set reqsize 0.3
  72. set htmlsize 1
  73. set imgsize 10
  74. proc finish {ns traceall tcptrace redtrace queuetrace graph connGraphFlag midtime turnontime turnofftime { qtraceflag false } } {
  75. upvar $connGraphFlag graphFlag
  76. global dir
  77. global qm
  78. global donttrace
  79. puts stderr "[$qm(12) set pdrops_] [$qm(21) set pdrops_] "
  80. if {!$donttrace} {
  81. $ns flush-trace
  82. close $traceall
  83. flush $tcptrace
  84. close $tcptrace
  85. flush $redtrace
  86. close $redtrace
  87. flush $queuetrace
  88. close $queuetrace
  89. processtrace $midtime $turnontime $turnofftime $qtraceflag $dir
  90. }
  91. # plotgraph $graph graphFlag $midtime $turnontime $turnofftime $qtraceflag $dir
  92. exit 0
  93. }
  94. proc burst_finish { ns ftp burstsz pause } {
  95. $ns at [expr [$ns now] + $pause] "$ftp producemore $burstsz"
  96. }
  97. proc periodic_burst { ns ftp burstsz pause } {
  98. $ftp producemore $burstsz
  99. $ns at [expr [$ns now] + $pause] "periodic_burst $ns $ftp $burstsz $pause"
  100. }
  101. # read user options and act accordingly
  102. set count 0
  103. while {$count < $argc} {
  104. set arg [lindex $argv $count]
  105. incr count 2
  106. switch -exact '$arg' {
  107. '-null' {
  108. incr count -1
  109. continue
  110. }
  111. '-graph' {
  112. set graph 1
  113. incr count -1
  114. continue
  115. }
  116. '-phttp' {
  117. set phttpAllFlag 1
  118. incr count -1
  119. continue
  120. }
  121. '-httpseq' {
  122. set httpseqAllFlag 1
  123. incr count -1
  124. continue
  125. }
  126. '-red' {
  127. set fgw "RED"
  128. set rgw "RED"
  129. incr count -1
  130. continue
  131. }
  132. '-sred' {
  133. set fgw "RED/Semantic"
  134. set rgw "RED/Semantic"
  135. incr count -1
  136. continue
  137. }
  138. '-pred' {
  139. set fgw "PRED"
  140. incr count -1
  141. continue
  142. }
  143. '-nonfifo' {
  144. set nonfifo 1
  145. incr count -1
  146. continue
  147. }
  148. '-pdrop' {
  149. set priority_drop true
  150. incr count -1
  151. continue
  152. }
  153. '-rdrop' {
  154. set random_drop true
  155. incr count -1
  156. continue
  157. }
  158. '-recn' {
  159. set random_ecn true
  160. incr count -1
  161. continue
  162. }
  163. '-cba' {
  164. set count_bytes_acked true
  165. incr count -1
  166. continue
  167. }
  168. '-fp' {
  169. set fixed_period 1
  170. incr count -1
  171. continue
  172. }
  173. '-fpef' {
  174. set fixed_period_except_first 1
  175. incr count -1
  176. continue
  177. }
  178. '-acksfirst' {
  179. set acksfirst true
  180. incr count -1
  181. continue
  182. }
  183. '-filteracks' {
  184. set filteracks true
  185. incr count -1
  186. continue
  187. }
  188. '-replace_head' {
  189. set replace_head true
  190. incr count -1
  191. continue
  192. }
  193. '-noflr' {
  194. Agent/TCP set fast_loss_recov_ false
  195. incr count -1
  196. continue
  197. }
  198. '-nofrt' {
  199. Agent/TCP set fast_reset_timer_ false
  200. incr count -1
  201. continue
  202. }
  203. '-fixediw' {
  204. Agent/TCP/Session set fixedIw_ true
  205. incr count -1
  206. continue
  207. }
  208. '-proxy' {
  209. Agent/TCP/Session set proxyopt_ true
  210. incr count -1
  211. continue
  212. }
  213. '-monitorq' {
  214. set monitorq 1
  215. incr count -1
  216. continue
  217. }
  218. '-donttrace' {
  219. set donttrace 1
  220. incr count -1
  221. continue
  222. }
  223. '-traceq' {
  224. if {[regexp {^[0-9]} [expr $count -1]]} {
  225. set fromNode [lindex $argv [expr $count -1]]
  226. set toNode [lindex $argv $count]
  227. set traceqFromNode($fromNode,$toNode) $fromNode
  228. set traceqToNode($fromNode,$toNode) $toNode
  229. incr count 1
  230. } else {
  231. set traceq 1
  232. incr count -1
  233. }
  234. continue
  235. }
  236. '-numimg' {
  237. set numimg [lindex $argv [expr $count-1]]
  238. continue
  239. }
  240. '-reqsz' {
  241. set reqsize [lindex $argv [expr $count-1]]
  242. continue
  243. }
  244. '-htmlsz' {
  245. set htmlsize [lindex $argv [expr $count-1]]
  246. continue
  247. }
  248. '-imgsz' {
  249. set imgsize [lindex $argv [expr $count-1]]
  250. continue
  251. }
  252. '-mda' {
  253. set maxdelack [lindex $argv [expr $count-1]]
  254. continue
  255. }
  256. '-mb' {
  257. set maxburst [lindex $argv [expr $count-1]]
  258. continue
  259. }
  260. '-acksz' {
  261. set ackSize [lindex $argv [expr $count-1]]
  262. continue
  263. }
  264. '-tk' {
  265. set tcpTick [lindex $argv [expr $count-1]]
  266. Agent/TCP/Session set tcpTick_ [lindex $argv [expr $count-1]]
  267. continue
  268. }
  269. '-fbw' {
  270. set fbw [lindex $argv [expr $count-1]]
  271. continue
  272. }
  273. '-rbw' {
  274. set rbw [lindex $argv [expr $count-1]]
  275. continue
  276. }
  277. '-fq' {
  278. set fqsize [lindex $argv [expr $count-1]]
  279. continue
  280. }
  281. '-rq' {
  282. set rqsize [lindex $argv [expr $count-1]]
  283. continue
  284. }
  285. '-q' {
  286. set qsize [lindex $argv [expr $count-1]]
  287. Queue set limit_ $qsize 
  288. continue
  289. }
  290. '-bs' {
  291. set burstsz [lindex $argv [expr $count-1]]
  292. continue
  293. }
  294. '-fbs' {
  295. set firstburstsz [lindex $argv [expr $count-1]]
  296. continue
  297. }
  298. '-pause' {
  299. set pause [lindex $argv [expr $count-1]]
  300. continue
  301. }
  302. '-win' {
  303. set window [lindex $argv [expr $count-1]]
  304. continue
  305. }
  306. '-bwin' {
  307. set burstwin [lindex $argv [expr $count-1]]
  308. continue
  309. }
  310. '-webwin' {
  311. set webwin [lindex $argv [expr $count-1]]
  312. continue
  313. }
  314. '-upwin' {
  315. set upwin [lindex $argv [expr $count-1]]
  316. continue
  317. }
  318. '-redwt' {
  319. set fgw_q_weight [lindex $argv [expr $count-1]]
  320. set rgw_q_weight [lindex $argv [expr $count-1]]
  321. continue
  322. }
  323. '-dur' {
  324. set duration [lindex $argv [expr $count-1]]
  325. continue
  326. }
  327. '-del' {
  328. set delay [lindex $argv [expr $count-1]]
  329. continue
  330. }
  331. '-src' {
  332. set src $n([lindex $argv [expr $count-1]])
  333. continue
  334. }
  335. '-dst' {
  336. set dst $n([lindex $argv [expr $count-1]])
  337. continue
  338. }
  339. '-ton' {
  340. set turnontime [lindex $argv [expr $count-1]]
  341. continue
  342. }
  343. '-toff' {
  344. set turnofftime [lindex $argv [expr $count-1]]
  345. continue
  346. }
  347. '-dir' {
  348. set dir [lindex $argv [expr $count-1]]
  349. continue
  350. }
  351. '-seed' {
  352. set seed [lindex $argv [expr $count-1]]
  353. continue
  354. }
  355. '-topo' {
  356. set topology [lindex $argv [expr $count-1]]
  357. continue
  358. }
  359. '-sched' {
  360. set sched [lindex $argv [expr $count-1]]
  361. switch -exact '$sched' {
  362. 'frr' {set schedDisp $FINE_ROUND_ROBIN}
  363. 'crr' {set schedDisp $COARSE_ROUND_ROBIN}
  364. 'rand' {set schedDisp $RANDOM}
  365. 'null' {}
  366. }
  367. continue
  368. }
  369. '-overhead' {
  370. Agent/TCP set overhead_ [lindex $argv [expr $count-1]]
  371. continue
  372. }
  373. default {
  374. incr count -2
  375. }
  376. }
  377. if {!$trace_opened && !$donttrace} {
  378. # set up trace files
  379. set f [open $dir/out.tr w]
  380. $ns trace-all $f
  381. set tcptrace [open $dir/tcp-raw.tr w] 
  382. set sinktrace [open $dir/sink.tr w]
  383. set redtrace [open $dir/red.tr w]
  384. set queuetrace [open $dir/q.tr w]
  385. set trace_opened 1
  386. }
  387. if {$turnontime == -1} {
  388. set turnontime 0
  389. }
  390. if {$turnofftime == -1} {
  391. set turnofftime $duration
  392. }
  393. set burstflag 0
  394. set webFlag false
  395. set phttpFlag 0
  396. set httpseqFlag 0
  397. set direction ""
  398. while {$count < $argc} {
  399. set arg [lindex $argv $count]
  400. incr count 1
  401. switch -exact '$arg' {
  402. '-burst' {
  403. set burstflag 1
  404. continue
  405. }
  406. '-dn' {
  407. set direction "down"
  408. continue
  409. }
  410. '-up' {
  411. set direction "up"
  412. continue
  413. }
  414. '-web' {
  415. set webFlag true
  416. continue
  417. }
  418. '-phttp' {
  419. set phttpFlag 1
  420. continue
  421. }
  422. '-httpseq' {
  423. set httpseqFlag 1
  424. continue
  425. }
  426. default {
  427. incr count -1
  428. break
  429. }
  430. }
  431. }
  432. if { $direction == "down" } {
  433. set src $n(00)
  434. set dst $n(30)
  435. } elseif { $direction == "up" } {
  436. set src $n(30)
  437. set dst $n(00)
  438. } else {
  439. }
  440. set arg [lindex $argv $count]
  441. set slow_start_restart true
  442. set fs_enable false
  443. set srctype "TCP/Fack"
  444. set sinktype "TCPSink"
  445. set sessionFlag false
  446. switch -exact '$arg' {
  447. '-null' {
  448. }
  449. '-tahoe' {
  450. set srctype "TCP"
  451. }
  452. '-tahoefs' {
  453. set srctype "TCP/FS"
  454. set slow_start_restart false
  455. set fs_enable true
  456. }
  457. '-reno' {
  458. set srctype "TCP/Reno"
  459. }
  460. '-renofs' {
  461. set srctype "TCP/Reno/FS"
  462. set slow_start_restart false
  463. set fs_enable true
  464. }
  465. '-newreno' {
  466. set srctype "TCP/Newreno"
  467. }
  468. '-newrenofs' {
  469. set srctype "TCP/Newreno/FS"
  470. set slow_start_restart false
  471. set fs_enable true
  472. }
  473. '-fack' {
  474. set srctype "TCP/Fack"
  475. set sinktype "TCPSink/Sack1"
  476. }
  477. '-fackfs' {
  478. set srctype "TCP/Fack/FS"
  479. set sinktype "TCPSink/Sack1"
  480. set slow_start_restart false
  481. set fs_enable true
  482. }
  483. '-renoasym' {
  484. set srctype "TCP/Reno/Asym"
  485. set sinktype "TCPSink/Asym"
  486. }
  487. '-newrenoasym' {
  488. set srctype "TCP/Newreno/Asym"
  489. set sinktype "TCPSink/Asym"
  490. }
  491. '-newrenoasymfs' {
  492. set srctype "TCP/Newreno/Asym/FS"
  493. set sinktype "TCPSink/Asym"
  494. set slow_start_restart false
  495. set fs_enable true
  496. }
  497. '-int' {
  498. set srctype "TCP/Int"
  499. set sessionFlag true
  500. }
  501. '-intfs' {
  502. set srctype "TCP/Int"
  503. set sessionFlag true
  504. set slow_start_restart false
  505. set fs_enable true
  506. }
  507. default {
  508. incr count -1
  509. }
  510. }
  511. set randTime 0
  512. incr count 1
  513. set arg [lindex $argv $count]
  514. set startTime $arg
  515. incr count 1
  516. set connGraph 0 
  517. set arg [lindex $argv $count]
  518.         if { $arg == "-graph" } {
  519.                 set connGraph 1
  520.                 incr count 1
  521.         } elseif { $arg == "-rand" } {
  522. incr count 1
  523. set arg [lindex $argv $count]
  524. set randTime $arg
  525. incr count 1
  526. }
  527. if {($direction == "up") && ($upwin > 0)} {
  528. set win $upwin
  529. } elseif {($burstflag == 1) && ($burstwin > 0)} {
  530. set win $burstwin
  531. } elseif {$webFlag && $webwin > 0} {
  532. set win $webwin
  533. } else {
  534. set win $window
  535. }
  536. if {$webFlag} {
  537. set web [new WebCS $ns $src $dst "$srctype $maxburst $tcpTick $win $slow_start_restart $fs_enable" $tcptrace "$sinktype $sinktrace" [expr $phttpAllFlag || $phttpFlag] [expr $httpseqAllFlag || $httpseqFlag] $sessionFlag "$count_bytes_acked $schedDisp $fs_enable"]
  538. $web set finish_ "finish $ns $f $tcptrace $redtrace $queuetrace $graph connGraphFlag 0 $turnontime $turnofftime [expr $monitorq || $traceq]"
  539. $ns at $startTime "$web start"
  540. } else {
  541. set tcp [createTcpSource $srctype $maxburst $tcpTick $win $slow_start_restart $fs_enable]
  542. set sink [createTcpSink $sinktype $sinktrace]
  543. set ftp [createFtp $ns $src $tcp $dst $sink]
  544. set newSessionFlag false
  545. if {$sessionFlag} {
  546. set newSessionFlag [setupTcpSession $tcp $count_bytes_acked $schedDisp $fs_enable]
  547. # set d [expr ([$tcp set dst_]/256)*256]
  548. # set session [[$tcp set node_] getTcpSession $d]
  549. }
  550. setupTcpTracing $tcp $tcptrace $newSessionFlag
  551. setupGraphing $tcp $connGraph connGraphFlag $newSessionFlag
  552. if { $burstflag == 0 } {
  553. $ns at $startTime "$ftp start"
  554. } elseif { $fixed_period } {
  555. if {$firstburstsz > 0} {
  556. $ns at $startTime "$ftp produce $firstburstsz"
  557. } else {
  558. $ns at $startTime "$ftp produce $burstsz"
  559. }
  560. $ns at [expr $startTime+$pause] "periodic_burst $ns $ftp $burstsz $pause"
  561. } elseif { $fixed_period_except_first } {
  562. if {$firstburstsz > 0} {
  563. $ns at $startTime "$ftp produce $firstburstsz"
  564. } else {
  565. $ns at $startTime "$ftp produce $burstsz"
  566. }
  567. $ns at [expr $pause+$randTime] "periodic_burst $ns $ftp $burstsz $pause"
  568. } else {
  569. $tcp proc done {} "burst_finish $ns $ftp $burstsz $pause"
  570. if {$firstburstsz > 0} {
  571. $ns at $startTime "$ftp produce $firstburstsz"
  572. } else {
  573. $ns at $startTime "$ftp produce $burstsz"
  574. }
  575. }
  576. set ok 1
  577. while {$ok == 1 && $count < $argc} {
  578. set arg [lindex $argv $count]
  579. switch -exact '$arg' {
  580. '-at' {
  581. incr count 1
  582. set time [lindex $argv $count]
  583. incr count 1
  584. set cmd [lindex $argv $count]
  585. incr count 1
  586. $ns at $time "$tcp $cmd"
  587. }
  588. default {
  589. set ok 0
  590. }
  591. }
  592. }
  593. }
  594. }
  595. # seed random number generator
  596. if {$seed >= 0} {
  597. ns-random $seed
  598. }
  599. if {$topology == "fs"} {
  600. # topology
  601. #
  602. #     
  603. #  n00                         n30
  604. #                            /
  605. #       10Mb, 1ms           / 10Mb, 1ms
  606. #                          /
  607. #           1Mb, 50ms     /
  608. #        n1 ------------ n2
  609. #       /                  
  610. #      /                    
  611. #     /  10Mb, 1ms            10Mb, 1ms
  612. #    /                        
  613. #  n01                         n31
  614. for {set i 0} {$i < $numsrc} {incr i 1} {
  615. $ns duplex-link $n(0$i) $n(1) 10Mb 1ms DropTail
  616. }
  617. $ns duplex-link $n(1) $n(2) $fbw $delay $fgw
  618. for {set i 0} {$i < $numdst} {incr i 1} {
  619. $ns duplex-link $n(2) $n(3$i) 10Mb 1ms DropTail
  620. }
  621. # configure forward bottleneck queue
  622. configQueue $ns $n(1) $n(2) $fgw $queuetrace $fqsize $nonfifo false false false $priority_drop $random_drop $random_ecn
  623. configQueue $ns $n(2) $n(1) $rgw $queuetrace $rqsize $nonfifo false false false $priority_drop $random_drop $random_ecn
  624. set l(12) [$ns link $n(1) $n(2)]
  625. set qm(12) [$l(12) set qMonitor_]
  626. set l(21) [$ns link $n(2) $n(1)]
  627. set qm(21) [$l(21) set qMonitor_]
  628. #configQueue $ns $n(1) $n(2) $fgw 0 $fqsize $nonfifo false false false $priority_drop $random_drop $random_ecn
  629. configREDQueue $ns $n(1) $n(2) $redtrace $fgw_q_weight 1 0.15 0.6 
  630. configREDQueue $ns $n(2) $n(1) $redtrace $rgw_q_weight 1 0.15 0.6
  631. } elseif {$topology == "asym"} {
  632. # topology
  633. #
  634. #      10Mb, 1ms       10Mb, 2ms       10Mb, 1ms
  635. #  n00 ------------ n1 ------------ n2 ------------ n30
  636. #                     28.8Kb, 50ms 
  637. #
  638. for {set i 0} {$i < $numsrc} {incr i 1} {
  639. $ns duplex-link $n(0$i) $n(1) 10Mb 1ms DropTail
  640. }
  641. $ns simplex-link $n(1) $n(2) 10Mb 2ms DropTail
  642. $ns simplex-link $n(2) $n(1) $rbw 50ms $rgw
  643. for {set i 0} {$i < $numdst} {incr i 1} {
  644. $ns duplex-link $n(2) $n(3$i) 10Mb 1ms DropTail
  645. }
  646. # configure reverse bottleneck queue
  647. configQueue $ns $n(2) $n(1) $rgw 0 $rqsize $nonfifo $acksfirst $filteracks $replace_head
  648. configREDQueue $ns $n(2) $n(1) $redtrace $rgw_q_weight
  649. }
  650. # trace queues
  651. foreach i [array names traceqFromNode] {
  652. trace_queue $ns $n($traceqFromNode($i)) $n($traceqToNode($i)) $queuetrace
  653. set traceq 1
  654. }
  655. #end simulation
  656. $ns at $duration "finish $ns $f $tcptrace $redtrace $queuetrace $graph connGraphFlag 0 $turnontime $turnofftime [expr $monitorq || $traceq]"
  657. $ns run