50
SPTM -osnove ns2-

NS2 - osnove + primjeri

Embed Size (px)

Citation preview

Page 1: NS2 - osnove + primjeri

SPTM

-osnove ns2-

Napomena: Iskreno preporučavam korištenje programa Notepad++ za pisanje skripti, jer je prilagođen za razne programske jezike.

Page 2: NS2 - osnove + primjeri

KORIŠTENJE CYGWINA

• Pokretanje prozora za rad

Nakon klika na ikonicu Cygwina, u crni prozor ukucamo startxwin.bati time otvaramo bijeli komandni prozor za rad.

• Kretanje kroz foldere

Da bi saznali u kom folderu se nalazimo, u komandnom prozoru ukucamo naredbu (path of working directory)pwd

Da bi se vratili u nadfolder, koristimo naredbu (change directory go up)cd ..

Da bi vidjeli koje sve foldere i fileove imamo na raspolaganju u folderu u kome se trenutno nalazimo, koristimo naredbu (list)ls

Da bi ušli u neki folder koji se nalazi u trenutnom folderu koristimo naredbu (change directory go to)cd ime_foldera

• Pokretanje tcl skripte

Ovime pokrećemo tcl skriptu pod imenom test.tclns test.tcl

• Pokretanje awk skripte

Ovime pokrećemo awk skriptu pod imenom test.awk nad datotekom out.trawk –f test.awk out.tr

• Korištenje Gnuplota

Alat Gnuplot pokrećemo ukucavanjem u komandni prozor:gnuplot

Nakon toga otvara nam se Gnuplot interfejs. Ako želimo iscrtati dvodimenzionalnu krivu na osnovu rezultata u nekoj datoteci (npr. podaci.txt), pišemo sljedeće:plot "podaci.txt" 1:2 title "Naslov" with lines

"podaci.txt" – govori koju datoteku koristimo za crtanje1:2 – govori da kolonu 1 želimo koristiti na x, a kolonu 2 na y osititle "Naslov" – omogućava da grafik naslovimo nekim naslovomwith lines – povezuje iscrtane tačke (tj. (x,y) parove).

Da izađemo iz Gnuplota, ukucamo u komandni prozor:exit

Page 3: NS2 - osnove + primjeri

OSNOVNE TCL PROGRAMIRANJA

NOTA BENE! Cygwin zna biti osjetljiv na bilo kakvu nedosljednost u sintaksi, zato pazite da zagrade, razmaci, itd. budu na mjestu gdje trebaju biti.

• Pisanje komentara

# Ovo je komentar; komentar bi se trebao pisati u zasebnoj liniji

• Dodjeljivanje vrijednosti varijabli

set a 12# Ovime se varijabli a dodjeljuje vrijednost 12

• Dodjeljivanje vrijednosti jedne varijable drugoj varijabli

set b 3set x $b

# Ovime smo varijabli x dodijelili vrijednost koju ima varijabla b, tj x=3# Operator $ vraća vrijednost varijable nad kojom je upotrebljen

• Korištenje matematičkih operacija

set a 4set b 0set x [expr $a + $b]

# expr je komanda za formiranje matematičkog izraza# u ovom primjeru smo varijabli x dodijelili zbir vrijednosti varijabli a i b

• Kreiranje datoteke

set file_pointer [open file_name w]

# Ovime smo kreirali datoteku koja nosi naziv file_name,# te joj dodijelili pokazivač file_pointer# Preko pokazivača radimo sa datotekom, unutar skripte

• Pregled sadržaja datoteke

cat file_namehead file_nametail file_name

# Naredbom cat ispisujemo sadržaj cijele datoteke.# Naredbom head ispisujemo prvih deset redova datoteke.# Naredbom cat ispisujemo zadnjih deset redova datoteke.

• Ispis na ekran i upis u datoteku

Za ispis na ekran ili upis u datoteku koristimo naredbu puts, i to sljedeću sintaksu:

puts "___"puts $file_pointer "___"

# Prva komanda je za ispis na ekran, a druga za upis u datoteku.

Page 4: NS2 - osnove + primjeri

* Primjeri i finese:

set a 4set b 13

puts "Hello world!"puts "$a"puts "[expr $a + $b]"

# Ispis gore zadatog niza komandi će biti: # Hello world!# 4# 17

Pri pozivanju komande puts svaki put izlaz se ispisuje u novi red. Ukoliko ipak želimo da ispis bude u jednom redu, onda koristimo sintaksu

puts –nonewline "Nema "puts "nove linije"

# Na ekranu se ispisuje Nema nove linije

Napomena: U Tcl-u nije moguće naglasiti kojeg tipa je varijabla. Stoga moramo biti pažljivi ako radimo sa brojevima kako bi naglasili da li želimo da broj tretiramo kao integer ili double, što je ilustrirano na primjeru

puts "[expr 1/60]"puts "[expr 1.0/60.0]"

# Prva naredba ispisa će za rezultat dati 0, jer se 1 i 60 tretiraju kao integer# Druga naredba ispisa će za rezultat dati 0.016666666666666666, # jer se 1 i 60 tretiraju kao double

Ako želimo koristiti komandu puts kako bi vršili upisi u datoteku, to možemo učiniti na neki od sljedećih načina [za razmak od jednog tab-a koristi se \t]

set ptest [open test.txt w]puts $ptest "Decembar."

# Ovime smo napravili tekstualnu datoteku test.txt i u nju spremili tekst Decembar.

set ptest [open test.txt w]set x 11set y 15puts $ptest "x $x"puts $ptest "y\t$y"

# Ovime smo napravili tekstualnu datoteku test.txt i u nju spremili dvije linije:# ime varijable x i njenu vrijednost 11, razmaknute jednim space-om# ime varijable y i njenu vrijednost 15, razmaknute jednim tab-om, odnosno:x 11y 15

• Pokretanje unix komandi iz skripte

Ukoliko nakon izvršenja simulacije želimo da izvršimo neke komande nad rezultatima pokretanja skripte, a pri tome ne želimo da ih ručno unosimo u komandni prozor Cygwin-a, možemo zadati niz naredbi unutar same tcl skripte, a to činimo pomoću naredbe exec. Sintaksa je (pri čemu & na kraju čini da se komanda izvršava u pozadini).

exec komanda &

Page 5: NS2 - osnove + primjeri

Primjer:

set x 11set y 12set z 13set file1 [open test.txt w]puts $file1 "1 [expr $x + $x]"puts $file1 "2 [expr $x + $y]"puts $file1 "3 [expr $x + $z]"

exec xgraph test.txt &exec cat test.txt &

# Ovime smo napravili datoteku test.txt i u nju smjestili dvije kolone brojeva# sa prvom naredbom exec xgraph test.txt & pravimo grafik na osnovu datoteke# sa drugom naredbom exec cat test.txt & ispisujemo sadržaj datoteke

• IF petlja

Sintaksa za IF petlju je sljedeća:

if {uslov} { izvrši_komande } else { izvrši_komande}

U sekciji izvrši_komande možemo ugnijezditi i druge IF petlje. Operator jednakosti je ==, a operator nejednakosti !=.

Primjer:

set x 11set y [expr $x + 4]

if {$x != 7 && $x <= $y} {puts "Uslov ispunjen"} else {puts "Uslov nije ispunjen"

}

# Rezultat će biti ispis teksta Uslov ispunjen na ekranu.

• FOR petlja

Sintaksa za FOR petlju je sljedeća:

for { set i 0 } { uslov } { incr i } { izvrši_komande}

Osim inkrementiranja vrijednosti i (incr i), može se dekrementirati ili nad njim izvršiti bilo koja operacija.

Primjer:

for { set i 0} { $i < 4 } { incr i } puts "Vrijednost je $i"}

Page 6: NS2 - osnove + primjeri

• Kreiranje procedura

Procedure se kreiraju prema sljedećoj sintaksi:

# Kreiranje procedureproc ime_procedure { parametar1 parametar2 ... } {

global varijabla1 varijabla2 ...izvrši_komandereturn $nešto

}

# Pozivanje procedureime_procedure par1 par2 ...

Procedure mogu da primaju parametre, ali i ne moraju. Parametri mogu biti varijable, objekti ili datoteke. Promjena nad proslijeđenim parametrima unutar procedure ne mijenja stanje parametra van procedure. Ukoliko želimo suprotan učinak, trebamo te parametre proglasiti global.

