http-agent.tcl

来自「一款用来进行网络模拟的软件」· TCL 代码 · 共 733 行 · 第 1/2 页

TCL
733
字号
# Copyright (c) Xerox Corporation 1998. All rights reserved.## This program is free software; you can redistribute it and/or modify it# under the terms of the GNU General Public License as published by the# Free Software Foundation; either version 2 of the License, or (at your# option) any later version.# # This program is distributed in the hope that it will be useful, but# WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU# General Public License for more details.# # You should have received a copy of the GNU General Public License along# with this program; if not, write to the Free Software Foundation, Inc.,# 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA# # Linking this file statically or dynamically with other modules is making# a combined work based on this file.  Thus, the terms and conditions of# the GNU General Public License cover the whole combination.# # In addition, as a special exception, the copyright holders of this file# give you permission to combine this file with free software programs or# libraries that are released under the GNU LGPL and with code included in# the standard release of ns-2 under the Apache 2.0 license or under# otherwise-compatible licenses with advertising requirements (or modified# versions of such code, with unchanged license).  You may copy and# distribute such a system following the terms of the GNU GPL for this# file and the licenses of the other code concerned, provided that you# include the source code of that other code when and as the GNU GPL# requires distribution of source code.# # Note that people who make modified versions of this file are not# obligated to grant this special exception for their modified versions;# it is their choice whether to do so.  The GNU General Public License# gives permission to release a modified version without this exception;# this exception also makes it possible to release a modified version# which carries forward this exception.## HTTP agents: server, client, cache## $Header: /cvsroot/nsnam/ns-2/tcl/webcache/http-agent.tcl,v 1.11 2005/08/26 05:05:30 tomh Exp $Http set id_ 0	;# required by TclCL# Type of Tcp agent. Can be SimpleTcp or FullTcp# Default should be set to FullTcp, in case for inadvertent bites. :(Http set TRANSPORT_ FullTcpHttp set HB_FID_ 40Http set PINV_FID_ 41# XXX invalidation message size should be proportional to the number of# invalidations inside the messageHttp set INVSize_ 43	;# unicast invalidationHttp set REQSize_ 43	;# RequestHttp set REFSize_ 50	;# Refetch requestHttp set IMSSize_ 50	;# If-Modified-SinceHttp set JOINSize_ 10	;# Server join/leaveHttp set HBSize_ 1	;# Used by Http/Server/Inval onlyHttp set PFSize_ 1	;# Pro formaHttp set NTFSize_ 10	;# Request NotificationHttp set MPUSize_ 10	;# Mandatory push requestHttp/Server set id_ 0Http/Server/Inval set id_ 0Http/Server/Inval/Yuc set hb_interval_ 60Http/Server/Inval/Yuc set enable_upd_ 0Http/Server/Inval/Yuc set Ca_ 1Http/Server/Inval/Yuc set Cb_ 4Http/Server/Inval/Yuc set push_thresh_ 4Http/Server/Inval/Yuc set push_low_bound_ 0Http/Server/Inval/Yuc set push_high_bound_ 8Http/Cache set id_ 0Http/Cache/Inval set id_ 0Http/Cache/Inval/Mcast set hb_interval_ 60Http/Cache/Inval/Mcast set upd_interval_ 5Http/Cache/Inval/Mcast set enable_upd_ 0Http/Cache/Inval/Mcast set Ca_ 1Http/Cache/Inval/Mcast set Cb_ 4Http/Cache/Inval/Mcast set push_thresh_ 4Http/Cache/Inval/Mcast set push_low_bound_ 0Http/Cache/Inval/Mcast set push_high_bound_ 8Http/Cache/Inval/Mcast/Perc set direct_request_ 0PagePool/CompMath set num_pages_ 1PagePool/CompMath set main_size_ 1024PagePool/CompMath set comp_size_ 10240# Transport protocol used for multimedia connectionsHttp set MEDIA_TRANSPORT_ RAP# Application-level handler for multimedia connections. # Currently there are two available:# - MediaApp: simply extract data from packets and pass it to cache# - QA: do quality adaptationHttp set MEDIA_APP_ MediaApp# 1K per multimedia segmentApplication/MediaApp set segmentSize_ 1024Application/MediaApp set MAX_LAYER_ 10# Constants related to quality adaptationApplication/MediaApp/QA set LAYERBW_ 2500 ;# Byte per-secondApplication/MediaApp/QA set MAXACTIVELAYERS_ 10Application/MediaApp/QA set SRTTWEIGHT_ 0.95Application/MediaApp/QA set SMOOTHFACTOR_ 4Application/MediaApp/QA set MAXBKOFF_ 100Application/MediaApp/QA set debug_output_ 0# Prefetching lookahead SRTT 200msApplication/MediaApp/QA set pref_srtt_ 0.6# 100M buffer size at cache/server/clientPagePool/Client/Media set max_size_ 104857600 Http instproc init { ns node } {	$self next	$self instvar ns_ node_ id_ pool_	set ns_ $ns	set node_ $node	$self set id_ [$node_ id]	set pool_ [$self create-pagepool]}Http instproc create-pagepool {} {	set pool [new PagePool/Client]	$self set-pagepool $pool	return $pool}Http instproc addr {} {	$self instvar node_ 	return [$node_ node-addr]}Http set fid_ -1Http instproc getfid {} {	$self instvar fid_	set fid_ [Http set fid_]	Http set fid_ [incr fid_]}Http instproc get-mpusize {} {	return [Http set MPUSize_]}Http instproc get-ntfsize {} {	return [Http set NTFSize_]}Http instproc get-pfsize {} {	return [Http set PFSize_]}Http instproc get-hbsize {} {	return [Http set HBSize_]}Http instproc get-imssize {} {	return [Http set IMSSize_]}Http instproc get-invsize {} {	return [Http set INVSize_]}# Generate request packet size. Should be constant because it's smallHttp instproc get-reqsize {} {	return [Http set REQSize_]}Http instproc get-refsize {} {	return [Http set REFSize_]}Http instproc get-joinsize {} {	return [Http set JOINSize_]}# At startup, connect to a server, the server may be a cacheHttp instproc connect { server } {	Http instvar TRANSPORT_	$self instvar ns_ slist_ node_ fid_ id_	lappend slist_ $server	set tcp [new Agent/TCP/$TRANSPORT_]	$tcp set fid_ [$self getfid]	$ns_ attach-agent $node_ $tcp	set ret [$server alloc-connection $self $fid_]	set snk [$ret agent]	$ns_ connect $tcp $snk	#$tcp set dst_ [$snk set addr_]	$tcp set window_ 100	# Use a wrapper to implement application data transfer	set wrapper [new Application/TcpApp $tcp]	$self cmd connect $server $wrapper	$wrapper connect $ret	#puts "HttpApp $id_ connected to server [$server id]"}Http instproc stat { name } {	$self instvar stat_	return $stat_($name)}# Used for mandatory push refreshmentsHttp/Client set hb_interval_ 60Http/Client instproc init args {	eval $self next $args	$self instvar node_ stat_	$node_ color "SteelBlue"	array set stat_ [list req-num 0 stale-num 0 stale-time 0 rep-time 0 \		rt-min 987654321 rt-max 0 st-min 987654321 st-max 0]}# XXX Assume that it's always client disconnects from server, not vice versaHttp/Client instproc disconnect { server } {	$self instvar ns_ slist_ 	set pos [lsearch $slist_ $server]	if {$pos >= 0} {		lreplace $slist_ $pos $pos	} else { 		error "Http::disconnect: not connected to $server"	}	# Cleanup of all pending requests and states	$self instvar ns_ node_ cache_	$self stop-session $server	# XXX Is this the right behavior? Should we wait for FIN etc.?	set tcp [[$self get-cnc $server] agent]	$self cmd disconnect $server	$server disconnect $self	$tcp proc done {} "$ns_ detach-agent $node_ $tcp; delete $tcp"	$tcp close}# Meta-data to be sent in a request# XXX pageid should always be given from the users, because client may # connect to a cache, hence it doesn't know the server name.Http/Client instproc send-request { server type pageid args } {	$self instvar ns_ pending_ 	;# unansewered requests	# XXX Do not set pending states for an non-existent connection	if ![$self cmd is-connected $server] {		return	}	if ![info exists pending_($pageid)] { 		# XXX Actually we should use set, because only one request		# is allowed for a page simultaneously		lappend pending_($pageid) [$ns_ now]	} else {		# If the page is being requested, do not send another request		return	}	set size [$self get-reqsize]	$self send $server $size \	    "$server get-request $self $type $pageid size $size [join $args]"	$self evTrace C GET p $pageid s [$server id] z $size	$self instvar stat_ simStartTime_	if [info exists simStartTime_] {		incr stat_(req-num)	}	$self mark-request $pageid}Http/Client instproc mark-request { pageid } {	# Nam state coloring	$self instvar node_ marks_ ns_	$node_ add-mark $pageid:[$ns_ now] "purple"	lappend marks_($pageid) $pageid:[$ns_ now]}# The reason that "type" is here is for Http/Cache to work. Client doesn't # check the reason of the responseHttp/Client instproc get-response-GET { server pageid args } {	$self instvar pending_ id_ ns_ stat_ simStartTime_	if ![info exists pending_($pageid)] {		error "Client $id_: Unrequested response page $pageid from server [$server id]"	}	array set data $args	# Check stale hits	set origsvr [lindex [split $pageid :] 0]	set modtime [$origsvr get-modtime $pageid]	set reqtime [lindex $pending_($pageid) 0]	set reqrtt [expr [$ns_ now] - $reqtime]		#	# XXX If a stale hit occurs because a page is modified during the RTT	# of the request, we should *NOT* consider it a stale hit. We 	# implement it by ignoring all stale hits whose modification time is	# larger than the request time. 	#	if {$modtime > $data(modtime)} {		# Staleness is the time from now to the time it's last modified		set tmp [$origsvr stale-time $pageid $data(modtime)]		if {$tmp > $reqrtt/2} {			# We have a real stale hit			$self evTrace C STA p $pageid s [$origsvr id] l $tmp			if [info exists simStartTime_] {				incr stat_(stale-num)				set stat_(stale-time) [expr \					$stat_(stale-time) + $tmp]				if {$stat_(st-min) > $tmp} {					set stat_(st-min) $tmp				}				if {$stat_(st-max) < $tmp} {					set stat_(st-max) $tmp				}			}		}	}	# Assume this response is for the very first request we've sent. 	# Because we'll average the response time at the end, which 	# request this response actually corresponds to doesn't matter.	$self evTrace C RCV p $pageid s [$server id] l $reqrtt z $data(size)	if [info exists simStartTime_] {		set stat_(rep-time) [expr $stat_(rep-time) + $reqrtt]		if {$stat_(rt-min) > $reqrtt} {			set stat_(rt-min) $reqrtt		}		if {$stat_(rt-max) < $reqrtt} {			set stat_(rt-max) $reqrtt		}	}	set pending_($pageid) [lreplace $pending_($pageid) 0 0]	if {[llength $pending_($pageid)] == 0} {		unset pending_($pageid)	}	$self mark-response $pageid}Http/Client instproc mark-response { pageid } {	$self instvar node_ marks_ ns_	set mk [lindex $marks_($pageid) 0]	$node_ delete-mark $mk	set marks_($pageid) [lreplace $marks_($pageid) 0 0]}Http/Client instproc get-response-REF { server pageid args } {	eval $self get-response-GET $server $pageid $args}Http/Client instproc get-response-IMS { server pageid args } {	eval $self get-response-GET $server $pageid $args}# Generate the time when next request will occur# It's either a TracePagePool or a MathPagePool## XXX both TracePagePool and MathPagePool should share the same C++ # interface and OTcl interfaceHttp/Client instproc set-page-generator { pagepool } {	$self instvar pgtr_ 	;# Page generator	set pgtr_ $pagepool}Http/Client instproc set-interval-generator { ranvar } {	$self instvar rvInterPage_

⌨️ 快捷键说明

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