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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 1997 Regents of the University of California.
  3. # All rights reserved.
  4. # Redistribution and use in source and binary forms, with or without
  5. # modification, are permitted provided that the following conditions
  6. # are met:
  7. # 1. Redistributions of source code must retain the above copyright
  8. #    notice, this list of conditions and the following disclaimer.
  9. # 2. Redistributions in binary form must reproduce the above copyright
  10. #    notice, this list of conditions and the following disclaimer in the
  11. #    documentation and/or other materials provided with the distribution.
  12. # 3. All advertising materials mentioning features or use of this software
  13. #    must display the following acknowledgement:
  14. #  This product includes software developed by the MASH Research
  15. #  Group at the University of California Berkeley.
  16. # 4. Neither the name of the University nor of the Research Group may be
  17. #    used to endorse or promote products derived from this software without
  18. #    specific prior written permission.
  19. # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  20. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22. # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  23. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  24. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  25. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  26. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  27. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  28. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  29. # SUCH DAMAGE.
  30. #
  31. # This file contributed by Curtis Villamizar <curtis@ans.net>, May 1997.
  32. # Maintainer: John Heidemann <johnh@isi.edu>.
  33. #
  34. #
  35. # WARNING:  This code uses the compatibility library and so should not
  36. # be used as an example.  Hopefully at some time in the future it will
  37. # be updated.
  38. #
  39. # Create a three node test environment
  40. #
  41. #  c1 -------- isp1 -------- s1
  42. #      28.8kb        1.54mb
  43. #     modemdelay    netdelay
  44. #
  45. proc create_testnet { } {
  46.     global testnet
  47.     set testnet(c1) [ns node]
  48.     set testnet(isp1) [ns node]
  49.     set testnet(s1) [ns node]
  50.     set testnet(L1) 
  51.     [ns_duplex $testnet(c1) $testnet(isp1) 
  52.     $testnet(modemspeed) $testnet(modemdelay) $testnet(qtype)]
  53.     ns_duplex $testnet(isp1) $testnet(s1) 
  54.     $testnet(netspeed) $testnet(netdelay) drop-tail
  55.     [lindex $testnet(L1) 0] set queue-limit $testnet(modemqueue)
  56.     [lindex $testnet(L1) 1] set queue-limit $testnet(modemqueue)
  57.     if {$testnet(qtype) == "red"} {
  58. set redlink [ns link $testnet(c1) $testnet(isp1)]
  59. $redlink set thresh [expr $testnet(modemqueue) * 0.25]
  60. $redlink set maxthresh [expr $testnet(modemqueue) * 0.85]
  61. $redlink set q_weight 0.001
  62. $redlink set wait_ 1
  63. $redlink set dropTail_ 1
  64.     }
  65. }
  66. proc tcpDump { tcpSrc interval } {
  67.     proc dump { src interval } {
  68. ns at [expr [ns now] + $interval] "dump $src $interval"
  69. puts [ns now]/ack=[$src get ack]
  70.     }
  71.     ns at 0.0 "dump $tcpSrc $interval"
  72. }
  73. proc trigger { xresults } {
  74.     global testnet flows
  75.     # NEEDSWORK:  should we really indirect once down results like this?
  76.     set results "[lindex $xresults 0]"
  77.     set type [lindex $results 0]
  78.     if { $type != "-" && $type != "d" } {
  79. return;
  80.     }
  81.     set id [lindex $results 7]
  82.     set counter [format "count%d" $id]
  83.     if { [info exists flows($counter)] } {
  84. incr flows($counter)
  85.     } else {
  86. set flows($counter) 1
  87.     }
  88.     if { $type != "-" } {
  89. return;
  90.     }
  91.     set got [expr 1 + [lindex $results 10]]
  92.     set isrunning isrunning$id
  93.     if { $id == 0 } {
  94. if { $got == $testnet(httpsize) } {
  95.     puts [format "http flow completed at %s" [lindex $results 1]]
  96.     incr flows(flows_running) -1
  97.     set flows($isrunning) 0
  98. }
  99.     } else {
  100. if { $got == $testnet(inlinesize) } {
  101.     puts [format "inline%d completed at %s" $id [lindex $results 1]]
  102.     incr flows(flows_running) -1
  103.     incr flows(inlines_running) -1
  104.     set flows($isrunning) 0
  105. }
  106.     }
  107.     set flows(persist) 1
  108.     if { $flows(count0) >= 1 } {
  109. while {$flows(inlines_started) < $flows(inlines_needed) 
  110. && $flows(flows_running) < $flows(flows_allowed) 
  111. && $flows(inlines_running) < $flows(inlines_allowed) } {
  112.     incr flows(inlines_started)
  113.     incr flows(flows_running)
  114.     incr flows(inlines_running)
  115.     set ident $flows(inlines_started)
  116.     set nextflow inline$ident
  117.     if {$flows(persist)} {
  118. for {set j 0} {$j < $ident} {incr j} {
  119.     set isrunning isrunning$j
  120.     if {$flows($isrunning) == 0} {
  121. set thisflow tcp$ident
  122. if {$j == 0} {
  123.     set otherflow tcp0
  124. } else {
  125.     set otherflow tcp$j
  126. }
  127. $flows($thisflow) persist $flows($otherflow)
  128. break
  129.     }
  130. }
  131.     }
  132.     $flows($nextflow) start
  133.     set isrunning isrunning$ident
  134.     set flows($isrunning) 1
  135.     puts [format "trigger at %s: start %d" 
  136.     [lindex $results 1] $flows(inlines_started)]
  137. }
  138.     }
  139. }
  140. proc openTrace { stopTime testName } {
  141.     exec rm -f out.tr temp.rands
  142.     set traceFile [open out.tr w]
  143.     ns at $stopTime "close $traceFile ; finish $testName"
  144.     set T [ns trace]
  145.     $T attach $traceFile
  146.     return $T
  147. }
  148. proc finish file {
  149.     global testnet flows
  150.     set f [open temp.rands w]
  151.     puts $f "TitleText: $file"
  152.     puts $f "Device: Postscript"
  153.     
  154.     set total 0
  155.     for { set i 0 } { $i <= $flows(inlines_needed) } { incr i } {
  156. set counter [format "count%d" $i]
  157. set got $flows($counter)
  158. incr total $got
  159. puts [format "flow %d : %d packets" $i $got]
  160.     }
  161.     set needed [expr $testnet(httpsize) 
  162.     + ( $flows(inlines_needed) * $testnet(inlinesize) )]
  163.     set discard [expr $total - $needed]
  164.     puts [format "%d sent : %d needed : %d discarded : %d %%" 
  165.     $total $needed $discard [expr 100 * $discard / $needed]]
  166.     if { $testnet(dograph) == 0 } {
  167. exit 0
  168.     }
  169.     exec rm -f temp.p temp.d 
  170.     exec touch temp.d temp.p
  171.     #
  172.     # split queue/drop events into two separate files.
  173.     # we don't bother checking for the link we're interested in
  174.     # since we know only such events are in our trace file
  175.     #
  176.     exec awk {
  177. {
  178.     if (($1 == "-" ) && 
  179.     ($5 == "tcp" || $5 == "ack") && 
  180.     ($8 == 0 || ($8 == 4 && $11 <= 6))) 
  181.     print $2, $8 + ($11 % 90) * 0.01
  182. }
  183.     } out.tr > temp.p1
  184.     exec awk {
  185. {
  186.     if (($1 == "-" ) && 
  187.     ($5 == "tcp" || $5 == "ack") && 
  188.     ($8 == 1 || ($8 == 4 && $11 > 6 && $11 <= 26))) 
  189.     print $2, $8 + ($11 % 90) * 0.01
  190. }
  191.     } out.tr > temp.p2
  192.     exec awk {
  193. {
  194.     if (($1 == "-" ) && 
  195.     ($5 == "tcp" || $5 == "ack") && 
  196.     ($8 == 2 || $8 == 3 || ($8 == 4 && $11 > 26))) 
  197.     print $2, $8 + ($11 % 90) * 0.01
  198. }
  199.     } out.tr > temp.p3
  200.     exec awk {
  201. {
  202.     if ($1 == "d")
  203.     print $2, $8 + ($11 % 90) * 0.01
  204. }
  205.     } out.tr > temp.d
  206.     puts $f "packets
  207.     flush $f
  208.     exec cat temp.p1 >@ $f
  209.     flush $f
  210.     puts $f [format "n"1st-inlinen"]
  211.     flush $f
  212.     exec cat temp.p2 >@ $f
  213.     flush $f
  214.     puts $f [format "n"other-2n"]
  215.     flush $f
  216.     exec cat temp.p3 >@ $f
  217.     flush $f
  218.     # insert dummy data sets so we get X's for marks in data-set 4
  219.     # puts $f [format "n"skip-1n0 1nn"skip-2n0 1nn"]
  220.     
  221.     puts $f [format "n"dropsn"]
  222.     flush $f
  223.     #
  224.     # Repeat the first line twice in the drops file because
  225.     # often we have only one drop and xgraph won't print marks
  226.     # for data sets with only one point.
  227.     #
  228.     exec head -1 temp.d >@ $f
  229.     exec cat temp.d >@ $f
  230.     close $f
  231.     exec xgraph -bb -tk -nl -m -x time -y packet temp.rands &
  232.     
  233.     exit 0
  234. }
  235. proc init_tcp_flow {taskid flowid id size} {
  236.     global testnet flows
  237.     set flow [ns_create_connection tcp-reno 
  238.     $testnet(s1) tcp-sink $testnet(c1) $id]
  239.     $flow set window $testnet(window)
  240.     $flow set packet-size $testnet(mss)
  241.     $flow set maxcwnd $testnet(window)
  242.     set flows($flowid) $flow 
  243.     set flows($taskid) [$flow source ftp]
  244.     $flows($taskid) set maxpkts_ $size
  245.     # tcpDump $flow $testnet(dumpincr)
  246. }
  247. proc setup_http_test {} {
  248.     global testnet
  249.     global flows
  250.     create_testnet
  251.     init_tcp_flow http tcp0 0 $testnet(httpsize)
  252.     ns at 0.0 "$flows(http) start"
  253.     set flows(isrunning0) 1
  254.     set flows(flows_running) 1
  255.     set flows(count0) 0
  256.     for { set i 1 } { $i <= $flows(inlines_needed) } { incr i } {
  257. set nexttask [format "inline%d" $i]
  258. set nextflow [format "tcp%d" $i]
  259. init_tcp_flow $nexttask $nextflow $i $testnet(inlinesize)
  260.     }
  261.     # trace only the bottleneck link
  262.     set traceme [openTrace $testnet(testlimit) test_http]
  263.     set bottleneck [ns link $testnet(isp1) $testnet(c1)]
  264.     $bottleneck trace $traceme
  265.     $bottleneck callback { trigger }
  266. }
  267. proc set_globals {} {
  268.     global testnet
  269.     set testnet(netspeed) 1.54mb
  270.     set testnet(modemspeed) 28.8kb
  271.     set testnet(netdelay) 150ms
  272.     set testnet(modemdelay) 50ms
  273.     set testnet(mss) 512
  274.     set testnet(window) 64
  275.     set testnet(httpsize) 6
  276.     set testnet(inlinesize) 40
  277.     set testnet(modemqueue) 6
  278.     set testnet(dumpincr) 5.0
  279.     set testnet(testlimit) 50.0
  280.     set testnet(dograph) 0
  281.     set testnet(qtype) drop-tail
  282.     global flows
  283.     set flows(inlines_started) 0
  284.     set flows(inlines_needed) 3
  285.     set flows(flows_running) 0
  286.     set flows(flows_allowed) 4
  287.     set flows(inlines_running) 0
  288.     set flows(inlines_allowed) $flows(flows_allowed)
  289. }
  290. proc process_args {} {
  291.     global argc argv testnet flows
  292.     for {set i 0} {$i < $argc} {incr i} {
  293. set arg [lindex $argv $i]
  294. switch x$arg {
  295.     x-window {
  296. incr i
  297. set testnet(window) [lindex $argv $i]
  298.     }
  299.     x-graph {
  300. set testnet(dograph) 1
  301. puts "match"
  302.     }
  303.     x-delayN {
  304. incr i
  305. set testnet(netdelay) [lindex $argv $i]
  306.     }
  307.     x-delayM {
  308. incr i
  309. set testnet(modemdelay) [lindex $argv $i]
  310.     }
  311.     x-mss {
  312. incr i
  313. set testnet(mss) [lindex $argv $i]
  314.     }
  315.     x-httpsize {
  316. incr i
  317. set testnet(httpsize) [lindex $argv $i]
  318.     }
  319.     x-inlinesize {
  320. incr i
  321. set testnet(inlinesize) [lindex $argv $i]
  322.     }
  323.     x-queue {
  324. incr i
  325. set testnet(modemqueue) [lindex $argv $i]
  326.     }
  327.     x-dumpincr {
  328. incr i
  329. set testnet(dumpincr) [lindex $argv $i]
  330.     }
  331.     x-testlimit {
  332. incr i
  333. set testnet(testlimit) [lindex $argv $i]
  334.     }
  335.     x-inlines {
  336. incr i
  337. set flows(inlines_needed) [lindex $argv $i]
  338.     }
  339.     x-maxflow {
  340. incr i
  341. set flows(flows_allowed) [lindex $argv $i]
  342.     }
  343.     x-maxinline {
  344. incr i
  345. set flows(inlines_allowed) [lindex $argv $i]
  346.     }
  347.     x-red {
  348. set testnet(qtype) red
  349.     }
  350.     x-sfq {
  351. set testnet(qtype) sfq
  352.     }
  353.     default {
  354. puts [format "unrecognized argument: %s" [lindex $argv $i]]
  355. exit 1
  356.     }
  357. }
  358.     }
  359. }
  360. set_globals
  361. process_args
  362. setup_http_test
  363. # ns gen-map
  364. ns run