Primjer:

# Kreiranje procedureproc procedura { x y } {

global a bset a 1set b 4puts "x+a = [expr $x + $a]"puts "y+b = [expr $y + $b]"

}

# Pozivanje procedureset x 4set y 5procedura $x $y

Page 7: NS2 - osnove + primjeri

POKRETANJE I ZAUSTAVLJANJE SIMULACIJE

Simulacijska skripta počinje definisanjem instance klase Simulator, tj. novog objekta (varijablu ns možemo nazvati i drugačije, ali je ovo konvencija):

set ns [new Simulator]

Rezultat simulacije trebaju biti podaci koje ćemo moći analizirati. Zbog toga je potrebno da imamo datoteke u koje će nam se spremati ti podaci, kako bi ih kasnije koristili. Za analizu simulacije koristimo trace datoteke, dok za vizualizaciju koristimo nam datoteke, a sintaksa za njihovo kreiranje je:

# Otvaramo trace fileset tracefile1 [open out.tr w]$ns trace-all $tracefile1

U prvoj liniji koda stvaramo izlaznu datoteku out.tr, naredbom open out.tr w, pri čemu w označava upis. Zatim postavljamo pokazivač tracefile1 na ovu datoteku naredbom set. U drugoj liniji koda pristupamo objektu ns i u njegovu varijablu trace-all (koja je atribut klase Simulator) upisujemo vrijednost koja odgovara vrijednosti pokazivača tracefile1. Na ovaj način smo učinili da se svi događaji u simulaciji prate, te upisuju u out.tr datoteku u određenom formatu.Analognu situaciju imamo za nam file:

# Otvaramo nam fileset namfile1 [open out.nam w]$ns namtrace-all $namfile1

Okončanje simulacije se definiše finish procedurom, čija je sintaksa:

# Definisanje finish procedureproc finish {} {

global ns tracefile1 namfile1$ns flush-traceclose $tracefile1close $namfile1exec nam out.nam &exit 0

}

Prva linija koda definiše proceduru sa imenom finish, koja ne prima parametre. Druga linija koda deklariše globalne varijable ns, tracefile1, namfile1, tj. objekat simulatora, pokazivač na trace datoteku i pokazivač na nam datoteku. Riječ global ukazuje na to da se služimo varijablama koje su deklarisane van same procedure.Treća linija koda poziva simulatorsku metodu flush-trace, kojom se datoteke out.nam i out.tr pune odgovarajućim sadržajem. Ova metoda predstavlja pražnjenje buffera, jer se podaci do tog trenutka drže u bufferu, a ne na HD.Četvrta i peta linija koda služe za zatvaranje datoteka out.tr i out.nam, koristeći se pripadajućim pokazivačima na te datoteke.Šesta linija koda - exec nam out.nam &, pokreće program za vizualizaciju. Ovo smo mogli učiniti kucanjem naredbe nam out.nam u komandnom prozoru, ali smo ranije rekli da nam komanda exec olakšava to na način da možemo iz same skripte pozivati eksterne komande.Zadnja linija koda – exit 0, završava aplikaciju i vraća vrijednost 0, koja se uzima kao pretpostavljena vrijednost za normalan završetak simulacije.

Nakon definicije samog scenarija simulacije, trebamo odrediti kada ćemo pozvati finish proceduru, tj. kada želimo okončati simulaciju, te trebamo napisati naredbu za pokretanje simulacije:

$ns at 125.0 "finish" $ns run

# Prvom linijom koda govorimo kako želimo da simulacija traje 125 sekundi# Drugom linijom koda pokrećemo simulaciju

Page 8: NS2 - osnove + primjeri

DEFINISANJE LINKOVA I ČVOROVA

Sintaksa za definisanje čvora je:

set n0 [$ns node]

Na ovaj način napravili smo čvor i dodijelili mu pokazivač n0. Ukoliko želimo u skripti pozivati na taj čvor, napisaćemo $n0.Dva čvora možemo povezati linkom, i sintaksa je sljedeća:

set n0 [$ns node]set n1 [$ns node]$ns duplex-link $n0 $n1 10Mb 10ms DropTail

U ovom primjeru smo čvorove $n0 i $n1 povezali bidirekcionim linkom čiji je kapacitet 10Mbps (u svakom smjeru) i kašnjenje usljed propagacije 10ms. U koliko želimo propagaciju samo u jednom smjeru, koristimo ključnu riječ simplex-link. Što se tiče ključne riječi DropTail, preko nje smo definirali način na koji želimo da se tretiraju paketi koji stignu u trenutku kada je buffer pun, tj. želimo da svi novopristigli paketi budu odbačeni, ukoliko je buffer pun. Alternativne opcije su RED(Random Early Discard), FQ(Fair Queueing), DRR(Deficit Round Robin), SFQ(Stochastic Fair Queueing), CBQ(priority + Round Robin).

Nekada je potrebno definisati i kapacitet buffera reda čekanja, a to činimo na sljedeći način:

$ns queue-limit $n0 $n1 20

Ovime smo buffer za red čekanja između linka n0-n1 ograničili na 20 paketa.

Page 9: NS2 - osnove + primjeri

AGENTI I APLIKACIJE

Nakon što smo definisali čvorove i linkove između njih, sljedeći logičan korak je pravljenje saobraćaja koji će se razmjenjivati između pojedinih čvorova. Da bi to postigli, trebamo definisati rutiranje (tj. izvore i odredišta), agente (protokole) i koje aplikacije koriste pojedine agente. Ovo su najkorišteniji:

Aplikacija Agent FTP TCPCBR UDP

Najprije definišemo agent između dva čvora, a zatim aplikaciju koja koristi taj agent.

FTP preko TCPTCP agent ćemo definišemo na sljedeći način:

set tcp1 [new Agent/TCP]

Analogno kao i u prethodnim slučajevima, tcp1 predstavlja pokazivač na TCP agent, pri čemu je TCP agent objekt u NS-u. Kako bi dodijelili formirani TCP agent nekom čvoru, pišemo:

set n0 [$ns node]$ns attach-agent $n0 $tcp1

Sada treba da definišemo ponašanje odredišnog čvora u komunikaciji. To činimo na način da odredišni čvor postavimo kao „ponor informacija“, tj. :

set sink1 [new Agent/TCPSink]

I pokazivač sink1 moramo dodijeliti nekom čvoru:

set n1 [$ns node]$ns attach-agent $n1 $sink1

Kako bi povezali čvorove $n0 i $n1, te ostvarili TCP prenos, pišemo sljedeće:

$ns connect $tcp1 $sink1

TCP agent ima mnogo parametara, koje možemo eksplicitno mijenjati. Npr., defaultna veličina TCP paketa je 1000 byte-a, što se može promijeniti na sljedeći način (postavljamo veličinu TCP paketa na 1233 byte-a):

$tcp1 set packetSize_ 1233

Također, pri vizualizaciji mreže korisno je vidjeti koji tok odgovara kojem paru čvorova. S tim u vezi, moguće je različitim tokovima dodijeliti različite boje pristupanjem atributu flow id:

$ns color 1 Blue$tcp1 set fid_ 1

U prvoj liniji koda, vrijednost 1 predstavlja vrijednost parametra flow id. Na ovaj način smo atributu fid_ dodijelili vrijednost 1, a za drugi tok ćemo dodijeliti neku drugu vrijednost. Vidimo da vrijednosti 1 odgovara plava boja.Prva linija koda, ustvari, dodjeljuje plavu boju tokovima koji spadaju u klasu 1 (što znači da možemo grupisati više tokova u jednu klasu, i da svi imaju istu boju; npr. u skripti možemo TCP konekcije označiti jednom bojom, a UDP drugom bojom), o čemu će biti govora u napomenama za NS-simple-trace skriptu.

Nakon definisanja TCP konekcije, potrebno je uspostaviti FTP preko nje, odnosno nakačiti agent na aplikaciju. Za FTP aplikaciju ćemo koristiti neki prikladan naziv pokazivačan, npr. ftp1:

set ftp1 [new Application/FTP]$ftp1 attach-agent $tcp1

Page 10: NS2 - osnove + primjeri

TCP podrazumijeva dvosmjernu komunikaciju, zbog vraćanja ACK-ova pri uspješnom slanju. U alatu za vizualizaciju ćemo primijetiti da su ACK-ovi iste boje kao i odgovarajući TCP tok, ali su mnogo kraći i idu u suprotnom smjeru.

