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

通讯编程

开发平台:

Visual C++

  1. # Copyright (C) 1999 by USC/ISI
  2. # All rights reserved.                                            
  3. #                                                                
  4. # Redistribution and use in source and binary forms are permitted
  5. # provided that the above copyright notice and this paragraph are
  6. # duplicated in all such forms and that any documentation, advertising
  7. # materials, and other materials related to such distribution and use
  8. # acknowledge that the software was developed by the University of
  9. # Southern California, Information Sciences Institute.  The name of the
  10. # University may not be used to endorse or promote products derived from
  11. # this software without specific prior written permission.
  12. # THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
  13. # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  14. # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  15. # Re-tooled version of Polly's web traffic models (tcl/ex/web-traffic.tcl, 
  16. # tcl/ex/large-scale-traffic.tcl) in order to save memory.
  17. #
  18. # The main strategy is to move everything into C++, only leave an OTcl 
  19. # configuration interface. Be very careful as what is configuration and 
  20. # what is functionality.
  21. #
  22. # $Header: /cvsroot/nsnam/ns-2/tcl/webcache/webtraf.tcl,v 1.21 2004/10/28 01:24:06 sfloyd Exp $
  23. PagePool/WebTraf set debug_ false
  24. PagePool/WebTraf set TCPTYPE_ Reno
  25. PagePool/WebTraf set TCPSINKTYPE_ TCPSink   ;#required for SACK1 Sinks.
  26. #0 for default, fid=id
  27. #1 for increasing along with new agent allocation (as in red-pd). 
  28. #   useful when used with flow monitors (as they tend to run out of space in hash tables)
  29. #   (see red-pd scripts for usage of this)
  30. #2 for assigning the same fid to all connections.
  31. #    useful when want to differentiate between various web traffic generators using flow monitors.
  32. #   (see pushback scripts for usage of this).
  33. PagePool/WebTraf set FID_ASSIGNING_MODE_ 0 
  34. PagePool/WebTraf set VERBOSE_ 0
  35. # Support the reuse of page level attributes to save
  36. #  memory for large simulations
  37. PagePool/WebTraf set recycle_page_ 1
  38. # If set, do not recycle TCP agents
  39. PagePool/WebTraf set dont_recycle_ 0
  40. # To use fullTCP (xuanc), we need to:
  41. # 1. set the flag fulltcp_ to 1
  42. # 2. set TCPTYPE_ FullTcp
  43. PagePool/WebTraf set fulltcp_ 0
  44. # Trace web request and response flows
  45. PagePool/WebTraf set req_trace_ 0
  46. PagePool/WebTraf set resp_trace_ 0
  47. # Timer for application level control of connection
  48. PagePool/WebTraf set enable_conn_timer_ 0
  49. # Default value for end-users' average waiting time
  50. PagePool/WebTraf set avg_waiting_time_ 30
  51. # options to control traffic based on flow size, 
  52. # used to evaluate SFD algorithm.
  53. # The threshold to classify short and long flows (in TCP packets, ie 15KB)
  54. PagePool/WebTraf set FLOW_SIZE_TH_ 15
  55. # Option to modify traffic mix:
  56. # 0: original settings without change
  57. # 1: Allow only short flows
  58. # 2: Chop long flows to short ones.
  59. PagePool/WebTraf set FLOW_SIZE_OPS_ 0
  60. PagePool/WebTraf instproc launch-req { id pid clnt svr ctcp csnk size pobj} {
  61.     $self instvar timer_
  62.     set launch_req 1
  63.     set flow_th [PagePool/WebTraf set FLOW_SIZE_TH_]
  64.     if {[PagePool/WebTraf set FLOW_SIZE_OPS_] == 1 && $size > $flow_th} {
  65. set launch_req 0
  66.     }
  67.     if {$launch_req == 1} {
  68. set ns [Simulator instance]
  69. # create request connection from client to server
  70. $ns attach-agent $clnt $ctcp
  71. $ns attach-agent $svr $csnk
  72. $ns connect $ctcp $csnk
  73. # sink needs to listen for fulltcp
  74. if {[PagePool/WebTraf set fulltcp_] == 1} {
  75.     $csnk listen
  76. }
  77. if {[PagePool/WebTraf set FID_ASSIGNING_MODE_] == 0} {
  78.     $ctcp set fid_ $id
  79.     if {[PagePool/WebTraf set fulltcp_] == 1} {
  80. $csnk set fid_ $id
  81.     }
  82. }
  83. set timer_ [$self get-conn-timer $ctcp $csnk $clnt $svr]
  84. # define call-back function for request TCP
  85. $ctcp proc done {} "$self done-req $id $pid $clnt $svr $ctcp $csnk $size $pobj $timer_"
  86. # Trace web traffic flows (send request: client==>server).
  87. if {[PagePool/WebTraf set req_trace_]} {
  88.     puts "req + $id $pid $size [$clnt id] [$svr id] [$ns now]"
  89. }
  90. # Send a single packet as a request
  91. $self send-message $ctcp 1
  92.     }
  93. }
  94. PagePool/WebTraf instproc done-req { id pid clnt svr ctcp csnk size pobj timer} {
  95.     # Cancel the connection timer if any
  96.     if {[PagePool/WebTraf set enable_conn_timer_]} {
  97. $timer cancel
  98. delete $timer
  99.     }
  100.     set ns [Simulator instance]
  101.     
  102.     # Recycle client-side TCP agents
  103.     $ns detach-agent $clnt $ctcp
  104.     $ns detach-agent $svr $csnk
  105.     $ctcp reset
  106.     $csnk reset
  107.     # do NOT recycle tcp & sink, reuse for response connection
  108.     # request has completed successfully, now pass the request to web server
  109.     # notify web server about the request
  110.     set delay [$self job_arrival $id $clnt $svr $ctcp $csnk $size $pobj]
  111.     #$self launch-resp $id $pid $svr $clnt $ctcp $csnk $size $pobj
  112.     # this job is actually dropped due to server's queue limit
  113.     if {$delay == 0} {
  114. # Trace web traffic flows (recv request: client==>server).
  115. # Request has been rejected by server due to its capacity
  116. if {[PagePool/WebTraf set req_trace_]} {
  117.     puts "req d $id $pid $size [$clnt id] [$svr id] [$ns now]"
  118. }
  119. # Recycle TCP agents
  120. $self recycle $ctcp $csnk
  121. # is there any difference for rejected requests?
  122. $self doneObj $pobj
  123.     } else {
  124. # Trace web traffic flows (recv request: client==>server).
  125. # Request has been received by server successfully
  126. if {[PagePool/WebTraf set req_trace_]} {
  127.     puts "req - $id $pid $size [$clnt id] [$svr id] [$ns now]"
  128. }
  129.     }
  130.     
  131. }
  132. PagePool/WebTraf instproc launch-resp { id pid svr clnt stcp ssnk size pobj} {
  133.     set flow_th [PagePool/WebTraf set FLOW_SIZE_TH_]
  134.     set ns [Simulator instance]
  135.     # create response connection from server to client
  136.     $ns attach-agent $svr $stcp
  137.     $ns attach-agent $clnt $ssnk
  138.     $ns connect $stcp $ssnk
  139.     # sink needs to listen for fulltcp
  140.     if {[PagePool/WebTraf set fulltcp_] == 1} {
  141. $ssnk listen
  142.     }
  143.     if {[PagePool/WebTraf set FID_ASSIGNING_MODE_] == 0} {
  144. $stcp set fid_ $id
  145. if {[PagePool/WebTraf set fulltcp_] == 1} {
  146.     $ssnk set fid_ $id
  147. }
  148.     }
  149.     
  150.     if {[PagePool/WebTraf set FLOW_SIZE_OPS_] == 2 && $size > $flow_th} {
  151. set sent $flow_th
  152.     } else {
  153. set sent $size
  154.     }
  155.     # define callback function for response tcp
  156.     $stcp proc done {} "$self done-resp $id $pid $clnt $svr $stcp $ssnk $size $sent $flow_th [$ns now] [$stcp set fid_] $pobj"
  157.     
  158.     # Trace web traffic flows (send responese: server->client).
  159.     if {[PagePool/WebTraf set resp_trace_]} {
  160. puts "resp + $id $pid $sent $size [$svr id] [$clnt id] [$ns now]"
  161.     }
  162.     # Send a single packet as a request
  163.     $self send-message $stcp $sent
  164. }
  165. PagePool/WebTraf instproc done-resp { id pid clnt svr stcp ssnk size sent sent_th {startTime 0} {fid 0} pobj } {
  166.     set ns [Simulator instance]
  167.     
  168.     # modified to trace web traffic flows (recv responese: server->client).
  169.     if {[PagePool/WebTraf set resp_trace_]} {
  170. puts "resp - $id $pid $sent $size [$svr id] [$clnt id] [$ns now]"
  171.     }
  172.     
  173.     if {[PagePool/WebTraf set VERBOSE_] == 1} {
  174. puts "done-resp - $id [$svr id] [$clnt id] $size $startTime [$ns now] $fid"
  175.     }
  176.     
  177.     # Reset server-side TCP agents
  178.     $stcp reset
  179.     $ssnk reset
  180.     $ns detach-agent $clnt $ssnk
  181.     $ns detach-agent $svr $stcp
  182.     # if there are some packets left, keeps on sending.
  183.     if {$sent < $size} {
  184. $ns attach-agent $svr $stcp
  185. $ns attach-agent $clnt $ssnk
  186. $ns connect $stcp $ssnk
  187. if {[PagePool/WebTraf set fulltcp_] == 1} {
  188.     $ssnk listen
  189. }
  190. if {[PagePool/WebTraf set FID_ASSIGNING_MODE_] == 0} {
  191.     $stcp set fid_ $id
  192.     if {[PagePool/WebTraf set fulltcp_] == 1} {
  193. $ssnk set fid_ $id
  194.     }
  195. }
  196. set left [expr $size - $sent]
  197. if {$left <= $sent_th} {
  198.     # modified to trace web traffic flows (send responese: server->client).
  199.     if {[PagePool/WebTraf set resp_trace_]} {
  200. puts "resp + $id $pid $left $size [$svr id] [$clnt id] [$ns now]"
  201.     }
  202.     set sent [expr $sent + $left]
  203.     $stcp proc done {} "$self done-resp $id $pid $clnt $svr $stcp $ssnk $size $sent $sent_th [$ns now] [$stcp set fid_]"
  204.     $self send-message $stcp $left
  205. } else {
  206.     # modified to trace web traffic flows (send responese: server->client).
  207.     if {[PagePool/WebTraf set resp_trace_]} {
  208. puts "resp + $id $pid $sent_th $size [$svr id] [$clnt id] [$ns now]"
  209.     }
  210.     set sent [expr $sent + $sent_th]
  211.     $stcp proc done {} "$self done-resp $id $pid $clnt $svr $stcp $ssnk $size $sent $sent_th [$ns now] [$stcp set fid_]"
  212.     $self send-message $stcp $sent_th
  213. }
  214.     } else {
  215. # Recycle TCP agents
  216. $self recycle $stcp $ssnk
  217. $self doneObj $pobj
  218.     }
  219. }
  220. # XXX Should allow customizable TCP types. Can be easily done via a 
  221. # class variable
  222. PagePool/WebTraf instproc alloc-tcp {} {
  223.     set tcp [new Agent/TCP/[PagePool/WebTraf set TCPTYPE_]]
  224.     
  225.     set fidMode [PagePool/WebTraf set FID_ASSIGNING_MODE_]
  226.     if {$fidMode == 1} {
  227. $self instvar maxFid_
  228. $tcp set fid_ $maxFid_
  229. incr maxFid_
  230.     } elseif  {$fidMode == 2} {
  231. $self instvar sameFid_
  232. $tcp set fid_ $sameFid_
  233.     }
  234.     
  235.     return $tcp
  236. }
  237. PagePool/WebTraf instproc alloc-tcp-sink {} {
  238.     return [new Agent/[PagePool/WebTraf set TCPSINKTYPE_]]
  239. }
  240. PagePool/WebTraf instproc send-message {tcp num_packet} {
  241.     #puts "send message: [[Simulator instance] now], $num_packet"
  242.     if {[PagePool/WebTraf set fulltcp_] == 1} {
  243. # for fulltcp: need to use flag
  244. $tcp sendmsg [expr $num_packet * 1000] "MSG_EOF"
  245.     } else {
  246. #Advance $num_packet packets: for one-way tcp
  247. $tcp advanceby $num_packet
  248.     }
  249. }
  250. # Debo
  251. #PagePool/WebTraf instproc create-session { args } {
  252. #
  253. #    set ns [Simulator instance]
  254. #    set asimflag [$ns set useasim_]
  255. #    #puts "Here"
  256. #    $self use-asim
  257. #    $self cmd create-session $args
  258. #
  259. #} 
  260. PagePool/WebTraf instproc  add2asim { srcid dstid lambda mu } {
  261.     set sf_ [[Simulator instance] set sflows_]
  262.     set nsf_ [[Simulator instance] set nsflows_]
  263.     
  264.     lappend sf_ $srcid:$dstid:$lambda:$mu
  265.     incr nsf_
  266.     [Simulator instance] set sflows_ $sf_
  267.     [Simulator instance] set nsflows_ $nsf_
  268.     #puts "setup short flow .. now sflows_ = $sf_"
  269. }
  270. # Set a timer for connection duration
  271. PagePool/WebTraf instproc get-conn-timer { tcp snk clnt svr } {
  272.     if {[PagePool/WebTraf set enable_conn_timer_]} {
  273. set timer_ [new ConnTimer $self [PagePool/WebTraf set avg_waiting_time_]]
  274. $timer_ sched $tcp $snk $clnt $svr
  275.     } else {
  276. set timer_ 0
  277.     }
  278.     return $timer_
  279. }
  280. # Timer for Application level retransmission
  281. Class ConnTimer -superclass Timer
  282. ConnTimer instproc init {webtraf delay} {
  283.      $self instvar webtraf_ avg_delay_
  284.      $self set webtraf_ $webtraf
  285.      $self set avg_delay_ $delay
  286.  
  287.      $self next [Simulator instance]
  288.  }
  289.  
  290.  ConnTimer instproc sched {tcp snk n1 n2} {
  291.      $self instvar tcp_ snk_ n1_ n2_ avg_delay_
  292.  
  293.      $self set tcp_ $tcp
  294.      $self set snk_ $snk
  295.      $self set n1_ $n1
  296.      $self set n2_ $n2
  297.  
  298.      set waiting_time [new RandomVariable/Exponential]
  299.      $waiting_time set avg_ $avg_delay_
  300.      set delay [$waiting_time value]
  301.      puts "delay: $delay"
  302.      delete $waiting_time
  303.      $self next $delay
  304.  }
  305.  
  306.  ConnTimer instproc timeout {} {
  307.      $self instvar webtraf_
  308.      $self instvar n1_ n2_ tcp_ snk_
  309.      #puts "timeout!!"
  310.      set v [new RandomVariable/Uniform]
  311.      set p [$v value]
  312.      #puts "p: $p"
  313.      delete $v
  314.      if {$p > 0.5} {
  315.  # continue to wait
  316.  $self sched $tcp_ $snk_ $n1_ $n2_
  317.      } else {
  318.  # terminate request
  319.  set ns [Simulator instance] 
  320.  
  321.  $ns detach-agent $n1_ $tcp_
  322.  $ns detach-agent $n2_ $snk_
  323.  $tcp_ reset
  324.  $snk_ reset
  325.  $webtraf_ recycle $tcp_ $snk_
  326.  
  327.  delete $self
  328.      }
  329.  }