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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 1995 The 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. # @(#) $Header: /cvsroot/nsnam/ns-2/tcl/test/sack.tcl,v 1.2 2005/05/29 15:35:19 sfloyd Exp $
  34. #
  35. #
  36. # This file uses the ns-1 interfaces, not the newere v2 interfaces.
  37. # Don't copy this code for use in new simulations,
  38. # copy the new code with the new interfaces!
  39. #
  40. Agent/TCP set minrto_ 1
  41. # default changed on 10/14/2004.
  42. Agent/TCP/Newreno set newreno_changes1_ 0
  43. # The default is being changed to 1 on 5/5/03, to reflect RFC 2582.
  44. Agent/TCP/Newreno set partial_window_deflation_ 0
  45. # The default is being changed to 1 on 5/5/03, to reflect RFC 2582.
  46. Agent/TCP set singledup_ 0
  47. # The default has been changed to 1
  48. #
  49. # Create a simple four node topology:
  50. #
  51. #        s1
  52. #          
  53. #  8Mb,0ms   0.8Mb,100ms
  54. #           r1 --------- k1
  55. #  8Mb,0ms /
  56. #         /
  57. #        s2
  58. #
  59. # one drop
  60. proc create_testnet { } {
  61. global mod s1 s2 r1 r2 k1
  62. global mod ns_tcp ns_tcpnewreno
  63. set mod 100
  64. set s1 [ns node]
  65. set s2 [ns node]
  66. set r1 [ns node]
  67. set k1 [ns node]
  68. set r2 [ns node]
  69. ns_duplex $s1 $r1 8Mb 0.1ms drop-tail
  70. ns_duplex $s2 $r1 8Mb 0.1ms drop-tail
  71. ns_duplex $r1 $r2 8Mb 0.001ms drop-tail
  72. set L [ns_duplex $r2 $k1 800Kb 100ms drop-tail]
  73. [lindex $L 0] set queue-limit 6
  74. [lindex $L 1] set queue-limit 6
  75. # maxburst must be set to an integer.
  76. set ns_tcp(maxburst) maxBurst
  77. set ns_tcp(bug-fix) false
  78. set ns_tcpnewreno(changes) 0
  79. }
  80. #
  81. # Create a simple six node topology:
  82. #
  83. #        s1     s3
  84. #               /
  85. # 10Mb,2ms   1.5Mb,20ms   / 10Mb,4ms
  86. #           r1 --------- r2
  87. # 10Mb,3ms /     10Mb,5ms
  88. #         /     
  89. #        s2     s4 
  90. #
  91. proc create_testnet2 { } {
  92. global mod s1 s2 r1 r2 r2 s3 s4
  93. global mod ns_tcp
  94. set s1 [ns node]
  95. set s2 [ns node]
  96. set r1 [ns node]
  97. set r2 [ns node]
  98. set s3 [ns node]
  99. set s4 [ns node]
  100. ns_duplex $s1 $r1 10Mb 2ms drop-tail
  101. ns_duplex $s2 $r1 10Mb 3ms drop-tail
  102. set L [ns_duplex $r1 $r2 1.5Mb 20ms red]
  103. [lindex $L 0] set queue-limit 25
  104. [lindex $L 1] set queue-limit 25
  105. ns_duplex $s3 $r2 10Mb 4ms drop-tail
  106. ns_duplex $s4 $r2 10Mb 5ms drop-tail
  107. set ns_tcp(maxburst) maxBurst
  108. set ns_tcp(bug-fix) false
  109. }
  110. proc finish { file mod } {
  111. set f [open temp.rands w]
  112. puts $f "TitleText: $file"
  113. puts $f "Device: Postscript"
  114. exec rm -f temp.p 
  115. exec touch temp.p
  116. #
  117. # split queue/drop events into two separate files.
  118. # we don't bother checking for the link we're interested in
  119. # since we know only such events are in our trace file
  120. #
  121. exec awk {
  122. {
  123. if (($1 == "+" || $1 == "-" ) && 
  124.     ($5 == "tcp" || $5 == "ack"))
  125. print $2, $8*(mod+10) + ($11 % mod) 
  126. }
  127. } mod=$mod out.tr > temp.p
  128. exec rm -f temp.d
  129. exec touch temp.d
  130. exec awk {
  131. {
  132. if ($1 == "d")
  133. print $2, $8*(mod+10) + ($11 % mod) 
  134. }
  135. } mod=$mod out.tr > temp.d
  136.         exec rm -f temp.p1
  137. exec touch temp.p1
  138.         exec awk {
  139.                 {
  140.                         if (($1 == "-" ) && 
  141.                             ($5 == "tcp" || $5 == "ack"))
  142.                                         print $2, $8*(mod+10) + ($11 % mod) 
  143.                 }
  144.         } mod=$mod out.tr1 > temp.p1
  145. puts $f "packets
  146. flush $f
  147. exec cat temp.p >@ $f
  148. flush $f
  149.         puts $f n"acks
  150.         flush $f
  151.         exec cat temp.p1 >@ $f
  152. # insert dummy data sets so we get X's for marks in data-set 4
  153. # puts $f [format "n"skip-1n0 1nn"skip-2n0 1nn"]
  154. puts $f [format "n"skip-1n0 1nn"]
  155. puts $f "drops
  156. flush $f
  157. #
  158. # Repeat the first line twice in the drops file because
  159. # often we have only one drop and xgraph won't print marks
  160. # for data sets with only one point.
  161. #
  162. exec head -1 temp.d >@ $f
  163. exec cat temp.d >@ $f
  164. close $f
  165. # exec csh figure.com $file &
  166. puts stdout "Calling xgraph."
  167. exec xgraph -bb -tk -nl -m -ly 0,$mod -x time -y packet temp.rands &
  168. # exec xgraph -bb -tk -nl -m -x time -y packet temp.rands &
  169. exit 0
  170. }
  171. proc openTrace { stopTime testName mod } {
  172. exec rm -f out.tr temp.rands
  173. global r1 k1    
  174. set traceFile [open out.tr w]
  175. ns at $stopTime 
  176. "close $traceFile ; finish $testName $mod"
  177. set T [ns trace]
  178. $T attach $traceFile
  179. return $T
  180. }
  181. proc openTraces { stopTime testName filename node1 node2 mod } {
  182.         global s1 s2 r1 r2 k1
  183.         exec rm -f $filename temp.rands
  184.         set traceFile [open $filename w]
  185.         ns at $stopTime 
  186.                 "close $traceFile"
  187.         set T [ns trace]
  188.         $T attach $traceFile
  189.         [ns link $node1 $node2] trace $T
  190. }
  191. proc openTraces1 { stopTime testName filename node1 node2 mod } {
  192.         global s1 s2 r1 r2 k1
  193.         exec rm -f $filename temp.rands
  194.         set traceFile [open $filename w]
  195.         ns at $stopTime 
  196.                 "close $traceFile ; finish $testName $mod"
  197.         set T1 [ns trace]
  198.         $T1 attach $traceFile
  199.         [ns link $node1 $node2] trace $T1
  200. }
  201. proc test_one_drop {} {
  202. global mod s1 s2 r1 r2 k1
  203. create_testnet
  204. set mod 60
  205. set endtime 6.0
  206. [ns link $r2 $k1] set queue-limit 8
  207. set tcp1 [ns_create_connection tcp $s1 tcp-sink $k1 0]
  208. $tcp1 set window 28
  209. set ftp1 [$tcp1 source ftp]
  210. set tcp2 [ns_create_connection tcp-reno $s1 tcp-sink $k1 1]
  211. $tcp2 set window 8
  212. set ftp2 [$tcp2 source ftp]
  213. $ftp2 set maxpkts 12
  214. set tcp3 [ns_create_connection tcp-reno $s1 tcp-sink $k1 2]
  215. $tcp3 set window 8
  216. set ftp3 [$tcp3 source ftp]
  217. $ftp3 set maxpkts 10
  218. ns at 1.0 "$ftp1 start"
  219. ns at 1.2 "$ftp2 start"
  220. ns at 1.2 "$ftp3 start"
  221. # trace only the bottleneck link
  222. openTraces $endtime test_type_one_drop out.tr $r2 $k1 $mod
  223. openTraces1 $endtime test_type_one_drop out.tr1 $r2 $r1 $mod
  224. ns run
  225. }
  226. proc test_two_drops {} {
  227. global mod s1 s2 r1 r2 k1
  228. create_testnet
  229. set mod 60
  230. set endtime 6.0
  231. [ns link $r2 $k1] set queue-limit 8
  232. set tcp1 [ns_create_connection tcp $s1 tcp-sink $k1 0]
  233. $tcp1 set window 28
  234. set ftp1 [$tcp1 source ftp]
  235. set tcp2 [ns_create_connection tcp-reno $s1 tcp-sink $k1 1]
  236. $tcp2 set window 8
  237. set ftp2 [$tcp2 source ftp]
  238. $ftp2 set maxpkts 12
  239. set tcp3 [ns_create_connection tcp-reno $s1 tcp-sink $k1 2]
  240. $tcp3 set window 8
  241. set ftp3 [$tcp3 source ftp]
  242. $ftp3 set maxpkts 11
  243. ns at 1.0 "$ftp1 start"
  244. ns at 1.2 "$ftp2 start"
  245. ns at 1.2 "$ftp3 start"
  246. # trace only the bottleneck link
  247. openTraces $endtime test_type_two_drops out.tr $r2 $k1 $mod
  248. openTraces1 $endtime test_type_two_drops out.tr1 $r2 $r1 $mod
  249. ns run
  250. }
  251. proc test_three_drops {} {
  252. global mod s1 s2 r1 r2 k1
  253. create_testnet
  254. set mod 60
  255. set endtime 6.0
  256. [ns link $r2 $k1] set queue-limit 8
  257. set tcp1 [ns_create_connection tcp $s1 tcp-sink $k1 0]
  258. $tcp1 set window 28
  259. set ftp1 [$tcp1 source ftp]
  260. set tcp2 [ns_create_connection tcp-reno $s1 tcp-sink $k1 1]
  261. $tcp2 set window 8
  262. set ftp2 [$tcp2 source ftp]
  263. $ftp2 set maxpkts 12
  264. set tcp3 [ns_create_connection tcp-reno $s1 tcp-sink $k1 2]
  265. $tcp3 set window 8
  266. set ftp3 [$tcp3 source ftp]
  267. $ftp3 set maxpkts 12
  268. ns at 1.0 "$ftp1 start"
  269. ns at 1.2 "$ftp2 start"
  270. ns at 1.18 "$ftp3 start"
  271. # trace only the bottleneck link
  272. openTraces $endtime test_type_three_drops out.tr $r2 $k1 $mod
  273. openTraces1 $endtime test_type_three_drops out.tr1 $r2 $r1 $mod
  274. ns run
  275. }
  276. proc test_four_drops {} {
  277. global mod s1 s2 r1 r2 k1
  278. create_testnet
  279. set mod 60
  280. set endtime 6.0
  281. [ns link $r2 $k1] set queue-limit 8
  282. set tcp1 [ns_create_connection tcp $s1 tcp-sink $k1 0]
  283. $tcp1 set window 28
  284. set ftp1 [$tcp1 source ftp]
  285. set tcp2 [ns_create_connection tcp-reno $s1 tcp-sink $k1 1]
  286. $tcp2 set window 8
  287. set ftp2 [$tcp2 source ftp]
  288. $ftp2 set maxpkts 12
  289. set tcp3 [ns_create_connection tcp-reno $s1 tcp-sink $k1 2]
  290. $tcp3 set window 8
  291. set ftp3 [$tcp3 source ftp]
  292. $ftp3 set maxpkts 13
  293. ns at 1.0 "$ftp1 start"
  294. ns at 1.2 "$ftp2 start"
  295. ns at 1.2 "$ftp3 start"
  296. # trace only the bottleneck link
  297. openTraces $endtime test_type_four_drops out.tr $r2 $k1 $mod
  298. openTraces1 $endtime test_type_four_drops out.tr1 $r2 $r1 $mod
  299. ns run
  300. }
  301. proc test_many_drops {} {
  302. global mod s1 s2 r1 r2 k1
  303. create_testnet
  304. set mod 60
  305. set endtime 6.0
  306. [ns link $r2 $k1] set queue-limit 8
  307. set tcp1 [ns_create_connection tcp $s1 tcp-sink $k1 0]
  308. $tcp1 set window 28
  309. set ftp1 [$tcp1 source ftp]
  310. set tcp2 [ns_create_connection tcp-reno $s1 tcp-sink $k1 1]
  311. $tcp2 set window 8
  312. set ftp2 [$tcp2 source ftp]
  313. $ftp2 set maxpkts 12
  314. set tcp3 [ns_create_connection tcp-reno $s1 tcp-sink $k1 2]
  315. $tcp3 set window 8
  316. set ftp3 [$tcp3 source ftp]
  317. $ftp3 set maxpkts 16
  318. ns at 1.0 "$ftp1 start"
  319. ns at 1.2 "$ftp2 start"
  320. ns at 1.2 "$ftp3 start"
  321. # trace only the bottleneck link
  322. openTraces $endtime test_type_many_drops out.tr $r2 $k1 $mod
  323. openTraces1 $endtime test_type_many_drops out.tr1 $r2 $r1 $mod
  324. ns run
  325. }
  326. #
  327. # In the following tests, the TCP connection has two related parameters,
  328. # "window", for the receiver's advertised window, and "maxcwnd",
  329. # for the max congestion window.
  330. #
  331. proc test_one_14 {} {
  332. global mod s1 s2 r1 r2 k1
  333. create_testnet
  334. set endtime 5.0
  335. set tcp1 [ns_create_connection tcp $s1 tcp-sink $k1 0]
  336. $tcp1 set window 28
  337. $tcp1 set maxcwnd 14
  338. set ftp1 [$tcp1 source ftp]
  339. ns at 1.0 "$ftp1 start"
  340. # trace only the bottleneck link
  341. openTraces $endtime test_type_one_14 out.tr $r2 $k1 $mod
  342. openTraces1 $endtime test_type_one_14 out.tr1 $r2 $r1 $mod
  343. ns run
  344. }
  345. proc test_one_15 {} {
  346. global mod s1 s2 r1 r2 k1
  347. create_testnet
  348. set endtime 5.0
  349. set tcp1 [ns_create_connection tcp $s1 tcp-sink $k1 0]
  350. $tcp1 set window 30
  351. $tcp1 set maxcwnd 15
  352. set ftp1 [$tcp1 source ftp]
  353. ns at 1.0 "$ftp1 start"
  354. # trace only the bottleneck link
  355. openTraces $endtime test_type_one_15 out.tr $r2 $k1 $mod
  356. openTraces1 $endtime test_type_one_15 out.tr1 $r2 $r1 $mod
  357. ns run
  358. }
  359. proc test_one_20 {} {
  360. global mod s1 s2 r1 r2 k1
  361. create_testnet
  362. set endtime 10.0
  363. set tcp1 [ns_create_connection tcp $s1 tcp-sink $k1 0]
  364. $tcp1 set window 40
  365. $tcp1 set maxcwnd 20
  366. set ftp1 [$tcp1 source ftp]
  367. ns at 1.0 "$ftp1 start"
  368. # trace only the bottleneck link
  369. openTraces $endtime test_type_one_20 out.tr $r2 $k1 $mod
  370. openTraces1 $endtime test_type_one_20 out.tr1 $r2 $r1 $mod
  371. ns run
  372. }
  373. proc test_one_26 {} {
  374. global mod s1 s2 r1 r2 k1
  375. create_testnet
  376. set endtime 10.0
  377. set tcp1 [ns_create_connection tcp $s1 tcp-sink $k1 0]
  378. $tcp1 set window 52 
  379. $tcp1 set maxcwnd 26
  380. set ftp1 [$tcp1 source ftp]
  381. ns at 1.0 "$ftp1 start"
  382. # trace only the bottleneck link
  383. openTraces $endtime test_type_one_26 out.tr $r2 $k1 $mod
  384. openTraces1 $endtime test_type_one_26 out.tr1 $r2 $r1 $mod
  385. ns run
  386. }
  387. # delayed ack not implemented for sack.
  388. # proc test_one_40 {} { 
  389. #         global mod s1 s2 r1 r2 r2 s3 s4
  390. #         create_testnet2
  391. #         [ns link $r1 $r2] set queue-limit 29
  392. #         set tcp1 [ns_create_connection tcp $s1 tcp-sink-da $r2 0]
  393. #         $tcp1 set window 40
  394. #         set ftp1 [$tcp1 source ftp]
  395. #         ns at 0.0 "$ftp1 start"
  396. #         # trace only the bottleneck link
  397. #  openTraces 5.0 test_type_one_40 out $r1 $r2 $k1
  398. #         ns run
  399. # }
  400. proc test_two_2 {} {
  401. global mod s1 s2 r1 r2 k1 
  402. create_testnet
  403. set endtime 8.0
  404. [ns link $r2 $k1] set queue-limit 8
  405. [ns link $k1 $r2] set queue-limit 8
  406. set tcp1 [ns_create_connection tcp $s1 tcp-sink $k1 0]
  407. $tcp1 set window 200
  408. $tcp1 set maxcwnd 100
  409. set tcp2 [ns_create_connection tcp $s2 tcp-sink $k1 1]
  410. $tcp2 set window 32
  411. $tcp2 set window 16
  412. set ftp1 [$tcp1 source ftp]
  413. set ftp2 [$tcp2 source ftp]
  414. ns at 1.0 "$ftp1 start"
  415. ns at 0.5 "$ftp2 start"
  416. # trace only the bottleneck link
  417. openTraces $endtime test_type_two_2 out.tr $r2 $k1 $mod
  418. openTraces1 $endtime test_type_two_2 out.tr1 $r2 $r1 $mod
  419. ns run
  420. }
  421. proc test_two_A {} {
  422. global mod s1 s2 r1 r2 k1
  423. create_testnet
  424. set endtime 10.0
  425. [ns link $r2 $k1] set queue-limit 9
  426. set tcp1 [ns_create_connection tcp $s1 tcp-sink $k1 0]
  427. $tcp1 set window 100
  428. $tcp1 set maxcwnd 50
  429. set tcp2 [ns_create_connection tcp $s2 tcp-sink $k1 1]
  430. $tcp2 set window 40
  431. $tcp2 set maxcwnd 20
  432. set ftp1 [$tcp1 source ftp]
  433. set ftp2 [$tcp2 source ftp]
  434. ns at 1.0 "$ftp1 start"
  435. ns at 1.0 "$ftp2 start"
  436. # trace only the bottleneck link
  437. openTraces $endtime test_type_two_A out.tr $r2 $k1 $mod
  438. openTraces1 $endtime test_type_two_A out.tr1 $r2 $r1 $mod
  439. ns run
  440. }
  441. proc test_two_B {} {
  442. global mod s1 s2 r1 r2 k1
  443. create_testnet
  444. set endtime 10.0
  445. [ns link $s2 $r1] set delay 200ms
  446. [ns link $r1 $s2] set delay 200ms
  447. [ns link $r2 $k1] set queue-limit 11
  448. [ns link $k1 $r2] set queue-limit 11
  449. set tcp1 [ns_create_connection tcp $s1 tcp-sink $k1 0]
  450. $tcp1 set window 60
  451. $tcp1 set maxcwnd 30 
  452. set tcp2 [ns_create_connection tcp $s2 tcp-sink $k1 1]
  453. $tcp2 set window 60
  454. $tcp2 set maxcwnd 30
  455. set ftp1 [$tcp1 source ftp]
  456. set ftp2 [$tcp2 source ftp]
  457. ns at 0.0 "$ftp1 start"
  458. ns at 0.0 "$ftp2 start"
  459. # trace only the bottleneck link
  460. openTraces $endtime test_type_two_B out.tr $r2 $k1 $mod
  461. openTraces1 $endtime test_type_two_B out.tr1 $r2 $r1 $mod
  462. ns run
  463. }
  464. if { $argc != 1 } {
  465. puts stderr {usage: ns test-suite.tcl [ 1 2 3 ... ]}
  466. exit 1
  467. }
  468. if { "[info procs test_$argv]" != "test_$argv" } {
  469. puts stderr "sack.tcl: no such test: $argv"
  470. }
  471. test_$argv