CBR preko UDPKod UDP-a većinu stvari definišemo na analogan način kao kod TCP-a, pa ćemo samo pobrojati komande:set n0 [$ns node]set n1 [$ns node]

set udp1 [new Agent/UDP]$ns attach-agent $n0 $udp1

set null8 [new Agent/Null]$ns attach-agent $n1 $null8

$ns connect $udp1 $null8

$ns color 2 Red$udp set fid_ 2

Pošto se UDP znatno razlikuje od TCP-a, način na koji stvaramo saobraćaj je sljedeći:

set cbr1 [new Application/Traffic/CBR]$cbr attach-agent $udp1

Neki dodatni atributi kojima možemo pristupati su i:

$cbr set rate_ 0.1Mb# Podešavanje brzine generisanja paketa

$cbr set packetSize_ 100# Podešavanje veličine paketa

Page 11: NS2 - osnove + primjeri

DEFINISANJE DOGAĐAJA

Prilikom stvaranja našeg simulatora (naredbom set ns [new Simulator]) stvara se i planer događaja, u koji mi unosimo šta želimo da se desi, i kada. Novi red u listu događaja unosimo na način:

$ns at vrijeme događaj

Vrijeme se definiše u sekundama. Lista događaja se počinje izvršavati po pozivu $ns run, tj. pri pokretanju simulacije. Npr. ukoliko želimo pokrenuti i zaustaviti kreirani CBR i FTP saobraćaj, to činimo ovako:

$ns at 1.0 "$ftp start"$ns at 2.0 "$cbr start"$ns at 4.0 "$ftp stop"$ns at 5.0 "$cbr stop"

Ovime smo u drugoj sekundi pokrenuli, a u petoj zaustavili CBR saobraćaj, a FTP saobraćaj smo pokrenuli u prvoj sekundi i zaustavili u četvrtoj

Page 12: NS2 - osnove + primjeri

VIZUALIZACIJA SIMULACIJE (NAM – The Network Animator)

Neke od stvari koje možemo u NAM-u raditi su i sljedeće:

1) pozicioniranje čvorova odnosno linkova, npr. :

$ns duplex-link-op $n0 $n1 orient right-down$ns simplex-link $n2 $n3 orient right-up$ns simplex-link $n4 $n5 orient left

2) dodjeljivanje boja i oblika čvorovima, npr. :

$n0 color red$n0 shape box

Umjesto box može hexagon, circle, itd.

3) dodjeljivanje boja linkovima, npr. :

$ns duplex-link-op $n0 $n1 color "green"

4) ukoliko želimo posmatrati dužinu reda čekanja, npr.:

$ns simplex-link-op $n0 $n1 queuePos O.5

Page 13: NS2 - osnove + primjeri

LABORATORIJA 1

Na osnovu svega prethodno napisanog, možemo uspješno da uradimo ovu vježbu:

Page 14: NS2 - osnove + primjeri

# Pravimo simulator i dodjeljujemo mu pokazivac pod imenom nsset ns [new Simulator]

# Posto imamo dva toka – TCP i UDP, mozemo podesiti da se u animatoru# razlikuju po bojama; vrijednosti 1 odgovara plava, a vrijednosti 2 crvena boja$ns color 1 Blue$ns color 2 Red

# Otvaramo nam datoteku u koju cemo upisivati podatke bitne za simulacijuset nf [open out.nam w]$ns namtrace-all $nf

# Otvaramo trace datotekuset tf [open out.tr w]$ns trace-all $tf

# Kreiramo proceduru kojom se na ispravan nacin spremaju podaci # pri zavrsetku simulacijeproc finish {} { global ns nf tf $ns flush-trace

close $nf close $tf

exec nam out.nam & exit 0}

# Na slici imamo 4 cvoraset n0 [$ns node]set n1 [$ns node]set n2 [$ns node]set n3 [$ns node]

# Ovo su zadatkom definisani odnosi izmedju tih cvorova$ns duplex-link $n0 $n2 2Mb 10ms DropTail$ns duplex-link $n1 $n2 2Mb 10ms DropTail$ns duplex-link $n2 $n3 1.7Mb 20ms DropTail

# Receno je da je maksimalna duzina reda cekanja 10$ns queue-limit $n2 $n3 10

# Da bi u simulatoru imali isti raspored linkova kao na slici, pisemo sljedece$ns duplex-link-op $n0 $n2 orient right-down$ns duplex-link-op $n1 $n2 orient right-up$ns duplex-link-op $n2 $n3 orient right

# Za NAM – posmatranje duzine reda cekanja$ns duplex-link-op $n2 $n3 queuePos 0.5

# Postavljamo TCP konekciju, i kacimo FTPset tcp [new Agent/TCP]$ns attach-agent $n0 $tcp

set sink [new Agent/TCPSink]$ns attach-agent $n3 $sink

$ns connect $tcp $sink$tcp set fid_ 1

set ftp [new Application/FTP]$ftp attach-agent $tcp# Znamo da je defaultna vrijednost TCP paketa upravo 1kb,koji se trazi u zadatku

# Postavljamo UDP konekciju, i kacimo CBRset udp [new Agent/UDP]

Page 15: NS2 - osnove + primjeri

$ns attach-agent $n1 $udp

set null [new Agent/Null]$ns attach-agent $n3 $null

$ns connect $udp $null$udp set fid_ 2

set cbr [new Application/Traffic/CBR]$cbr attach-agent $udp

# Definisemo zadanu velicinu paketa i brzinu generisanja$cbr set packet_size_ 1000$cbr set rate_ 1Mb

# Zakazujemo tok saobracaja prema slici$ns at 0.1 "$cbr start"$ns at 1.0 "$ftp start"$ns at 4.0 "$ftp stop"$ns at 4.5 "$cbr stop"

# Pozivamo finish proceduru$ns at 5.0 "finish"

# Pokrecemo simulaciju$ns run

Page 16: NS2 - osnove + primjeri

NS SIMPLE TRACE

Pošto je NS-simple-trace skripta s kojom smo uvijek radili, samo će biti date kratke napomene šta je to drugačije kod nje u odnosu na ovu gore napisanu skriptu:

#Create a simulator objectset ns [new Simulator]

#Define different colors for data flows (for NAM)$ns color 1 Blue$ns color 2 Red

#Open the NAM trace fileset nf [open out.nam w]$ns namtrace-all $nf

#Open the Trace fileset tf [open out.tr w]$ns trace-all $tf

#Define a 'finish' procedureproc finish {} { global ns nf tf $ns flush-trace #Close the NAM trace file close $nf #Close the Trace file close $tf #Execute NAM on the trace file exec nam out.nam & exit 0}

#Create four nodesset n0 [$ns node]set n1 [$ns node]set n2 [$ns node]set n3 [$ns node]

#Create links between the nodes$ns duplex-link $n0 $n2 2Mb 10ms DropTail$ns duplex-link $n1 $n2 2Mb 10ms DropTail$ns duplex-link $n2 $n3 1.7Mb 20ms DropTail

#Set Queue Size of link (n2-n3) to 10$ns queue-limit $n2 $n3 10

#Give node position (for NAM)$ns duplex-link-op $n0 $n2 orient right-down$ns duplex-link-op $n1 $n2 orient right-up$ns duplex-link-op $n2 $n3 orient right

#Monitor the queue for link (n2-n3). (for NAM)$ns duplex-link-op $n2 $n3 queuePos 0.5

#Setup a TCP connectionset tcp [new Agent/TCP]$tcp set class_ 2# Ovime smo rekli da našu TCP konekciju želimo staviti svrstati u klasu/grupu 2.# To znači da sve atribute koje smo pridružili toj klasi prenose se i na $tcp.# Ranije u skripti je klasi 2 dodijeljena crvena boja, međutim, pogledajmo šta# se dešava par linija poslije

$ns attach-agent $n0 $tcpset sink [new Agent/TCPSink]$ns attach-agent $n3 $sink

Page 17: NS2 - osnove + primjeri

$ns connect $tcp $sink$tcp set fid_ 1# Ovdje eksplicitno naglašavamo toku želimo dodijeliti boju koja odgovara broju 1.# Dakle, mada je $tcp u klasi 2, boja će ipak biti plava, jer smo eksplicitno # promijenili parametar.

