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

📄 http-mod.tcl

📁 对IEEE 802.11e里的分布式信道接入算法EDCA进行改进
💻 TCL
字号:
# Part of the work for the summer intern at AT&T Labs-Research# Code contributed by Polly Huang, http://www-scf.usc.edu/~bhuang# phuang@research.att.com, huang@isi.edu# Ported from UCB Empirical HTTP code, http.tclputs "WARNING: Obsoleted by PagePool/WebTraf."puts "See ~ns/tcl/webcache/webtraf.{h,cc} and web-traffic.tcl in tcl/ex"##################### Class: HttpSession #######################Agent/CBR set maxpkts_ 0Class HttpSessionHttpSession set sessionId_ 1HttpSession instproc init { ns numPage sessionSrc } {    $self instvar httpPages_ numPage_ interPage_ pageSize_     $self instvar ns_ sessionId_ sessionSrc_    $self instvar tcpType_ tcpSinkType_    set ns_ $ns    set numPage_ $numPage    set sessionId_ [HttpSession set sessionId_]    HttpSession set sessionId_ [expr $sessionId_ + 1]    set sessionSrc_ $sessionSrc    set tcpType_ TCP/Reno    set tcpSinkType_ TCPSink    # default interPage_ interval to 1 second/page    if ![info exist interPage_] {	set interPage_ [new RandomVariable/Constant]	$interPage_ set val_ 1    }    # default pageSize_ to 2 objects/page    if ![info exist pageSize_] {	set pageSize_ [new RandomVariable/Constant]	$pageSize_ set val_ 2    }}HttpSession instproc disable-reliability {} {    $self instvar disable_reliability_    set disable_reliability_ 1}HttpSession instproc disable-flow-control windowInit {    $self instvar disable_flow_control_ windowInit_        set disable_flow_control_ 1    set windowInit_ $windowInit}HttpSession instproc createPage {} {    $self instvar httpPages_ numPage_ pageSize_     $self instvar ns_ sessionId_ sessionSrc_    $self instvar tcpType_ tcpSinkType_    $self instvar disable_reliability_ disable_flow_control_ windowInit_    for {set i 0} {$i < $numPage_} {incr i} {	set httpPages_($i) [new HttpPage $ns_ $sessionId_]	$httpPages_($i) set numObject_ [$pageSize_ value]	$httpPages_($i) set pageSrc_ $sessionSrc_	$httpPages_($i) set sessionManager_ $self	# puts "HttpSession::createPage:$tcpType_ $tcpSinkType_"	$httpPages_($i) set tcpType_ $tcpType_	$httpPages_($i) set tcpSinkType_ $tcpSinkType_	if {[info exist disable_reliability_] && $disable_reliability_} {	    $httpPages_($i) set disable_reliability_ 1	    # puts "HttpSession::createPage: disable_reliability_ $disable_reliability_"	}	if {[info exist disable_flow_control_] && $disable_flow_control_} {	    $httpPages_($i) set disable_flow_control_ 1	    $httpPages_($i) set windowInit_ $windowInit_	    # puts "HttpSession::createPage: disable_flow_control_ $disable_flow_control_ windowInit_ $windowInit_"	}    }}HttpSession instproc start {} {    $self instvar httpPages_ numPage_ interPage_     $self instvar ns_     set launchTime [$ns_ now]    for {set i 0} {$i < $numPage_} {incr i} {	$ns_ at $launchTime "$httpPages_($i) start"	set launchTime [expr $launchTime + [$interPage_ value]]    }}HttpSession instproc setDistribution { var distribution args } {    $self instvar httpPages_    ## Create random model object    set model [new RandomVariable/$distribution]    switch $distribution {	Constant {$model set val_ [lindex $args 0]}	Uniform  {	    $model set max_ [lindex $args 0] 	    $model set min_ [lindex $args 1]	}	Exponential {$model set avg_ [lindex $args 0]}	Pareto  {	    $model set avg_ [lindex $args 0] 	    $model set shape_ [lindex $args 1]	}	ParetoII  {	    $model set avg_ [lindex $args 0] 	    $model set shape_ [lindex $args 1]	}	TraceDriven  {$model set filename_ [lindex $args 0]}    }    ## Assign variables with the random model    switch $var {	interPage_ {$self set $var $model}	pageSize_  {$self set $var $model}	interObject_ {	    foreach index [array name httpPages_] {		$httpPages_($index) set $var $model	    }	}	objectSize_  {	    foreach index [array name httpPages_] {		$httpPages_($index) set $var $model	    }	}    }}##################### Class: HttpPage ###########################Class HttpPageHttpPage set pageId_ 1HttpPage instproc init { ns sessionId } {    $self instvar httpObjects_ numObject_ interObject_ objectSize_     $self instvar ns_ sessionId_ pageId_ curObject_    $self instvar tcpType_ tcpSinkType_    set ns_ $ns    set sessionId_ $sessionId    set pageId_ [HttpPage set pageId_]    HttpPage set pageId_ [expr $pageId_ + 1]    set tcpType_ TCP/Reno    set tcpSinkType_ TCPSink    # default numObject_ to 1 object/session    set numObject_ 1    set curObject_ 0    # default interObject_ interval to 1 second/object    if ![info exist interObject_] {	set interObject_ [new RandomVariable/Constant]	$interObject_ set val_ 0.5    }    # default objectSize_ to 5 packets/object    if ![info exist objectSize_] {	set objectSize_ [new RandomVariable/Constant]	$objectSize_ set val_ 5    }}HttpPage instproc start {} {    $self instvar httpObjects_ numObject_ interObject_ objectSize_     $self instvar ns_ pageSrc_ sessionManager_ pageId_ sessionId_    $self instvar curObject_ tcpType_ tcpSinkType_    $self instvar disable_reliability_ disable_flow_control_ windowInit_    if {$curObject_ < $numObject_} {	set httpObjects_($curObject_) [new HttpObject $ns_ $pageSrc_ [$ns_ pickdst] $pageId_ $sessionId_ $tcpType_ $tcpSinkType_]	$httpObjects_($curObject_) set numPacket_ [$objectSize_ value]	$httpObjects_($curObject_) set pageManager_ $self	$httpObjects_($curObject_) set sessionManager_ $sessionManager_	if {[info exist disable_reliability_] && $disable_reliability_} {	    $httpObjects_($curObject_) set disable_reliability_ 1	    # puts "HttpPage::start: disable_reliability $disable_reliability_"	}	if {[info exist disable_flow_control_] && $disable_flow_control_} {	    $httpObjects_($curObject_) set disable_flow_control_ 1	    $httpObjects_($curObject_) set windowInit_ $windowInit_	    # puts "HttpPage::start: disable_flow_control_ $disable_flow_control_ windowInit_ $windowInit_"	}	$httpObjects_($curObject_) start	incr curObject_	$ns_ at [expr [$ns_ now] + [$interObject_ value]] "$self start"    }}##################### Class: HttpObject ##############################Class HttpObject -superclass InitObjectHttpObject set objectId_ 1HttpObject instproc init { ns src dst pageId sessionId tcpType tcpSinkType} {    $self instvar numPacket_ ns_ tcpType_ tcpSinkType_    $self instvar clientSrc_ serverSrc_  clientSink_ serverSink_    $self instvar clientNode_ serverNode_ clientTCP_ serverTCP_    $self instvar sessionManager_ objectSrc_ objectId_ pageId_ sessionId_    $self instvar clientSinkRcvPktCount_    set ns_ $ns    set pageId_ $pageId    set sessionId_ $sessionId    set objectId_ [HttpObject set objectId_]    HttpObject set objectId_ [expr $objectId_ + 1]    # default numObject_ to 1 object/session    set numPacket_ 1    set tcpType_ $tcpType    set tcpSinkType_ $tcpSinkType    set clientNode_ $src    set serverNode_ $dst#    $clientNode_ set idleTCP_ ""#    $clientNode_ set idleTCPSink_ ""#    $serverNode_ set idleTCP_ ""#    $serverNode_ set idleTCPSink_ ""    set clientSinkRcvPktCount_ 0    # setup TCP connection    set clientTCP_ [$clientNode_ pickTCP TCP/Reno]    # puts "clientTCP $clientTCP_"    # trace client TCP info    $ns instvar clientchan_    if [info exist clientchan_] {	$clientTCP_ set trace_all_oneline_ true	$clientTCP_ trace cwnd_	$clientTCP_ attach [$ns set clientchan_]    }    set serverTCP_ [$serverNode_ pickTCP $tcpType_]    # puts "serverTCP $serverTCP_"    # trace server TCP info    $ns instvar serverchan_    if [info exist serverchan_] {	$serverTCP_ set trace_all_oneline_ true	$serverTCP_ trace cwnd_	$serverTCP_ attach [$ns set serverchan_]    }    $clientTCP_ set fid_ $objectId_    $serverTCP_ set fid_ $objectId_    set clientSink_ [$serverNode_ pickTCPSink TCPSink]    set serverSink_ [$clientNode_ pickTCPSink $tcpSinkType_]    set clientSrc_ [$self newXfer FTP $clientNode_ $serverNode_ $clientTCP_ $clientSink_]    set serverSrc_ [$self newXfer FTP $serverNode_ $clientNode_ $serverTCP_ $serverSink_]    $clientTCP_ proc done {} "$self doneRequest"    $serverTCP_ proc done {} "$self doneReply"}HttpObject instproc start {} {    $self instvar numPacket_ ns_ pageManager_ sessionManager_    $self instvar clientNode_ clientTCP_ clientSrc_ serverTCP_    $self instvar objectId_ pageId_ sessionId_    $self instvar clientSink_ serverSink_    $self instvar disable_reliability_ disable_flow_control_ windowInit_    puts "$numPacket_ \t $objectId_ \t $pageId_ \t $sessionId_ \t [$ns_ now]"    if {[info exist disable_reliability_] && $disable_reliability_} {	$clientTCP_ disable-reliability	$clientSink_ disable-reliability 	$serverTCP_ disable-reliability	$serverSink_ disable-reliability     }    if {[info exist disable_flow_control_] && $disable_flow_control_} {	$clientTCP_ disable-flow-control	$serverTCP_ disable-flow-control	$clientTCP_ set windowInit_ $windowInit_	$serverTCP_ set windowInit_ $windowInit_    }    $clientSrc_ producemore 1}HttpObject instproc newXfer {type src dst sa da} {	$self instvar ns_	$ns_ attach-agent $src $sa	$ns_ attach-agent $dst $da	$ns_ connect $sa $da        set app [new Application/$type]        $app attach-agent $sa	return $app}HttpObject instproc doneRequest {} {    $self instvar numPacket_ ns_    $self instvar clientSrc_ serverSrc_  clientSink_ serverSink_    $self instvar clientNode_ serverNode_ clientTCP_ serverTCP_    # puts "doneRequest: server([$serverNode_ id]) replyin obj size($numPacket_) [$ns_ now]"    $clientNode_ instvar idleTCP_    $serverNode_ instvar idleTCPSink_    if {![info exists idleTCP_] || [lsearch $idleTCP_ $clientTCP_] < 0} {	lappend idleTCP_ $clientTCP_	# puts "[$clientNode_ id] TCP doneRequest: append $clientTCP_ => $idleTCP_"    } else {	puts "[$clientNode_ id] doneRequest: using idle TCP $clientTCP_, $idleTCP_"	exit    }    if {![info exists idleTCPSink_] || [lsearch $idleTCPSink_ $clientSink_] < 0} {	lappend idleTCPSink_ $clientSink_	# puts "[$serverNode_ id] TCPSInk doneRequest: append $clientSink_ => $idleTCPSink_"    } else {	puts "[$serverNode_ id] doneRequest: using idle TCP Sink $clientSink_, $idleTCPSink_"	exit    }    # puts "$serverSrc_ [expr int(ceil($numPacket_))]"    $serverSrc_ producemore [expr int(ceil($numPacket_))]}HttpObject instproc doneReply {} {    $self instvar numPacket_ ns_    $self instvar clientSrc_ serverSrc_  clientSink_ serverSink_    $self instvar clientNode_ serverNode_ clientTCP_ serverTCP_ objectId_    # puts "$objectId_ doneReply: server([$serverNode_ id]) client([$clientNode_ id]) replied obj size($numPacket_) [$ns_ now]"    $serverNode_ instvar idleTCP_    $clientNode_ instvar idleTCPSink_    if {![info exists idleTCP_] || [lsearch $idleTCP_ $serverTCP_] < 0} {	lappend idleTCP_ $serverTCP_	# puts "[$serverNode_ id] TCP doneReply: append $serverTCP_ => $idleTCP_"    } else {	puts "[$serverNode_ id] doneReply: using idle TCP $serverTCP_, $idleTCP_"	exit    }    if {![info exists idleTCPSink_] || [lsearch $idleTCPSink_ $serverSink_] < 0} {	lappend idleTCPSink_ $serverSink_	# puts "[$clientNode_ id] TCPSink doneReply: append $serverSink_ => $idleTCPSink_"    } else {	puts "[$clientNode_ id] doneReply: using idle TCP Sink $serverSink_, $idleTCPSink_"	exit    }}#####################################################################Node instproc pickTCP { type } {    $self instvar idleTCP_    if [info exist idleTCP_] {	set i 0	foreach TCP $idleTCP_ {	    if {[$TCP info class] == "Agent/$type"} {		set idleTCP_ [lreplace $idleTCP_ $i $i]		# puts "[$self id] TCP pick(found): $TCP, $idleTCP_"		$TCP reset		return $TCP	    }	    incr i	}    }    set TCP [new Agent/$type]     if [info exist idleTCP_] {	# puts "[$self id] TCP pick(new): $TCP , $idleTCP_"    } else {	# puts "[$self id] TCP pick(new): $TCP"    }    return $TCP}Node instproc pickTCPSink { type } {    $self instvar idleTCPSink_    if [info exist idleTCPSink_] {	set i 0	foreach Sink $idleTCPSink_ {	    if {[$Sink info class] == "Agent/$type"} {		set idleTCPSink_ [lreplace $idleTCPSink_ $i $i]		# puts "[$self id] TCPSink pick(found): $Sink, $idleTCPSink_"		$Sink reset		return $Sink	    }	    incr i	}    }    set Sink [new Agent/$type]    if [info exist idleTCPSink_] {	# puts "[$self id] TCPSink pick(new): $Sink, $idleTCPSink_"    } else {	# puts "[$self id] TCPSink pick(new): $Sink"    }    return $Sink}#####################################################################Simulator instproc picksrc {} {    $self instvar Node_ src_    global defaultRNG    if {![info exist src_] || [llength $src_] == 0} {	set tmp [$defaultRNG integer [Node set nn_]]	return $Node_($tmp)    } else {	set round [llength $src_]	set tmp [$defaultRNG integer $round]	return $Node_([lindex $src_ $tmp])    }}Simulator instproc roundrobinsrc {} {    $self instvar Node_ src_ roundrobin_    global defaultRNG    if {![info exist src_] || [llength $src_] == 0} {	set round [Node set nn_]    } else {	set round [llength $src_]    }    if ![info exist roundrobin_] {	set roundrobin_ [$defaultRNG integer $round]    }    set roundrobin_ [expr [expr $roundrobin_ + 1] % $round]    if {![info exist src_] || [llength $src_] == 0} {	return $Node_($roundrobin_)    } else {	# puts "roundrobin: $roundrobin_"	return $Node_([lindex $src_ $roundrobin_])    }}Simulator instproc pickdst {} {    $self instvar Node_ dst_    global defaultRNG    if {![info exist dst_] || [llength $dst_] == 0} {	set round 0	foreach index [array names Node_] {	    incr round	}	set tmp [$defaultRNG integer $round]	# puts "$round $tmp"	return $Node_($tmp)    } else {	set round [llength $dst_]	set tmp [$defaultRNG integer $round]	# puts "$round $tmp"	return $Node_([lindex $dst_ $tmp])    }}

⌨️ 快捷键说明

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