Monday, 8 September 2008

TCP monitoring in NS

Today I was asking in how to monitor TCP connections on NS-2. Then I decided to blog about the topic.

First you need a TCP agent and maybe with a FTP or some sort of application (I suppose that you already have some nodes):

#Setup a TCP connection set tcp1 [new Agent/TCP]
$tcp1 set class_ 2

#Attach tcp to node n0
$ns attach-agent $n0
set sink [new Agent/TCPSink]
#Attach a sink to node
$ns attach-agent $n1 $sink $ns connect $tcp1 $sink
$tcp1 set fid_ 1
#Setup a FTP over TCP connection

set ftp0 [new Application/FTP]
#Link tcp agent with FTP application

$ftp0 attach-agent
$ftp0 set type_ FTP

Now, create a procedure to print some TCP information

proc update_tcpinfo {} {
global ns file_out time_step
set now [$ns now]

set window [$tcp set cwnd_]

set avgwind [$tcp set awnd_]

set rtt [$tcp set rtt_]

set acks [$tcp set ack_]

Then you have window, avgwind, rtt and acks that you can print out to screen or to a file (an output file or may be the tracefile, I would recommend a separate trace file).

puts $file_out "$now $window $avgwind $rtt $acks"

And call the procedure every time_step

$ns at [expr $now + $time_step] "update_tcpinfo" }

To declare your outfile just do it as the trace and nam files are normally initiated:

#Open flow file set file_out [open flow_trace.txt w]

And do not forget to close it:
#Define a 'finish' procedure
proc finish {} {

global ns nf tf file_out

$ns flush-trace

#Close the NAM trace file

close $nf

#Close the Trace file

close $tf
#Close outputs file

close $file_out

#Execute NAM on the trace file, uncomment the next line to exec NAM automatically

#exec nam out.nam & exit 0

Call the procedure and run the simulation

$ns at 0.5 "updatetcpinfo" #Call the finish procedure after 5 seconds of simulation time $ns at 5 "finish" #Run the simulation $ns run

This is only pseudo code and it could have some errors. I prepared a working file that can be found here: