
4 Pregled koncepta
4.1 Ključne apstrakcije
4.1.1 Node (Čvor)
4.1.2 Application (Aplikacija)
4.1.3 Channel (Kanal)
4.1.4 Net Device (Mrežni uređaj)
4.1.5 Topološki pomagači
4.2 Prvi skript ns-3
4.2.1 Boilerplate kod
4.2.2 Priključni moduli
4.2.3 Namespace ns3
4.2.4 Evidentiranje
4.2.5 Glavna funkcija
4.2.6 Korišćenje topoloških pomagača
4.2.7 Korišćenje Aplikacije
4.2.8 Simulator
4.2.9 Sakupljanje vašeg scenarija
4.3 ns-3 Izvorni kod
Glava 4
Pregled koncepta
Prvo što trebamo učiniti prije nego što počnemo učiti ili pisati kod ns-3 je objasniti nekoliko osnovnih pojmova i apstrakcija u sistemu. Mnogima od ovoga može se činiti očigledno, ali preporučujemo da odvojite vreme za čitanje ovog odeljka kako biste bili sigurni da započinjete na čvrstoj osnovi.
4.1 Ključne apstrakcije
U ovom odeljku ćemo razmotriti neke termine koji se obično koriste u mrežama, ali imaju posebno značenje u ns-3.
4.1.1 Node (Čvor)
U internetskom žargonu, računar koji je povezan na mrežu naziva se host ili ponekad krajnji sistem. S obzirom na to da je ns-3 simulator mreže, a ne simulator Interneta, namerno ne koristimo termin host, jer je to blisko povezano sa Internetom i njegovim protokolima. Umesto toga, koristimo opštiji termin koji koriste i drugi simulatori, a koji potiče iz teorije grafova - čvor (čvor).
U ns-3, osnovna apstrakcija računarskog uređaja naziva se čvor. Ova apstrakcija je predstavljena u C++ klasom Node. Klasa NodeNode (čvor) pruža metode za upravljanje predstavama računarskih uređaja u simulacijama.
Trebate razumeti Node kao računar kojem dodajete funkcionalnost. Dodavat ćete takve stvari kao što su aplikacije, protokoli i periferne kartice s drajverima koji omogućuju računaru da obavlja korisni rad. Koristimo istu osnovnu modelu u ns-3.
4.1.2 Application (Aplikacija)
Općenito, računalni softver se dijeli u dvije široke kategorije. Sustavski softver organizira različite računalne resurse poput memorije, procesorskih ciklusa, diska, mreže itd. prema određenom računalnom modelu. Sustavski softver obično ne koristi te resurse za izvršavanje zadatka koji izravno pridonosi korisniku. Korisnik obično pokreće aplikaciju kako bi postigao određeni cilj, koja zatim dobiva i koristi resurse kojima upravlja sustavski softver.
Često se granica između sustavnog i aplikativnog softvera povlači pri promjeni razine privilegija koja se događa u sustavnim pozivima operacijskog sustava. U ns-3 ne postoji stvarna koncepcija operacijskog sustava, a samim time niti koncepti razina privilegija ili sustavnih poziva. Međutim, imamo ideju o aplikacijama. Baš kao u 'stvarnom svijetu', aplikativni programi rade na računalima za izvršavanje zadataka; ns-3 aplikacije rade na čvorovima ns-3 za upravljanje simulacijama u simuliranom svijetu.
U ns-3 osnovna apstrakcija za korisnički program koji generira neku aktivnost za modeliranje je aplikacija. Ova apstrakcija predstavljena je u C++ klasi Application. Klasa Application pruža metode za upravljanje prikazima naših verzija aplikacija razine korisnika u simulacijama. Od programera se očekuje da će, kako bi stvorili nove aplikacije, specijalizirati klasu Application u smislu objektno orijentiranog programiranja. U ovom vodiču koristit ćemo specijalizacije klase Application, nazvane UdpEchoClientApplication i UdpEchoServerApplication. Kao što se i očekivalo, ove aplikacije čine skup klijent/server aplikacija koje se koriste za generiranje i echo simulaciju mrežnih paketa.
4.1.3 Channel (Kanal)
U stvarnom svijetu možete povezati računalo s mrežom. Često se okruženja kroz koja se podaci prenose u tim mrežama nazivaju kanalima. Kada priključite Ethernet kabel u utičnicu na zidu, povezujete računalo s Ethernet komunikacijskim kanalom. U simuliranom svijetu ns-3, čvor se povezuje s objektom koji predstavlja komunikacijski kanal. Ovdje se osnovna apstrakcija komunikacijske podmreže naziva kanal i predstavlja se C++ klasom Channel.
Klasa ChannelChannel pruža metode za upravljanje interakcijom objekata podmreže i povezivanje s njima. Kanali se također mogu specijalizirati od strane programera u smislu objektno-orijentiranog programiranja. Specijalizacija kanala može modelirati nešto jednostavno poput žice. Specijalizirani kanal može modelirati i složenije stvari poput velikog Ethernet prekidača ili trodimenzionalnog prostora punog prepreka u slučaju bežičnih mreža.
U ovom ćemo vodiču koristiti specijalizirane verzije kanala pod nazivom CsmaChannelCsmaChannel, PointToPointChannelPointToPointChannel i WifiChannelWifiChannel. CsmaChannel, na primjer, modelira verziju komunikacijske podmreže koja implementira komunikacijsko okruženje višestrukog pristupa s kontrolom nositelja. To nam daje funkcionalnost sličnu Ethernetu.
4.1.4 Net Device (Mrežni uređaj)
Ranije je bilo tako da ako želite povezati računalo s mrežom, trebali ste kupiti određeni mrežni kabel i hardverski uređaj, poznat (u terminologiji PC-a) kao perifernu ploču, koju je trebalo instalirati u računalo. Ako su na perifernoj ploči implementirane neke mrežne funkcije, nazivale su se mrežnim sučeljima ili mrežnim karticama. Danas se većina računala isporučuje s integriranim hardverom mrežnog sučelja, a korisnici ih ne vide kao odvojene uređaje.
Mrežna kartica neće raditi bez programskog upravljačkog programa koji upravlja njezinim hardverom. U Unixu (ili Linuxu), dio perifernog hardvera klasificira se kao uređaj. Uređaji se upravljaju pomoću upravljačkih programa uređaja, a mrežni uređaji (NIC) upravljaju se korištenjem upravljačkih programa mrežnih uređaja (network device drivers) i imaju zajednički naziv mrežni uređaji (net devices). U Unixu i Linuxu mrežnim uređajima pristupate po imenima poput eth0.
U ns-3, apstrakcija mrežnog uređaja obuhvaća i programski upravljač i modeliranu opremu. Tijekom simulacije, mrežni uređaj je 'postavljen' unutar čvora kako bi mu omogućio komunikaciju s drugim čvorovima putem kanala. Baš kao u stvarnom računalu, čvor se može povezati s više kanala putem više uređaja Mrežni uređaji.
Mrežna apstrakcija uređaja predstavljena je C++ klasom Mrežni uređaj. Klasa Mrežni uređaj pruža metode za upravljanje vezama s objektima Čvor i Kanal; i može biti specijalizirana od strane programera u smislu objektno-orijentiranog programiranja. U ovom vodiču koristit ćemo nekoliko specijaliziranih verzija Mrežnog uređaja pod nazivima CsmaMrežniUređaj, PointToPointMrežniUređaj i WifiMrežniUređaj. Baš kao što je Ethernet mrežni adapter namijenjen za rad s Ethernet, CsmaMrežniUređaj koji je namijenjen za rad s CsmaChannel, PointToPointMrežniUređaj koji je namijenjen za rad s PointToPointKanal, već WifiMrežniUređaj — namijenjen za rad s WifiKanal.
4.1.5 Topološki pomagači
U stvarnoj mreži naći ćete domaćinske računare s dodanim (ili ugrađenim) mrežnim karticama. U ns-3 bi rekli da ćete vidjeti čvorove s priključenim Mrežnim uređajima. U velikoj simuliranoj mreži morat ćete organizirati veze između mnogih objekata Node, Mrežni uređaj i Kanal.
Budući da je povezivanje Mrežnih uređaja s čvorovima, Mrežnih uređaja s kanalima, dodjeljivanje IP adresa itd. u ns-3 opći zadatak, kako bismo to pojednostavili, nudimo takozvane topološke pomoćne alate. Na primjer, za stvaranje Mrežnog uređaja potrebno je izvršiti brojne operacije unutar ns-3, dodati MAC adresu, postaviti ovaj mrežni uređaj u Čvor, konfigurirati stog protokola čvora, a zatim povezati Mrežni uređaj s Kanalom. Potrebno je još više operacija za povezivanje više uređaja na višepunktne kanale, a zatim povezivanje zasebnih mreža u objedinjenu mrežu (Internetworks). Pružamo pomoćne objekte topologije koji radi vaše udobnosti objedinjuju ove brojne operacije u jednostavnu modela za korištenje.
4.2 Prvi skript ns-3
Ako ste instalirali sustav kao što je predloženo iznad, imat ćete ns-3 verziju u direktoriju pod nazivom repos u vašem home direktoriju. Idite u direktorij release
Ako nemate tu direktorij, to znači da niste naveli izlaznu direktorij prilikom kompilacije release verzije ns‑3. Izvršite kompilaciju ovako:
$ ./waf configure —build-profile=release —out=build/release,
$ ./waf build
tamo biste trebali vidjeti strukturu direktorija sličnu sljedećem:
AUTHORS examples scratch utils waf.bat*
bindings LICENSE src utils.py waf-tools
build ns3 test.py* utils.pyc wscript
CHANGES.html README testpy-output VERSION wutils.py
doc RELEASE_NOTES testpy.supp waf* wutils.pycPređite u direktorij examples/tutorial. Trebali biste vidjeti datoteku s imenom first.cc. To je skripta koja će stvoriti jednostavnu točku-točkastu vezu između dva čvora i prenijeti jedan paket između njih. Pogledajmo tu skriptu red po red, za to otvorite first.cc u svom omiljenom uredu.
4.2.1 Boilerplate kod
Prvi redak u datoteci je redak načina rada urednika emacs. On govori emacsu o konvencijama formatiranja (stil kodiranja) koje ćemo koristiti u našem izvoru kodu.
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */Ovo je uvijek prilično sporno pitanje, stoga trebamo razjasniti to odmah kako bismo ga uklonili s puta. Projekt ns‑3, kao i većina velikih projekata, prihvatio je stil kodiranja koji mora biti usklađen s cijelim dostavljenim kodom. Ako želite doprinijeti svojim kodom projektu, na kraju ćete se morati pridržavati ns‑3 standarda kodiranja, kako je opisano u datoteci doc/codingstd.txt ili prikazano na web stranici projekta: .
Preporučujemo vam da se naviknete na izgled koda ns‑3 i primjenjujete ovaj standard svaki put kada radite s našim kodom. Cjeli tim developera i suradnika složio se s tim nakon malo gunđanja. Redak načina rada emacsa, naveden iznad, olakšava pravilno formatiranje ako koristite urednik emacs.
Simulator ns‑3 licenciran je pod GNU General Public License. Vidjet ćete odgovarajući pravni naslov GNU u svakoj datoteci distribucije ns‑3. Često možete vidjeti obavijest o autorskim pravima za jednu od uključenih institucija u projektu ns‑3 iznad teksta GPL i autora, prikazanoj ispod.
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/4.2.2 Priključni moduli
Pravi kod počinje s nizom direktiva uključivanja (include).
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"Kako bismo pomogli našim korisnicima skripti visokog nivoa da se nose s brojnim zaglavljima prisutnim u sustavu, grupiramo ih prema njihovoj upotrebi u velike module. Pružamo jednu zaglavlje datoteku koja će rekurzivno učitati sve zaglavlja koja se koriste u tom modulu. Umjesto da tražite koje vam tačno zaglavlje treba, i možda dobijete pravi popis zavisnosti, omogućujemo vam da učitate grupu datoteka s visokim nivoom detalja. Ovo nije najefikasniji pristup, ali zasigurno olakšava pisanje skripti.
Svaka od uključenih datoteka ns-3 je smeštena u direktorij pod imenom ns3 (poddirektorij za izgradnju), kako bi se tokom procesa izgradnje izbegli konflikti imena datoteka. Datoteka ns3/core-module.h odgovara ns-3 modulu koji ćete pronaći u direktoriju src/core u izdanju koje ste instalirali. U popisu ovog direktorija naći ćete veliki broj zaglavlja. Kada izgradite, Waf stavljaju javna zaglavlja u direktorij ns3 u poddirektorij build/debug
Ako nemate tu direktorij, to znači da niste naveli izlaznu direktorij prilikom kompilacije release verzije ns‑3. Izvršite kompilaciju ovako:
$ ./waf configure —build-profile=debug —out=build/debug
$ ./waf build
ili
$ ./waf configure —build-profile=optimized —out=build/optimized
$ ./waf build
ili build/optimized, u zavisnosti od vaše konfiguracije. Waf također će automatski generisati uključenu datoteku modula za učitavanje svih javnih zaglavlja. Pošto se, naravno, strogo pridržavate ovog uputstva, već ste uradili
$ ./waf -d debug --enable-examples --enable-tests configureda biste podesili projekat za izvođenje debug izgradnji koje uključuju primjere i testove. Također ste uradili
$ ./wafda biste izgradili projekat. Dakle, sada, kada pogledate u direktorij ../../build/debug/ns3, tamo, između ostalih, naći ćete zaglavlja četiri modula prikazana gore. Možete pogledati sadržaj ovih datoteka i otkriti da uključuju sve javne datoteke koje koriste odgovarajući moduli.
4.2.3 Namespace ns3
Sljedeća linija u skriptu first.cc je deklaracija imenskog prostora.
using namespace ns3;Projekt ns‑3 implementiran je u C++ imenskom prostoru nazvanom ns3. To grupira sve ns‑3 povezane izjave u vidu izvan globalnog imenskog prostora, što bi, nadamo se, trebalo olakšati integraciju s drugim kodom. Korištenje C++ operatora uvodi ns‑3 imenski prostor u trenutni (globalni) deklarativni region. Ovo je malo neobičan način da kažemo da nakon ove izjave nećete morati koristiti operator razlučivanja ns3 :: opseg ispred svake ns‑3 komponente kako biste je koristili. Ako niste upoznati s imenskim prostorima, pogledajte bilo koji učbenik o C++ i uporedite ns3 imenski prostor s korištenjem std imenskog prostora i izjava. using namespace std; u primjerima rada s izlaznim operatorom cout i tokovima.
4.2.4 Evidentiranje
Sljedeća linija skripte je
NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");Koristit ćemo ovu izjavu kao zgodnu tačku za raspravu o našem sustavu dokumentacije Doxygen. Ako pogledate web stranicu projekta ns‑3, pronaći ćete link "Dokumentacija" (Documentation) na navigacijskoj traci. Ako odaberete ovaj link, doći ćete na našu stranicu dokumentacije. Postoji link za "Posljednji izdanja", koji će vas dovesti do dokumentacije za posljednju stabilnu verziju ns‑3. Ako odaberete link "API Documentation", otići ćete na stranicu dokumentacije API ns‑3.
Na lijevoj strani stranice pronaći ćete grafički prikaz strukture dokumentacije. Dobar početak je "knjiga" Moduli ns‑3 u stablu navigacije ns‑3. Ako proširite Modules, vidjet ćete popis dokumentacije modula ns‑3. Kako je ranije spomenuto, koncept modula ovdje je izravno povezan s datotekama uključenim u modul. Podsustav za vođenje evidencije (logiranje) ns‑3 raspravlja se u dijelu Korištenje modula za vođenje evidencije, tako da ćemo se na nju vratiti kasnije u ovom vodiču, ali možete naučiti o prethodnoj izjavi gledajući modul Core, a zatim otvorivši knjigu Debugging tools, zatim odaberite stranicu Logging. Kliknite na Logging.
Sada biste trebali pregledati dokumentaciju Doxygen za modul Logging. Na vrhu stranice u popisu makronaredbi vidjet ćete unos za NS_LOG_COMPONENT_DEFINE. Prije nego što kliknete na poveznicu, obavezno pogledajte 'Detaljan opis' modula za bilježenje kako biste stekli opći uvid u njegovo funkcioniranje. To možete učiniti tako da se pomaknete dolje ili odaberete 'Više...' ispod dijagrama.
Kada ste stekli opći uvid u ono što se događa, nastavite i pogledajte dokumentaciju o konkretnim NS_LOG_COMPONENT_DEFINE. Ovdje neću ponavljati dokumentaciju, ali rezimirajući, reći ću da ova linija deklarira komponentu bilježenja pod nazivom FirstScriptExample, koja omogućuje uključivanje i isključivanje bilježenja poruka u konzoli prema imenu.
4.2.5 Glavna funkcija
U sljedećim redovima skripte vidjet ćete,
int
main (int argc, char *argv[])
{ To je jednostavno deklaracija glavne funkcije vašeg programa (skripte). Kao i u bilo kojem programu na C++, trebate definirati glavnu funkciju koja se izvršava prva. Ovdje nema ničega posebnog. Vaša ns-3 skripta je jednostavno C++ program. Sljedeći red postavlja vremensku rezoluciju na 1 nanosekundu, što je zadana vrijednost:
Time::SetResolution (Time::NS);Vremenska rezolucija ili jednostavno rezolucija je najmanja vremenska vrijednost koja se može koristiti (najmanja zamisliva razlika između dva vremenska vrijednosti). Možete promijeniti rezoluciju samo jednom. Mehanizam koji omogućava ovu fleksibilnost troši memoriju, stoga, čim se rezolucija izričito postavi, oslobađamo memoriju kako bismo spriječili daljnje ažuriranje. (Ako ne postavite rezoluciju izričito, zadana vrijednost bit će jedna nanosekunda, a memorija će se osloboditi pri početku simulacije.)
Sljedeće dvije linije skripte koriste se za uključivanje dviju komponenti bilježenja koje su ugrađene u aplikacije EchoClient i EchoServer:
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO); LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);Ako ste pročitali dokumentaciju o komponenti Logging, vidjet ćete da postoji nekoliko razina detaljnosti registracije koje možete uključiti za svaku komponentu. Ove dvije linije koda uključuju vođenje dnevnika na razini INFO za echo klijente i servere. Na ovoj razini aplikacija će tijekom simulacije ispisivati poruke prilikom slanja i primanja paketa.
Sada ćemo prijeći izravno na izradu topologije i pokretanje simulacije. Uključit ćemo objekte pomoćnika za topologiju kako bismo ovaj posao učinili što lakšim.
4.2.6 Korišćenje topoloških pomagača
Sljedeće dvije linije koda u našem skriptu zapravo će stvoriti ns-3 Node objekte koji će predstavljati računala u simulaciji.
NodeContainer nodes;
nodes.Create (2);Prije nego što nastavimo, pronađimo dokumentaciju za klasu NodeContainer. Još jedan način da dođete do dokumentacije za ovu klasu je kroz karticu Classes na stranicama Doxygen. Ako ste već otvorili Doxygen, samo se pomaknite prema gore do vrha stranice i odaberite karticu Classes. Trebali biste vidjeti novi set kartica, od kojih je jedna popis klasa. Ispod te kartice vidjet ćete popis svih ns-3 klasa. Pomaknite se prema dolje do ns3::NodeContainer. Kada pronađete klasu, odaberite je kako biste prešli na dokumentaciju za klasu.
Kao što se sjećamo, jedna od naših ključnih apstrakcija je čvor. Predstavlja računalo kojemu ćemo dodati stvari poput protokolskih stoga, aplikacija i perifernih kartica. Pomoćnik za topologiju NodeContainer omogućuje jednostavan način za stvaranje, upravljanje i pristup bilo kojim objektima Node, koje stvaramo za pokretanje simulacije. Prva linija iznad jednostavno deklarira NodeContainer, koji nazivamo nodes. Druga linija poziva metodu Create za objekt nodes i traži da kontejner stvori dva čvora. Kako je opisano u Doxygen, kontejner traži u sustavu ns-3 stvaranje dva objekta Node i pohranjuje pokazivače na te objekte unutar sebe.
Čvorovi stvoreni u skriptu trenutno ništa ne rade. Sljedeći korak u izgradnji topologije je povezivanje naših čvorova s mrežom. Najjednostavniji oblik mreže koji podržavamo je točka-to-točka veza između dva čvora. U ovom trenutku ćemo stvoriti takvo povezivanje.
PointToPointHelper
Stvaramo dvojnicu povezivanje, djelujući prema poznatom obrascu, koristeći topološki pomoćni objekt za izvođenje niskorazinskog posla potrebnog za povezivanje. Podsjećamo da su naš dvije ključne apstrakcije Mrežni uređaj i Kanal. U stvarnom svijetu ti pojmovi otprilike odgovaraju perifernim karticama i mrežnim kabelima. Kao pravilo, te dvije stvari su usko povezane jedna s drugom, i nitko ne može računati na razmjenu, na primjer, uređaja Ethernet preko bežične veze. Naši topološki pomagači slijede ovo usko povezivanje i zato ćete u ovom scenariju koristiti jedan objekt PointToPointHelper za konfiguriranje i povezivanje ns‑3 objekata PointToPointMrežniUređaj i PointToPointKanal. Sljedeće tri linije u scenariju:
PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));Prva linija,
PointToPointHelper pointToPoint;stvara u steku instancu objekta PointToPointHelper. S gledišta višeg razina, sljedeća linija,
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));govori objektu PointToPointHelper da koristi vrijednost "5 Mbps" (pet megabita u sekundi) kao "DataRate».
Iz konkretnije perspektive, linija "DataRate" odgovara onome što nazivamo atributom PointToPointMrežniUređaj. Ako pogledate Doxygen za klasu ns3::PointToPointNetDevice i u dokumentaciji za metodu GetTypeId naći ćete popis atributa koji su definirani za uređaj. Među njima će biti atribut "DataRate". Većina vidljivih korisničkih objekata ns‑3 ima slične popise atributa. Ovaj mehanizam koristimo za jednostavno podešavanje simulacije bez ponovne kompilacije, kao što ćete vidjeti u sljedećem odjeljku.
Slično "DataRate" u PointToPointNetDevice, naići ćete na atribut "Delay" povezan s PointToPointChannel. Završna linija,
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));govori PointToPointHelper koristi vrijednost "2 ms" (dvije milisekunde) kao vrijednost kašnjenja širenja putem kanala točka-točka koji kasnije stvara.
NetDeviceContainer
Trenutno imamo u scenariju NodeContainer, koji sadrži dva čvora. Imamo PointToPointHelper, koji je pripremljen za stvaranje objekata PointToPointNetDevices i povezivanje njih pomoću objekta PointToPointChannel. Baš kao što smo koristili pomoćni objekt topologije NodeContainer za stvaranje čvorova, zamolit ćemo PointToPointHelper da izvrši posao vezan uz stvaranje, konfiguriranje i instaliranje naših uređaja. Trebat će nam popis svih stvorenih objekata Mrežni uređaj, stoga koristimo NetDeviceContainer za njihovo pohranjivanje na isti način kako smo koristili NodeContainer za pohranu našeg stvorenog čvora. Sljedeće dvije linije koda,
NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);završavaju postavljanje uređaja i kanala. Prva linija deklarira spremnik za uređaje, koji je spomenut ranije, dok druga radi glavni posao. Metoda Instaliraj objekta PointToPointHelper prima NodeContainer kao parametar. Unutar NetDeviceContainer za svaki čvor koji se nalazi u NodeContainer stvara se (za točno dvoje za točku-točku komunikacije) PointToPointMrežniUređaj stvara i pohranjuje u spremniku uređaja. PointToPointKanal stvara, i priključuju mu se dvojica PointToPointNetDevices. Nakon stvaranja objekata, atributi pohranjeni u PointToPointHelper, koriste se za inicijalizaciju odgovarajućih atributa u stvorenim objektima.
Nakon izvršavanja poziva pointToPoint.Install (nodes) imat ćemo dva čvora, svaki s instaliranim mrežnim uređajem 'točka-točka' i jednim 'točka-točka' kanal između njih. Oba uređaja će biti postavljena za prijenos podataka brzinom od pet megabita u sekundi s latencijom prijenosa od dva milisekunde.
InternetStackHelper
Sada imamo postavljene čvorove i uređaje, ali naši čvorovi nemaju postavljene protokole. Sljedeće dvije linije koda će se pobrinuti za to.
InternetStackHelper stack;
stack.Install (nodes);InternetStackHelper je pomoćnik za topologiju internet steka, slično PointToPointHelper za dvotočkovne mrežne uređaje. Metoda Instaliraj prima NodeContainer kao parametar. Kada se izvrši, postavit će internet stek (TCP, UDP, IP itd.) na svakom čvoru u spremniku.
Ipv4AddressHelper
Zatim moramo povezati naša uređaja s IP adresama. Dajemo pomoćnika za upravljanje raspodjelom IP adresa. Jedini vidljivi API za korisnike je postavljanje osnovne IP adrese i mrežne maske za korištenje prilikom izvršavanja stvarne raspodjele adresa (to se radi na nižoj razini unutar pomoćnika). Sljedeće dvije linije koda u našem primjeru skripte first.cc,
Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");deklariraju pomoćni objekt adrese i govore mu da treba početi dodjeljivati IP adrese iz mreže 10.1.1.0, koristeći masku podmreže 255.255.255.0 za određivanje. Po defaultu, dodijeljene adrese počinju s jedinicom i povećavaju se monotono, tako da će prva dodijeljena adresa iz ove baze biti 10.1.1.1, zatim 10.1.1.2 itd. U stvarnosti, na niskoj razini sustav ns‑3 pamti sve dodijeljene IP adrese i generira fatalnu pogrešku ako slučajno stvorite situaciju u kojoj se ista adresa generira dvaput (usput, ovu pogrešku je teško debagirati).
Sljedeća linija koda,
Ipv4InterfaceContainer interfaces = address.Assign (devices);provodi stvarno dodjeljivanje adrese. U ns‑3 uspostavljamo vezu između IP adrese i uređaja koristeći objekt Ipv4Interface. Kao što nam ponekad treba popis mrežnih uređaja koje je stvorio pomoćnik za daljnju upotrebu, ponekad nam je potreban popis objekata Ipv4Interface. Ipv4InterfaceContainer omogućuje tu funkcionalnost.
Izgradili smo mrežu točka-točka, s postavljenim stablima i dodijeljenim IP adresama. Sada nam trebaju aplikacije za generiranje prometa u svakom čvoru.
4.2.7 Korišćenje Aplikacije
Još jedna od osnovnih apstrakcija sustava ns‑3 je Application (aplikacija). U ovom scenariju koristimo dvije specijalizacije osnovne klase Application ns‑3 pod nazivom UdpEchoServerApplication i UdpEchoClientApplication. Kao u prethodnim slučajevima, koristimo pomoćne objekte za konfiguraciju i upravljanje osnovnim objektima. Ovdje koristimo UdpEchoServerHelper i UdpEchoClientHelperobjekte, kako bismo olakšali naš život.
UdpEchoServerHelper
Sljedeće linije koda u našem primjeru skripte first.cc koriste se za postavljanje UDP echo server aplikacije na jednom od čvorova koje smo ranije stvorili.
UdpEchoServerHelper echoServer (9);
ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));Prva linija koda u gornjem fragmentu stvara UdpEchoServerHelper. Kao i obično, ovo nije sama aplikacija, već objekt koji nam pomaže u stvaranju pravih aplikacija. Jedan od naših dogovora je prenošenje potrebnih atributa u konstruktor pomoćnog objekta. U ovom slučaju, pomoćnik ne može učiniti ništa korisno ako mu nije pružen broj porta na kojem će server čekati pakete; taj broj također mora biti poznat klijentu. U ovom slučaju, predajemo konstruktoru pomoćnika broj porta. Sam konstruktor jednostavno izvršava SetAttribute s prenesenom vrijednošću. Kasnije, po želji, pomoću SetAttribute moći ćete postaviti drugu vrijednost atributa „Port”.
Poput mnogih drugih pomoćnih objekata, objekt UdpEchoServerHelper ima metodu Instaliraj. Izvršenje ove metode zapravo dovodi do stvaranja osnovne aplikacije eho-servera i vezanja uz čvor. Zanimljivo je da metoda Instaliraj prima NodeContainter kao parametar, baš kao i druge Instaliraj metode koje smo vidjeli.
Nejasna konverzija C++, koja ovdje radi, prihvaća rezultat metode node.Get (1) (koji vraća pametni pokazivač na objekt čvora — Ptr) i koristi ga u konstruktoru za anonimni objekt NodeContainer, koji se zatim prosljeđuje metodi Instaliraj. Ako ne možete odrediti u C++ kodu koja se metoda s kojom potpisom prevodi i izvršava, tražite među nejasnim konverzijama.
Sada vidimo da echoServer.Install planira postaviti aplikaciju UdpEchoServerApplication na pronađenom u NodeContainer, koji koristimo za upravljanje našim čvorovima, čvor s indeksom 1. Metoda Instaliraj vratit će kontejner koji sadrži pokazivače na sve aplikacije (u ovom slučaju jednu, s obzirom na to da smo predali anonimni NodeContainer, koji sadrži jedan čvor) stvoren od strane pomoćnika.
Aplikacijama je potrebno naznačiti trenutak pokretanja generiranja prometa „start” i može biti potrebno dodatno naznačiti vrijeme kada ga zaustaviti „stop”. Pružamo oba parametra. Ova vremena postavljaju se putem metoda ApplicationContainer Pokrenuti i Zaustaviti. Ove metode prihvaćaju parametre tipa Time. U ovom slučaju koristimo jasnu sekvencu konverzija C++, kako bismo uzeli C++ double 1.0 i pretvoriti ga u objekt tns‑3 Time, koristeći objekt Seconds za pretvorbu u sekunde. Imajte na umu da pravila pretvorbe mogu kontrolirati autori modela, a C++ ima svoja pravila, stoga ne možete uvijek računati na to da će se parametri pretvoriti onako kako ste očekivali. Dvije linije,
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));dovest će do toga da će se echo server aplikacija pokrenuti (automatski uključiti) jednu sekundu nakon početka simulacije i zaustaviti (isključiti) nakon deset sekundi simulacije. S obzirom na to da smo proglasili događaj simulacije (događaj zaustavljanja aplikacije) koji će biti izvršen nakon deset sekundi, simulirat će se najmanje deset sekundi rada mreže.
UdpEchoClientHelper
Klijentska aplikacija echo postavlja se na način koji je praktički sličan serveru. Postoji osnovni objekt UdpEchoClientApplication, kojim upravlja
UdpEchoClientHelper.
UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));;Međutim, za echo klijenta trebamo postaviti pet različitih atributa. Prva dva atributa postavljaju se tijekom kreiranja UdpEchoClientHelper. Prosljeđujemo parametre koji se koriste (unutar pomoćnika) za postavljanje atributa «RemoteAddress» i «RemotePort» u skladu s našim dogovorom o prosljeđivanju potrebnih parametara u konstruktor pomoćnika.
Podsjetimo se da smo koristili Ipv4InterfaceContainer za praćenje IP adresa koje smo dodijelili našim uređajima. Nulti sučelje u kontejneru sučelja odgovarat će IP adresi nultog čvora u kontejneru čvorova. Prvo sučelje u kontejneru sučelja odgovara IP adresi prvog čvora u kontejneru čvorova. Tako, u prvoj liniji koda (na vrhu) stvaramo pomoćnika i kažemo mu da će udaljena adresa klijenta biti IP adresa dodijeljena čvoru na kojem se nalazi server. Također kažemo da je potrebno organizirati slanje paketa na deveti port.
Atribut «MaxPackets» obavještava klijenta o maksimalnom broju paketa koje možemo poslati tijekom simulacije. Atribut «Interval» obavještava klijenta koliko dugo treba čekati između paketa, a atribut «PacketSize» obavještava klijenta koliko velike trebaju biti korisne informacije paketa. Ovom kombinacijom atributa kažemo klijentu da pošalje jedan 1024-bajtni paket.
Kao i kod eho servera, postavljamo eho klijentu atribute Pokrenuti i Zaustaviti, ali ovdje pokrećemo klijenta jednu sekundu nakon uključivanja servera (nasuprot dvije sekunde nakon početka simulacije).
4.2.8 Simulator
U ovoj fazi trebamo pokrenuti simulaciju. To se radi putem globalne funkcije Simulator::Run.
Simulator::Run ();Kada smo prethodno pozivali metode,
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));
...
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));zapravo smo isplanirali događaje u simulatoru na 1,0 sekundi, 2,0 sekundi i dva događaja na 10,0 sekundi. Nakon poziva Simulator::Run, sustav će početi pregledavati popis isplaniranih događaja i izvršavati ih. Prvo će pokrenuti događaj nakon 1,0 sekundi, što aktivira aplikaciju eho servera (ovaj događaj može, zauzvrat, isplanirati mnogo drugih događaja). Zatim će pokrenuti događaj isplaniran za t = 2,0 sekundi, koji će pokrenuti aplikaciju eho klijenta. Opet, ovaj događaj može isplanirati još mnogo događaja. Implementacija događaja pokretanja u eho klijentu započet će fazu prijenosa podataka simulacije slanjem paketa na server.
Akt slanja paketa na server izazvat će lanac događaja koji će se automatski planirati u pozadini i koji će implementirati mehaniku slanja eho signala u skladu s parametrima sinkronizacije koje smo postavili u scenariju.
Na kraju, budući da šaljemo samo jedan paket (podsjetimo, atribut MaxPackets je postavljen na jedan), lanac događaja iniciranim ovim jedinim klijentskim eho zahtjevom završit će, a simulacija će preći u stanje čekanja. Kada se to dogodi, preostale isplanirane događaje bit će događaji Zaustaviti za server i klijenta. Kada se ti događaji izvrše, neće preostati događaja za daljnju obradu i Simulator::Run vratit će kontrolu. Simulacija je završena.
Samo je potrebno očistiti. To se radi pozivanjem globalne funkcije Simulator::Destroy. Budući da su pozvane funkcije pomoćnika (ili niskonivoa kod ns-3), koje su organizirane na način da u simulator umetnu hookove za uništavanje svih objekata koji su stvoreni. Nema potrebe da pratite bilo koji od tih objekata sami — sve što trebate učiniti je pozvati Simulator::Destroy i izaći. Sustav ns-3 će obaviti taj teški posao umjesto vas. Preostale linije našeg prvog ns-3 skripta, first.cc, upravo to rade:
Simulator::Destroy ();
return 0;
}Kada se simulator zaustavlja?
ns-3 je simulator diskretnih događaja (DE). U takvom simulatoru svaki događaj je povezan s vremenom njegova izvršenja, a simulacija se nastavlja obradom događaja redoslijedom njihova nastanka tijekom simulacije. Događaji mogu uzrokovati planiranje budućih događaja (na primjer, tajmer se može ponovno planirati da završi brojanje u sljedećem intervalu).
Početni događaji obično inicira objekt, npr. IPv6 će planirati otkrivanje usluga u mreži, upite susjeda itd. Aplikacija planira prvi događaj slanja paketa itd. Kada se događaj obrađuje, može generirati nula, jedan ili više događaja. Tijekom izvođenja simulacije, događaji se jednostavno završavaju ili generiraju nove. Simulacija će se automatski zaustaviti ako je red događaja prazan ili ako se detektira posebno događaj Zaustaviti. Događaj Zaustaviti generira funkcija Simulator::Stop (zaustavi vrijeme).
Postoji tipičan slučaj kada je Simulator::Stop apsolutno potreban za zaustavljanje simulacije: kada postoje samodoprinoseći događaji. Samodoprinoseći (ili ponavljajući) događaji su događaji koji se uvijek ponovno planiraju. Kao rezultat, oni uvijek održavaju red događaja ne praznim. Postoji mnogo protokola i modula koji sadrže ponavljajuće događaje, kao što su:
• FlowMonitor — periodična provjera izgubljenih paketa;
• RIPng — periodična emisija ažuriranja tablica usmjeravanja;
• itd.
U takvim slučajevima Simulator::Stop je potrebno za ispravno zaustavljanje simulacije. Osim toga, kada je ns-3 u načinu emulacije, koristi se RealtimeSimulator kako bi se sinkronizirali satovi simulacije s satom računala, i Simulator::Stop je potrebno za zaustavljanje procesa.
Mnogi od simulacijskih programa u priručniku ne pozivaju Simulator::Stop jasno, jer se automatski završavaju kada se događaji u redu iscrpe. Međutim, ti programi također će prihvatiti poziv Simulator::Stop. Na primjer, sljedeća dodatna naredba u prvom primjeru programa zakazat će eksplicitno zaustavljanje u 11. sekundi:
+ Simulator::Stop (Seconds (11.0));
Simulator::Run ();
Simulator::Destroy ();
return 0;
}Gore navedeno zapravo neće promijeniti ponašanje ovog programa, budući da ovo specifično modeliranje prirodno završava za 10 sekundi. No, da ste promijenili vrijeme zaustavljanja u gornjoj naredbi s 11 sekundi na 1 sekundu, primijetili biste da se modeliranje zaustavlja prije nego što ikakvi ispis dođu na ekran (s obzirom na to da se ispis događa otprilike 2 sekunde trajanja simulacije).
Važno je pozvati Simulator::Stop prije poziva Simulator::Run; u suprotnom, Simulator::Run možda nikada neće vratiti kontrolu glavnom programu za izvođenje zaustavljanja!
4.2.9 Sakupljanje vašeg scenarija
Učinili smo kreiranje vaših jednostavnih skripti trivijalnim. Sve što trebate učiniti je staviti svoju skriptu u katalog scratch, i ona će biti automatski sastavljena kada pokrenete Waf. Hajdemo probati. Vratite se u gornji katalog i kopirajte examples/tutorial/first.cc u katalog scratch
$ cd ../..
$ cp examples/tutorial/first.cc scratch/myfirst.ccSada sastavite svoj prvi primjer skripte, koristeći waf:
$ ./wafTrebali biste vidjeti poruke da je vaš prvi primjer uspješno sastavljen.
Waf: Ulazak u direktorij `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
[614/708] cxx: scratch/myfirst.cc -> build/debug/scratch/myfirst_3.o
[706/708] cxx_link: build/debug/scratch/myfirst_3.o -> build/debug/scratch/myfirst
Waf: Napuštanje direktorija `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' završeno uspješno (2.357s)Sada možete pokrenuti primjer (napomena: ako sastavljate svoj program u direktoriju scratch, tada ga morate pokrenuti iz scratch):
$ ./waf --run scratch/myfirstTrebali biste vidjeti sličan ispis:
Waf: Ulazak u direktorij `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Napuštanje direktorija `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' završeno uspješno (0.418s) Poslano 1024 bajta na 10.1.1.2
Primljeno 1024 bajta s 10.1.1.1
Primljeno 1024 bajta s 10.1.1.2Ovdje vidite da sustav gradnje provjerava je li datoteka sastavljena, a zatim je pokreće. Vidite da zapis komponente na echo klijentu pokazuje da je poslao jedan 1024-bajtni paket na echo server 10.1.1.2. Također vidite zapis logiranja na echo serveru koji kaže da je primio 1024 bajta od 10.1.1.1. Echo server tiho ponavlja paket, a vi vidite u logu echo klijenta da je primio svoj paket natrag sa servera.
4.3 ns-3 Izvorni kod
Sada kada ste koristili neke od ns‑3 pomoćnika, možete pogledati izvorne kodove koji implementiraju tu funkcionalnost. Najnoviji kod možete pregledati na našoj web stranici putem sljedeće poveznice: . Tamo ćete vidjeti sažetak stranicu Mercurial za naše razvojno stablo ns‑3. Na vrhu stranice vidjet ćete nekoliko poveznica,
summary | shortlog | changelog | graph | tags | filesIdite dalje i odaberite poveznicu na datoteke. Ovako će izgledati gornja razina većine naših spremišta:
drwxr-xr-x [up]
drwxr-xr-x bindings python files
drwxr-xr-x doc files
drwxr-xr-x examples files
drwxr-xr-x ns3 files
drwxr-xr-x scratch files
drwxr-xr-x src files
drwxr-xr-x utils files
-rw-r--r-- 2009-07-01 12:47 +0200 560 .hgignore file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 1886 .hgtags file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 1276 AUTHORS file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 30961 CHANGES.html file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 17987 LICENSE file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 3742 README file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 16171 RELEASE_NOTES file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 6 VERSION file | revisions | annotate
-rwxr-xr-x 2009-07-01 12:47 +0200 88110 waf file | revisions | annotate
-rwxr-xr-x 2009-07-01 12:47 +0200 28 waf.bat file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 35395 wscript file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 7673 wutils.py file | revisions | annotateNaši primjeri skripti nalaze se u direktoriju examples. Ako kliknete na primjere, vidjet ćete popis poddirektorija. Jedna od datoteka u poddirektoriju tutorial — first.cc. Ako kliknete na first.cc vidjet ćete kod koji ste upravo proučili.
Izvorni kod nalazi se uglavnom u direktoriju src. Možete pregledati izvorni kod klikom na ime direktorija ili na vezu datoteke desno od imena direktorija. Ako kliknete na direktorij src, dobit ćete popis poddirektorija src. Ako zatim kliknete na poddirektorij core, pronaći ćete popis datoteka. Prva datoteka koju ćete vidjeti (u trenutku pisanja ovog vodiča) — abort.h. Ako kliknete na vezu abort.h, bit ćete preusmjereni na izvorni datoteku za abort.h, koja sadrži korisne makroe za izlazak iz skripti ako se otkriju abnormalni uvjeti. Izvorni kod za pomoćne programe koje smo koristili u ovom poglavlju može se pronaći u direktoriju src/Applications/helper. Ne ustručavajte se istraživati stablo direktorija kako biste shvatili gdje što ide i razjasnili stil programiranja ns‑3.
Izvor: habr.com
