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

通讯编程

开发平台:

Visual C++

  1. # Part of the work for the summer intern at AT&T Labs-Research
  2. # Code contributed by Polly Huang, http://www-scf.usc.edu/~bhuang
  3. # phuang@research.att.com, huang@isi.edu
  4. # Ported from UCB Empirical HTTP code, http.tcl
  5. #puts "WARNING: Obsoleted by PagePool/WebTraf."
  6. #puts "See ~ns/tcl/webcache/webtraf.{h,cc} and web-traffic.tcl in tcl/ex"
  7. ##################### Class: HttpSession #######################
  8. Agent/CBR set maxpkts_ 0
  9. Class HttpSession
  10. HttpSession set sessionId_ 1
  11. HttpSession instproc init { ns numPage sessionSrc } {
  12.     $self instvar httpPages_ numPage_ interPage_ pageSize_  donePage_
  13.     $self instvar ns_ sessionId_ sessionSrc_
  14.     $self instvar tcpType_ tcpSinkType_
  15.     set ns_ $ns
  16.     set numPage_ $numPage
  17.     set donePage_ 0
  18.     set sessionId_ [HttpSession set sessionId_]
  19.     HttpSession set sessionId_ [expr $sessionId_ + 1]
  20.     set sessionSrc_ $sessionSrc
  21.     set tcpType_ TCP/Reno
  22.     set tcpSinkType_ TCPSink
  23.     # default interPage_ interval to 1 second/page
  24.     if ![info exist interPage_] {
  25. set interPage_ [new RandomVariable/Constant]
  26. $interPage_ set val_ 1
  27.     }
  28.     # default pageSize_ to 2 objects/page
  29.     if ![info exist pageSize_] {
  30. set pageSize_ [new RandomVariable/Constant]
  31. $pageSize_ set val_ 2
  32.     }
  33. }
  34. HttpSession instproc disable-reliability {} {
  35.     $self instvar disable_reliability_
  36.     set disable_reliability_ 1
  37. }
  38. HttpSession instproc disable-flow-control windowInit {
  39.     $self instvar disable_flow_control_ windowInit_    
  40.     set disable_flow_control_ 1
  41.     set windowInit_ $windowInit
  42. }
  43. HttpSession instproc createPage {} {
  44.     $self instvar httpPages_ numPage_ pageSize_ 
  45.     $self instvar ns_ sessionId_ sessionSrc_
  46.     $self instvar tcpType_ tcpSinkType_
  47.     $self instvar disable_reliability_ disable_flow_control_ windowInit_
  48.     for {set i 0} {$i < $numPage_} {incr i} {
  49. set httpPages_($i) [new HttpPage $ns_ $sessionId_]
  50. $httpPages_($i) set numObject_ [$pageSize_ value]
  51. $httpPages_($i) set pageSrc_ $sessionSrc_
  52. $httpPages_($i) set sessionManager_ $self
  53. # puts "HttpSession::createPage:$tcpType_ $tcpSinkType_"
  54. $httpPages_($i) set tcpType_ $tcpType_
  55. $httpPages_($i) set tcpSinkType_ $tcpSinkType_
  56. if {[info exist disable_reliability_] && $disable_reliability_} {
  57.     $httpPages_($i) set disable_reliability_ 1
  58.     # puts "HttpSession::createPage: disable_reliability_ $disable_reliability_"
  59. }
  60. if {[info exist disable_flow_control_] && $disable_flow_control_} {
  61.     $httpPages_($i) set disable_flow_control_ 1
  62.     $httpPages_($i) set windowInit_ $windowInit_
  63.     # puts "HttpSession::createPage: disable_flow_control_ $disable_flow_control_ windowInit_ $windowInit_"
  64. }
  65.     }
  66. }
  67. HttpSession instproc start {} {
  68.     $self instvar httpPages_ numPage_ interPage_ 
  69.     $self instvar ns_ 
  70.     set launchTime [$ns_ now]
  71.     for {set i 0} {$i < $numPage_} {incr i} {
  72. $ns_ at $launchTime "$httpPages_($i) start"
  73. set launchTime [expr $launchTime + [$interPage_ value]]
  74.     }
  75. }
  76. HttpSession instproc setDistribution { var distribution args } {
  77.     $self instvar httpPages_
  78.     ## Create random model object
  79.     set model [new RandomVariable/$distribution]
  80.     switch $distribution {
  81. Constant {$model set val_ [lindex $args 0]}
  82. Uniform  {
  83.     $model set max_ [lindex $args 0] 
  84.     $model set min_ [lindex $args 1]
  85. }
  86. Exponential {$model set avg_ [lindex $args 0]}
  87. Pareto  {
  88.     $model set avg_ [lindex $args 0] 
  89.     $model set shape_ [lindex $args 1]
  90. }
  91. ParetoII  {
  92.     $model set avg_ [lindex $args 0] 
  93.     $model set shape_ [lindex $args 1]
  94. }
  95. TraceDriven  {$model set filename_ [lindex $args 0]}
  96.     }
  97.     ## Assign variables with the random model
  98.     switch $var {
  99. interPage_ {$self set $var $model}
  100. pageSize_  {$self set $var $model}
  101. interObject_ {
  102.     foreach index [array name httpPages_] {
  103. $httpPages_($index) set $var $model
  104. $self set interObject_ $model
  105.     }
  106. }
  107. objectSize_  {
  108.     foreach index [array name httpPages_] {
  109. $httpPages_($index) set $var $model
  110. $self set objectSize_ $model
  111.     }
  112. }
  113.     }
  114. }
  115. HttpSession instproc doneOnePage {} {
  116.     $self instvar interPage_ pageSize_ numPage_ donePage_ 
  117.     $self instvar interObject_ objectSize_
  118.     incr donePage_
  119.     # puts "doneOnePage: $numPage_ $donePage_"
  120.     if {$donePage_ == $numPage_} {    
  121. delete $interPage_ 
  122. delete $pageSize_
  123. if {[info exist interObject_]} {
  124.     delete $interObject_
  125. }
  126. if {[info exist objectSize_]} {
  127.     delete $objectSize_
  128. }
  129. delete $self
  130.     }
  131. }
  132. ##################### Class: HttpPage ###########################
  133. Class HttpPage
  134. HttpPage set pageId_ 1
  135. HttpPage instproc init { ns sessionId } {
  136.     $self instvar httpObjects_ numObject_ interObject_ objectSize_ 
  137.     $self instvar ns_ sessionId_ pageId_ curObject_ doneObject_
  138.     $self instvar tcpType_ tcpSinkType_
  139.     set ns_ $ns
  140.     set sessionId_ $sessionId
  141.     set pageId_ [HttpPage set pageId_]
  142.     HttpPage set pageId_ [expr $pageId_ + 1]
  143.     set tcpType_ TCP/Reno
  144.     set tcpSinkType_ TCPSink
  145.     # default numObject_ to 1 object/session
  146.     set numObject_ 1
  147.     set curObject_ 0
  148.     set doneObject_ 0
  149.     # default interObject_ interval to 1 second/object
  150.     if ![info exist interObject_] {
  151. set interObject_ [new RandomVariable/Constant]
  152. $interObject_ set val_ 0.5
  153.     }
  154.     # default objectSize_ to 5 packets/object
  155.     if ![info exist objectSize_] {
  156. set objectSize_ [new RandomVariable/Constant]
  157. $objectSize_ set val_ 5
  158.     }
  159. }
  160. HttpPage instproc start {} {
  161.     $self instvar httpObjects_ numObject_ interObject_ objectSize_ 
  162.     $self instvar ns_ pageSrc_ sessionManager_ pageId_ sessionId_
  163.     $self instvar curObject_ tcpType_ tcpSinkType_
  164.     $self instvar disable_reliability_ disable_flow_control_ windowInit_
  165.     if {$curObject_ < $numObject_} {
  166. set httpObjects_($curObject_) [new HttpObject $ns_ $pageSrc_ [$ns_ pickdst] $pageId_ $sessionId_ $tcpType_ $tcpSinkType_]
  167. $httpObjects_($curObject_) set numPacket_ [$objectSize_ value]
  168. $httpObjects_($curObject_) set pageManager_ $self
  169. $httpObjects_($curObject_) set sessionManager_ $sessionManager_
  170. if {[info exist disable_reliability_] && $disable_reliability_} {
  171.     $httpObjects_($curObject_) set disable_reliability_ 1
  172.     # puts "HttpPage::start: disable_reliability $disable_reliability_"
  173. }
  174. if {[info exist disable_flow_control_] && $disable_flow_control_} {
  175.     $httpObjects_($curObject_) set disable_flow_control_ 1
  176.     $httpObjects_($curObject_) set windowInit_ $windowInit_
  177.     # puts "HttpPage::start: disable_flow_control_ $disable_flow_control_ windowInit_ $windowInit_"
  178. }
  179. $httpObjects_($curObject_) start
  180. incr curObject_
  181. $ns_ at [expr [$ns_ now] + [$interObject_ value]] "$self start"
  182.     }
  183. }
  184. HttpPage instproc doneOneObject {} {
  185.     $self instvar interObject_ objectSize_ doneObject_ numObject_
  186.     $self instvar sessionManager_
  187.     incr doneObject_
  188.     # puts "doneOneObject: $numObject_ $doneObject_"
  189.     if {$doneObject_ == $numObject_} {
  190. #delete $interObject_
  191. #delete $objectSize_
  192. $sessionManager_ doneOnePage
  193. delete $self
  194.     }
  195. }
  196. ##################### Class: HttpObject ##############################
  197. Class HttpObject -superclass InitObject
  198. HttpObject set objectId_ 1
  199. HttpObject instproc init { ns src dst pageId sessionId tcpType tcpSinkType} {
  200.     $self instvar numPacket_ ns_ tcpType_ tcpSinkType_
  201.     $self instvar clientSrc_ serverSrc_  clientSink_ serverSink_
  202.     $self instvar clientNode_ serverNode_ clientTCP_ serverTCP_
  203.     $self instvar sessionManager_ objectSrc_ objectId_ pageId_ sessionId_
  204.     $self instvar clientSinkRcvPktCount_
  205.     set ns_ $ns
  206.     set pageId_ $pageId
  207.     set sessionId_ $sessionId
  208.     set objectId_ [HttpObject set objectId_]
  209.     HttpObject set objectId_ [expr $objectId_ + 1]
  210.     # default numObject_ to 1 object/session
  211.     set numPacket_ 1
  212.     set tcpType_ $tcpType
  213.     set tcpSinkType_ $tcpSinkType
  214.     set clientNode_ $src
  215.     set serverNode_ $dst
  216. #    $clientNode_ set idleTCP_ ""
  217. #    $clientNode_ set idleTCPSink_ ""
  218. #    $serverNode_ set idleTCP_ ""
  219. #    $serverNode_ set idleTCPSink_ ""
  220.     set clientSinkRcvPktCount_ 0
  221.     # setup TCP connection
  222.     set clientTCP_ [$clientNode_ pickTCP TCP/Reno]
  223.     # puts "clientTCP $clientTCP_"
  224.     # trace client TCP info
  225.     $ns instvar clientchan_
  226.     if [info exist clientchan_] {
  227. $clientTCP_ set trace_all_oneline_ true
  228. $clientTCP_ trace cwnd_
  229. $clientTCP_ attach [$ns set clientchan_]
  230.     }
  231.     set serverTCP_ [$serverNode_ pickTCP $tcpType_]
  232.     # puts "serverTCP $serverTCP_"
  233.     # trace server TCP info
  234.     $ns instvar serverchan_
  235.     if [info exist serverchan_] {
  236. $serverTCP_ set trace_all_oneline_ true
  237. $serverTCP_ trace cwnd_
  238. $serverTCP_ attach [$ns set serverchan_]
  239.     }
  240.     $clientTCP_ set fid_ $objectId_
  241.     $serverTCP_ set fid_ $objectId_
  242.     set clientSink_ [$serverNode_ pickTCPSink TCPSink]
  243.     set serverSink_ [$clientNode_ pickTCPSink $tcpSinkType_]
  244.     set clientSrc_ [$self newXfer FTP $clientNode_ $serverNode_ $clientTCP_ $clientSink_]
  245.     set serverSrc_ [$self newXfer FTP $serverNode_ $clientNode_ $serverTCP_ $serverSink_]
  246.     $clientTCP_ proc done {} "$self doneRequest"
  247.     $serverTCP_ proc done {} "$self doneReply"
  248. }
  249. HttpObject instproc start {} {
  250.     $self instvar numPacket_ ns_ pageManager_ sessionManager_
  251.     $self instvar clientNode_ clientTCP_ clientSrc_ serverTCP_
  252.     $self instvar objectId_ pageId_ sessionId_
  253.     $self instvar clientSink_ serverSink_
  254.     $self instvar disable_reliability_ disable_flow_control_ windowInit_
  255.     # puts "$numPacket_ t $objectId_ t $pageId_ t $sessionId_ t [$ns_ now]"
  256.     if {[info exist disable_reliability_] && $disable_reliability_} {
  257. $clientTCP_ disable-reliability
  258. $clientSink_ disable-reliability 
  259. $serverTCP_ disable-reliability
  260. $serverSink_ disable-reliability 
  261.     }
  262.     if {[info exist disable_flow_control_] && $disable_flow_control_} {
  263. $clientTCP_ disable-flow-control
  264. $serverTCP_ disable-flow-control
  265. $clientTCP_ set windowInit_ $windowInit_
  266. $serverTCP_ set windowInit_ $windowInit_
  267.     }
  268.     $clientSrc_ producemore 1
  269. }
  270. HttpObject instproc newXfer {type src dst sa da} {
  271. $self instvar ns_
  272. $ns_ attach-agent $src $sa
  273. $ns_ attach-agent $dst $da
  274. $ns_ connect $sa $da
  275.         set app [new Application/$type]
  276.         $app attach-agent $sa
  277. return $app
  278. }
  279. HttpObject instproc doneRequest {} {
  280.     $self instvar numPacket_ ns_
  281.     $self instvar clientSrc_ serverSrc_  clientSink_ serverSink_
  282.     $self instvar clientNode_ serverNode_ clientTCP_ serverTCP_
  283.     # puts "doneRequest: server([$serverNode_ id]) replyin obj size($numPacket_) [$ns_ now]"
  284.     $clientNode_ instvar idleTCP_
  285.     $serverNode_ instvar idleTCPSink_
  286.     if {![info exists idleTCP_] || [lsearch $idleTCP_ $clientTCP_] < 0} {
  287. lappend idleTCP_ $clientTCP_
  288. # puts "[$clientNode_ id] TCP doneRequest: append $clientTCP_ => $idleTCP_"
  289.     } else {
  290. puts "[$clientNode_ id] doneRequest: using idle TCP $clientTCP_, $idleTCP_"
  291. exit
  292.     }
  293.     if {![info exists idleTCPSink_] || [lsearch $idleTCPSink_ $clientSink_] < 0} {
  294. lappend idleTCPSink_ $clientSink_
  295. # puts "[$serverNode_ id] TCPSInk doneRequest: append $clientSink_ => $idleTCPSink_"
  296.     } else {
  297. puts "[$serverNode_ id] doneRequest: using idle TCP Sink $clientSink_, $idleTCPSink_"
  298. exit
  299.     }
  300.     # puts "$serverSrc_ [expr int(ceil($numPacket_))]"
  301.     $serverSrc_ producemore [expr int(ceil($numPacket_))]
  302. }
  303. HttpObject instproc doneReply {} {
  304.     $self instvar numPacket_ ns_
  305.     $self instvar clientSrc_ serverSrc_  clientSink_ serverSink_
  306.     $self instvar clientNode_ serverNode_ clientTCP_ serverTCP_ objectId_
  307.     $self instvar pageManager_
  308.     # puts "$objectId_ doneReply: server([$serverNode_ id]) client([$clientNode_ id]) replied obj size($numPacket_) [$ns_ now]"
  309.     $serverNode_ instvar idleTCP_
  310.     $clientNode_ instvar idleTCPSink_
  311.     if {![info exists idleTCP_] || [lsearch $idleTCP_ $serverTCP_] < 0} {
  312. lappend idleTCP_ $serverTCP_
  313. # puts "[$serverNode_ id] TCP doneReply: append $serverTCP_ => $idleTCP_"
  314.     } else {
  315. puts "[$serverNode_ id] doneReply: using idle TCP $serverTCP_, $idleTCP_"
  316. exit
  317.     }
  318.     if {![info exists idleTCPSink_] || [lsearch $idleTCPSink_ $serverSink_] < 0} {
  319. lappend idleTCPSink_ $serverSink_
  320. # puts "[$clientNode_ id] TCPSink doneReply: append $serverSink_ => $idleTCPSink_"
  321.     } else {
  322. puts "[$clientNode_ id] doneReply: using idle TCP Sink $serverSink_, $idleTCPSink_"
  323. exit
  324.     }
  325.     $pageManager_ doneOneObject
  326.     delete $self
  327. }
  328. #####################################################################
  329. Node instproc pickTCP { type } {
  330.     $self instvar idleTCP_
  331.     if [info exist idleTCP_] {
  332. set i 0
  333. foreach TCP $idleTCP_ {
  334.     if {[$TCP info class] == "Agent/$type"} {
  335. set idleTCP_ [lreplace $idleTCP_ $i $i]
  336. # puts "[$self id] TCP pick(found): $TCP, $idleTCP_"
  337. $TCP reset
  338. return $TCP
  339.     }
  340.     incr i
  341. }
  342.     }
  343.     set TCP [new Agent/$type] 
  344.     if [info exist idleTCP_] {
  345. # puts "[$self id] TCP pick(new): $TCP , $idleTCP_"
  346.     } else {
  347. # puts "[$self id] TCP pick(new): $TCP"
  348.     }
  349.     return $TCP
  350. }
  351. Node instproc pickTCPSink { type } {
  352.     $self instvar idleTCPSink_
  353.     if [info exist idleTCPSink_] {
  354. set i 0
  355. foreach Sink $idleTCPSink_ {
  356.     if {[$Sink info class] == "Agent/$type"} {
  357. set idleTCPSink_ [lreplace $idleTCPSink_ $i $i]
  358. # puts "[$self id] TCPSink pick(found): $Sink, $idleTCPSink_"
  359. $Sink reset
  360. return $Sink
  361.     }
  362.     incr i
  363. }
  364.     }
  365.     set Sink [new Agent/$type]
  366.     if [info exist idleTCPSink_] {
  367. # puts "[$self id] TCPSink pick(new): $Sink, $idleTCPSink_"
  368.     } else {
  369. # puts "[$self id] TCPSink pick(new): $Sink"
  370.     }
  371.     return $Sink
  372. }
  373. #####################################################################
  374. Simulator instproc picksrc {} {
  375.     $self instvar Node_ src_
  376.     global defaultRNG
  377.     if {![info exist src_] || [llength $src_] == 0} {
  378. set tmp [$defaultRNG integer [Node set nn_]]
  379. return $Node_($tmp)
  380.     } else {
  381. set round [llength $src_]
  382. set tmp [$defaultRNG integer $round]
  383. return $Node_([lindex $src_ $tmp])
  384.     }
  385. }
  386. Simulator instproc roundrobinsrc {} {
  387.     $self instvar Node_ src_ roundrobin_
  388.     global defaultRNG
  389.     if {![info exist src_] || [llength $src_] == 0} {
  390. set round [Node set nn_]
  391.     } else {
  392. set round [llength $src_]
  393.     }
  394.     if ![info exist roundrobin_] {
  395. set roundrobin_ [$defaultRNG integer $round]
  396.     }
  397.     set roundrobin_ [expr [expr $roundrobin_ + 1] % $round]
  398.     if {![info exist src_] || [llength $src_] == 0} {
  399. return $Node_($roundrobin_)
  400.     } else {
  401. # puts "roundrobin: $roundrobin_"
  402. return $Node_([lindex $src_ $roundrobin_])
  403.     }
  404. }
  405. Simulator instproc pickdst {} {
  406.     $self instvar Node_ dst_
  407.     global defaultRNG
  408.     if {![info exist dst_] || [llength $dst_] == 0} {
  409. set round 0
  410. foreach index [array names Node_] {
  411.     incr round
  412. }
  413. set tmp [$defaultRNG integer $round]
  414. # puts "$round $tmp"
  415. return $Node_($tmp)
  416.     } else {
  417. set round [llength $dst_]
  418. set tmp [$defaultRNG integer $round]
  419. # puts "$round $tmp"
  420. return $Node_([lindex $dst_ $tmp])
  421.     }
  422. }