
4 Prehľad konceptu
4.1 Kľúčové abstrakcie
4.1.1 Uzol (Node)
4.1.2 Aplikácia (Application)
4.1.3 Kanál (Channel)
4.1.4 Sietové zariadenie (Net Device)
4.1.5 Topologické pomocníci
4.2 Prvý skript ns-3
4.2.1 Boilerplate kód
4.2.2 Pripojiteľné moduly
4.2.3 Priestor názvov ns3
4.2.4 Žurnalizovanie
4.2.5 Hlavná funkcia
4.2.6 Používanie topologických pomocníkov
4.2.7 Používanie Aplikácie
4.2.8 Simulátor
4.2.9 Zostavenie vášho scenára
4.3 ns-3 Zdrojový kód
Kapitola 4
Prehľad konceptu
Prvé, čo musíme urobiť predtým, ako začneme študovať alebo písať kód ns‑3, je vysvetliť niekoľko základných pojmov a abstrakcií v systéme. Mnohé z toho sa niektorým môžu zdať zrejmé, ale odporúčame venovať čas čítaniu tejto časti, aby ste sa uistili, že začínate na pevných základoch.
4.1 Kľúčové abstrakcie
V tejto časti sa pozrieme na niektoré termíny, ktoré sa bežne používajú v sieti, ale majú špecifický význam v ns‑3.
4.1.1 Uzol (Node)
Na internetovom žargóne sa počítačové zariadenie, ktoré je pripojené k sieti, nazýva hostiteľom alebo občas koncovým systémom. Z dôvodu, že ns‑3 je simulátor siete, nie simulátor Internetu, úmyselne nepoužívame pojem hostiteľ, pretože je to tesne späté s Internetom a jeho protokolmi. Namiesto toho používame všeobecnejší termín, ktorý sa tiež používa v iných simulátoroch, ktorý má pôvod v teórii grafov – uzol (node).
V ns-3 je základná abstrakcia výpočtového zariadenia nazvaná uzol. Táto abstrakcia je v C++ reprezentovaná triedou Node. Trieda NodeNode (uzol) poskytuje metódy na správu zobrazení výpočtových zariadení v simuláciách.
Musíte chápať Node ako počítač, ku ktorému pridáte funkčnosť. Pridáte doň také veci, ako sú aplikácie, protokolové zásobníky a periférne karty s ovládačmi, ktoré umožnia počítaču vykonávať užitočnú prácu. Používame rovnaký základný model v ns-3.
4.1.2 Aplikácia (Application)
Vo všeobecnosti sa počítačový softvér delí na dva široké typy. Systémový softvér organizuje rôzne počítačové zdroje, ako sú pamäť, procesorové cykly, disk, sieť atď., v súlade s určitou výpočtovou modelou. Systémový softvér zvyčajne nevyužíva tieto zdroje na vykonávanie úloh, ktoré prinášajú okamžitý užitočný prínos pre používateľa. Používateľ zvyčajne spúšťa aplikáciu, aby dosiahol určitý cieľ, pričom táto aplikácia získava a využíva zdroje riadené systémovým softvérom.
Často je rozhranie medzi systémovým a aplikačným softvérom definované zmenou úrovne privilégií, ktorá nastáva pri systémových volaniach ovládačov. V ns-3 neexistuje skutočná koncepcia operačného systému, a preto ani koncepcie úrovní privilégií alebo systémových volaní. Avšak máme koncept aplikácie. Rovnako ako vo „skutočnom svete“, aplikácie fungujúce v počítačoch na vykonávanie úloh, aplikácie ns-3 fungujú na uzloch ns-3 na riadenie simulácií v simulovanom svete.
V ns-3 je základnou abstrakciou pre používateľský program, ktorý generuje nejakú aktivitu na modelovanie, aplikácia. Táto abstrakcia je v C++ zastúpená triedou Application (aplikácia). Trieda Application poskytuje metódy na správu predstáv našej verzie aplikácií na úrovni používateľa v simuláciách. Očakáva sa, že vývojári špecializujú triedu Application v zmysle objektovo orientovaného programovania, aby vytvorili nové aplikácie. V tejto príručke budeme používať špecializácie triedy Application nazývané UdpEchoClientApplication a UdpEchoServerApplication. Ako sa dalo očakávať, tieto aplikácie tvoria skupinu klientskych/serverových aplikácií, ktoré sa používajú na generovanie a echa-simuláciu sieťových paketov.
4.1.3 Kanál (Channel)
V reálnom svete je možné pripojiť počítač k sieti. Často sú prostredia, cez ktoré sú prenášané dáta v týchto sieťach, nazývané kanálmi. Keď pripojíte Ethernetový kábel do zásuvky na stene, pripojujete počítač k komunikačnému kanálu Ethernet. V simulovanom svete ns-3 je uzol pripojený k objektu, ktorý predstavuje komunikačný kanál. Tu je hlavná abstrakcia komunikačnej podsiete nazývaná kanál a je predstavená v C++ triedou Channel (kanál).
Trieda ChannelChannel poskytuje metódy na správu interakcie objektov podsiete a ich pripojenie k uzlom. Kanály môžu byť tiež špecializované vývojármi v zmysle objektovo orientovaného programovania. Špecializácia kanála môže modelovať niečo jednoduché, ako je drôt. Špecializovaný kanál môže tiež modelovať zložitejšie veci, ako je veľký Ethernetový prepínač alebo trojrozmerný priestor plný prekážok v prípade bezdrôtových sietí.
V tomto sprievodcovi budeme používať špecializované verzie kanála nazývané CsmaChannelCsmaChannel, PointToPointChannelPointToPointChannel a WifiChannelWifiChannel. CsmaChannel, napríklad, modeluje verziu komunikačnej podsiete, ktorá realizuje komunikačné prostredie s viacerými prístupmi s kontrolou nosnej. To nám poskytuje funkčnosť podobnú Ethernetu.
4.1.4 Sietové zariadenie (Net Device)
Kedysi bolo tak, že ak ste chceli pripojiť počítač k sieti, museli ste si kúpiť konkrétny sieťový kábel a hardvérové zariadenie nazývané (v terminológii PC) periférna karta, ktorú bolo potrebné nainštalovať do počítača. Ak boli na periférnej karte implementované niektoré sieťové funkcie, nazývali sa sieťové rozhrania alebo sieťové karty. Dnes prichádza väčšina počítačov so zabudovaným hardvérom sieťového rozhrania a používatelia ich nevnímajú ako samostatné zariadenia.
Sieťová karta nebude fungovať bez programového ovládača, ktorý riadi jej hardvér. V Unixe (alebo Linuxe) je časť periférneho hardvéru klasifikovaná ako device. Zariadenia sú spravované pomocou ovládačov zariadení (device drivers) a sieťové zariadenia (NIC) sú spravované pomocou ovládačov sieťových zariadení (network device drivers) a majú súhrnné názvy sieťové zariadenia (net devices). V Unix a Linux sa na sieťové zariadenia odvolávate pomocou názvov ako napríklad eth0.
V ns‑3 abstrahácia sieťového zariadenia zahŕňa ako softvérový ovládač, tak aj modelované vybavenie. Pri simulácii je sieťové zariadenie „nainštalované“ v uzle, aby sa mohlo spájať s inými uzlami cez kanály. Tak ako v skutočnom počítači, aj uzol môže byť pripojený k viacerým kanálom cez niekoľko zariadení. NetDevices.
Sieťová abstrahácia zariadenia je reprezentovaná v C++ triedou NetDevice. Trieda NetDevice poskytuje metódy na správu pripojení s objektmi Node a Channel; a môžu byť špecializované vývojármi v zmysle objektovo orientovaného programovania. V tejto príručke budeme používať niekoľko špecializovaných verzií NetDevice pod názvami CsmaNetDevice, PointToPointNetDevice a WifiNetDevice. Rovnako ako sieťový adaptér Ethernet je určený na prácu so sieťou Ethernet, CsmaNetDevice je určený na prácu s CsmaChannel, PointToPointNetDevice je určený na prácu s PointToPointChannel, a WifiNetDevice — je určený na prácu s WifiChannel.
4.1.5 Topologické pomocníci
V skutočnej sieti nájdete hostiteľské počítače s pridanými (alebo zabudovanými) sieťovými kartami. V ns‑3 by sme povedali, že uvidíte uzly s pripojenými NetDevices. V veľkej simulovanej sieti budete musieť usporiadať pripojenia medzi množstvom objektov. Node, NetDevice a Channel.
Keďže pripojenie NetDevices k uzlom, NetDevices k kanálom, priradenie IP adries a pod. v ns‑3 je bežnou úlohou, aby sme to urobili čo najjednoduchšie, poskytujeme tzv. topologické pomocníky. Napríklad na vytvorenie NetDevice je potrebné vykonať množstvo operácií v jadre ns‑3, pridať MAC adresu, nastaviť toto sieťové zariadenie v Node, konfigurovať zásobník protokolov uzla a potom pripojiť NetDevice k Channel. Ešte viac operácií bude potrebné, aby sa pripojilo niekoľko zariadení k viacbodovým kanálom a potom spojiť jednotlivé siete do zjednotenej siete (Internetworks). Poskytujeme pomocné objekty topológie, ktoré pre vaše pohodlie kombinujú tieto nespočetné operácie do ľahko použiteľného modelu.
4.2 Prvý skript ns-3
Ak ste nainštalovali systém, ako bolo navrhnuté vyššie, budete mať vydanie ns‑3 v adresári s názvom repos vo vašej domovskej zložke. Prejdite do adresára release
Ak nemáte taký adresár, znamená to, že ste pri vytváraní finálnej verzie ns-3 neuviedli výstupný adresár, vykonajte kompiláciu takto:
$ ./waf configure —build-profile=release —out=build/release,
$ ./waf build
tam by ste mali vidieť štruktúru adresára podobnú nasledujúcej:
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.pycPrejdite do adresára examples/tutorial. Mali by ste tam vidieť súbor s názvom first.cc. Toto je skript, ktorý vytvorí jednoduché bod-to-bod spojenie medzi dvoma uzlami a prenesie jeden balík medzi uzlami. Poďme sa pozrieť na tento skript riadok po riadku, na to otvoríme first.cc vo vašom obľúbenom editore.
4.2.1 Boilerplate kód
Prvý riadok v súbore je riadok režimu editora emacs. Hovorí emacsu o konvenciách formátovania (štýl kódovania), ktoré budeme používať v našom zdrojovom kóde.
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */Toto je vždy dosť sporná otázka, preto by sme mali objasniť, aby sme ju hneď odstránili z cesty. Projekt ns-3, rovnako ako väčšina veľkých projektov, prijal štýl kódovania, ktorému musí zodpovedať celý poskytnutý kód. Ak chcete prispieť svojím kódom do projektu, nakoniec budete musieť dodržať normy kódovania ns-3, ako je opísané v súbore doc/codingstd.txt alebo uvedené na webovej stránke projektu: .
Odporúčame vám zvyknúť si na vzhľad kódu ns-3 a uplatňovať tento štandard vždy, keď pracujete s naším kódom. Celý tím vývojárov a prispievateľov sa na tom dohodol po niekoľkých náznakoch. Riadenie režimu emacs, uvedené vyššie, uľahčuje správne formátovanie, ak používate editor emacs.
Simulátor ns-3 je licencovaný s použitím GNU General Public License. Uvidíte príslušný právny titulok GNU v každom súbore distribúcie ns-3. Často môžete vidieť oznámenie o autorských právach pre jednu z zapojených inštitúcií v projekte ns-3 nad textom GPL a autora, ako je uvedené nižšie.
/*
* 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 Pripojiteľné moduly
Skutočný kód začína sériou direktív pre zahrnutie (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"Aby sme našim používateľom skriptov s vysokou úrovňou pomohli vysporiadať sa s veľkým množstvom hlavičkových súborov prítomných v systéme, združujeme ich podľa ich využitia do veľkých modulov. Poskytujeme jeden hlavičkový súbor, ktorý bude rekurzívne načítavať všetky hlavičkové súbory, ktoré sa používajú v danom module. Namiesto toho, aby ste hľadali, ktorý hlavičkový súbor potrebujete, a možno dostali správny zoznam závislostí, dávame vám možnosť načítať skupinu súborov s vysokou úrovňou detailu. Nie je to najefektívnejší prístup, ale rozhodne to uľahčuje písanie skriptov.
Každý z pripojených súborov ns-3 sa umiestňuje do adresára s názvom ns3 (podadresár zostavy), aby sa počas procesu zostavovania predišlo konfliktom názvov súborov. Súbor ns3/core-module.h zodpovedá modulu ns-3, ktorý nájdete v adresári src/core vo vašej nainštalovanej verzii. V zozname tohto adresára nájdete veľké množstvo hlavičkových súborov. Keď vykonáte zostavenie, Waf umiestňuje verejné hlavičkové súbory do adresára ns3 v podadresári build/debug
Ak nemáte taký adresár, znamená to, že ste pri vytváraní finálnej verzie ns-3 neuviedli výstupný adresár, vykonajte kompiláciu takto:
$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf build
alebo
$ ./waf configure --build-profile=optimized --out=build/optimized
$ ./waf build
alebo build/optimized, v závislosti od vašej konfigurácie. Waf taktiež automaticky generuje pripojený súbor modulu na načítanie všetkých verejných hlavičkových súborov. Keďže, samozrejme, nezmeniteľne dodržiavate túto príručku, už ste vykonali
$ ./waf -d debug --enable-examples --enable-tests configureaby ste pripravili projekt na vykonávanie ladených zostáv, ktoré zahŕňajú príklady a testy. Taktiež ste urobili
$ ./wafaby ste zostavili projekt. Takže teraz, keď sa pozriete do adresára ../..//build/debug/ns3, tam, medzi inými, nájdete hlavičkové súbory štyroch modulov uvedených vyššie. Môžete sa pozrieť na obsah týchto súborov a zistiť, že obsahujú všetky verejné súbory používané príslušnými modulmi.
4.2.3 Priestor názvov ns3
Ďalší riadok v skripte first.cc je deklarácia menného priestoru.
using namespace ns3;Projekt ns‑3 je implementovaný v priestore názvov C++, ktorý sa nazýva ns3. To zhromažďuje všetky ns‑3 súvisiace deklarácie v oblasti viditeľnosti mimo globálneho priestoru názvov, čo by, ako dúfame, malo pomôcť pri integrácii s iným kódom. Použitie operátora C++ zavádza priestor názvov ns‑3 do aktuálneho (globálneho) deklaratívneho regiónu. Je to podivný spôsob, ako povedať, že po tomto vyhlásení už nebudete musieť vkladať operátor rozlíšenia ns3::priestor pred celý kód ns‑3, aby ste ho mohli používať. Ak nie ste oboznámení s priestormi názvov, obrátite sa na takmer akúkoľvek učebnicu C++ a porovnáte priestor názvov ns3 s použitím priestoru názvov std a deklarácií. using namespace std; v príkladoch používania výstupného operátora cout a prúdov.
4.2.4 Žurnalizovanie
Nasledujúci riadok skriptu je taký,
NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");Toto vyhlásenie budeme používať ako pohodlné miesto na diskusiu o našom systéme dokumentovania Doxygen. Ak sa pozriete na webovú stránku projektu ns‑3, nájdete odkaz „Dokumentácia“ (Documentation) na paneli navigácie. Ak vyberiete tento odkaz, dostanete sa na našu stránku dokumentácie. Existuje odkaz na „Posledné vydanie“, ktorý vás nasmeruje k dokumentácii pre poslednú stabilnú verziu ns‑3. Ak vyberiete odkaz „API Documentation“, dostanete sa na stránku dokumentácie API ns‑3.
Na ľavej strane stránky nájdete grafické zobrazenie štruktúry dokumentácie. Dobré miesto na začiatok je „kniha“ Moduly ns‑3 v navigačnom strome ns‑3. Ak rozbalíte Moduly, uvidíte zoznam dokumentácie modulov ns‑3. Ako bolo uvedené vyššie, koncept modulu tu priamo súvisí so súbormi zaradenými do modulu vyššie. Podsystem zaznamenávania (logovania) ns‑3 je diskutovaný v sekcii Použitie modulu zaznamenávania, preto sa k nemu vrátime neskôr v tejto príručke, ale môžete sa dozvedieť o vyššie uvedenom vyhlásení pohľadom na modul Jadro, a potom otvorením knihy Nástroje na ladenie, a potom výberom stránky Logging. Kliknite na Logging.
Teraz by ste mali prezrieť dokumentáciu Doxygen pre modul Logging. V zozname makier v hornej časti stránky uvidíte záznam pre NS_LOG_COMPONENT_DEFINE. Predtým, než prejdete na odkaz, určite si prečítajte „Podrobné informácie“ o module registrácie, aby ste pochopili jeho celkové fungovanie. Môžete sa na to posunúť nadol alebo zvoliť „Viac…“ pod diagramom.
Akonáhle budete mať jasný obraz o tom, čo sa deje, pokračujte a pozrite si dokumentáciu konkrétnych NS_LOG_COMPONENT_DEFINE. Nebudem tu duplicovať dokumentáciu, ale zhrnieme to tak, že tento riadok vyhlasuje registračný komponent s názvom FirstScriptExample, ktorý umožňuje zapínať a vypínať konzolové registrácie správ podľa odkazu na názov.
4.2.5 Hlavná funkcia
V nasledujúcich riadkoch skriptu uvidíte,
int
main (int argc, char *argv[])
{ To je iba vyhlásenie hlavnej funkcie vašej programu (skriptu). Ako v každej program obsahuje C++, musíte definovať hlavnú funkciu, ktorá sa vykonáva prvá. Nie je tu nič špeciálne. Váš skript ns‑3 je jednoducho program C++. Nasledujúci riadok nastavuje časové rozlíšenie na 1 nanosekundu, čo je predvolená hodnota:
Time::SetResolution (Time::NS);Časové rozlíšenie alebo jednoducho rozlíšenie je najmenšia hodnota času, ktorá môže byť použitá (najmenší predstaviteľný rozdiel medzi dvoma časovými hodnotami). Môžete zmeniť rozlíšenie iba raz. Mechanizmus, ktorý poskytuje túto flexibilitu, spotrebováva pamäť, takže akonáhle je rozlíšenie explicitne nastavené, uvoľňujeme pamäť, aby sme predišli ďalším aktualizáciám. (Ak výslovne nenastavíte rozlíšenie, predvolene bude 1 nanosekunda a pamäť sa uvoľní na začiatku simulácie.)
Nasledujúce dve riadky skriptu sa používajú na aktiváciu dvoch komponentov protokolovania, ktoré sú zabudované do aplikácií EchoClient a EchoServer:
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO); LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);Ak ste si prečítali dokumentáciu k komponentu Logging, uvidíte, že existuje niekoľko úrovní podrobností registrácie, ktoré môžete zapnúť pre každý komponent. Tieto dve riadky kódu zapnú vedenie denníka na úrovni INFO pre echo klientov a serverov. Na tejto úrovni aplikácia počas simulácie vypisuje správy pri odosielaní a prijímaní paketov.
Teraz prejdeme priamo k vytvoreniu topológie a spusteniu simulácie. Využijeme objekty topologických pomocníkov, aby bola táto práca čo najjednoduchšia.
4.2.6 Používanie topologických pomocníkov
Nasledujúce dve riadky kódu v našom skripte vlastne vytvoria objekty Node ns-3, ktoré budú reprezentovať počítače v simulácii.
NodeContainer nodes;
nodes.Create (2);Predtým, ako budeme pokračovať, nájdime dokumentáciu pre triedu NodeContainer. Ďalší spôsob, ako sa dostať do dokumentácie k tejto triede, je prostredníctvom záložky Classes na stránkach Doxygen. Ak máte Doxygen už otvorený, jednoducho posuňte sa nahor až na vrchol stránky a vyberte záložku Classes. Mali by ste vidieť nový súbor záložiek, z ktorých jedna je zoznam tried. Pod touto záložkou uvidíte zoznam všetkých tried ns-3. Posuňte sa nadol k ns3 :: NodeContainer. Keď nájdete triedu, vyberte ju, aby ste prešli k dokumentácii pre triedu.
Ako si pamätáme, jednou z našich kľúčových abstrakcií je uzol. Predstavuje počítač, ku ktorému plánujeme pridať také veci ako protokolové zásobníky, aplikácie a periférne karty. Topologický pomocník NodeContainer poskytuje pohodlný spôsob, ako vytvárať, spravovať a pristupovať k akýmkoľvek objektom Node, ktoré vytvárame na spustenie simulácie. Prvý riadok vyššie jednoducho vyhlasuje NodeContainer, ktorý nazývame nodes. Druhý riadok volá metódu Create pre objekt nodes a žiada kontajner o vytvorenie dvoch uzlov. Ako je popísané v Doxygen, kontajner žiada systém ns-3 o vytvorenie dvoch objektov Node a uchováva ukazovatele na tieto objekty vo svojom vnútornom úložisku.
Uzly vytvorené v skripte zatiaľ nič nerobia. Nasledujúcim krokom pri vytváraní topológie je pripojiť naše uzly k sieti. Najjednoduchšia forma siete, ktorú podporujeme, je dvojbodové spojenie medzi dvoma uzlami. Teraz takéto spojenie vytvoríme.
PointToPointHelper
Vytvárame dvojbodové spojenie, pričom postupujeme podľa známeho vzoru, používame topologický pomocný objekt na vykonanie nízkoúrovňovej práce potrebnej na pripojenie. Pripomíname, že naše dve kľúčové abstrakcie NetDevice a Channel. V reálnom svete tieto pojmy približne zodpovedajú periférnym kartám a sieťovým káblom. Spravidla sú tieto dve veci úzko prepojené a nikto nemôže počítať s výmenou, napríklad zariadení Ethernet cez bezdrôtový kanál. Naši topologickí pomocníci sledujú toto tesné prepojenie a preto budete v tomto scenári používať jeden objekt PointToPointHelper na nastavenie a pripojenie objektov ns-3 PointToPointNetDevice a PointToPointChannel. Nasledujúce tri riadky v scenári:
PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));Prvý riadok,
PointToPointHelper pointToPoint;vytvára v staku inštanciu objektu PointToPointHelper. Z pohľadu vrchnej úrovne nasledujúci riadok,
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));povie objektu PointToPointHelper použiť hodnotu „5 Mbps“ (päť megabitov za sekundu) ako „DataRate».
Z konkrétnejšieho pohľadu riadok „DataRate“ zodpovedá tomu, čo nazývame atribútom PointToPointNetDevice. Ak sa pozriete na Doxygen pre triedu ns3::PointToPointNetDevice a v dokumentácii k metóde GetTypeId nájdete zoznam atribútov definovaných pre zariadenie. Medzi nimi bude atribút „DataRate“. Väčšina používateľsky viditeľných objektov ns-3 má podobné zoznamy atribútov. Tento mechanizmus využívame na jednoduché nastavenie simulácie bez prekompilácie, ako uvidíte v nasledujúcej časti.
Podobne ako „DataRate“ v PointToPointNetDevice, nájdete atribút „Delay“, ktorý súvisí s PointToPointChannel. Finálny riadok,
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));hovorí PointToPointHelper použiť hodnotu „2 ms“ (dve milisekundy) ako hodnotu oneskorenia šírenia cez kanál bod-punkt, ktorý následne vytvorí.
NetDeviceContainer
Zatiaľ máme v scenári NodeContainer, ktorý obsahuje dva uzly. Máme PointToPointHelper, ktorý je pripravený na vytvorenie objektov PointToPointNetDevices a pripojenie ich pomocou objektu PointToPointChannel. Rovnako ako sme použili na vytvorenie uzlov pomocný objekt topológie NodeContainer, požiadame PointToPointHelper aby vykonala prácu súvisiacu s vytváraním, nastavením a inštalovaním našich zariadení. Budeme potrebovať zoznam všetkých vytvorených objektov. NetDevice, preto používame NetDeviceContainer na ich ukladanie rovnako, ako sme používali NodeContainer na ukladanie našich vytvorených uzlov. Nasledujúce dve riadky kódu,
NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);dokončujú nastavenie zariadení a kanála. Prvý riadok deklaruje kontajner zariadení, spomenutý vyššie, a druhý vykonáva hlavnú prácu. Metóda Nainštalovať objektu PointToPointHelper prijíma NodeContainer ako parameter. Vnútri NetDeviceContainer pre každý uzol nachádzajúci sa v NodeContainer sa vytvára (pre spojenie bod-bod ich musí byť presne dva) PointToPointNetDevice sa vytvára a ukladá do kontajnera zariadení. PointToPointChannel sa vytvára a k nemu sa pripoja dva PointToPointNetDevices. Po vytvorení objektov sa atribúty uložené v PointToPointHelper, používajú na inicializáciu príslušných atribútov vo vytvorených objektoch.
Po vykonaní volania pointToPoint.Install (nodes) budeme mať dva uzly, každý s nainštalovaným sieťovým zariadením „bod-bod“ a jedným kanálom „bod-bod“ medzi nimi. Oba zariadenia budú nastavené na prenos dát rýchlosťou päť megabitov za sekundu so oneskorením prenosu po kanáli dve milisekundy.
InternetStackHelper
Teraz máme nastavené uzly a zariadenia, ale na našich uzloch nie sú nainštalované protokolové zásobníky. Nasledujúce dve riadky kódu sa o to postarajú.
InternetStackHelper stack;
stack.Install (nodes);InternetStackHelper je pomocník pre topológiu pre internetové zásobníky, podobne ako PointToPointHelper pre dvojbodové sieťové zariadenia. Metóda Nainštalovať prijíma NodeContainer ako parameter. Pri vykonaní nainštaluje internetový zásobník (TCP, UDP, IP, atď.) na každom uzle kontajnera.
Ipv4AddressHelper
Potom musíme naše zariadenia prepojiť s IP adresami. Poskytujeme pomocníka pre správu rozdelenia IP adries. Jediný viditeľný používateľský API je nastavenie základnej IP adresy a masky siete na použitie pri vykonávaní skutočného rozdelenia adries (to sa deje na nižšej úrovni vo vnútri pomocníka). Nasledujúce dve riadky kódu v našom príklade skriptu first.cc,
Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");deklara pomocný objekt adresy a hovorí mu, že má začať priraďovať IP adresy z rozsahu 10.1.1.0, používajúc na určenie bitovú masku 255.255.255.0. Predvolením priradené adresy začnú s jednotkou a budú sa monotónne zvyšovať, takže prvá adresa priradená z tejto základne bude 10.1.1.1, potom 10.1.1.2 atď. V praxi na nízkej úrovni systém ns-3 uchováva všetky priradené IP adresy a generuje fatálnu chybu, ak náhodou vytvoríte situáciu, kde bude rovnaká adresa vygenerovaná dvakrát (mimochodom, túto chybu je ťažké oddebukovať).
Nasledujúca línia kódu,
Ipv4InterfaceContainer interfaces = address.Assign (devices);vykonáva skutočné priradenie adresy. V ns-3 vytvárame spojenie medzi IP adresou a zariadením, používajúc objekt Ipv4Interface. Tak ako občas potrebujeme zoznam sieťových zariadení vytvorených asistentom na ďalšie použitie, občas potrebujeme zoznam objektov Ipv4Interface. Ipv4InterfaceContainer poskytuje túto funkcionalitu.
Vybudovali sme bod-to-bod sieť so stanovenými zásobníkmi a priradenými IP adresami. Teraz potrebujeme na každom uzle aplikáciu na generovanie prevádzky.
4.2.7 Používanie Aplikácie
Ďalšia z hlavných abstrakcií systému ns-3 je Aplikácia (application). V tomto scenári používame dve špecializácie základnej triedy Aplikácia ns-3 s názvom UdpEchoServerApplication a UdpEchoClientApplication. Rovnako ako v predchádzajúcich prípadoch používame pomocné objekty na konfiguráciu a správu základných objektov. Tu používame UdpEchoServerHelper a UdpEchoClientHelperobjekty, aby sme si uľahčili život.
UdpEchoServerHelper
Nasledujúce línie kódu v našom príklade skriptu first.cc slúžia na nastavenie aplikácie UDP echo servera na jednom z uzlov, ktoré sme vytvorili skôr.
UdpEchoServerHelper echoServer (9);
ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));Prvá línia kódu v uvedenom úryvku vytvára UdpEchoServerHelper. Ako obvykle, nejde v skutočnosti o aplikáciu samú o sebe, ale o objekt, ktorý nám pomáha vytvárať skutočné aplikácie. Jedným z našich dohovorov je prenášať potrebné atribúty do konštruktora pomocného objektu. V tomto prípade pomocník nemôže urobiť nič užitočné, ak mu nie je poskytnuté číslo portu, na ktorom server bude očakávať pakety, toto číslo musí byť tiež známe klientovi. V tomto prípade prenášame konštruktorovi pomocníka číslo portu. Konštruktor, na oplátku, jednoducho vykonává SetAttribute s prenesenou hodnotou. Neskôr, ak budete chcieť, pomocou SetAttribute budete môcť nastaviť inú hodnotu atribútu „Port“.
Podobne ako mnohé iné pomocné objekty, objekt UdpEchoServerHelper má metódu Nainštalovať. Vykonanie tejto metódy v skutočnosti vedie k vytvoreniu základnej aplikácie echo servera a jej pripojeniu k uzlu. Zaujímavé je, že metóda Nainštalovať prijíma NodeContainer ako parameter, rovnako ako ostatné Nainštalovať metódy, ktoré sme videli.
Implicitná konverzia C++, ktorá funguje tu, prijíma výsledok metódy node.Get (1) (ktorá vracia inteligentný ukazovateľ na objekt uzla — Ptr) a používa ho v konštruktore pre anonymný objekt NodeContainer, ktorý sa potom predáva metóde Nainštalovať. Ak nemôžete určiť v C++ kóde, ktorá metóda s akou signatúrou sa kompiluje a vykonáva, hľadajte medzi implicitnými konverziami.
Teraz vidíme, že echoServer.Install sa chystá nainštalovať aplikáciu UdpEchoServerApplication na nájdený v NodeContainer, ktorý používame na správu našich uzlov, uzol s indexom 1. Metóda Nainštalovať vráti kontajner, ktorý obsahuje ukazovatele na všetky aplikácie (v tomto prípade jednu, pretože sme preniesli anonymný NodeContainer, obsahujúci jeden uzol) vytvorený pomocníkom.
Aplikáciám je potrebné uviesť čas začiatku generovania prevádzky „start“ a môže byť potrebné dodatočne uviesť čas, kedy ho zastaviť „stop“. Poskytujeme oba parametre. Tieto časy sa nastavujú pomocou metód ApplicationContainer Spustiť a Zastaviť. Tieto metódy prijímajú parametre typu Time. V tomto prípade používame explicitnú sekvenciu konverzií C++, aby sme vzali C++ double 1.0 a preveďte ho na objekt tns‑3 Time, ktorý používa objekt Seconds na prevod na sekundy. Pamätajte, že pravidlá konverzie môžu byť kontrolované autorom modelu a C++ má svoje vlastné pravidlá, takže sa nemôžete vždy spoliehať na to, že parametre budú prevedené tak, ako ste očakávali. Dve riadky,
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));spôsobia, že aplikácia echo servera sa spustí (automatiky sa zapne) jednu sekundu po začiatku simulácie a zastaví sa (automaticky vypne) po desiatich sekundách simulácie. Vzhľadom na to, že sme vyhlásili udalosť simulácie (udalosť zastavenia aplikácie), ktorá bude vykonaná po desiatich sekundách, tak sa simuluje najmenej desať sekúnd prevádzky siete.
UdpEchoClientHelper
Klientská aplikácia echo sa nastavuje spôsobom, prakticky identickým serveru. Existuje základný objekt UdpEchoClientApplication, ktorý spravuje
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));Avšak pre echo klienta musíme nastaviť päť rôznych atribútov. Prvé dva atribúty sa nastavujú počas vytvárania UdpEchoClientHelper. Prenášame parametre, ktoré sa používajú (v rámci pomocníka) na nastavenie atribútov "RemoteAddress" a "RemotePort" v súlade s našou dohodou o prenose potrebných parametrov do konštruktora pomocníka.
Pripomeňme, že sme použili Ipv4InterfaceContainer na sledovanie IP adries, ktoré sme priradili našim zariadeniam. Nulové rozhranie v kontejnere rozhraní bude zodpovedať IP adrese nulového uzla v kontejnere uzlov. Prvé rozhranie v kontejnere rozhraní zodpovedá IP adrese prvého uzla v kontejnere uzlov. Takže v prvom riadku kódu (hore) vytvárame pomocníka a hovoríme mu, že vzdialenou adresou klienta bude IP adresa priradená uzlu, na ktorom je server. Takisto hovoríme, že je potrebné zorganizovať odosielanie paketov na deviaty port.
Atribút „MaxPackets“ informuje klienta o maximálnom počte paketov, ktoré môžeme odoslať počas simulácie. Atribút „Interval“ hovorí klientovi, ako dlho čakať medzi paketmi, a atribút „PacketSize“ informuje klienta o veľkosti payloadu paketu. Touto kombináciou atribútov hovoríme klientovi, aby odoslal jeden 1024-bajtový paket.
Rovnako ako v prípade echo servera, nastavujeme atribúty echo klienta Spustiť a Zastaviť, ale tu spúšťame klienta jednu sekundu po aktivovaní servera (o dve sekundy po začiatku simulácie).
4.2.8 Simulátor
V tomto štádiu potrebujeme spustiť simuláciu. To sa robí pomocou globálnej funkcie Simulator::Run.
Simulator::Run ();Keď sme predtým volali metódy,
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));
...
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));v skutočnosti sme naplánovali udalosti v simulátore na 1,0 sekundy, 2,0 sekundy a dve udalosti na 10,0 sekundy. Po vyvolaní Simulator::Run, systém začne prechádzať zoznam naplánovaných udalostí a vykonávať ich. Najprv spustí udalosť po 1,0 sekunde, čo aktivuje aplikáciu echo servera (táto udalosť môže, naopak, naplánovať mnoho ďalších udalostí). Potom spustí udalosť naplánovanú na t = 2,0 sekundy, ktorá spustí aplikáciu echo klienta. Opäť, táto udalosť môže naplánovať ešte mnoho udalostí. Implementácia spustenia udalosti v echo klientovi začne fázu prenosu dát simulácie, odoslaním paketu na server.
Akt odoslania paketu na server vyvolá reťazec udalostí, ktoré budú automaticky naplánované za scénou a ktoré budú implementovať mechaniku odosielania paketu echo signálov v súlade s parametrami synchronizácie, ktoré sme nastavili v skripte.
Nakoniec, keď odosielame iba jeden paket (nechajme si pripomenúť, atribút MaxPackets bol nastavený na jeden), reťazec udalostí vyvolaný týmto jediným klientským echo požiadavkom sa skončí a simulácia prejde do režimu čakania. Akonáhle sa to stane, zostávajúce naplánované udalosti budú udalosti Zastaviť pre server a klienta. Keď budú tieto udalosti vykonané, neostanú žiadne udalosti na ďalšie spracovanie a Simulator::Run vráti kontrolu. Simulácia sa skončila.
Ostáva len upratať. To sa robí vyvolaním globálnej funkcie Simulator::Destroy. Keď boli vyvolané funkcie pomocníkov (alebo kód nízkej úrovne ns‑3), ktoré sú usporiadané tak, aby do simulátora boli vložené háky na zničenie všetkých objektov, ktoré boli vytvorené. Nemusíte sledovať žiadne z týchto objektov osobne — všetko, čo ste museli urobiť, bolo zavolať Simulator::Destroy a odísť. Systém ns‑3 vykoná túto náročnú úlohu za vás. Zvyšné riadky nášho prvého ns‑3 skriptu, first.cc, robia presne to:
Simulator::Destroy ();
return 0;
}Kedy sa simulátor zastaví?
ns‑3 je simulátor diskrétnych udalostí (DE). V takomto simulátore je každá udalosť spojená s časom jej vykonania a simulácia pokračuje spracovaním udalostí v poradí ich výskytu počas simulácie. Udalosti môžu spôsobovať plánovanie budúcich udalostí (napríklad časovač môže přeplánovať seba, aby dokončil odpočítavanie v nasledujúcom intervale).
Počiatočné udalosti zvyčajne iniciuje objekt, napríklad IPv6 plánuje zistenie služieb v sieti, žiadosti susedov a podobne. Aplikácia plánuje prvú udalosť odoslania paketu a podobne. Keď sa udalosť spracováva, môže generovať nula, jednu alebo viac udalostí. Počas vykonávať simulácie sa udalosti jednoducho končia alebo vytvárajú nové. Simulácia sa automaticky zastaví, ak je fronta udalostí prázdna alebo ak sa zistí špeciálna udalosť Zastaviť. Událosť Zastaviť sa generuje funkciou Simulator::Stop (zastaviť čas).
Existuje typický prípad, keď je Simulator::Stop absolútne nevyhnutná na zastavenie simulácie: keď existujú samostatné udalosti. Samoopakujúce sa (alebo opakujúce sa) udalosti sú udalosti, ktoré sa vždy přeplánujú. V dôsledku toho vždy udržujú frontu udalostí neprázdnu. Existuje mnoho protokolov a modulov obsahujúcich opakujúce sa udalosti, napríklad:
• FlowMonitor — periodická kontrola stratených paketov;
• RIPng — periodická retransmisi aktualizácie routovacích tabuliek;
• a podobne.
V takýchto prípadoch Simulator::Stop je potrebný na správne zastavenie simulácie. Okrem toho, keď je ns‑3 v emulačnom režime, RealtimeSimulator sa používa na synchronizáciu hodín simulácie s hodinami stroja, a Simulator::Stop je potrebný na zastavenie procesu.
Mnoho programov simulácie v učebnici nevyvoláva Simulator::Stop je zjavné, že sa automaticky ukončia s vyčerpaním udalostí v rade. Avšak tieto programy tiež prijmú volanie Simulator::Stop. Napríklad, nasledujúci dodatočný príkaz v prvom príklade programu naplánuje explicitné zastavenie na 11 sekunde:
+ Simulator::Stop (Seconds (11.0));
Simulator::Run ();
Simulator::Destroy ();
return 0;
}Uvedené skutočne nezmení správanie tohto programu, pretože táto konkrétna simulácia sa prirodzene končí po 10 sekundách. Ale keby ste zmenili čas zastavenia v uvedenom príkaze z 11 sekúnd na 1 sekundu, všimli by ste si, že simulácia sa zastaví skôr, než akýkoľvek výstup sa dostane na obrazovku (keďže výstup sa deje približne po 2 sekundách simulačného času).
Je dôležité zavolať Simulator::Stop pred zavolaním Simulator::Run; v opačnom prípade Simulator::Run nemusí nikdy vrátiť riadenie hlavnomu programu na vykonanie zastavenia!
4.2.9 Zostavenie vášho scenára
Urobili sme vytváranie vašich jednoduchých skriptov triviálnym. Všetko, čo musíte urobiť, je umiestniť váš skript do adresára scratch a automaticky sa zloží, ak spustíte Waf. Skúsme to. Vráťte sa do adresára na najvyššej úrovni a skopírujte examples/tutorial/first.cc do adresára scratch
$ cd ../..
$ cp examples/tutorial/first.cc scratch/myfirst.ccTeraz zostavte svoj prvý príklad skriptu pomocou waf:
$ ./wafMali by ste vidieť správy o tom, že váš prvý príklad bol úspešne vytvorený.
Waf: Vstup do adresára `/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: Opustenie adresára `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' bol úspešne dokončený (2.357s)Teraz môžete spustiť príklad (majte na pamäti, že ak zostavujete svoj program v adresári scratch, tak ho musíte aj spúšťať z scratch):
$ ./waf --run scratch/myfirstMali by ste vidieť podobný výstup:
Waf: Vstup do adresára `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Opustenie adresára `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' bol úspešne dokončený (0.418s) Odoslané 1024 bajtov na 10.1.1.2
Prijatých 1024 bajtov z 10.1.1.1
Prijatých 1024 bajtov z 10.1.1.2Tu vidíte, že systém zostavovania kontroluje, či bol súbor zostavený, a potom ho spúšťa. Pozorujete, že komponent na echo kliensovi uvádza, že odoslal jeden 1024-bajtový paket na echo server 10.1.1.2. Takisto vidíte komponentu protokolovania na echo serveri, ktorá hovorí, že dostala 1024 bajty od 10.1.1.1. Echo server ticho opakuje paket, a vidíte v protokole echo klienta, že dostal svoj paket späť zo servera.
4.3 ns-3 Zdrojový kód
Teraz, keď ste použili niektoré z pomocníkov ns-3, môžete sa pozrieť na niektoré zdrojové kódy, ktoré implementujú túto funkčnosť. Najnovší kód si môžete pozrieť na našom webovom serveri na nasledujúcom odkaze: . Tam uvidíte súhrnnú stránku Mercurial pre našu vývojovú vetvu ns-3. V hornej časti stránky uvidíte niekoľko odkazov,
summary | shortlog | changelog | graph | tags | filesPokračujte ďalej a vyberte odkaz na súbory. Takto bude vyzerať horná úroveň väčšiny našich repozitárov:
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še príklady skriptov sa nachádzajú v adresári examples. Ak kliknete na príklady, uvidíte zoznam podadresárov. Jeden zo súborov v podadresári tutorial — first.cc. Ak kliknete na first.cc uvidíte kód, ktorý ste práve preskúmali.
Zdrojový kód sa nachádza prevažne v adresári src. Môžete si zobraziť zdrojový kód kliknutím na názov adresára alebo na odkaz súborov napravo od názvu adresára. Ak kliknete na adresár src, zobrazí sa vám zoznam podadresárov src. Ak potom kliknete na podadresár core, nájdete zoznam súborov. Prvý súbor, ktorý uvidíte (v čase písania tejto príručky) — abort.h. Ak kliknete na odkaz abort.h, budete presmerovaní na zdrojový súbor pre abort.h, ktorý obsahuje užitočné makrá na ukončenie skriptov, ak sú zistené anomálne podmienky. Zdrojový kód pre pomocníkov, ktoré sme použili v tejto kapitole, nájdete v adresári src/Applications/helper. Nebojte sa skúmať strom adresárov, aby ste pochopili, čo sa kde nachádza a zorientovali sa v štýle programovania ns‑3.
Zdroj: habr.com