#Setup a FTP over TCP connectionset ftp [new Application/FTP]$ftp attach-agent $tcp$ftp set type_ FTP# Pristupamo eksplicitno atributu type_ kod ovog FTP objekta, i unosimo vrijednost # FTP. Ovo može biti korisno, kao prevencija greške, ukoliko imamo mnogo tokova pa # ih grupišemo u klase, i može se desiti da pridruživanjem toka nekoj klasi/grupi # slučajno promijenimo sam tip toka.

#Setup a UDP connectionset udp [new Agent/UDP]$ns attach-agent $n1 $udpset null [new Agent/Null]$ns attach-agent $n3 $null$ns connect $udp $null$udp set fid_ 2

#Setup a CBR over UDP connectionset cbr [new Application/Traffic/CBR]$cbr attach-agent $udp$cbr set type_ CBR# Pristupamo eksplicitno atributu type_ kod ovog CBR objekta, i unosimo vrijednost # CBR. Ovo može biti korisno, kao prevencija greške, ukoliko imamo mnogo tokova pa # ih grupišemo u klase, i može se desiti da pridruživanjem toka nekoj klasi/grupi # slučajno promijenimo sam tip toka.

$cbr set packet_size_ 1000$cbr set rate_ 1mb$cbr set random_ false# Atribut random_ je ustvari zastavica koja govori da li treba u komunikaciju# unijeti nasumičan šum. Ona je po defaultu false, tako da je ova linija koda# bila nepotrebna. Ako hoćemo unijeti šum, samo je postavimo na true.

#Schedule events for the CBR and FTP agents$ns at 0.1 "$cbr start"$ns at 1.0 "$ftp start"$ns at 4.0 "$ftp stop"$ns at 4.5 "$cbr stop"

#Detach tcp and sink agents (not really necessary)$ns at 4.5 "$ns detach-agent $n0 $tcp ; $ns detach-agent $n3 $sink"# Ovime se otklanja TCP konekcija iz mreže u trenutku 4.5. Nije potrebno činiti!

#Call the finish procedure after 5 seconds of simulation time$ns at 5.0 "finish"

#Print CBR packet size and intervalputs "CBR packet size = [$cbr set packet_size_]"puts "CBR interval = [$cbr set interval_]"# Ispisujemo na ekran dva parametra CBR konekcije: # veličinu paketa i vremena između transmisije.

#Run the simulation$ns run

Page 18: NS2 - osnove + primjeri

ANALIZIRANJE TRACE DATOTEKE

Ranije smo spomenuli trace datoteku, u kojoj se upisuju događaji koji su se desili u simulaciji. Bitni događaji se grupišu u 12 kolona, pa je defaultna struktura trace datoteke:

Značenje pojedinih polja je:

Međutim, podaci sami po sebi su beskorisni ukoliko ne postoji način da ih analiziramo. U svrhu analiziranja trace datoteka (tj. velikih tekstualnih datoteka) koristimo skriptni jezik awk. Ovaj skriptni jezik obrađuje red po red tekstualne datoteke. Korištenje awk-a ćemo vidjeti na dva primjera.

Page 19: NS2 - osnove + primjeri

LABORATORIJA 2

awk skripta:

BEGIN {tisipi=0cebeer=0

}

($1=="r" && $3==2 && $4==3 && $5=="tcp") {tisipi=tisipi+$6

}($1=="r" && $3==2 && $4==3 && $5=="cbr") {

cebeer=cebeer+$6}

END {print "TCP=" tisipiprint "CBR=" cebeerukupno=cebeer+tisipiprint "UKUPNO=" ukupnoprint "Postotak TCP=" tisipi/ukupno*100 print "Postotak CBR=" cebeer/ukupno*100

}

Ovu skriptu pokrećemo nad datotekom out.tr, koja je nastala kao rezultat pokretanja simulacijske skripte ns-simple-trace.tcl. Pretpostavimo da smo ovu awk skriptu sačuvali pod imenom prvi.awk. Naredba za pozivanje awk skripte nad tekstualnom datotekom out.tr je:awk –f prvi.awk out.tr

Analizirajmo skriptu! Vidimo da se awk skripta sastoji iz tri dijela:1) BEGIN – u ovom dijelu inicijaliziramo sve globalne varijable koje ćemo nadalje koristiti.

BEGIN {tisipi=0cebeer=0

} Ovime smo postavili dvije varijable – tisipi i cebeer na nulu. Mogli smo koristiti i alternativni zapis:BEGIN {

tisipicebeer

} jer awk sam postavlja varijable na nulu, ako nije drugačije naglašeno. U ove dvije varijable smještamo količinu TCP i CBR saobraćaja (broj byte-a).

2) TIJELO – u ovom dijelu pišemo koje operacije želimo da se vrše nad podacima. Tijelo se izvršava nad svakim redom posebno.

Nama treba količina saobraćaja TCP saobraćaja, pa pišemo sljedeći uslov i akciju kada je uslov ispunjen:

($1=="r" && $3==2 && $4==3 && $5=="tcp") {tisipi=tisipi+$6

}Imamo četiri uslova u prvom redu, koji su povezani znakom &&, što znači da moraju svi biti ispunjeni, pa pojasnimo te uslove:

Page 20: NS2 - osnove + primjeri

$1==“r“ – ako u prvoj koloni trace datoteke piše r; podsjetimo se iz strukture trace datoteke da je prva kolona oznaka događaja koji se desio paketu, te da r označava da je paket primljen

$3==2 – ako u trećoj koloni piše 2; treća kolona je izvorni čvor, a nama se u zadatku traži saobraćaj između čvora 2 i čvora 3

$4==3 – ako u četvrtoj koloni piše 3; četvrta kolona je odredišni čvor, a nama se u zadatku traži saobraćaj između čvora 2 i čvora 3

$5==tcp – ako u petoj koloni piše tcp; nama je potreban za prvi dio tcp saobraćaj

Kada su sva četiri uslova ispunjena, prelazi se na operaciju:tisipi=tisipi+$6Što znači da varijabli tisipi dodajemo vrijednost iz kolone 6 (za konkretno taj red), a kolona 6 nam je ustvari veličina paketa u bajtima.

Analogno tražimo i CBR saobraćaj:($1=="r" && $3==2 && $4==3 && $5=="cbr") {

cebeer=cebeer+$6}Znači, kada nađemo paket da je uredno primljen, da je razmijenjen izmešu drugog i trećeg čvora, te da je tipa cbr, dodajemo broj bajta tog paketa u ukupnu sumu.

3) END – u ovom dijelu definišemo šta želimo da radimo sa dobivenim informacijama.

Mi smo se odlučili da dobivene podatke iskoristimo na sljedeći način:END {

print "TCP=" tisipiIspisali smo koliko je byte-a TCP saobraćaja.

print "CBR=" cebeerIspisali smo koliko je byte-a TCP saobraćaja.

ukupno=cebeer+tisipiIzračunali smo koliko je ukupno saobraćaja ostvareno između čvorova 2 i 3.

print "UKUPNO=" ukupnoIspisali smo koliko je ukupno saobraćaja ostvareno.

print "Postotak TCP=" tisipi/ukupno*100 Izračunali smo, a potom ispisali postotak TCP saobraćaja.

print "Postotak CBR=" cebeer/ukupno*100 Izračunali smo, a potom ispisali postotak TCP saobraćaja.}

Nota bene: Kod awk skripti je jako bitno korištenje vitičastih zagrada! BEGIN i END su omeđeni zagradama, tj. BEGIN{} i END{}. Vidimo da kod uslova prvo ide uslov, pa onda operacije stavljamo u zagrade, tj. (uslov){komande}. Kod if petlje, ona treba biti omeđena zagradama, tj. {if(uslov){komande}}.

Page 21: NS2 - osnove + primjeri

awk skripta:

BEGIN {s=0

t1=0dt=0.1

} { if($1=="r" && $3==2 && $4==3) { if ($2-t1>dt) { print $2 " " (8*s/dt) > "protok.txt" s=0 t1=$2}else { s=s+$6}}}END {}

Ovu skriptu pokrećemo nad datotekom out.tr, koja je nastala kao rezultat pokretanja simulacijske skripte ns-simple-trace.tcl. Pretpostavimo da smo ovu awk skriptu sačuvali pod imenom drugi.awk. Naredba za pozivanje awk skripte nad tekstualnom datotekom out.tr je:awk –f drugi.awk out.tr

