Vodič za ns-3 mrežni simulator. Poglavlje 4

Vodič za ns-3 mrežni simulator. Poglavlje 4
poglavlje 1,2
poglavlje 3

4 Pregled koncepta
4.1 Ključne apstrakcije
4.1.1 Čvor
4.1.2 Aplikacija
4.1.3 Kanal
4.1.4 Mrežni uređaj
4.1.5 Topološki asistenti
4.2 Prva ns-3 skripta
4.2.1 Standardni kod
4.2.2 Dodaci
4.2.3 ns3 imenski prostor
4.2.4 Evidentiranje
4.2.5 Glavna funkcija
4.2.6 Korištenje topoloških asistenata
4.2.7 Korištenje aplikacije
4.2.8 Simulator
4.2.9 Izrada vaše skripte
4.3 ns-3 Izvorni kod

Poglavlje 4

Pregled koncepta

Prva stvar koju treba da uradimo pre nego što počnemo da učimo ili pišemo ns-3 kod je da objasnimo nekoliko osnovnih koncepata i apstrakcija u sistemu. Mnogima od ovoga može izgledati očigledno, ali preporučujemo da odvojite vrijeme i pročitate ovaj odjeljak kako biste bili sigurni da počinjete na čvrstim osnovama.

4.1 Ključne apstrakcije

U ovom dijelu ćemo pogledati neke termine koji se obično koriste na webu, ali imaju specifično značenje u ns-3.

4.1.1 Čvor

U internetskom žargonu, računarski uređaj koji se povezuje na mrežu naziva se host ili ponekad krajnji sistem. Budući da je ns-3 mrežni simulator, a ne internet simulator, namjerno ne koristimo termin host, jer je to usko povezano s internetom i njegovim protokolima. Umjesto toga, koristimo opštiji termin, koji također koriste 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 manipuliranje reprezentacijama računarskih uređaja u simulacijama.

Morate razumjeti čvor poput računara kojem dodajete funkcionalnost. Dodaćete stvari kao što su aplikacije, stekovi protokola i periferne kartice sa drajverima koji omogućavaju računaru da obavlja koristan posao. Isti osnovni model koristimo u ns-3.

4.1.2 Aplikacija

Općenito, kompjuterski softver je podijeljen u dvije široke klase. Sistemski softver organizuje različite računarske resurse kao što su memorija, ciklusi procesora, disk, mreža itd. prema nekom računarskom modelu. Sistemski softver obično ne koristi ove resurse za obavljanje zadataka koji direktno koriste korisniku. Korisnik obično pokreće aplikaciju da bi postigao određeni cilj, koji dobija i koristi resurse koje kontroliše sistemski softver.

Često se linija razdvajanja između sistemskog i aplikativnog softvera povlači na promjenama na nivou privilegija koje se dešavaju u zamkama operativnog sistema. ns-3 nema pravi koncept operativnog sistema, a samim tim ni koncept nivoa privilegija ili sistemskih poziva. Ipak, imamo ideju za aplikaciju. Baš kao što se u "stvarnom svijetu" softverske aplikacije pokreću na računarima za obavljanje zadataka, ns-3 aplikacije rade na ns-3 čvorovima za kontrolu simulacija u simuliranom svijetu.

U ns-3, osnovna apstrakcija za korisnički program koji generiše neku aktivnost za modeliranje je aplikacija. Ova apstrakcija je predstavljena u C++ klasom Application. Klasa Application pruža metode za manipuliranje pogledima naše verzije aplikacija na nivou korisnika u simulacijama. Od programera se očekuje da specijaliziraju klasu Application u smislu objektno orijentiranog programiranja za kreiranje novih aplikacija. U ovom vodiču ćemo koristiti specijalizacije klase Application pod nazivom UdpEchoClientApplication и UdpEchoServerApplication. Kao što možete očekivati, ove aplikacije čine skup klijent/server aplikacija koje se koriste za generiranje i eho mrežnih paketa.

4.1.3 Kanal

U stvarnom svijetu, možete povezati računar na mrežu. Često se mediji preko kojih se prenose podaci u ovim mrežama nazivaju kanali. Kada uključite Ethernet kabl u zidnu utičnicu, računar povezujete na Ethernet vezu. U simuliranom ns-3 svijetu, čvor je povezan sa objektom koji predstavlja komunikacijski kanal. Ovdje se osnovna apstrakcija komunikacijske podmreže naziva kanal i u C++ je predstavljena klasom Channel.

Класс ChannelChannel pruža metode za upravljanje interakcijom subnet objekata i povezivanje hostova s ​​njima. Programeri također mogu specijalizirati kanale u smislu objektno orijentiranog programiranja. Specijalizacija kanala može modelirati nešto jednostavno kao žica. Namjenski kanal također može modelirati složene stvari poput velikog Ethernet prekidača ili trodimenzionalnog prostora punog prepreka u slučaju bežičnih mreža.

Koristit ćemo specijalizirane verzije kanala u ovom vodiču pod nazivom CsmaChannelCsmaChannel, PointToPointChannelPointToPointChannel и WifiChannelWifiChannel. CsmaChannel, na primjer, modelira verziju komunikacijske podmreže koja implementira komunikacijsko okruženje s višestrukim pristupom na bazi operatera. Ovo nam daje funkcionalnost sličnu Ethernetu.

