*hi all,
friends this tcl script is very necessary for my thesis please replay ASAP.
i am using n-2.31 with cygwin Actually i want to simulate short session and
to measure the distribution of the transmission duration of the number of
ongoing connections and the throughput in TCP connections. for this i use
monitoring the number of session. it will be look like following scenario::
*
S(1) ----------------
. |
. |
. |
.
|-----------------------------------N------------------------------------D(1)
...........D(NodeNb)
. |
. |
. |
S(NodeNb) -----------------
*for this tcl file is as follows:*
set ns [new Simulator]
#this file contain transfer time of different connection
set Out [open Out.ns w]
#next file will contain the number of connections
set Conn [open Conn.tr w]
#open the trace file
set tf [open out.tr w]
$ns trace-all $tf
#we define the 3 files that will be used to trace the queue size,
#the bandwidth and lasses at the bottleneck.
set qsize [open queuesize.tr w]
set qbw [open queuebw.tr w]
set qlost [open queuelost.tr w]
#defining the topology
set N [$ns node]
set D [$ns node]
$ns duplex-link $N $D 2Mb 1ms DropTail
$ns queue-limit $N $D 3000
#number of sources
set NodeNb 6
#number of flows per source node
set NumberFlows 530
#Nodes and links
for { set j 1 } {$j<=$NodeNb} {incr j} {
set S($j) [$ns node]
$ns duplex-link $S($j) $N 100Mb 1ms DropTail
$ns queue-limit $S($j) $N 1000
}
#TCP sources and destinations
for {set i 1} {$i<=$NodeNb} { incr i } {
for {set j 1} {$j<=$NumberFlows} { incr j } {
set tcpsrc ($i, $j) [new Agent/TCP/Newreno]
set tcp_snk ($i, $j) [new Agent/TCPSink]
$tcpsrc($i, $j) set window_ 2000
}
}
#connections
for {set i 1} {$i<=$NodeNb} { incr i } {
for {set j 1} {$j<=$NumberFlows} { incr j } {
$ns attach-agent $S($i) $tcpsrc($i, $j)
$ns attach-agent $D $tcp_snk($i, $j)
$ns connect $tcpsrc($i, $j) $tcp_snk($i, $j)
}
}
#ftp sources
for {set i 1} {$i<=$NodeNb} { incr i } {
for {set j 1} {$j<=$NumberFlows} { incr j } {
set ftp($i, $j) [$tcpsrc($i, $j) attach-source FTP]
}
}
#generator for the random size of files
set rng1 [new RNG]
$rng1 seed 0
set rng2 [new RNG]
$rng2 seed 0
#random interarrival time of tcp transfers at each source i
set RV [new RandomVariable/Exponential]
$RV set avg_ 0.045
$RV use-rng $rng1
#random size of files to transmit
set RV [new RandomVariable/Exponential]
$RVSize set avg_ 10000
$RVSize set shape_ 1.5
$RVSize use-rng $rng2
#we nw define the begining times of transfers and the transfer sizes
#arrivals of sessions follow a poisson process
for {set i 1} {$i<=$NodeNb} { incr i } {
set t [$ns now]
for {set j 1} {$j<=$NumberFlows} { incr j } {
#set the begining time of next transfer from source i
set t [expr $t + [$RV value]]
set Conct($i, $j) $t
#set the size of next transfer from source i
set Size($i, $j) [expr [$RVSize value]]
$ns at $Conct($i, $j) "$ftp($i, $j) send $Size($i, $j)"
#update the number of flows
$ns at #Conct($i, $j) "countFlows $i 1"
}
}
#next is a recursive procedure that checks for each session whether
#it has ended. the procedure calls itself each 0.1 sec (this is set in
#the variable "time")
#if a connection has ended then we print in the file $Out
#* the connection identifiers r i and j
#* the start and end time of the connection,
#* the throughput of the session,
#* the size of the transfer in bytes
# and we further defines another begining of transfer after a random times
proc Test {} {
global Conct tcpsrc Size NodeNB NumberFlows ns RV ftp Out tcp_snk
RVSize
set time 0.1
for {set i 1} {$i<=$NodeNb} { incr i } {
for {set j 1} {$j<=$NumberFlows} { incr j } {
#we now check if the transfer is over
if {[$tcpsrc($i, $j) set ack_]==[$tcpsrc($i, $j) set maxseq_]} {
if {[$tcpsrc($i, $j) set ack_]>=0} {
#if the transfer is over, we print relevent information in $Out
puts $Out "$i, $j\t$Conct($i, $j)\t[expr [$ns now]]\t\
[expr ($Size($i, $j))/(1000*([expr [$ns now ]] - $Conct($i,
$j)))]\t$Size($i, $j)"
countFlows $i 0
$tcpsrc($i, $j) reset
$tcp_snk($i, $j) reset
}
}
}
}
$ns at [expr [$ns now]+$time] "Test"
}
for {set j 1} {$j<=$NodeNb} { incr j } {
set Cnts($j) 0
}
# the following recursive procedure updates the number of connections as a
function of time.
# Each 0.2 it prints them in to $Conn. This is done by calling the procedure
with the "sign"
# parameter equal 3 (in which case the "ind" parameter does not play a
role). the procedure
# is also called by the Test procedure whenever a connection from source i
ends by assigning
# the "sign" parameter 0, or when it begins, by assigning it 1 (i is passed
through the "ind"
# variable).
proc countFlows { ind sign } {
global Cnts Conn NodeNb
set ns [Simulator instance]
if { $sign==0 } { set Cnts($ind) [expr $Cnts($ind) - 1] }
elseif { $sign==1 } { set Cnts($ind) [expr $Cnts($ind) - 1] }
else {
puts -nonewline $Conn "[$ns now] \t"
set sum 0
for {set j 1} {$j<=$NodeNb} { incr j } {
puts -nonewline $Conn "$Cnts($j) \t"
set sum [expr $sum + $Cnts($j)]
}
puts $Conn "$sum"
$ns at [expr [$ns now] + 0.2] "countFlows 1 3"
}
}
#define a finish procedure
proc finish {} {
global ns tf qsize qbw qlost
$ns flush-trace
close $qsize
close $qbw
close $qlost
# Execute xgraph to display the queue size, queue bandwidth and loss rate
exec xgraph queuesize.tr -geometry 800X400 -t "Queue size" -x "secs" -y
"# packets" &
exec xgraph queuebw.tr -geometry 800X400 -t "bandwidth" -x "secs" -y
"Kbps" -fg white &
exec xgraph queuelost.tr -geometry 800X400 -t "# Packet lost" -x "secs"
-y "packets" &
exit 0
}
# Queue Monitoring
set qfile [$ns monitor-queue $N $D [open queue.tr w] 0.05]
[$ns link $N $D] queue-sample-timeout;
# the following records queue size, banwidth and loss rate\par
proc record {} {
global ns qfile qsize qbw qlost N D
set time 0.05
set now [$ns now]
# print the current queue size in $qsize, the current used bandwidth in
$qbw, and the loss\par
# rate in $qloss\par
$qfile instvar parrivals_ pdepartures_ bdrops_ bdepartures_ pdrops_
puts $qsize "$now [expr $parrivals_-$pdepartures_-$pdrops_]"
puts $qbw "$now [expr $bdepartures_*8/1024/$time]"
set bdepartures_ 0
puts $qlost "$now [expr $pdrops_/$time]"
$ns at [expr $now+$time] "record"
}
$ns at 0.0 "record"
$ns at 0.01 "Test"
$ns at 0.5 "countFlows 1 3"
$ns at 20 "finish"
$ns run
*but it is giving following error:*
wrong # args: should "set varName ?newValue?"
while compiling
"set tcpsrc ($i, $j) [new Agent/TCP/Newreno]"
("for" body line 2)
"for {set j 1} {$j<=$NumberFlows} { incr j } {
set tcpsrc ($i, $j) [new Agent/TCP/Newreno]
set tcp_snk ($i, $j) [new Agent/TCPSink]
$tcpsrc($i, $j)..."
("for" body line 2)
invoked from within
"for {set i 1} {$i<=$NodeNb} { incr i } {
for {set j 1} {$j<=$NumberFlows} { incr j } {
set tcpsrc ($i, $j) [new Agent/TCP/Newreno]
set tcp_snk ($i,..."
(file "my_tcl.tcl" line 40)
*i m unable to rectify the error.
plz help me this is very important for my thesis.
plz replay ASAP.
*
Thanks,