Analizirajmo skriptu!Da bi našli prosječan protok, činimo sljedeće: podijelimo vrijeme simulacije na kratake intervale; za svaki taj interval nađemo koliko je saobraćaj prošlo, saberemo i podijelimo sa širinom tog intervala. To smo realizovali na sljedeći način:

U BEGIN dijelu inicijaliziramo 3 varijable. U varijablu s ćemo smiještati količinu saobraćaja za jedan interval. Varijabla t1 predstavlja početak intervala, i dobivaće različite vrijednosti kako se interval bude mijenjao. Treća varijabla – dt=0.1 predstavlja širinu intervala, tj. želimo da posmatramo saobraćaj u intervalima od 0.1 sec.

U TIJELU nailazimo najprije na uslov:if($1=="r" && $3==2 && $4==3)Ovo znači da nas zanimaju samo primljeni paketi od čvora 2 ka čvoru 3.

Drugi uslov:{ if ($2-t1>dt) { print $2 " " (8*s/dt) > "protok.txt" s=0 t1=$2}govori da ako je razlika između vremena kada je paket primljen ($2 – kolona 2) i početka intervala (t1) veća od željene širine intervala (dt=0.1), tada zapisujemo u datoteku „protok.txt“ vrijednost kraja tog intervala (print $2), zatim razmak (" ") , a zatim količinu saobraćaja izraženu u bitima (8*s) i podijeljenu sa širinom intervala (dt). Poslije toga treba da poništimo brojač saobraćaja (s=0), te da vrijeme kada je zadnji paket primljen postavimo kao početak novog intervala (t1=$2).

Ukoliko ovaj uslov nije ispunjen, to znači da se još uvijek nalazimo u intervalu od 0.1 sec, te smo u potrazi za paketima koji prolazi u trenutnom intervalu, i kada ih nađemo, dodajemo ih sumi s:

Page 22: NS2 - osnove + primjeri

else { s=s+$6}Gdje je $6 veličina paketa u bajtima.

Rezultat pokretanja ove skripte nad datotekom out.tr će biti datoteka protok.txt, gdje će prva kolona predstavljati kraj intervala od 0.1 sec, a druga kolona broj bita koji su razmijenjeni u tom intervalu.

GNUPLOT

Gnuplot je alat koji nam omogućava grafički prikaz određenih rezultata. Za konkretan zadatak, gnuplot će nam iscrtati prosječan broj paketa u zavisnosti od vremena. Korištenje Gnuplota je detaljnije opisano u dijelu pod imenom Korištenje Cygwina, zato ćemo mi ovdje samo napisati niz komandi koje se odnose na zadatak:

gnuplotplot "protok.txt" using 1:2 title "Protok" with linesexit

Rezultat je ova slika:

Page 23: NS2 - osnove + primjeri

LABORATORIJA 3

awk skripta:

BEGIN {protok_dt = 1 # Interval usrednjavanja protoka (u sekundama)protok_t = 0protok_d = 0protok_uk = 0protok_br = 0

}

{ akcija = $1;vrijeme = $2;prema=$4velicina_paketa = $6;id_toka = $8;

if(akcija=="r" && id_toka == 1 && prema == 3) {protok_d += velicina_paketa*8;if ((vrijeme-protok_t) > protok_dt){

print vrijeme " " protok_d/protok_dt > "protok.txt"protok_uk += protok_d/protok_dtprotok_br += 1protok_t = vrijemeprotok_d = 0

} }}

END {print "Srednji protok: " protok_uk/protok_br " [bps]"

}Ovu skriptu pokrećemo nad datotekom out.tr, koja je nastala kao rezultat pokretanja simulacijske skripte ns-simple-trace.tcl. Pretpostavimo da smo ovu awk skriptu sačuvali pod imenom protok.awk. Naredba za pozivanje awk skripte nad tekstualnom datotekom out.tr je:awk –f protok.awk out.tr

Analizirajmo skriptu! BEGIN dio je dovoljno objašnjen samim komentarima.TIJELO počinje sljedećim blokom:

akcija = $1;vrijeme = $2;od = $3;prema = $4;tip = $5;velicina_paketa = $6;id_toka = $8;izvor = $9;odrediste = $10;br_sekvence = $11;id_paketa = $12;

Ovo ustvari samo dodjeljuje imena (pointere) pojedinim kolonama trace file-a:

Slijedi blog uslova:if(akcija=="r" && id_toka == 1 && prema==3) {

Page 24: NS2 - osnove + primjeri

protok_d += velicina_paketa*8;if ((vrijeme-protok_t) > protok_dt){

print vrijeme " " protok_d/protok_dt > "protok.txt"protok_uk += protok_d/protok_dtprotok_br += 1protok_t = vrijemeprotok_d = 0

} }Podsjetimo se još jednom – awk skripta analizira red-po-red datoteke!Prvi uslov znači da nas interesuju samo priljeni paketi iz toka 1, a destinacija je bila čvor 3. Ako je taj uslov ispunjen, dodajemo taj paket saobraćaju na posmatranom intervalu (predstavljenog varijablom protok_d). Množimo veličinu paketa sa 8, jer u trace datoteci veličina paketa je izražena u bajtima, a mi želimo da bude u bitima.Sljedeći uslov govori da se set nadalje definisanih akcija izvršava ukoliko je razlika između vremena pristizanja posmatranog paketa i početka tog intervala usrednjavanja veća od definisanog intervala usrednjavanja. Ako je to ispunjeno, najprije se u datoteku protok.txt upisuje vrijeme pristizanja paketa (kao kraj intervala usrednjavanja), razmak (" "), a zatim ukupan saobraćaj na tom intervalu podijeljen sa intervalom usrednjavanja (tj. usrednjen saobraćaj na intervalu).Nakon toga, tako usrednjen protok se dodaje ukupnom protoku (protok_uk), zatim se protok_br uvećava za jedan (ovim brojačem bilježimo koliko smo imali intervala dužine protok_dt u posmatranom vremenu razmjene paketa). Nakon toga, kao početak narednog intervala usrednjavanja postavljamo kraj prethodnog intervala (protok_t=vrijeme), te vraćamo sumu ukupnog saobraćaja na intervalu usrednjavanja na nulu (protok_d=0).END se sastoji iz samo jedne komande:print "Srednji protok: " protok_uk/protok_br " [bps]"Tj. ispisujemo srednji protok.Za grafički prikaz koristimo gnuplot, te u komandni prozor ukucavamo sljedeći niz naredbi:gnuplotplot "protok.txt" using 1:2 title "Protok" with linesexit

Primijetimo da smo awk skriptu protok.awk mogli uraditi na kraći način:

BEGIN {interval_usrednjavanja = 1pocetak_intervala = 0 protok_na_intervalu = 0 protok_ukupan = 0 broj_usrednjavanja = 0

}{

if($1=="r" && $8 == 1 && $4==3) {protok_na_intervalu += $6*8;if (($2-pocetak_intervala) > interval_usrednjavanja){

print $2 " " protok_na_intervalu/interval_usrednjavanja > "protok.txt"protok_ukupan += protok_na_intervalu/interval_usrednjavanjabroj_usrednjavanja += 1pocetak_intervala = $2protok_na_intervalu = 0}

}}END {

print "Srednji protok: " protok_ukupan/broj_usrednjavanja " [bps]"}

Page 25: NS2 - osnove + primjeri

awk skripta:

BEGIN {br_odbacenih = 0;br_poslanih = 0;

}

{ akcija = $1;vrijeme = $2;id_toka = $8;

if (id_toka ==1 && akcija =="d") {br_odbacenih++;print vrijeme " " br_odbacenih > "gubici.txt"

}if (id_toka==1 && akcija=="+") {

br_poslanih++;}

}

END {printf("Broj poslanih paketa: %d\nBroj izgubljenih paketa: %d\nGubici: %.2f %", br_poslanih, br_odbacenih, 100*br_odbacenih/br_poslanih);}

Neka detaljna analiza skripte nije potrebna. Ukoliko nam za tok jedan dođe paket sa oznakom "d" (dropped), to znači da je paket odbačen, i mi brojač odbačin paketa povećamo za 1. Ako paket ima oznaku "+", to znači da je poslan (ušao u red čekanja), te povećamo brojač poslanih paketa za 1. Na kraju ispisujemo broj poslanih paketa, broj izgubljeni paketa, te postotak izgubljenih. Primijetimo da tekst koji se ispisuje ide pod navodnicima, a nakon toga su pobrojane varijable koje treba ispisati u tekstu. Na mjestima gdje piše %d idu vrijednosti varijabli, redoslijedom kojim su naknadno nabrojane. Oznaka \n znači prelazak u novi red, a %.2f znači da želimo zaokruživanje na dvije decimale. Zadnji postotak za ispis postotka odbačenih.

Za grafički prikaz koristimo gnuplot, te u komandni prozor ukucavamo sljedeći niz naredbi:gnuplotplot "gubici.txt" using 1:2 title "Gubici" with linesexit

Page 26: NS2 - osnove + primjeri

awk skripta:

BEGIN {najveci_id_paketa = 0;

}

{ akcija = $1;vrijeme = $2;id_toka = $8;id_paketa = $12;

if (id_paketa > najveci_id_paketa)najveci_id_paketa = id_paketa;

if (id_toka == 1) {if (akcija == "r") {

krajnje_vrijeme[id_paketa] = vrijeme;}if (akcija == "+") {

pocetno_vrijeme[id_paketa] = vrijeme;}if (akcija == "d") {

krajnje_vrijeme[id_paketa] = pocetno_vrijeme[id_paketa] ;}

} }

END {for (id_paketa = 1; id_paketa <= najveci_id_paketa; id_paketa++) {

pocetak = pocetno_vrijeme[id_paketa];kraj = krajnje_vrijeme[id_paketa];trajanje_paketa = kraj - pocetak;ukupno+=trajanje_paketa;N++;if (trajanje_paketa!=0) printf("%f %f\n", pocetak, trajanje_paketa) >

"kasnjenje.txt";}printf("\nProsjecno kasnjenje: %f",ukupno/N);

}printf("\nSrednje kasnjenje: %f",ukupno/N);}

Na početku deklarišemo varijablu najveci_id_paketa. Pošto je pretpostavka da su paketi sa manjim id-om poslani ranije, ova varijabla će nam omogućiti da ustanovimo koji je zadnji paket poslan, jer ce on imati najveci id. Uslov:if (id_paketa > najveci_id_paketa)najveci_id_paketa = id_paketa;će pri nailasku na paket sa većim id-om (tj. paket koji je kasnije poslan) stari najveci_id_paketa zamijeniti novim. Kašnjenje paketa predstavlja razliku između vremena primanja paketa i vremena slanja. To su trenuci kada paket ima žig „+“ i žig „r“. Zbog toga kao početno vrijeme za određeni paket stavljamo vrijeme kada je paket imao žig +, a kao krajnje vrijeme stavljamo vrijeme kada je paket imao žig r. Odbačeni paketi imaju par (+,d), te moramo naći rješenje za njih. U END segmentu kao uslov upisivanja u datoteku kasnjenje.txt se postavlja da je trajanje paketa različito od nule. Ako želimo da odbačeni paketi ne budu upisani u ovu datoteku, trebamo samo podesiti da njihovo kašnjenje bude jednako nuli, tj. da početno vrijeme(+) i krajnje vrijeme(d) budu isti, što smo učinili uslovom:if (akcija == "d") {

krajnje_vrijeme[id_paketa] = pocetno_vrijeme[id_paketa] ;}

Page 27: NS2 - osnove + primjeri

Za grafički prikaz koristimo gnuplot, te u komandni prozor ukucavamo sljedeći niz naredbi:gnuplotplot "kasnjenje.txt" using 1:2 title "Kasnjenje" with linesexit

Page 28: NS2 - osnove + primjeri

awk skripta:

BEGIN {najveci_id_paketa = 0;

}

{akcija = $1;vrijeme = $2;od = $3;prema = $4;tip = $5;velicina_paketa = $6;id_toka = $8;izvor = $9;odrediste = $10;br_sekvence = $11;id_paketa = $12;

if (id_paketa > najveci_id_paketa)najveci_id_paketa = id_paketa;

#Zapis vremena prenosa paketaif (pocetno_vrijeme[id_paketa] == 0) {

# Zapis broja sekvencebr_sekvence_paketa[id_paketa] = br_sekvence;pocetno_vrijeme[id_paketa] = vrijeme;

}

#Zapis vremena prijema paketa za CBRif (id_toka == 1 && akcija != "d") {

if (akcija == "r") {krajnje_vrijeme[id_paketa] = vrijeme;

}} else {

krajnje_vrijeme[id_paketa] = -1;}

}

END {zadnji_br_sekvence = 0;zadnje_kasnjenje = 0;razlika_br_sekvence = 0;for (id_paketa = 0; id_paketa <= najveci_id_paketa; id_paketa++) {

pocetak = pocetno_vrijeme[id_paketa];kraj = krajnje_vrijeme[id_paketa];trajanje_paketa = kraj - pocetak;if (pocetak < kraj) {

razlika_br_sekvence = br_sekvence_paketa[id_paketa] - zadnji_br_sekvence;

razlika_kasnjenja = trajanje_paketa - zadnje_kasnjenje;if (razlika_br_sekvence <= 0) {

jitter = 0;} else {

jitter = razlika_kasnjenja/razlika_br_sekvence;}if (jitter<0) jitter=-jitter;printf("%f %f\n", pocetak, jitter) > "jitter.txt";zadnji_br_sekvence = br_sekvence_paketa[id_paketa];zadnje_kasnjenje = trajanje_paketa;

}}

}

Page 29: NS2 - osnove + primjeri

awk skripta:

BEGIN {najveci_id_paketa = 1077;J=0;Pr=0;

}

{akcija = $1;vrijeme = $2;od = $3;prema = $4;tip = $5;velicina_paketa = $6;id_toka = $8;izvor = $9;odrediste = $10;br_sekvence = $11;id_paketa = $12;

if (id_paketa > najveci_id_paketa)najveci_id_paketa = id_paketa;

#Zapis vremena prenosa paketaif (pocetno_vrijeme[id_paketa] == 0) {

# Zapis broja sekvencebr_sekvence_paketa[id_paketa] = br_sekvence;pocetno_vrijeme[id_paketa] = vrijeme;

}

#Zapis vremena prijema paketa za CBRif (id_toka == 1 && akcija != "d") {

if (akcija == "r") {krajnje_vrijeme[id_paketa] = vrijeme;

}} else {

krajnje_vrijeme[id_paketa] = -1;}

}

END {zadnji_br_sekvence = 0;zadnje_kasnjenje = 0;razlika_br_sekvence = 0;for (id_paketa = 0; id_paketa <= najveci_id_paketa; id_paketa++) {

pocetak = pocetno_vrijeme[id_paketa];kraj = krajnje_vrijeme[id_paketa];trajanje_paketa = kraj - pocetak;if (pocetak < kraj) {

razlika_br_sekvence = br_sekvence_paketa[id_paketa] - zadnji_br_sekvence;

razlika_kasnjenja = trajanje_paketa - zadnje_kasnjenje;if (razlika_br_sekvence <= 0) {

jitter = 0;} else {

jitter = razlika_kasnjenja/razlika_br_sekvence;}if (jitter<0) jitter=-jitter;J=Pr+(jitter-Pr)/16;Pr=J;

Page 30: NS2 - osnove + primjeri

printf("%f %f\n", pocetak, J) > "jitter3550.txt";zadnji_br_sekvence = br_sekvence_paketa[id_paketa];zadnje_kasnjenje = trajanje_paketa;

}}

}

Page 31: NS2 - osnove + primjeri

awk skripta:

BEGIN {najveci_id_paketa = 0;br_paketa=0;suma=0;srednje=0;s=0;

}

{ akcija = $1;vrijeme = $2;od = $3;prema = $4;tip = $5;velicina_paketa = $6;id_toka = $8;izvor = $9;odrediste = $10;br_sekvence = $11;id_paketa = $12;

if (id_paketa > najveci_id_paketa)najveci_id_paketa = id_paketa;

if (pocetno_vrijeme[id_paketa] == 0) pocetno_vrijeme[id_paketa] = vrijeme;

if (id_toka == 2 && akcija != "d") {if (akcija == "r") {

br_paketa++;krajnje_vrijeme[id_paketa] = vrijeme;trajanje[id_paketa]=krajnje_vrijeme[id_paketa]-

pocetno_vrijeme[id_paketa];suma=suma+trajanje[id_paketa];

}} else {

krajnje_vrijeme[id_paketa] = -1;}

}

END {srednje=suma/br_paketa;for (id_paketa = 0; id_paketa <= najveci_id_paketa; id_paketa++) {

trajanje_paketa = trajanje[id_paketa];pocetak=pocetno_vrijeme[id_paketa];kraj=krajnje_vrijeme[id_paketa];if (pocetak < kraj) {

s=s+(trajanje_paketa-srednje)^2;}

}RTT=sqrt((1/br_paketa)*s);printf("RTT: %f\n", RTT) > "RTT.txt";

}

Page 32: NS2 - osnove + primjeri

ALATI ZA MONITORING SAOBRAĆAJA

U NS-u postoji nekoliko alata (objekata) koji nam omogućavaju da pratimo saobraćaj, te da bilježimo neke bitne statističke parametre vezane za taj saobraćaj. Ovdje ćemo navesti neke od njih, te demonstrirati kako ih možemo koristiti.

LossMonitor objekat

Page 33: NS2 - osnove + primjeri

GENERATORI SAOBRAĆAJA

Nekada je poželjno da naši izvori paketa transmisiju vrše na način koji mi želimo. NS2 nam omogućava da generatore saobraćaja podesimo na dva moguća načina:

- da se koristimo generatorom prometa koji oponaša neku poznatu raspodjelu- da se koristimo generatorom prometa koji oponaša snimljeni saobraćaj iz neke

mreže.Najprije ćemo razmotriti tri najčešća generatora sa poznatim raspodjelama, a potom ćemo vidjeti kako možemo da iskoristimo ranije snimljeni saobraćaj iz stvarne mreže u svrhu generisanja paketa u simulatoru.

Generatori sa eksponencijalnom raspodjelom

Poziva se naredbom:set generator [new Application/Traffic/Exponential]

Na ovaj način kreiramo ON/OFF promet. Za vrijeme ON (burst) perioda paketi se generišu konstantnom brzinom, dok za vrijeme OFF (idle) perioda paketi se ne generišu. Vremena burst i idle se ponašaju po eksponencijalnoj raspodjeli.Parametre koje možemo (ali ne moramo) podešavati su:PacketSize_ (veličina paketa)burst_time_ (prosječna dužina trajanja bursta)idle_time (prosječna dužina trajanja idlea)rate_ (brzina slanja paketa)

Uzmimo za primjer jednu mrežu u kojoj imamo samo dva čvora (n0 i n1), te generator eksponencijalnog saobraćaja stavimo na n0:

set ns [new Simulator]

set nf [open out.nam w]set tf [open out.tr w]$ns namtrace-all $nf$ns trace-all $tf

proc finish {} {global ns nf tf$ns flush-traceclose $nfclose $tfexec nam out.nam &exit 0

}set n0 [$ns node]set n1 [$ns node]$ns duplex-link $n0 $n1 2Mb 10ms DropTail$ns queue-limit $n0 $n1 10

set udp [new Agent/UDP]set null [new Agent/Null]$ns attach-agent $n0 $udp$ns attach-agent $n1 $null$ns connect $udp $null

set generator [new Application/Traffic/Exponential]$generator attach-agent $udp$generator set packetSize_ 210$generator set burst_time_ 500ms$generator set idle_time_ 500ms$generator set rate_ 100k

$ns at 0.1 "$generator start"$ns at 3.1 "$generator stop"$ns at 3.5 "finish"

$ns run

Page 34: NS2 - osnove + primjeri

Generatori sa Pareto raspodjelom

Poziva se naredbom:set generator [new Application/Traffic/Pareto]

Na ovaj način kreiramo ON/OFF promet. Za vrijeme ON (burst) perioda paketi se generišu konstantnom brzinom, dok za vrijeme OFF (idle) perioda paketi se ne generišu. Vremena burst i idle se ponašaju po Pareto raspodjeli.Parametre koje možemo(ali ne moramo) podešavati su:PacketSize_ (veličina paketa)burst_time_ (prosječna dužina trajanja bursta)idle_time (prosječna dužina trajanja idlea)rate_ (brzina slanja paketa)shape_ (shape parametar Pareto distribucije)

Uzmimo za primjer jednu mrežu u kojoj imamo samo dva čvora (n0 i n1), te generator Pareto saobraćaja stavimo na n0:

set ns [new Simulator]

set nf [open out.nam w]set tf [open out.tr w]$ns namtrace-all $nf$ns trace-all $tf

proc finish {} {global ns nf tf$ns flush-traceclose $nfclose $tfexec nam out.nam &exit 0

}

set n0 [$ns node]set n1 [$ns node]$ns duplex-link $n0 $n1 2Mb 10ms DropTail$ns queue-limit $n0 $n1 10

set udp [new Agent/UDP]set null [new Agent/Null]$ns attach-agent $n0 $udp$ns attach-agent $n1 $null$ns connect $udp $null

set generator [new Application/Traffic/Pareto]$generator attach-agent $udp$generator set packetSize_ 210$generator set burst_time_ 500ms$generator set idle_time_ 500ms$generator set rate_ 200k$generator set shape_ 1.5

$ns at 0.1 "$generator start"$ns at 3.1 "$generator stop"$ns at 3.5 "finish"

$ns run

Page 35: NS2 - osnove + primjeri

Generatori sa konstantnom brzinom slanja

Poziva se naredbom:set generator [new Application/Traffic/CBR]

O ovom generatoru je bilo riječi u dijelu kada smo objašnjavali UDP saobraćaj. Ovaj generator pakete generiše konstantnom brzinom (CBR – Constant Bit Rate).

Parametre koje možemo(ali ne moramo) podešavati su:PacketSize_ (veličina paketa)rate_ (brzina slanja paketa)interval_ (interval između paketa)random_ (slučajni šum u vremenu transmisije)maxpkts_ (maksimalan broj paketa za slanje)

Uzmimo za primjer jednu mrežu u kojoj imamo samo dva čvora (n0 i n1), te generator CBR saobraćaja stavimo na n0:

set ns [new Simulator]

set nf [open out.nam w]set tf [open out.tr w]$ns namtrace-all $nf$ns trace-all $tf

proc finish {} {global ns nf tf$ns flush-traceclose $nfclose $tfexec nam out.nam &exit 0

}

set n0 [$ns node]set n1 [$ns node]$ns duplex-link $n0 $n1 2Mb 10ms DropTail$ns queue-limit $n0 $n1 10

set udp [new Agent/UDP]set null [new Agent/Null]$ns attach-agent $n0 $udp$ns attach-agent $n1 $null$ns connect $udp $null

set generator [new Application/Traffic/CBR]$generator attach-agent $udp$generator set packetSize_ 210$generator set rate_ 100k$generator set interval_ 10ms$generator set random_ false$generator set maxpkts_ 20

$ns at 0.0 "$generator start"$ns at 3.0 "$generator stop"$ns at 3.5 "finish"

$ns run

Page 36: NS2 - osnove + primjeri

PRAVLJENJE GENERATORA SAOBRAĆAJA NA OSNOVU UZORKA SNIMLJENOG SAOBRAĆAJA

U većini slučaja, saobraćaj u mreži se ne ponaša baš poput neke raspodjele. Stoga je korisno simulaciju testirati stavljanjem realnog saobraćaja između pojedinih čvorova, jer će nam to dati mnogo realniju sliku o ponašanju naše mreže. NS2 nam to i omogućava:

Generator sa uzorkom saobraćajaPoziva se naredbom:set generator [new Application/Traffic/Trace]

Ovaj generator formira saobraćaj na osnovu trace file-a koji mu damo (a nastao je snimanjem određenog prometa), tj. oponaša ga. Taj trace file mora da sadrži dvije (32-bitne) kolone – prva kolona predstavlja međudolazna vremena (u mikrosekundama), a druga kolona veličinu paketa (u bajtima).Uzmimo za primjer jednu mrežu u kojoj imamo samo dva čvora (n0 i n1), te generator saobraćaja na osnovu trace datoteke „gen.dat“ stavimo na n0:

set ns [new Simulator]

set nf [open out.nam w]set tf [open out.tr w]$ns namtrace-all $nf$ns trace-all $tf