4.1.4 Mrežni uređaj

Nekada je bilo da ako želite da povežete računar na mrežu, morate kupiti određeni mrežni kabl i hardverski uređaj koji se naziva (u PC terminologiji) periferna kartica koju je trebalo instalirati u računar. Ako je periferna kartica implementirala neke mrežne funkcije, one su se zvale mrežne kartice ili mrežne kartice. Danas većina računara dolazi sa integrisanim mrežnim interfejsom hardvera i korisnici ih ne vide kao zasebne uređaje.

Mrežna kartica neće raditi bez softverskog drajvera koji kontroliše njen hardver. U Unixu (ili Linuxu), dio periferne opreme klasificira se kao uređaj. Uređajima se upravlja pomoću drajvera uređaja, a mrežnim uređajima (NIC) se upravlja pomoću drajvera mrežnih uređaja (drajveri mrežnih uređaja) i zajednički se nazivaju mrežni uređaji (net uređaja). U Unixu i Linuxu mrežne uređaje nazivate imenima kao što su eth0.

U ns-3, apstrakcija mrežnog uređaja obuhvata i softver drajvera i hardver koji se modelira. U simulaciji, mrežni uređaj se "instalira" u čvor kako bi mu se omogućilo da komunicira s drugim čvorovima putem kanala. Baš kao pravi računar, čvor se može povezati na više kanala preko više uređaja NetDevices.

Mrežna apstrakcija uređaja predstavljena je u C++ klasom NetDevice. Klasa NetDevice pruža metode za upravljanje vezama sa objektima Node i Channel; i mogu biti specijalizovani od strane programera u smislu objektno orijentisanog programiranja. U ovom vodiču ćemo koristiti nekoliko specijaliziranih verzija NetDevice tzv CsmaNetDevice, PointToPointNetDevice и WifiNetDevice. Baš kao što je Ethernet mrežni adapter dizajniran za rad s mrežom Ethernet, CsmaNetDevice dizajniran za rad sa CsmaChannel, PointToPointNetDevice dizajniran za rad sa PointToPointChanneli WifiNetDevice - dizajniran za rad sa WifiChannel.

4.1.5 Topološki asistenti

U stvarnoj mreži, naći ćete host računare sa dodanim (ili ugrađenim) mrežnim karticama. U ns-3 bismo rekli da ćete vidjeti čvorove sa priključenim NetDevices. U velikoj simuliranoj mreži, morat ćete organizirati veze između mnogih objekata čvor, NetDevice и kanal.

Od povezivanja NetDevices sa čvorovima, NetDevices sa vezama, dodeljivanje IP adresa, itd. u ns-3 su uobičajeni zadatak, da bismo ovo učinili što lakšim nudimo takozvane topološke pomoćnike. Na primjer, da biste kreirali NetDevice, trebate izvršiti mnoge ns-3 operacije kernela, dodati MAC adresu, instalirati mrežni uređaj u Node, konfigurirati stog protokola čvora, a zatim povezati NetDevice na kanal. Još više posla će biti potrebno da se više uređaja poveže na višestruke veze i zatim poveže pojedinačne mreže u mrežu Internetworks. Pružamo pomoćne objekte topologije koji kombinuju ove mnoge operacije u model koji se lako koristi za vašu udobnost.

4.2 Prva ns-3 skripta

Ako ste instalirali sistem kao što je gore predloženo, imat ćete ns-3 izdanje u direktoriju koji se zove repos u vašem početnom direktoriju. Idi na imenik puštanje

Ako nemate takav direktorij, to znači da niste naveli izlazni direktorij prilikom izrade izdanja verzije ns-3, izgradite ovako:
$ ./waf configure —build-profile=release —out=build/release,
$ ./waf build

tamo biste trebali vidjeti strukturu direktorija sličnu sljedećoj:

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.pyc

Idi na imenik primjeri/tutorial. Trebali biste vidjeti datoteku koja se tamo nalazi pod nazivom first.cc. Ovo je skripta koja će stvoriti jednostavnu point-to-point vezu između dva čvora i prenijeti jedan paket između čvorova. Pogledajmo ovu skriptu red po red; da biste to učinili, otvorite first.cc u svom omiljenom uređivaču.

4.2.1 Standardni kod
Prvi red u datoteci je red uređivača emacs. Govori emacsu o konvencijama oblikovanja (stil kodiranja) koje koristimo u našem izvornom kodu.

/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */

Ovo je uvijek prilično kontroverzno pitanje, tako da moramo ispraviti rekord kako bismo ga odmah sklonili s puta. Projekat ns-3, kao i većina velikih projekata, usvojio je stil kodiranja kojem mora biti usklađen sav doprinos. Ako želite da doprinesete svom kodu projektu, na kraju ćete morati da se uskladite sa ns-3 standardom kodiranja, kao što je opisano u datoteci doc/codingstd.txt ili prikazano na web stranici projekta: https://www.nsnam.org/develop/contributing-code/coding-style/.

Preporučujemo da se naviknete na izgled i osjećaj ns-3 koda i da primjenjujete ovaj standard kad god radite s našim kodom. Cijeli razvojni tim i saradnici su se složili s tim nakon nekog gunđanja. Gornja linija emacs moda olakšava pravilno formatiranje ako koristite emacs editor.

ns-3 simulator je licenciran za korištenje GNU General Public License. Vidjet ćete odgovarajuće GNU legalno zaglavlje u svakoj ns-3 distribucijskoj datoteci. Često ćete vidjeti obavijest o autorskim pravima za jednu od institucija koje učestvuju u projektu ns-3 iznad GPL teksta i autora, prikazanog 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 Dodaci

Sam kod počinje serijom inkluzivnih izjava (uključiti).

#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 skriptiranja visokog nivoa da se nose s velikim brojem datoteka zaglavlja prisutnih u sistemu, grupiramo ih prema njihovoj upotrebi u velike module. Nudimo jednu datoteku zaglavlja koja će rekurzivno učitavati sve datoteke zaglavlja koje se koriste u datom modulu. Umjesto da tražite tačno koje zaglavlje trebate i eventualno dobijete ispravnu listu ovisnosti, mi vam dajemo mogućnost preuzimanja grupe datoteka u velikoj granularnosti. To nije najefikasniji pristup, ali svakako znatno olakšava pisanje skripti.

Svaka od ns-3 uključenih datoteka smještena je u direktorij tzv ns3 (poddirektorij izgradnje) kako biste izbjegli sukobe imena datoteka tokom procesa izgradnje. File ns3/core-module.h odgovara ns-3 modulu, koji ćete naći u direktoriju src/core u izdanju koje ste instalirali. U listi ovog direktorija naći ćete veliki broj datoteka zaglavlja. Kada obavite montažu, Waf postavlja javne datoteke zaglavlja u ns3 direktorij u poddirektoriju build/debug

Ako nemate takav direktorij, to znači da niste naveli izlazni direktorij prilikom izrade izdanja verzije ns-3, izgradite ovako:
$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf build
ili
$ ./waf configure --build-profile=optimizirano --out=build/optimizirano
$ ./waf build

ili izgraditi/optimizirati, ovisno o vašoj konfiguraciji. Waf će također automatski generirati datoteku uključivanja modula za učitavanje svih javnih datoteka zaglavlja. Pošto, naravno, religiozno slijedite ovaj vodič, već ste to učinili

$ ./waf -d debug --enable-examples --enable-tests configure

da konfigurišete projekat za pokretanje debug build-ova koji uključuju primere i testove. I ti si

$ ./waf

da sklopi projekat. Dakle, sada kada pogledate u imenik ../../build/debug/ns3, tada ćete tamo pronaći, između ostalih, datoteke zaglavlja četiri gore prikazana modula. Možete pogledati sadržaj ovih datoteka i otkriti da oni uključuju sve javne datoteke koje koriste odgovarajući moduli.

4.2.3 ns3 imenski prostor

Sljedeći red u skripti first.cc je deklaracija imenskog prostora.

using namespace ns3;

Projekt ns-3 implementiran je u C++ imenskom prostoru koji se zove ns3. Ovo grupiše sve deklaracije vezane za ns-3 u opseg izvan globalnog prostora imena, što će, nadamo se, pomoći u integraciji sa drugim kodom. Korišćenje C++ operatora uvodi ns-3 imenski prostor u trenutni (globalni) deklarativni region. Ovo je fensi način da se kaže da nakon ove deklaracije nećete morati da ukucate operator dozvole ns3::scope prije svog ns-3 koda da biste ga koristili. Ako niste upoznati s imenskim prostorima, pogledajte skoro svaki C++ udžbenik i uporedite ns3 imenski prostor koristeći std imenski prostor i deklaraciju using namespace std; u primjerima rada sa izlaznim operatorom cout i potoci.

4.2.4 Evidentiranje

Sljedeći red skripte je,

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Koristićemo ovu izjavu kao pogodno mesto za razgovor o našem dokumentacionom sistemu doxygen. Ako pogledate web stranicu projekta ns-3, naći ćete vezu Dokumentacija u navigacijskoj traci. Ako kliknete na ovu vezu, bit ćete odvedeni na našu stranicu sa dokumentacijom. Postoji veza "Najnovije izdanje" koja će vas odvesti do dokumentacije za najnoviju stabilnu verziju ns-3. Ako odaberete vezu "API dokumentacija", bit ćete preusmjereni na stranicu dokumentacije ns-3 API-ja.

Na lijevoj strani stranice naći ćete grafički prikaz strukture dokumentacije. Dobro mjesto za početak je "knjiga" modula ns-3 u stablu navigacije ns-3. Ako otkrijete Moduli, vidjet ćete listu dokumentacije ns-3 modula. Kao što je gore objašnjeno, koncept modula ovdje je direktno povezan sa datotekama uključenim u gornji modul. Podsistem ns-3 evidentiranja je razmatran u odjeljku Korištenje modula za evidentiranje, tako da ćemo se na to vratiti kasnije u ovom vodiču, ali možete saznati više o gornjoj izjavi gledajući modul jezgroa zatim otvaranje knjige Alati za uklanjanje pogrešakaa zatim odabirom stranice Sindikat. Kliknite na Sindikat.

Sada biste trebali pregledati dokumentaciju doxygen za modul Sindikat. Na listi makronaredbi na vrhu stranice, vidjet ćete unos za NS_LOG_COMPONENT_DEFINE. Prije nego što kliknete na vezu, svakako pogledajte “Detaljan opis” modula za registraciju da biste razumjeli kako funkcionira općenito. Da biste to učinili, možete se pomaknuti prema dolje ili odabrati "Više..." ispod grafikona.

Kada dobijete opštu predstavu o tome šta se dešava, nastavite i pogledajte dokumentaciju za određeni NS_LOG_COMPONENT_DEFINE. Ovdje neću duplirati dokumentaciju, ali da rezimiramo, ova linija deklarira komponentu registracije koja se zove FirstScriptExample, koji vam omogućava da omogućite ili onemogućite bilježenje poruka na konzoli upućivanjem na ime.

4.2.5 Glavna funkcija

U sledećim redovima skripte videćete,

int 
main (int argc, char *argv[])
{ 

Ovo je jednostavno deklaracija glavne funkcije vašeg programa (skripte). Kao i kod svakog C++ programa, morate definirati glavnu funkciju, ona se prvo izvršava. Nema tu ništa posebno. Vaša ns-3 skripta je samo C++ program. Sljedeći red postavlja vremensku rezoluciju na 1 nanosekundu, što je zadana postavka:

Time::SetResolution (Time::NS);

Vremenska rezolucija ili jednostavno rezolucija je najmanja vremenska vrijednost koja se može koristiti (najmanja reprezentabilna razlika između dva vremena). Rezoluciju možete promijeniti tačno jednom. Mehanizam koji pruža ovu fleksibilnost troši memoriju, tako da kada je rezolucija eksplicitno postavljena, oslobađamo memoriju, sprečavajući dalja ažuriranja. (Ako eksplicitno ne postavite rezoluciju, ona će biti zadana na jednu nanosekundu i memorija će se osloboditi kada simulacija počne.)

Sljedeće dvije linije skripte koriste se za omogućavanje dvije komponente za evidentiranje koje su ugrađene u aplikacije EchoClient и EchoServer:

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO); LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);

Ako pročitate dokumentaciju za komponentu evidentiranja, vidjet ćete da postoji nekoliko nivoa evidentiranja/granularnosti koje možete omogućiti na svakoj komponenti. Ove dvije linije koda omogućavaju evidentiranje grešaka na INFO nivou za echo klijente i servere. Na ovom nivou, aplikacija će štampati poruke dok šalje i prima pakete tokom simulacije.

Sada ćemo prijeći na posao kreiranja topologije i pokretanja simulacije. Koristimo pomoćne objekte topologije kako bismo ovaj posao učinili što lakšim.

4.2.6 Korištenje topoloških asistenata

Sljedeće dvije linije koda u našoj skripti će zapravo kreirati Node ns-3 objekte koji će predstavljati računare u simulaciji.

NodeContainer nodes;
nodes.Create (2);

Prije nego što nastavimo, pronađimo dokumentaciju za klasu NodeContainer. Drugi način da dođete do dokumentacije za datu klasu je preko kartice Nastava na stranicama doxygen. Ako već imate otvoren Doxygen, jednostavno skrolujte do vrha stranice i odaberite karticu Klase. Trebali biste vidjeti novi set kartica, od kojih je jedna lista klasa. Ispod ove kartice ćete vidjeti listu svih ns-3 klasa. Pomaknite se dolje do ns3::NodeContainer. Kada pronađete klasu, odaberite je da biste otišli na dokumentaciju za klasu.

Kao što se sjećamo, jedna od naših ključnih apstrakcija je čvor. Predstavlja računar na koji ćemo dodati stvari kao što su stekovi protokola, aplikacije i periferne kartice. Topološki asistent NodeContainer pruža zgodan način za kreiranje, upravljanje i pristup svim objektima čvor, koji kreiramo za pokretanje simulacije. Prvi red iznad jednostavno deklarira NodeContainer, koje nazivamo čvorovima. Drugi red poziva metodu Create na objektu čvorova i traži od kontejnera da kreira dva čvora. Kako je opisano u doxygen, kontejner traži od ns-3 sistema da kreira dva objekta čvor i interno pohranjuje pokazivače na ove objekte.

Čvorovi kreirani u skripti još ne rade ništa. Sljedeći korak u izgradnji topologije je povezivanje naših čvorova na mrežu. Najjednostavniji oblik mreže koji podržavamo je veza od tačke do tačke između dva čvora. Sada ćemo stvoriti takvu vezu.

PointToPointHelper

Kreiramo vezu od tačke do tačke koristeći poznati obrazac, koristeći pomoćni objekat topologije da obavimo posao niskog nivoa koji je potreban za vezu. Podsjetimo da su naše dvije ključne apstrakcije NetDevice и kanal. U stvarnom svijetu, ovi pojmovi otprilike odgovaraju perifernim karticama i mrežnim kablovima. Obično su ove dvije stvari usko povezane jedna s drugom i niko ne može računati na dijeljenje, na primjer, uređaja Ethernet preko bežičnog kanala. Naši pomoćnici u topologiji prate ovaj bliski odnos i stoga ćete u ovom scenariju koristiti jedan objekt PointToPointHelper za postavljanje i povezivanje ns-3 objekata PointToPointNetDevice и PointToPointChannel. Sljedeća tri reda u skripti:

PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); 
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

Prva linija,

PointToPointHelper pointToPoint;

kreira instancu objekta na steku PointToPointHelper. Sa tačke gledišta najvišeg nivoa, sledeći red,

pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));

govori objektu PointToPointHelper koristite vrijednost "5 Mbit/s" (pet megabita u sekundi) kao "DataRate".

Sa specifičnije tačke gledišta, string "DataRate" odgovara onome što nazivamo atributom PointToPointNetDevice. Ako pogledate doxygen za razred ns3::PointToPointNetDevice iu dokumentaciji za metodu GetTypeId naći ćete listu atributa definiranih za uređaj. Među njima će biti atribut “DataRate" Većina korisnički vidljivih ns-3 objekata ima slične liste atributa. Koristimo ovaj mehanizam za jednostavno postavljanje simulacije bez ponovne kompilacije, kao što ćete vidjeti u sljedećem odjeljku.

Slicno "DataRate" u PointToPointNetDevice, naći ćete atribut "Delay" povezan s PointToPointChannel. Konačna linija

pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

kaže PointToPointHelper koristite vrijednost "2 ms" (dvije milisekunde) kao vrijednost kašnjenja propagacije za vezu od tačke do tačke koju naknadno kreira.

NetDeviceContainer

Trenutno imamo u scenariju NodeContainer, koji sadrži dva čvora. Imamo PointToPointHelper, koji je pripremljen za kreiranje objekata PointToPointNetDevices i povezujući ih pomoću objekta PointToPointChannel. Kao što smo koristili pomoćni objekat topologije NodeContainer za kreiranje čvorova, pitaćemo PointToPointHelper obavljati za nas poslove vezane za kreiranje, konfiguraciju i instalaciju naših uređaja. Potrebna nam je lista svih kreiranih objekata NetDevice, pa koristimo NetDeviceContainer da ih čuvamo na isti način na koji smo mi koristili NodeContainer da pohranimo čvorove koje smo kreirali. Sljedeće dvije linije koda,

NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);

kompletno podešavanje uređaja i kanala. Prvi red deklarira gore spomenuti kontejner uređaja, a drugi obavlja glavni posao. Metoda Instaliraj objekta PointToPointHelper prihvata NodeContainer kao parametar. Unutra NetDeviceContainer za svaki čvor koji se nalazi u NodeContainer je kreiran (za komunikaciju od tačke do tačke moraju biti tačno dva) PointToPointNetDevice se kreira i pohranjuje u kontejner uređaja. PointToPointChannel je kreirana i dvije su joj pridružene PointToPointNetDevices. Nakon kreiranja objekata, atributi pohranjeni u PointToPointHelper, koriste se za inicijalizaciju odgovarajućih atributa u kreiranim objektima.

Nakon poziva pointToPoint.Install (čvorovi) imaćemo dva čvora, svaki sa instaliranim mrežnim uređajem od tačke do tačke i jednom vezom od tačke do tačke između njih. Oba uređaja će biti konfigurisana da prenose podatke brzinom od pet megabita u sekundi sa kašnjenjem od dve milisekunde preko kanala.

InternetStackHelper

Sada imamo konfigurirane čvorove i uređaje, ali naši čvorovi nemaju instalirane stekove protokola. Sljedeće dvije linije koda će se pobrinuti za ovo.

InternetStackHelper stack;
stack.Install (nodes);

InternetStackHelper - je topološki pomoćnik za Internet stekove, sličan PointToPointHelperu za mrežne uređaje od tačke do tačke. Metoda Instaliraj uzima NodeContainer kao parametar. Kada se izvrši, instalirat će internetski stog (TCP, UDP, IP, itd.) na svaki čvor kontejnera.

IPv4AddressHelper

Zatim moramo povezati naše uređaje sa IP adresama. Pružamo pomoćnika za topologiju za upravljanje dodjelom IP adresa. Jedini API koji je vidljiv korisniku je postavljanje osnovne IP adrese i mrežne maske za korištenje kada se radi stvarna distribucija adresa (ovo se radi na nižem nivou 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");

deklarišite objekat pomoćnika adrese i recite mu da treba da počne da dodeljuje IP adrese iz mreže 10.1.1.0, koristeći bitmasku 255.255.255.0 za određivanje. Podrazumevano, dodijeljene adrese će početi od jedan i monotono se povećavati, tako da će prva adresa dodijeljena iz ove baze biti 10.1.1.1, zatim 10.1.1.2, itd. U stvarnosti, na niskom nivou, ns-3 sistem pamti sve dodeljene IP adrese i generiše fatalnu grešku ako slučajno stvorite situaciju da se ista adresa generiše dva puta (usput, ovu grešku je teško otkloniti).

Sljedeća linija koda,

Ipv4InterfaceContainer interfaces = address.Assign (devices);

obavlja stvarnu dodjelu adrese. U ns-3 uspostavljamo vezu između IP adrese i uređaja pomoću objekta IPv4Interface. Kao što nam je ponekad potrebna lista mrežnih uređaja koju je kreirao pomoćnik za kasniju upotrebu, ponekad nam je potrebna lista objekata IPv4Interface. IPv4InterfaceContainer pruža ovu funkcionalnost.

Izgradili smo mrežu od tačke do tačke, sa instaliranim stekovima i dodeljenim IP adresama. Sada su nam potrebne aplikacije u svakom čvoru za generiranje prometa.

4.2.7 Korištenje aplikacije

Još jedna od glavnih apstrakcija ns-3 sistema je aplikacija (aplikacija). U ovom scenariju koristimo dvije specijalizacije osnovne klase aplikacija ns-3 pozvan UdpEchoServerApplication и UdpEchoClientApplication. Kao iu prethodnim slučajevima, koristimo pomoćne objekte za konfiguraciju i upravljanje osnovnim objektima. Ovdje koristimo UdpEchoServerHelper и UdpEchoClientHelper predmeta koji nam olakšavaju život.

UdpEchoServerHelper

Sljedeći redovi koda u našoj first.cc skripti se koriste za konfiguriranje aplikacije UDP echo servera na jednom od čvorova koje smo kreirali ranije.

UdpEchoServerHelper echoServer (9);

ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));

Prvi red koda u gornjem isječku kreira UdpEchoServerHelper. Kao i obično, ovo nije sama aplikacija, to je objekat koji nam pomaže da kreiramo prave aplikacije. Jedna od naših konvencija je da prenesemo tražene atribute konstruktoru pomoćnog objekta. U ovom slučaju pomoćnik ne može učiniti ništa korisno osim ako mu se ne da broj porta na kojem će server slušati pakete, ovaj broj također mora biti poznat klijentu. U ovom slučaju, prosljeđujemo broj porta pomoćnom konstruktoru. Konstruktor, zauzvrat, jednostavno radi SetAttribute sa prosleđenom vrednošću. Kasnije, ako želite, možete koristiti SetAttribute da postavite drugu vrijednost za atribut Port.

Kao i mnogi drugi pomoćni objekti, objekt UdpEchoServerHelper ima metodu Instaliraj. Izvođenje ove metode efektivno kreira osnovnu eho serversku aplikaciju i vezuje je za host. Zanimljivo, metoda Instaliraj prihvata NodeContainer kao parametar kao i ostali Instaliraj metode koje smo vidjeli.

C++ implicitna konverzija koja radi ovdje uzima rezultat metode node.Get(1) (koji vraća pametni pokazivač na objekt čvora - Ptr ) i koristi ga u konstruktoru za anonimni objekat NodeContainerkoji se zatim prosleđuje metodi Instaliraj. Ako u C++ kodu ne možete odrediti koji potpis metode se kompajlira i izvršava, onda potražite među implicitnim konverzijama.

Sada to vidimo echoServer.Install sprema se instalirati aplikaciju UdpEchoServerApplication na pronađen u NodeContainerkoji koristimo za upravljanje našim čvorovima, čvor sa indeksom 1. Metoda Instaliraj će vratiti kontejner koji sadrži pokazivače na sve aplikacije (u ovom slučaju jednu, budući da smo proslijedili anonimni NodeContainer, koji sadrži jedan čvor) kreiran od strane pomoćnika.

Aplikacije moraju odrediti kada će početi generirati promet "počni" i možda će trebati dodatno navesti vrijeme kada će ga zaustaviti "stani". Nudimo obe opcije. Ova vremena se postavljaju pomoću metoda ApplicationContainer start и Stop. Ove metode prihvataju parametre tipa vrijeme. U ovom slučaju koristimo eksplicitni niz C++ konverzija da bismo preuzeli C++ dvostruko 1.0 i pretvorite ga u tns-3 Time objekt koji koristi objekt Seconds za pretvaranje u sekunde. Zapamtite da pravila konverzije može kontrolisati autor modela, a C++ ima svoja pravila, tako da ne možete uvijek računati da će parametri biti konvertirani na način na koji ste očekivali. Dvije linije

serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));

će uzrokovati da se aplikacija eho servera pokrene (uključuje automatski) jednu sekundu nakon što simulacija započne i zaustavi (isključi se) nakon deset sekundi simulacije. Zbog činjenice da smo deklarirali događaj simulacije (događaj zaustavljanja aplikacije), koji će se izvršiti za deset sekundi, bit će simulirano najmanje deset sekundi rada mreže.

UdpEchoClientHelper

Klijentska aplikacija odjek konfigurisan na način skoro sličan serveru. Postoji osnovni objekat UdpEchoClientApplicationvodi
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 moramo postaviti pet različitih atributa. Prva dva atributa se postavljaju u vrijeme kreiranja UdpEchoClientHelper. Mi prosljeđujemo parametre koji se koriste (unutar pomoćnika) za postavljanje atributa "Udaljena adresa" и "RemotePort" u skladu sa našim dogovorom da prosledimo potrebne parametre pomoćnom konstruktoru.

Sjetimo se da smo koristili IPv4InterfaceContainer za praćenje IP adresa koje smo dodijelili našim uređajima. Null interfejs u kontejneru interfejsa odgovaraće IP adresi nultog čvora u kontejneru čvorova. Prvi interfejs u kontejneru interfejsa odgovara IP adresi prvog čvora u kontejneru čvorova. Dakle, u prvom redu koda (iznad) kreiramo pomoćnika i kažemo mu da će klijentova udaljena adresa biti IP adresa koja je dodeljena hostu gde se server nalazi. Takođe kažemo da treba da organizujemo slanje paketa na port devet.

Atribut "MaxPackets" govori klijentu maksimalan broj paketa koje možemo poslati tokom simulacije. Atribut "Interval" govori klijentu koliko dugo treba čekati između paketa, a "PacketSize" atribut govori klijentu koliki bi teret trebao biti paket. Sa ovom kombinacijom atributa kažemo klijentu da pošalje jedan paket od 1024 bajta.

Kao i kod echo servera, postavljamo atribute echo klijenta start и Stop, ali ovdje pokrećemo klijenta sekundu nakon što se server uključi (dvije sekunde nakon početka simulacije).

4.2.8 Simulator

U ovom trenutku moramo pokrenuti simulaciju. Ovo se radi pomoću globalne funkcije Simulator::Run.

Simulator::Run ();

Kada smo prethodno pozvali metode,

serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));
... 
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));

zapravo smo zakazali događaje u simulatoru na 1,0 sekunde, 2,0 sekunde i dva događaja na 10,0 sekundi. Nakon poziva Simulator::Run, sistem će početi da prikazuje listu zakazanih događaja i da ih izvršava. Prvo će pokrenuti događaj za 1,0 sekundu, koji će pokrenuti aplikaciju eho servera (ovaj događaj zauzvrat može zakazati mnoge druge događaje). Zatim će pokrenuti događaj zakazan za t=2,0 sekunde koji će pokrenuti echo klijentsku aplikaciju. Opet, ovaj događaj može imati mnogo više planiranih događaja. Implementacija eho klijenta startnog događaja će započeti fazu prijenosa podataka simulacije slanjem paketa na server.

Čin slanja paketa na server će pokrenuti lanac događaja koji će se automatski zakazivati ​​iza scene i koji će implementirati mehaniku slanja eho paketa prema vremenskim parametrima koje smo postavili u skripti.

Kao rezultat toga, pošto šaljemo samo jedan paket (zapamtite, atribut MaxPackets postavljeno na jedan), lanac događaja pokrenut ovim pojedinačnim klijentskim pingom će se završiti i simulacija će preći u stanje pripravnosti. Kada se to dogodi, preostali zakazani događaji će biti događaji Stop za server i klijent. Kada se ovi događaji izvrše, neće ostati događaji za dalju obradu i Simulator::Run će vratiti kontrolu. Simulacija je završena.

Ostaje samo da počistite za sobom. Ovo se radi pozivanjem globalne funkcije Simulator::Destroy. Zato što su pozvane pomoćne funkcije (ili niskorazinski ns-3 kod) koje su organizirane tako da su kuke umetnute u simulator kako bi se uništili svi objekti koji su kreirani. Niste morali sami da pratite nijedan od ovih objekata – sve što je trebalo da uradite je da pozovete Simulator::Destroy i izađi. ns-3 sistem će obaviti ovaj težak posao za vas. Preostale linije naše prve ns-3 skripte, first.cc, rade upravo to:

Simulator::Destroy ();
return 0;
}

Kada će simulator stati?

ns-3 je simulator diskretnog događaja (DE). U takvom simulatoru, svaki događaj je povezan sa njegovim vremenom izvršenja, a simulacija se nastavlja obradom događaja onim redoslijedom kojim se događaju kako simulacija napreduje. Događaji mogu uzrokovati zakazivanje budućih događaja (na primjer, tajmer se može pomjeriti da završi brojanje u sljedećem intervalu).

Inicijalne događaje obično inicira entitet, na primjer IPv6 će zakazati otkrivanje usluga na mreži, susjedske zahtjeve itd. Aplikacija zakazuje prvi događaj slanja paketa i tako dalje. Kada se događaj obradi, može generirati nula, jedan ili više događaja. Kako simulacija napreduje, dešavaju se događaji, koji završavaju ili stvaraju nove. Simulacija će se automatski zaustaviti ako je red događaja prazan ili se otkrije poseban događaj Stop. Događaj Stop koju generiše funkcija Simulator::Stop (vreme zaustavljanja).

Postoji tipičan slučaj kada je Simulator::Stop apsolutno neophodan za zaustavljanje simulacije: kada postoje samoodrživi događaji. Samoodrživi (ili ponavljajući) događaji su događaji koji se uvijek pomjeraju. Kao posljedica toga, oni uvijek drže red događaja ne prazan. Postoji mnogo protokola i modula koji sadrže ponavljajuće događaje, na primjer:

• FlowMonitor - periodična provjera izgubljenih paketa;

• RIPng – periodično emitovanje ažuriranja tabele rutiranja;

• itd.

U takvim slučajevima Simulator::Stop neophodno za pravilno zaustavljanje simulacije. Dodatno, kada je ns-3 u režimu emulacije, RealtimeSimulator se koristi za sinhronizaciju sata simulacije sa satom mašine, i Simulator::Stop neophodno za zaustavljanje procesa.

Mnogi od simulacijskih programa u udžbeniku ne pozivaju Simulator::Stop eksplicitno, budući da se automatski završavaju kada se iscrpe događaji u redu čekanja. Međutim, ovi programi će također prihvatiti poziv Simulator::Stop. Na primjer, sljedeća dodatna izjava u prvom primjeru programa bi zakazala eksplicitno zaustavljanje na 11 sekundi:

+ Simulator::Stop (Seconds (11.0));
  Simulator::Run ();
  Simulator::Destroy ();
  return 0;
}

Gore navedeno neće zapravo promijeniti ponašanje ovog programa jer se ova simulacija prirodno završava nakon 10 sekundi. Ali ako biste promijenili vrijeme zaustavljanja u gornjoj izjavi sa 11 sekundi na 1 sekundu, primijetili biste da se simulacija zaustavlja prije nego što bilo koji izlaz dođe na ekran (pošto se izlaz događa nakon otprilike 2 sekunde vremena simulacije).

Važno je pozvati Simulator::Stop prije pozivanja Simulator::Run; inače Simulator::Run možda nikada neće vratiti kontrolu glavnom programu da izvrši zaustavljanje!

4.2.9 Izrada vaše skripte

Napravili smo trivijalno kreiranje vaših jednostavnih skripti. Sve što trebate učiniti je staviti svoju skriptu u scratch direktorij i ona će se automatski napraviti ako pokrenete Waf. Pokusajmo. Vratite se na direktorij najvišeg nivoa i kopirajte examples/tutorial/first.cc u katalog ogrebotina

$ cd ../.. 
$ cp examples/tutorial/first.cc scratch/myfirst.cc

Sada napravite svoj prvi uzorak skripte koristeći waf:

$ ./waf

Trebali biste vidjeti poruke koje ukazuju da je vaš prvi primjer uspješno kreiran.

Waf: Entering directory `/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: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (2.357s)

Sada možete pokrenuti primjer (imajte na umu da ako napravite svoj program u scratch direktoriju, onda ga morate pokrenuti iz ogrebotina):

$ ./waf --run scratch/myfirst

Trebali biste vidjeti sličan izlaz:

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.418s) Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
Received 1024 bytes from 10.1.1.2

Ovdje možete vidjeti da sistem izgradnje potvrđuje da je datoteka izgrađena i zatim je pokreće. Vidite da unos komponente na echo klijentu označava da je poslao jedan paket od 1024 bajta na echo server 10.1.1.2. I vi vidite komponentu za evidentiranje na echo serveru da kažete da je primila 1024 bajta od 10.1.1.1. Echo server tiho reproducira paket i možete vidjeti u dnevniku echo klijenta da je primio svoj paket nazad od servera.

4.3 ns-3 Izvorni kod

Sada kada ste koristili neke od ns-3 pomoćnika, možete pogledati neke od izvornih koda koji implementiraju ovu funkcionalnost. Najnoviji kod možete pogledati na našem web serveru na sljedećem linku: https://gitlab.com/nsnam/ns-3-dev.git. Tamo ćete vidjeti Mercurial stranicu sažetka za naše ns-3 stablo razvoja. Na vrhu stranice vidjet ćete nekoliko linkova,

summary | shortlog | changelog | graph | tags | files

Samo naprijed i odaberite vezu za datoteke. Ovako će izgledati najviši nivo 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 | annotate

Naši primjeri skripti su u direktoriju primjeri. Ako kliknete na primjere, vidjet ćete listu poddirektorija. Jedna od datoteka u poddirektorijumu tutorial - first.cc... Ako kliknete na first.cc vidjet ćete kod koji ste upravo naučili.

Izvorni kod se uglavnom nalazi u direktoriju src. Možete vidjeti izvorni kod klikom na ime direktorija ili klikom na vezu datoteka desno od naziva direktorija. Ako kliknete na src direktorij, dobit ćete listu src poddirektorija. Ako zatim kliknete na osnovni poddirektorij, naći ćete listu datoteka. Prva datoteka koju ćete vidjeti (u vrijeme pisanja ovog vodiča) je abort.h. Ako kliknete na link abort.h, bit ćete poslani u izvorni fajl za abort.h, koji sadrži korisne makroe za izlazak iz skripti ako se otkriju abnormalni uslovi. Izvorni kod za pomoćnike koje smo koristili u ovom poglavlju može se naći u direktoriju src/Applications/helper. Slobodno prošetajte po stablu direktorija da shvatite šta je gde i razumete stil ns-3 programa.

izvor: www.habr.com

Dodajte komentar