#3 sorgenti ftp e 3 sorgenti telnet trasmettono allo stesso destinatario
#Inizialmente si crea la congestione ma quando le sorgenti tcp riducono
#le loro finestre la coda si smaltisce abbastanza e non si perdono piu'
#pacchetti. La congestione si ricrea quando interviene il disturbo
#di una sorgente cbr che trasmette a un indirizzo multicast.
#E' possibile scegliere in esecuzione se usare una coda FIFO o SFQ sul
#collo di bottiglia.

set ns [new Simulator]
$ns multicast

#colore ftp
$ns color 1 Red
#colore telnet
$ns color 2 Blue
#colore multicast
$ns color 3 green

set nf [open cong.nam w]
$ns namtrace-all $nf

proc finish { }  {       global ns nf
                         $ns flush-trace
                         close $nf
                         exec nam cong.nam &
                         exit 0
                 }
#nodi per sorgenti ftp
set n0 [$ns node]
$n0 color "red"
set n1 [$ns node]
$n1 color "red"
set n2 [$ns node]
$n2 color "red"
#nodi per sorgenti telnet
set n3 [$ns node]
$n3 color "blue"
set n4 [$ns node]
$n4 color "blue"
set n5 [$ns node]
$n5 color "blue"
#router critico
set n6 [$ns node]
#secondo router
set n8 [$ns node]
#destinatario telnet e ftp
set n7 [$ns node]
$n7 color "red"
$n7 add-mark color  blue
#nodo per sorgente cbr
set n9 [$ns node]
$n9 color "green"
#destinatari multicast
set n10 [$ns node]
set n11 [$ns node]

#creo gruppo multicast
set group [Node allocaddr]

#il ritardo e' tale che una sorgente riceva ack prima di spedire
#un nuovo pacchetto
$ns duplex-link $n0 $n6 1Mb 10ms DropTail
$ns duplex-link $n1 $n6 1Mb 10ms DropTail
$ns duplex-link $n2 $n6 1Mb 10ms DropTail
$ns duplex-link $n3 $n6 1Mb 10ms DropTail
$ns duplex-link $n4 $n6 1Mb 10ms DropTail
$ns duplex-link $n5 $n6 1Mb 10ms DropTail
$ns duplex-link $n6 $n8 768Kb 25ms DropTail 
$ns duplex-link $n8 $n7 1Mb 10ms DropTail
$ns duplex-link $n9 $n6 1Mb 10ms DropTail
$ns duplex-link $n8 $n10 1Mb 10ms DropTail
$ns duplex-link $n8 $n11 1Mb 10ms DropTail
 
#monitoraggio della coda tra n6 e n8
$ns duplex-link-op $n6 $n8 queuePos 0.5
$ns queue-limit $n6 $n8 17

DM set PruneTimeout 2.5
set mproto DM
set mrthandle [$ns mrtproto $mproto {}]

#Creo una sorgente TCP e la attacco al nodo n0
set src0 [new Agent/TCP]
$ns attach-agent $n0 $src0
$src0 set window_ 8
$src0 set fid_ 1
$src0 set packetSize 1000

#Creo una sorgente TCP e la attacco al nodo n1
set src1 [new Agent/TCP]
$ns attach-agent $n1 $src1
$src1 set window_ 8
$src1 set fid_ 1
$src1 set packetSize 1000

#Creo una sorgente TCP e la attacco al nodo n2
set src2 [new Agent/TCP]
$ns attach-agent $n2 $src2
$src2 set window_ 8
$src2 set fid_ 1
$src2 set packetSize 1000

#Creo una sorgente TCP e la attacco al nodo n3
set src3 [new Agent/TCP]
$ns attach-agent $n3 $src3
$src3 set window_ 8
$src3 set fid_ 2

#Creo una sorgente TCP e la attacco al nodo n4
set src4 [new Agent/TCP]
$ns attach-agent $n4 $src4
$src4 set window_ 8
$src4 set fid_ 2

#Creo una sorgente TCP e la attacco al nodo n5
set src5 [new Agent/TCP]
$ns attach-agent $n5 $src5
$src5 set window_ 8
$src5 set fid_ 2

#Creo un destinatario TCP e lo attacco al nodo n7
set snk73 [new Agent/TCPSink]
$snk73 set packetSize_ 40
$ns attach-agent $n7 $snk73
$snk73 set fid_ 2
#Creo un destinatario TCP e lo attacco al nodo n7
set snk74 [new Agent/TCPSink]
$snk74 set packetSize_ 40
$ns attach-agent $n7 $snk74
$snk74 set fid_ 2
#Creo un destinatario TCP e lo attacco al nodo n7
set snk75 [new Agent/TCPSink]
$snk75 set packetSize_ 40
$ns attach-agent $n7 $snk75
$snk75 set fid_ 2
#Creo un destinatario TCP e lo attacco al nodo n7
set snk70 [new Agent/TCPSink]
$snk70 set packetSize_ 40
$ns attach-agent $n7 $snk70
$snk70 set fid_ 1
#Creo un destinatario TCP e lo attacco al nodo n7
set snk71 [new Agent/TCPSink]
$snk71 set packetSize_ 40
$ns attach-agent $n7 $snk71
$snk71 set fid_ 1
#Creo un destinatario TCP e lo attacco al nodo n7
set snk72 [new Agent/TCPSink]
$snk72 set packetSize_ 40
$ns attach-agent $n7 $snk72
$snk72 set fid_ 2

#Creo la sorgente cbr
set udp9 [new Agent/UDP]
$ns attach-agent $n9 $udp9
set src9 [new Application/Traffic/CBR]
$udp9 set fid_ 3
$src9 set packet_size_ 500
$src9 set rate_ 256Kb
$src9 attach-agent $udp9
$udp9 set dst_ $group
#Creo i destinatari del gruppo multicast
set rcv10 [new Agent/Null]
$ns attach-agent $n10 $rcv10
set rcv11 [new Agent/Null]
$ns attach-agent $n11 $rcv11

$ns connect $src0 $snk70
$ns connect $src1 $snk71
$ns connect $src2 $snk72
$ns connect $src3 $snk73
$ns connect $src4 $snk74
$ns connect $src5 $snk75

#Creo un'applicazione ftp, la attacco a src0
set ftp0 [new Application/FTP]
$ftp0 attach-agent $src0

#Creo un'applicazione ftp, la attacco a src1
set ftp1 [new Application/FTP]
$ftp1 attach-agent $src1

#Creo un'applicazione ftp, la attacco a src2
set ftp2 [new Application/FTP]
$ftp2 attach-agent $src2

#Creo un'applicazione telnet, la attacco a src3
set tel3 [new Application/Telnet]
$tel3 attach-agent $src3

#Creo un'applicazione telnet, la attacco a src4
set tel4 [new Application/Telnet]
$tel4 attach-agent $src4

#Creo un'applicazione telnet, la attacco a src5
set tel5 [new Application/Telnet]
$tel5 attach-agent $src5

$ns at 0.01 "$src9 start"
$ns at 0.15 "$ftp0 start"
$ns at 0.15 "$ftp1 start"
$ns at 0.15 "$ftp2 start"
$ns at 0.2 "$tel3 start"
$ns at 0.2 "$tel4 start"
$ns at 0.2 "$tel5 start"
$ns at 2.0 "$n10 join-group $rcv10 $group"
$ns at 2.0 "$n10 color green"
$ns at 2.0 "$n11 join-group $rcv11 $group"
$ns at 2.0 "$n11 color green"
$ns at 3.0 "finish"

$ns run