proc finish {} {global ns nf tf$ns flush-traceclose $nfclose $tfexec nam out.nam &exit 0

}

set n0 [$ns node]set n1 [$ns node]$ns duplex-link $n0 $n1 2Mb 10ms DropTail$ns queue-limit $n0 $n1 10

set udp [new Agent/UDP]set null [new Agent/Null]$ns attach-agent $n0 $udp$ns attach-agent $n1 $null$ns connect $udp $null

Tracefile set debug_ 0# Kod mene izbacuje grešku "Tracefile set debug_ 0"# i to rješavam na ovaj način

set trace [new Tracefile] set uzorak gen.dat $trace filename $uzorak# Otvaramo novu trace datoteku 'trace'.# Stavljamo pointer 'uzorak' na datoteku u kojoj je uzorak saobraćaja.# Poistovjećujemo trace file sa uzorkom saobraćaja.

set generator [new Application/Traffic/Trace] $generator attach-tracefile $trace $generator attach-agent $udp

$ns at 0.1 "$generator start"$ns at 3.1 "$generator stop"$ns at 3.5 "finish"

$ns run

Page 37: NS2 - osnove + primjeri

Prilagođavanje snimljenog saobraćaja za NS2 simulaciju

Pod izrazom „emulacija snimljenog saobraćaja“ podrazumijeva se prilagođavanje zapisa nekog uzorka saobraćaja na način na koji će ga NS2 moći protumačiti. Kada smo pričali o generatoru sa uzorkom saobraćaja, spominjali smo datoteku „gen.dat“ iz koje je NS2 „čitao“ podatke o snimljenom saobraćaju. Sada ćemo objasniti metod kako da napravimo tu datoteku. Pretpostavljamo da za snimanje saobraćaja koristimo Wireshark. Ovdje će biti prikazan način na koji sam ja pripremala saobraćaj za svoju prvu zadaću (bilo je potrebno izdvojiti najaktivniji UDP saobraćaj):

Izdvajanje saobraćaja u Wiresharku:1. Otvoriti snimak30.pcap dokument u Wiresharku.2. Ići: Statistics → Conversation List → UDP (IPv4 & Ipv6)3. Kliknuti natpis Bytes da ide u rastućem redoslijedu.4. Vidjeti u koloni Bytes koja je vrijednost najveća, a da pri tome postoji konverzacija u oba

smjera, tj. da jedno od polja Packets A->B i Packets A<-B nije nula. 5. Izabrati kolonu koju želimo i kliknuti desni klik: Apply as Filter → Selected → (A→B)

Moja izdvojena konverzacija je između:A : 92.36.214.98B : 216.234.69.15

6. Izvršiti podešavanja prikaza liste: Edit → Preferences → User Interface → Columns 7. Svaku stavku ponuđenog prikaza izbrisati sa Remove.8. Sa Add dodati kolone koje želimo:

Vel_pak, za koju odaberemo tip Packet length (bytes)Vr_medj, za koju odaberemo tip Delta time!Važno je da za imena kolona uzmete kratka imena koja ne sadrže slova koja nisu u enengleskom alfabetu, jer u suprotnom zna praviti probleme.

9. Idemo na Apply, pa na OK.10. Listu veličina paketa i vremena međudolazaka treba eksportovati u neku datoteku (npr.

generatorAB.txt): File → Export → File → generatorAB.txtNapomena!U prozoru Wireshark: Export File u polju Packet Range izabrati Displayed, a u polju Packet Format izabrati Packet summary line.

11. Otvoriti datoteku generatorAB.txt u Notepadu i izbrisati prvi red (gdje pišu nazivi kolona: Vel_pak i Vr_medj).

Podešavanje datoteke za format prihvatljiv u ns-2 i emulacija

1. Datoteka sa listom paketa i međudolaznih vremena (generatorAB.txt) je neophodno pretvoriti u binarno formatiranu 32-bitnu trace datoteku, kako bi je ns-2 simulator mogao interpretirati. Za konverziju datoteke potrebno je koristiti gotovu TCL skriptu konverter.tcl. Skriptu prilagođavamo izabranom toku:- za tok AB konverter.tcl otvara skriptu generatorAB.txt, te je potrebno modifikovati sljedeće linije koda:

set original_file_name generatorAB.txtset trace_file_name gen.dat

# Skripta konerter.tcl# Generisanje trace fajla sa binarnim zapisom: set original_file_name generatorAB.txt set original_file_id [open $original_file_name r]

set trace_file_name gen.dat set trace_file_id [open $trace_file_name w]

fconfigure $trace_file_id -encoding binary

Page 38: NS2 - osnove + primjeri

set vrijeme 0 set velicina 0

while {[eof $original_file_id] == 0} { gets $original_file_id current_line if {[string length $current_line] == 0 || [string compare [string index $current_line 0] "#"] == 0} { continue }

scan $current_line "%d%f" velicina vrijeme if {$velicina == 0} {continue} set vrijeme1 [expr 1000000*($vrijeme)] set vrijeme [expr int ($vrijeme1)]

set vrijeme [expr $vrijeme & 0xFFFFFFFF] set velicina [expr $velicina & 0xFFFFFFFF] puts -nonewline $trace_file_id [binary format "II" $vrijeme $velicina] } close $trace_file_id close $original_file_id

2. Skriptu konverter.tcl, te datoteku generatorAB.txt prebacujemo u radni folder Cygwina, zatim pokrećemo komandu:ns konverterAB.tclRezultat ove naredbe je datoteka gen.dat. Dobijena datoteka će se koristiti za generisanje paketa u ns-2 simulatoru.

Page 39: NS2 - osnove + primjeri

DINAMIČKO RUTIRANJE

Dinamičko rutiranje je „intelignetno“ svojstvo mreže, kada u slučaju pada linka ona sama (tj. njeni čvorovi/routeri) odlučuje da preusmjeri saobraćaj preko alternativnog puta. U NS2 simulatoru možemo da napravimo takvu mrežu. Objasnimo korištenje ove pogodnosti na primjeru:

Pretpostavimo da imamo datu mrežu sa slike:

Želimo između čvorova n0 i n5 uspostaviti UDP saobraćaj, koji će trajati 6 sekundi – od početka do kraja siulacije. Međutim, želimo da u intervalu 1.0-4.5 sec padne link između čvorova n1 i n4. To naznačavamo na sljedeći načina:$ns rtmodel-at 1.0 down $n1 $n4$ns rtmodel-at 4.5 up $n1 $n4U tom intervalu želimo da se uspostavi dinamičko rutiranje. To činimo naredbom:$ns rtproto DV

Skripta za ovaj scenario izgleda ovako:

set ns [new Simulator]

set nf [open out.nam w]$ns namtrace-all $nf

set tf [open out.tr w]$ns trace-all $tfproc finish {} { global ns nf tf $ns flush-trace close $nf close $tf exec nam out.nam & exit 0}

set n0 [$ns node]set n1 [$ns node]set n2 [$ns node]set n3 [$ns node]set n4 [$ns node]set n5 [$ns node]

$ns duplex-link $n0 $n1 2Mb 10ms DropTail$ns duplex-link $n1 $n2 2Mb 10ms DropTail$ns duplex-link $n2 $n3 2Mb 10ms DropTail$ns duplex-link $n1 $n4 2Mb 10ms DropTail$ns duplex-link $n4 $n5 2Mb 10ms DropTail$ns duplex-link $n3 $n5 2Mb 10ms DropTail

$ns duplex-link-op $n0 $n1 orient right

Page 40: NS2 - osnove + primjeri

$ns duplex-link-op $n1 $n2 orient right$ns duplex-link-op $n2 $n3 orient left-up$ns duplex-link-op $n3 $n5 orient left-up$ns duplex-link-op $n1 $n4 orient left-up$ns duplex-link-op $n4 $n5 orient right-up

set udp [new Agent/UDP]$ns attach-agent $n0 $udpset null [new Agent/Null]$ns attach-agent $n5 $null$ns connect $udp $nullset cbr [new Application/Traffic/CBR]$cbr attach-agent $udp

$ns rtproto DV

$ns rtmodel-at 1.0 down $n1 $n4$ns rtmodel-at 4.5 up $n1 $n4

$ns at 0.0 "$cbr start"$ns at 6.0 "$cbr stop"

$ns at 6.0 "finish"

$ns run