⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webtraf.tcl

📁 跑leach需要的
💻 TCL
字号:
# Copyright (C) 1999 by USC/ISI# All rights reserved.                                            #                                                                # Redistribution and use in source and binary forms are permitted# provided that the above copyright notice and this paragraph are# duplicated in all such forms and that any documentation, advertising# materials, and other materials related to such distribution and use# acknowledge that the software was developed by the University of# Southern California, Information Sciences Institute.  The name of the# University may not be used to endorse or promote products derived from# this software without specific prior written permission.# # THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.# # Re-tooled version of Polly's web traffic models (tcl/ex/web-traffic.tcl, # tcl/ex/large-scale-traffic.tcl) in order to save memory.## The main strategy is to move everything into C++, only leave an OTcl # configuration interface. Be very careful as what is configuration and # what is functionality.## $Header: /nfs/jade/vint/CVSROOT/ns-2/tcl/webcache/webtraf.tcl,v 1.20 2003/08/01 21:56:45 xuanc Exp $PagePool/WebTraf set debug_ falsePagePool/WebTraf set TCPTYPE_ RenoPagePool/WebTraf set TCPSINKTYPE_ TCPSink   ;#required for SACK1 Sinks.#0 for default, fid=id#1 for increasing along with new agent allocation (as in red-pd). #   useful when used with flow monitors (as they tend to run out of space in hash tables)#   (see red-pd scripts for usage of this)#2 for assigning the same fid to all connections.#    useful when want to differentiate between various web traffic generators using flow monitors.#   (see pushback scripts for usage of this).PagePool/WebTraf set FID_ASSIGNING_MODE_ 0 PagePool/WebTraf set VERBOSE_ 0# Support the reuse of page level attributes to save#  memory for large simulationsPagePool/WebTraf set recycle_page_ 1# To use fullTCP (xuanc), we need to:# 1. set the flag fulltcp_ to 1# 2. set TCPTYPE_ FullTcpPagePool/WebTraf set fulltcp_ 0# Trace web request and response flowsPagePool/WebTraf set req_trace_ 0PagePool/WebTraf set resp_trace_ 0# Timer for application level control of connectionPagePool/WebTraf set enable_conn_timer_ 0# Default value for end-users' average waiting timePagePool/WebTraf set avg_waiting_time_ 30# options to control traffic based on flow size, # used to evaluate SFD algorithm.# The threshold to classify short and long flows (in TCP packets, ie 15KB)PagePool/WebTraf set FLOW_SIZE_TH_ 15# Option to modify traffic mix:# 0: original settings without change# 1: Allow only short flows# 2: Chop long flows to short ones.PagePool/WebTraf set FLOW_SIZE_OPS_ 0PagePool/WebTraf instproc launch-req { id pid clnt svr ctcp csnk size pobj} {    $self instvar timer_    set launch_req 1    set flow_th [PagePool/WebTraf set FLOW_SIZE_TH_]    if {[PagePool/WebTraf set FLOW_SIZE_OPS_] == 1 && $size > $flow_th} {	set launch_req 0    }    if {$launch_req == 1} {	set ns [Simulator instance]		# create request connection from client to server	$ns attach-agent $clnt $ctcp	$ns attach-agent $svr $csnk	$ns connect $ctcp $csnk		# sink needs to listen for fulltcp	if {[PagePool/WebTraf set fulltcp_] == 1} {	    $csnk listen	}	if {[PagePool/WebTraf set FID_ASSIGNING_MODE_] == 0} {	    $ctcp set fid_ $id	    if {[PagePool/WebTraf set fulltcp_] == 1} {		$csnk set fid_ $id	    }	}	set timer_ [$self get-conn-timer $ctcp $csnk $clnt $svr]			# define call-back function for request TCP	$ctcp proc done {} "$self done-req $id $pid $clnt $svr $ctcp $csnk $size $pobj $timer_"		# Trace web traffic flows (send request: client==>server).	if {[PagePool/WebTraf set req_trace_]} {		    puts "req + $id $pid $size [$clnt id] [$svr id] [$ns now]"	}			# Send a single packet as a request	$self send-message $ctcp 1    }}PagePool/WebTraf instproc done-req { id pid clnt svr ctcp csnk size pobj timer} {    # Cancel the connection timer if any    if {[PagePool/WebTraf set enable_conn_timer_]} {	$timer cancel	delete $timer    }    set ns [Simulator instance]        # Recycle client-side TCP agents    $ns detach-agent $clnt $ctcp    $ns detach-agent $svr $csnk    $ctcp reset    $csnk reset    # do NOT recycle tcp & sink, reuse for response connection    # request has completed successfully, now pass the request to web server    # notify web server about the request    set delay [$self job_arrival $id $clnt $svr $ctcp $csnk $size $pobj]    #$self launch-resp $id $pid $svr $clnt $ctcp $csnk $size $pobj    # this job is actually dropped due to server's queue limit    if {$delay == 0} {	# Trace web traffic flows (recv request: client==>server).	# Request has been rejected by server due to its capacity	if {[PagePool/WebTraf set req_trace_]} {		    puts "req d $id $pid $size [$clnt id] [$svr id] [$ns now]"	}	# Recycle TCP agents	$self recycle $ctcp $csnk		# is there any difference for rejected requests?	$self doneObj $pobj    } else {	# Trace web traffic flows (recv request: client==>server).	# Request has been received by server successfully	if {[PagePool/WebTraf set req_trace_]} {		    puts "req - $id $pid $size [$clnt id] [$svr id] [$ns now]"	}    }    }PagePool/WebTraf instproc launch-resp { id pid svr clnt stcp ssnk size pobj} {    set flow_th [PagePool/WebTraf set FLOW_SIZE_TH_]    set ns [Simulator instance]    # create response connection from server to client    $ns attach-agent $svr $stcp    $ns attach-agent $clnt $ssnk    $ns connect $stcp $ssnk	    # sink needs to listen for fulltcp    if {[PagePool/WebTraf set fulltcp_] == 1} {	$ssnk listen    }    if {[PagePool/WebTraf set FID_ASSIGNING_MODE_] == 0} {	$stcp set fid_ $id		if {[PagePool/WebTraf set fulltcp_] == 1} {	    $ssnk set fid_ $id	}    }        if {[PagePool/WebTraf set FLOW_SIZE_OPS_] == 2 && $size > $flow_th} {	set sent $flow_th    } else {	set sent $size    }    # define callback function for response tcp    $stcp proc done {} "$self done-resp $id $pid $clnt $svr $stcp $ssnk $size $sent $flow_th [$ns now] [$stcp set fid_] $pobj"        # Trace web traffic flows (send responese: server->client).    if {[PagePool/WebTraf set resp_trace_]} {	puts "resp + $id $pid $sent $size [$svr id] [$clnt id] [$ns now]"    }    # Send a single packet as a request    $self send-message $stcp $sent}PagePool/WebTraf instproc done-resp { id pid clnt svr stcp ssnk size sent sent_th {startTime 0} {fid 0} pobj } {    set ns [Simulator instance]        # modified to trace web traffic flows (recv responese: server->client).    if {[PagePool/WebTraf set resp_trace_]} {	puts "resp - $id $pid $sent $size [$svr id] [$clnt id] [$ns now]"    }        if {[PagePool/WebTraf set VERBOSE_] == 1} {	puts "done-resp - $id [$svr id] [$clnt id] $size $startTime [$ns now] $fid"    }        # Reset server-side TCP agents    $stcp reset    $ssnk reset    $ns detach-agent $clnt $ssnk    $ns detach-agent $svr $stcp    # if there are some packets left, keeps on sending.    if {$sent < $size} {	$ns attach-agent $svr $stcp	$ns attach-agent $clnt $ssnk	$ns connect $stcp $ssnk	if {[PagePool/WebTraf set fulltcp_] == 1} {	    $ssnk listen	}	if {[PagePool/WebTraf set FID_ASSIGNING_MODE_] == 0} {	    $stcp set fid_ $id	    if {[PagePool/WebTraf set fulltcp_] == 1} {		$ssnk set fid_ $id	    }	}	set left [expr $size - $sent]	if {$left <= $sent_th} {	    # modified to trace web traffic flows (send responese: server->client).	    if {[PagePool/WebTraf set resp_trace_]} {		puts "resp + $id $pid $left $size [$svr id] [$clnt id] [$ns now]"	    }	    set sent [expr $sent + $left]	    $stcp proc done {} "$self done-resp $id $pid $clnt $svr $stcp $ssnk $size $sent $sent_th [$ns now] [$stcp set fid_]"	    $self send-message $stcp $left	} else {	    # modified to trace web traffic flows (send responese: server->client).	    if {[PagePool/WebTraf set resp_trace_]} {		puts "resp + $id $pid $sent_th $size [$svr id] [$clnt id] [$ns now]"	    }	    set sent [expr $sent + $sent_th]	    $stcp proc done {} "$self done-resp $id $pid $clnt $svr $stcp $ssnk $size $sent $sent_th [$ns now] [$stcp set fid_]"	    $self send-message $stcp $sent_th	}    } else {	# Recycle TCP agents	$self recycle $stcp $ssnk		$self doneObj $pobj    }}# XXX Should allow customizable TCP types. Can be easily done via a # class variablePagePool/WebTraf instproc alloc-tcp {} {    set tcp [new Agent/TCP/[PagePool/WebTraf set TCPTYPE_]]        set fidMode [PagePool/WebTraf set FID_ASSIGNING_MODE_]    if {$fidMode == 1} {	$self instvar maxFid_	$tcp set fid_ $maxFid_	incr maxFid_    } elseif  {$fidMode == 2} {	$self instvar sameFid_	$tcp set fid_ $sameFid_    }        return $tcp}PagePool/WebTraf instproc alloc-tcp-sink {} {    return [new Agent/[PagePool/WebTraf set TCPSINKTYPE_]]}PagePool/WebTraf instproc send-message {tcp num_packet} {    #puts "send message: [[Simulator instance] now], $num_packet"    if {[PagePool/WebTraf set fulltcp_] == 1} {	# for fulltcp: need to use flag	$tcp sendmsg [expr $num_packet * 1000] "MSG_EOF"    } else {	#Advance $num_packet packets: for one-way tcp	$tcp advanceby $num_packet    }}# Debo#PagePool/WebTraf instproc create-session { args } {##    set ns [Simulator instance]#    set asimflag [$ns set useasim_]#    #puts "Here"#    $self use-asim#    $self cmd create-session $args##} PagePool/WebTraf instproc  add2asim { srcid dstid lambda mu } {    set sf_ [[Simulator instance] set sflows_]    set nsf_ [[Simulator instance] set nsflows_]        lappend sf_ $srcid:$dstid:$lambda:$mu    incr nsf_    [Simulator instance] set sflows_ $sf_    [Simulator instance] set nsflows_ $nsf_    #puts "setup short flow .. now sflows_ = $sf_"}# Set a timer for connection durationPagePool/WebTraf instproc get-conn-timer { tcp snk clnt svr } {    if {[PagePool/WebTraf set enable_conn_timer_]} {	set timer_ [new ConnTimer $self [PagePool/WebTraf set avg_waiting_time_]]	$timer_ sched $tcp $snk $clnt $svr    } else {	set timer_ 0    }    return $timer_}# Timer for Application level retransmissionClass ConnTimer -superclass TimerConnTimer instproc init {webtraf delay} {     $self instvar webtraf_ avg_delay_     $self set webtraf_ $webtraf     $self set avg_delay_ $delay      $self next [Simulator instance] }  ConnTimer instproc sched {tcp snk n1 n2} {     $self instvar tcp_ snk_ n1_ n2_ avg_delay_      $self set tcp_ $tcp     $self set snk_ $snk     $self set n1_ $n1     $self set n2_ $n2      set waiting_time [new RandomVariable/Exponential]     $waiting_time set avg_ $avg_delay_     set delay [$waiting_time value]     puts "delay: $delay"     delete $waiting_time     $self next $delay }  ConnTimer instproc timeout {} {     $self instvar webtraf_     $self instvar n1_ n2_ tcp_ snk_     #puts "timeout!!"     set v [new RandomVariable/Uniform]     set p [$v value]     #puts "p: $p"     delete $v     if {$p > 0.5} {	 # continue to wait	 $self sched $tcp_ $snk_ $n1_ $n2_     } else {	 # terminate request	 set ns [Simulator instance] 	 	 $ns detach-agent $n1_ $tcp_	 $ns detach-agent $n2_ $snk_	 $tcp_ reset	 $snk_ reset	 $webtraf_ recycle $tcp_ $snk_	 	 delete $self     } }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -