ns-3 võrgusimulaatori õpetus. 4. peatükk

ns-3 võrgusimulaatori õpetus. 4. peatükk
1,2. peatükk
peatükk 3

4 Kontseptsiooni ülevaade
4.1 Peamised abstraktsioonid
4.1.1 Sõlm
4.1.2 Rakendamine
4.1.3 Kanal
4.1.4 Võrguseade
4.1.5 Topoloogilised assistendid
4.2 Esimene ns-3 skript
4.2.1 Katlaplaadi kood
4.2.2 Pistikprogrammid
4.2.3 ns3 nimeruum
4.2.4 Logimine
4.2.5 Põhifunktsioon
4.2.6 Topoloogiaassistentide kasutamine
4.2.7 Rakenduse kasutamine
4.2.8 Simulaator
4.2.9 Skripti koostamine
4.3 ns-3 Lähtekood

Peatükk 4

Kontseptsiooni ülevaade

Esimene asi, mida peame enne ns-3 koodi õppimise või kirjutamise alustamist tegema, on selgitada mõned süsteemi põhimõisted ja abstraktsioonid. Suur osa sellest võib mõnele tunduda ilmselge, kuid soovitame võtta aega selle jaotise lugemiseks, et veenduda, et alustate kindlal alusel.

4.1 Peamised abstraktsioonid

Selles jaotises vaatleme mõningaid termineid, mida veebis tavaliselt kasutatakse, kuid millel on ns-3 puhul konkreetne tähendus.

4.1.1 Sõlm

Interneti-žargoonis nimetatakse võrku ühendavat arvutiseadet hostiks või mõnikord ka lõppsüsteemiks. Kuna ns-3 on võrgusimulaator, mitte Interneti-simulaator, ei kasuta me meelega terminit host, kuna see on tihedalt seotud Interneti ja selle protokollidega. Selle asemel kasutame üldisemat terminit, mida kasutavad ka teised simulaatorid ja mis pärineb graafiteooriast: node (sõlme).

Ns-3-s nimetatakse arvutusseadme aluseks olevat abstraktsiooni sõlmeks. Seda abstraktsiooni esindab C++ keeles Node klass. Klass NodeNode (sõlm) pakub meetodeid arvutusseadmete esituste manipuleerimiseks simulatsioonides.

Sa pead aru saama sõlme nagu arvuti, millele lisate funktsioone. Lisate selliseid asju nagu rakendused, protokollivirnad ja välisseadmed draiveritega, mis võimaldavad arvutil kasulikku tööd teha. Kasutame ns-3-s sama põhimudelit.

4.1.2 Rakendamine

Üldiselt jaguneb arvutitarkvara kahte suurde klassi. Süsteemitarkvara korrastab erinevaid arvutiressursse nagu mälu, protsessori tsüklid, ketas, võrk jne vastavalt mõnele arvutusmudelile. Süsteemitarkvara tavaliselt ei kasuta neid ressursse kasutajale otsest kasu toovate ülesannete täitmiseks. Tavaliselt käivitab kasutaja konkreetse eesmärgi saavutamiseks rakendust, mis hangib ja kasutab süsteemitarkvara poolt juhitavaid ressursse.

Sageli tõmmatakse eraldusjoon süsteemi ja rakendustarkvara vahel privileegide taseme muutustel, mis toimuvad operatsioonisüsteemi lõksudes. ns-3-l pole tegelikku operatsioonisüsteemi kontseptsiooni ja seetõttu puudub ka privileegtasemete või süsteemikutsete kontseptsioon. Meil on aga rakenduse idee. Nii nagu "pärismaailmas" töötavad tarkvararakendused arvutites ülesannete täitmiseks, töötavad ns-3 rakendused ns-3 sõlmedes, et juhtida simulatsioone simuleeritud maailmas.

Ns-3 puhul on modelleerimiseks tegevust genereeriva kasutajaprogrammi põhiline abstraktsioon rakendus. Seda abstraktsiooni esindab C++ keeles rakendusklass. Rakenduste klass pakub meetodeid meie kasutajataseme rakenduste versioonide vaadete manipuleerimiseks simulatsioonides. Arendajatelt oodatakse uute rakenduste loomiseks spetsialiseerumist rakendusklassile objektorienteeritud programmeerimise mõttes. Selles õpetuses kasutame rakendusklassi spetsialiseerumisalasid nimega UdpEchoClientApplication и UdpEchoServerApplication. Nagu arvata võis, moodustavad need rakendused kliendi/serveri rakenduste komplekti, mida kasutatakse võrgupakettide genereerimiseks ja kajamiseks.

4.1.3 Kanal

Reaalses maailmas saate arvuti võrku ühendada. Sageli nimetatakse meediat, mille kaudu nendes võrkudes andmeid edastatakse, kanaliteks. Kui ühendate Etherneti kaabli seinakontakti, ühendate arvuti Etherneti lingiga. Simuleeritud ns-3 maailmas on sõlm ühendatud sidekanalit esindava objektiga. Siin nimetatakse kommunikatsiooni alamvõrgu põhiabstraktsiooni kanaliks ja seda esindab C++ keeles Channel klass.

Klass KanalKanal pakub meetodeid alamvõrguobjektide interaktsiooni haldamiseks ja hostide ühendamiseks nendega. Arendajad võivad kanaleid spetsialiseeruda ka objektorienteeritud programmeerimise mõttes. Kanali spetsialiseerumine võib modelleerida midagi nii lihtsat nagu traat. Spetsiaalne kanal võib modelleerida ka keerulisi asju, näiteks suurt Etherneti lülitit või traadita võrkude puhul takistusi täis kolmemõõtmelist ruumi.

Selles õpetuses nimega kasutame kanali spetsiaalseid versioone CsmaChannelCsmaChannel, PointToPointChannelPointToPointChannel и WifiChannelWifiChannel. CsmaChannelNäiteks modelleerib side alamvõrgu versiooni, mis rakendab kandja-sense mitme juurdepääsuga sidekeskkonda. See annab meile Etherneti sarnase funktsionaalsuse.

4.1.4 Võrguseade

Varem oli nii, et kui tahtsid arvutit võrku ühendada, pidid ostma kindla võrgukaabli ja riistvaraseadme, mida kutsuti (PC terminoloogias) väliskaardiks, mis tuli arvutisse installida. Kui välisseadme kaart rakendas mõnda võrgufunktsiooni, nimetati neid võrguliidese kaartideks või võrgukaartideks. Tänapäeval on enamikul arvutitel integreeritud võrguliidese riistvara ja kasutajad ei näe neid eraldi seadmetena.

Võrgukaart ei tööta ilma selle riistvara kontrolliva tarkvaradraiverita. Unixis (või Linuxis) klassifitseeritakse välisseade seadmeks. Seadmeid hallatakse seadmedraiverite abil ja võrguseadmeid (NIC-e) hallatakse võrguseadme draiverite (võrguseadmete draiverid) ja neid nimetatakse ühiselt võrguseadmeteks (võrguseadmed). Unixis ja Linuxis viitate võrguseadmetele selliste nimedega nagu eth0.

Ns-3 puhul hõlmab võrguseadme abstraktsioon nii tarkvaradraiverit kui ka modelleeritavat riistvara. Simulatsioonis "paigaldatakse" võrguseade sõlme, et see saaks kanalite kaudu suhelda teiste sõlmedega. Nii nagu päris arvuti, saab sõlme ühendada mitme kanaliga mitme seadme kaudu NetDevices.

Seadme võrguabstraktsiooni esindab C++ keeles klass NetDevice. Klass NetDevice pakub meetodeid ühenduste haldamiseks sõlme ja kanali objektidega; ja arendajad võivad olla spetsialiseerunud objektorienteeritud programmeerimisele. Selles õpetuses kasutame mitut NetDevice'i spetsiaalset versiooni CsmaNetDevice, PointToPointNetDevice и WifiNetDevice. Nii nagu Etherneti võrguadapter on loodud töötama võrguga Ethernet, CsmaNetDevice mõeldud töötamiseks CsmaChannel, PointToPointNetDevice mõeldud töötamiseks PointToPointChannelJa WifiNetDevice - mõeldud töötamiseks WifiChannel.

4.1.5 Topoloogilised assistendid

Päris võrgus leiate hostarvutid, millele on lisatud (või sisseehitatud) võrgukaardid. Ns-3 puhul ütleksime, et näete sõlmi, millele on lisatud NetDevices. Suures simuleeritud võrgus peate korraldama ühendused paljude objektide vahel sõlme, NetDevice и Kanal.

Alates NetDevices'ide ühendamisest sõlmedega, NetDevices'ide ühendamisest linkidega, IP-aadresside määramisest jne. ns-3 puhul on tavaline ülesanne, et seda võimalikult lihtsaks teha, pakume nn topoloogiaabilisi. Näiteks NetDevice'i loomiseks peate tegema palju ns-3 tuuma toiminguid, lisama MAC-aadressi, installima võrguseadme Node'i, konfigureerima sõlme protokollipinu ja seejärel ühendama NetDevice'i kanaliga. Veelgi rohkem tööd on vaja mitme seadme ühendamiseks mitmepunktiliste linkidega ja seejärel üksikute võrkude ühendamiseks Internetworksi võrku. Pakume topoloogiaabiobjekte, mis ühendavad need paljud toimingud teie mugavuse huvides hõlpsasti kasutatavaks mudeliks.

4.2 Esimene ns-3 skript

Kui installisite süsteemi ülalkirjeldatud viisil, on teie kodukataloogis ns-3 väljalase kataloogis nimega repos. Mine kataloogi vabastama

Kui teil sellist kataloogi pole, tähendab see, et te ei määranud ns-3 väljalaskeversiooni loomisel väljundkataloogi, ehitage järgmiselt:
$ ./waf configure —build-profile=release —out=build/release,
$ ./waf ehitada

seal peaksite nägema järgmisega sarnast kataloogistruktuuri:

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

Mine kataloogi näited/õpetus. Peaksite nägema seal asuvat faili nimega esimene.cc. See on skript, mis loob lihtsa punkt-punkti ühenduse kahe sõlme vahel ja edastab ühe paketi sõlmede vahel. Vaatame seda skripti ridade kaupa; selleks avage oma lemmikredaktoris fail first.cc.

4.2.1 Katlaplaadi kood
Faili esimene rida on redaktorirežiimi rida emacs. See räägib emacsile vormindustavadest (kodeerimisstiilist), mida me oma lähtekoodis kasutame.

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

See on alati üsna vastuoluline teema, seega peame rekordi püstitama, et see kohe käest ära saada. ns-3 projekt, nagu enamik suuremaid projekte, on võtnud kasutusele kodeerimisstiili, millele kogu lisatud kood peab vastama. Kui soovite oma koodi projekti lisada, peate lõpuks järgima ns-3 kodeerimisstandardit, nagu on kirjeldatud failis doc/codingstd.txt või näidatud projekti veebilehel: https://www.nsnam.org/develop/contributing-code/coding-style/.

Soovitame teil harjuda ns-3 koodi välimuse ja olemusega ning rakendada seda standardit alati, kui töötate meie koodiga. Kogu arendusmeeskond ja kaasautorid nõustusid sellega pärast mõningast nurinat. Ülaltoodud emacsi režiimi rida muudab emacsi redaktori kasutamisel õige vormindamise lihtsaks.

ns-3 simulaator on litsentsitud kasutamiseks GNU General Public License. Igas ns-3 levitamisfailis näete vastavat GNU legaalset päist. Sageli näete allpool näidatud GPL-i teksti ja autori kohal autoriõiguse teatist ühe projektis ns-3 osaleva asutuse kohta.

/* 
* 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 Pistikprogrammid

Kood ise algab rea kaasamislausetega (sisaldama).

#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"

Et aidata meie kõrgetasemelistel skriptimiskasutajatel toime tulla suure hulga süsteemis leiduvate päisefailidega, rühmitame need vastavalt nende kasutusviisidele suurtesse moodulitesse. Pakume ühte päisefaili, mis laadib rekursiivselt kõik antud moodulis kasutatavad päisefailid. Selle asemel, et otsida täpselt seda päist, mida vajate, ja võimalusel saada õige sõltuvuste loend, anname teile võimaluse failide rühma väga detailselt alla laadida. See ei ole kõige tõhusam lähenemisviis, kuid kindlasti muudab see skriptide kirjutamise palju lihtsamaks.

Kõik ns-3 hõlmatud failid paigutatakse kataloogi nimega ns3 (ehituse alamkataloog), et vältida failinimede konflikte ehitamise ajal. Fail ns3/core-module.h vastab ns-3 moodulile, mille leiate kataloogist src/core installitud versioonis. Selle kataloogi loendist leiate suure hulga päisefaile. Kui teete kokkupanekut, Waf paigutab avalikud päisefailid ns3 kataloogi alamkataloogi ehita/silu

Kui teil sellist kataloogi pole, tähendab see, et te ei määranud ns-3 väljalaskeversiooni loomisel väljundkataloogi, ehitage järgmiselt:
$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf ehitada
või
$ ./waf configure --build-profile=optimized --out=build/optimized
$ ./waf ehitada

või ehitada/optimeerida, olenevalt teie konfiguratsioonist. Waf genereerib automaatselt ka mooduli kaasamisfaili kõigi avalike päisefailide laadimiseks. Kuna te muidugi järgite seda juhendit usuliselt, olete seda juba teinud

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

projekti konfigureerimiseks, et käitada näiteid ja teste sisaldavaid silumisversioone. Sina ka tegid

$ ./waf

projekti kokku panna. Nii et nüüd, kui vaatate kataloogi ../../build/debug/ns3, siis sealt leiad muuhulgas ka nelja ülaltoodud mooduli päisefailid. Saate vaadata nende failide sisu ja leida, et need sisaldavad kõiki avalikke faile, mida vastavad moodulid kasutavad.

4.2.3 ns3 nimeruum

Järgmine rida skriptis esimene.cc on nimeruumi deklaratsioon.

using namespace ns3;

Projekti ns-3 rakendatakse C++ nimeruumis nimega ns3. See rühmitab kõik ns-3-ga seotud deklaratsioonid globaalsest nimeruumist väljaspool olevasse ulatusse, mis loodetavasti aitab integreerida muu koodiga. Operaatori C++ kasutamine toob ns-3 nimeruumi praegusesse (globaalsesse) deklaratiivsesse piirkonda. See on väljamõeldud viis öelda, et pärast seda deklaratsiooni ei pea te selle kasutamiseks sisestama loaoperaatorit ns3::scope enne kogu ns-3 koodi. Kui te pole nimeruumidega tuttav, vaadake peaaegu kõiki C++ õpikuid ja võrrelge ns3 nimeruumi std nimeruumi ja deklaratsiooni abil using namespace std; väljundoperaatoriga töötamise näidetes cout ja ojad.

4.2.4 Logimine

Skripti järgmine rida on

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Kasutame seda avaldust mugava kohana oma dokumentatsioonisüsteemi arutamiseks Doksüd. Kui vaatate ns-3 projekti veebisaiti, leiate navigeerimisribalt lingi Dokumentatsioon. Kui klõpsate sellel lingil, suunatakse teid meie dokumentatsiooni lehele. Seal on link "Latest Release", mis viib teid ns-3 uusima stabiilse versiooni dokumentatsiooni juurde. Kui valite lingi "API dokumentatsioon", suunatakse teid ns-3 API dokumentatsiooni lehele.

Lehe vasakpoolsest servast leiate dokumentatsiooni struktuuri graafilise esituse. Hea koht alustamiseks on moodulite ns-3 "raamat" ns-3 navigeerimispuus. Kui paljastate Moodulid, näete ns-3 moodulite dokumentatsiooni loendit. Nagu eespool mainitud, on mooduli mõiste siin otseselt seotud ülaltoodud moodulis sisalduvate failidega. ns-3 logimise alamsüsteemi käsitletakse jaotises Logimismooduli kasutamine, seega tuleme selle juurde hiljem selles õpetuses tagasi, kuid ülaltoodud avalduse kohta saate teada moodulit vaadates tuumja siis raamatu lahti Silumisriistadja seejärel lehe valimine Raie. Kliki Raie.

Nüüd peaksite dokumentatsiooni üle vaatama Doksüd mooduli jaoks Raie. Lehe ülaosas asuvas makrode loendis näete kirjet NS_LOG_COMPONENT_DEFINE. Enne lingil klõpsamist vaadake kindlasti registreerimismooduli jaotist "Üksikasjalik kirjeldus", et mõista, kuidas see üldiselt töötab. Selleks kerige alla või valige diagrammi all "Veel...".

Kui teil on üldine ettekujutus sellest, mis toimub, vaadake edasi ja vaadake konkreetse NS_LOG_COMPONENT_DEFINE dokumentatsiooni. Ma ei dubleeri siin dokumentatsiooni, kuid kokkuvõtteks deklareerib see rida registreerimiskomponendi nimega FirstScriptNäide, mis võimaldab lubada või keelata sõnumite konsooli logimise nime alusel.

4.2.5 Põhifunktsioon

Skripti järgmistel ridadel näete

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

See on lihtsalt teie programmi (skripti) põhifunktsiooni deklaratsioon. Nagu iga C++ programmi puhul, peate määratlema põhifunktsiooni, see käivitatakse kõigepealt. Siin pole midagi erilist. Teie ns-3 skript on lihtsalt C++ programm. Järgmine rida seab aja eraldusvõimeks 1 nanosekund, mis on vaikeseade:

Time::SetResolution (Time::NS);

Aja eraldusvõime või lihtsalt eraldusvõime on väikseim ajaväärtus, mida saab kasutada (väikseim esindatav erinevus kahe aja vahel). Saate eraldusvõimet muuta täpselt üks kord. Seda paindlikkust pakkuv mehhanism kulutab mälu, nii et kui eraldusvõime on selgesõnaliselt määratud, vabastame mälu, vältides edasisi värskendusi. (Kui te eraldusvõimet otseselt ei määra, on see vaikimisi üks nanosekund ja mälu vabastatakse simulatsiooni käivitamisel.)

Järgmisi kahte skriptirida kasutatakse kahe logimiskomponendi lubamiseks, mis on rakendustesse sisse ehitatud EchoClient и EchoServer:

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

Kui loete logimise komponendi dokumentatsiooni, näete, et iga komponendi puhul saate lubada mitu logimise/granulaarsuse taset. Need kaks koodirida võimaldavad silumislogimist INFO tasemele kajaklientide ja serverite jaoks. Sellel tasemel prindib rakendus sõnumeid, kui see simulatsiooni ajal pakette saadab ja vastu võtab.

Nüüd asume topoloogia loomise ja simulatsiooni käivitamise juurde. Kasutame topoloogia abiobjekte, et see töö oleks võimalikult lihtne.

4.2.6 Topoloogiaassistentide kasutamine

Meie skripti kaks järgmist koodirida loovad tegelikult Node ns-3 objektid, mis esindavad simulatsioonis olevaid arvuteid.

NodeContainer nodes;
nodes.Create (2);

Enne jätkamist leiame klassi dokumentatsiooni NodeContainer. Teine viis antud klassi dokumentatsiooni juurde pääsemiseks on vahekaart klassid lehtedel Doksüd. Kui teil on Doxygen juba avatud, kerige lihtsalt lehe ülaossa ja valige vahekaart Klassid. Peaksite nägema uut vahekaartide komplekti, millest üks on klasside loend. Selle vahekaardi all näete kõigi ns-3 klasside loendit. Kerige alla kuni ns3::NodeContainer. Kui leiate klassi, valige see, et minna klassi dokumentatsiooni.

Nagu mäletame, on üks meie peamisi abstraktsioone sõlm. See tähistab arvutit, millele lisame näiteks protokollivirnad, rakendused ja välisseadmed. Topoloogia assistent NodeContainer pakub mugavat võimalust mis tahes objektide loomiseks, haldamiseks ja neile juurde pääsemiseks sõlme, mille loome simulatsiooni käivitamiseks. Esimene ülaltoodud rida lihtsalt deklareerib NodeContainer, mida me nimetame sõlmedeks. Teine rida kutsub sõlmeobjekti meetodit Loo ja palub konteineril luua kaks sõlme. Nagu kirjeldatud punktis Doksüd, palub konteiner ns-3 süsteemil luua kaks objekti sõlme ja salvestab viidad nendele objektidele sisemiselt.

Skriptis loodud sõlmed ei tee veel midagi. Järgmine samm topoloogia loomisel on meie sõlmede ühendamine võrguga. Lihtsaim võrguvorm, mida me toetame, on punkt-punkti ühendus kahe sõlme vahel. Nüüd loome sellise ühenduse.

PointToPointHelper

Punkt-punkti ühenduse loome tuttava mustri abil, kasutades ühenduse loomiseks vajalike madalatasemeliste tööde tegemiseks topoloogia abiobjekti. Tuletage meelde, et meie kaks peamist abstraktsiooni NetDevice и Kanal. Reaalses maailmas vastavad need terminid ligikaudu välisseadmete kaartidele ja võrgukaablitele. Tavaliselt on need kaks asja üksteisega tihedalt seotud ja keegi ei saa loota näiteks seadmete jagamisele Ethernet juhtmevaba kanali kaudu. Meie topoloogiaabilised järgivad seda tihedat seost ja seetõttu kasutate selles stsenaariumis ühte objekti PointToPointHelper ns-3 objektide seadistamiseks ja ühendamiseks PointToPointNetDevice и PointToPointChannel. Skripti kolm järgmist rida:

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

Esimene rida,

PointToPointHelper pointToPoint;

loob virnale objekti eksemplari PointToPointHelper. Kõrgeima taseme seisukohast on järgmine rida,

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

ütleb objektile PointToPointHelper kasutage väärtust "5 Mbit/s" (viis megabitti sekundis) kui "DataRate'.

Konkreetsemast vaatenurgast vastab string "DataRate" sellele, mida me nimetame atribuudiks PointToPointNetDevice. Kui vaatate Doksüd klassi jaoks ns3::PointToPointNetDevice ja meetodi dokumentatsioonis GetTypeId leiate seadme jaoks määratletud atribuutide loendi. Nende hulgas on atribuut "DataRate" Enamikul kasutajale nähtavatel ns-3 objektidel on sarnased atribuutide loendid. Me kasutame seda mehhanismi simulatsiooni hõlpsaks seadistamiseks ilma uuesti kompileerimiseta, nagu näete järgmises jaotises.

Sarnane "DataRate" PointToPointNetDevice'is leiate PointToPointChanneliga seotud atribuudi "Delay". Viimane rida

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

говорит PointToPointHelper kasutage väärtust "2 ms" (kaks millisekundit) levimisviivituse väärtusena punktist punkti linki, mille see hiljem loob.

NetDeviceContainer

Hetkel on meil stsenaarium NodeContainer, mis sisaldab kahte sõlme. Meil on PointToPointHelper, mis on ette valmistatud objektide loomiseks PointToPointNetDevices ja ühendades need objekti PointToPointChannel abil. Nii nagu me kasutasime sõlmede loomiseks NodeContaineri topoloogia abiobjekti, küsime PointToPointHelper teostab meile seadmete loomise, seadistamise ja paigaldamisega seotud töid. Vajame kõigi loodud objektide loendit NetDevice, seega kasutame NetDeviceContainer hoida neid samal viisil, nagu me kasutasime NodeContainer meie loodud sõlmede salvestamiseks. Järgmised kaks koodirida,

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

lõpetage seadme ja kanali seadistamine. Esimene rida deklareerib ülalmainitud seadme konteineri ja teine ​​teeb põhitöö. meetod paigaldama objektiks PointToPointHelper aktsepteerib NodeContainer parameetrina. Sees NetDeviceContainer iga sõlme kohta, mis asub NodeContainer luuakse (punkt-punkti suhtluseks peab neid olema täpselt kaks) PointToPointNetDevice luuakse ja salvestatakse seadme konteinerisse. PointToPointChannel luuakse ja kaks on selle külge kinnitatud PointToPointNetDevices. Pärast objektide loomist salvestatakse atribuudid PointToPointHelper, kasutatakse loodud objektide vastavate atribuutide lähtestamiseks.

Pärast helistamist pointToPoint.Install (sõlmed) meil on kaks sõlme, mõlemasse on installitud punkt-punkti võrguseade ja üks punkt-punkti link nende vahel. Mõlemad seadmed on konfigureeritud edastama andmeid kiirusega viis megabitti sekundis kahe millisekundilise edastusviivitusega üle kanali.

InternetStackHelper

Nüüd on meil sõlmed ja seadmed konfigureeritud, kuid meie sõlmedesse pole installitud protokollivirnu. Selle eest hoolitsevad järgmised kaks koodirida.

InternetStackHelper stack;
stack.Install (nodes);

InternetStackHelper - on topoloogiaabiline Interneti-virnade jaoks, mis on sarnane PointToPointHelperiga punkt-punkti võrguseadmete jaoks. meetod paigaldama võtab parameetrina NodeContaineri. Kui see käivitatakse, installib see igasse konteinerisõlme Interneti-virna (TCP, UDP, IP jne).

IPv4AddressHelper

Seejärel peame oma seadmed siduma IP-aadressidega. Pakume topoloogiaabilist IP-aadressi eraldamise haldamiseks. Ainus kasutajale nähtav API on baas-IP-aadressi ja võrgumaski seadistamine, mida kasutatakse tegeliku aadressi jaotuse tegemisel (seda tehakse abistaja madalamal tasemel). Järgmised kaks koodirida meie näidisskriptis esimene.cc,

Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");

deklareerige aadressiabiobjekt ja öelge sellele, et see peaks alustama IP-aadresside eraldamist võrgust 10.1.1.0, kasutades määramiseks bitmaski 255.255.255.0. Vaikimisi algavad eraldatud aadressid ühest ja suurenevad monotoonselt, nii et esimene sellelt baasilt eraldatud aadress on 10.1.1.1, seejärel 10.1.1.2 jne. Tegelikkuses jätab ns-3 süsteem madalal tasemel meelde kõik eraldatud IP-aadressid ja tekitab saatusliku vea, kui kogemata tekitatakse olukord, kus sama aadress genereeritakse kaks korda (muide, seda viga on raske siluda).

Järgmine koodirida,

Ipv4InterfaceContainer interfaces = address.Assign (devices);

täidab tegeliku aadressi määramise. Ns-3 puhul loome ühenduse IP-aadressi ja objekti kasutava seadme vahel IPv4 liides. Nii nagu me vajame mõnikord abilise loodud võrguseadmete loendit hilisemaks kasutamiseks, vajame mõnikord ka objektide loendit IPv4 liides. IPv4Interface Container pakub seda funktsiooni.

Ehitasime punkt-punkti võrgu, installitud virnad ja määratud IP-aadressid. Nüüd vajame liikluse genereerimiseks rakendusi igas sõlmes.

4.2.7 Rakenduse kasutamine

Teine ns-3 süsteemi põhiline abstraktsioon on taotlus (taotlus). Selle stsenaariumi korral kasutame kahte põhiklassi spetsialiseerumist taotlus ns-3 kutsus UdpEchoServerApplication и UdpEchoClientApplication. Nagu eelmistel juhtudel, kasutame põhiobjektide konfigureerimiseks ja haldamiseks abiobjekte. Siin kasutame UdpEchoServerHelper и UdpEchoClientHelper objekte, mis muudavad meie elu lihtsamaks.

UdpEchoServerHelper

Meie first.cc näiteskripti järgmisi koodiridu kasutatakse UDP kajaserveri rakenduse konfigureerimiseks ühes meie varem loodud sõlmedest.

UdpEchoServerHelper echoServer (9);

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

Loob ülaltoodud koodilõigu esimene koodirida UdpEchoServerHelper. Nagu tavaliselt, pole see rakendus ise, see on objekt, mis aitab meil luua reaalseid rakendusi. Üks meie tavadest on nõutavate atribuutide edastamine abiobjekti konstrueerijale. Sel juhul ei saa abimees midagi kasulikku teha, kui talle pole antud pordi numbrit, millelt server pakette kuulama hakkab, see number peab olema ka kliendile teada. Sel juhul edastame pordi numbri abikonstruktorile. Konstruktor omakorda lihtsalt teeb Määra atribuut läbitud väärtusega. Hiljem saate soovi korral kasutada SetAttribute'i, et määrata pordi atribuudile erinev väärtus.

Nagu paljud teised abiobjektid, objekt UdpEchoServerHelper on meetod paigaldama. Selle meetodi käivitamine loob tõhusalt põhilise kajaserveri rakenduse ja seob selle hostiga. Huvitav on see meetod paigaldama aktsepteerib NodeContainer parameetrina nagu teisedki paigaldama meetodid, mida oleme näinud.

Siin töötav C++ kaudne teisendus võtab meetodi tulemuse node.Get(1) (mis tagastab nutika kursori sõlmeobjektile - Ptr ) ja kasutab seda anonüümse objekti konstruktoris NodeContainermis seejärel suunatakse meetodile paigaldama. Kui te ei saa C++ koodis kindlaks teha, millise meetodi signatuur kompileeritakse ja käivitatakse, siis vaadake kaudseid teisendusi.

Nüüd me näeme seda echoServer.Install rakendust installimas UdpEchoServerApplication aastal leitud NodeContainermida kasutame oma sõlmede haldamiseks, sõlm indeksiga 1. Meetod paigaldama tagastab konteineri, mis sisaldab viiteid kõikidele rakendustele (antud juhul ühele, kuna läbisime anonüümse NodeContainer, mis sisaldab ühte sõlme), mille on loonud abimees.

Rakendused peavad määrama, millal liiklust genereerida "alusta" ja võib-olla tuleb täiendavalt määrata aeg, millal see peatada "peatus". Pakume mõlemat võimalust. Need ajad määratakse meetoditega ApplicationContainer Avaleht и Peatus. Need meetodid aktsepteerivad tüüpi parameetreid aeg. Sel juhul kasutame C++ võtmiseks selgesõnalist C++ konversioonide jada kahekordistada 1.0 ja teisendage see tns-3 ajaobjektiks, mis kasutab sekunditeks teisendamiseks objekti Seconds. Pidage meeles, et teisendusreegleid saab juhtida mudeli autor ja C++-l on oma reeglid, nii et te ei saa alati loota, et parameetrid teisendatakse ootuspäraselt. Kaks rida

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

käivitab kajaserveri rakenduse (lülitub automaatselt sisse) üks sekund pärast simulatsiooni algust ja peatub (lülitub välja) pärast simulatsiooni kümmet sekundit. Tulenevalt asjaolust, et deklareerisime simulatsioonisündmuse (rakenduse seiskamise sündmuse), mis käivitatakse kümne sekundi pärast, simuleeritakse vähemalt kümme sekundit võrgu toimimist.

UdpEchoClientHelper

Kliendi rakendus miss konfigureeritud peaaegu sarnaselt serveriga. Seal on alusobjekt UdpEchoClientApplication, mida juhitakse
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));;

Echo kliendi jaoks peame aga määrama viis erinevat atribuuti. Esimesed kaks atribuuti määratakse loomise ajal UdpEchoClientHelper. Edastame parameetrid, mida kasutatakse (abistaja sees) atribuutide määramiseks "Kaugaadress" и "RemotePort" vastavalt meie kokkuleppele edastama vajalikud parameetrid abistajale konstruktorile.

Meenutagem, et kasutasime IPv4Interface Container et jälgida IP-aadresse, mille oleme oma seadmetele määranud. Liideste konteineris olev nullliides vastab sõlmede konteineri nullsõlme IP-aadressile. Esimene liides liideste konteineris vastab sõlmede konteineri esimese sõlme IP-aadressile. Seega loome esimesel koodireal (ülal) abimehe ja ütleme sellele, et kliendi kaugaadressiks on IP-aadress, mis on määratud hostile, kus server asub. Ütleme ka, et peame korraldama pakettide saatmise üheksasse porti.

Atribuut "MaxPackets" ütleb kliendile maksimaalse arvu pakette, mida saame simulatsiooni ajal saata. Atribuut "Interval" ütleb kliendile, kui kaua peab pakettide vahel ootama, ja atribuut "PacketSize" annab kliendile teada, kui suur peaks olema paketi kasulik koormus. Selle atribuutide kombinatsiooniga käsime kliendil saata ühe 1024-baidise paketi.

Nagu kajaserveri puhul, määrame kajakliendi atribuudid Avaleht и Peatus, kuid siin käivitame kliendi sekund pärast serveri sisselülitamist (kaks sekundit pärast simulatsiooni algust).

4.2.8 Simulaator

Sel hetkel peame simulatsiooni käivitama. Seda tehakse globaalse funktsiooni abil Simulaator::Run.

Simulator::Run ();

Kui me varem nimetasime meetodeid,

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

tegelikult planeerisime sündmused simulaatoris 1,0 sekundile, 2,0 sekundile ja kaks sündmust 10,0 sekundile. Peale kõnet Simulaator::Run, hakkab süsteem nägema ajastatud sündmuste loendit ja neid täitma. Esmalt käivitab see sündmuse 1,0 sekundi pärast, mis käivitab kajaserveri rakenduse (see sündmus võib omakorda ajastada palju muid sündmusi). Seejärel käivitab see sündmuse, mis on kavandatud t = 2,0 sekundit, mis käivitab kajakliendi rakenduse. Jällegi võib sellel üritusel olla veel palju üritusi plaanis. Sündmuse käivitamine kajakliendis alustab simulatsiooni andmeedastusfaasi, saates serverisse paketi.

Paketi serverisse saatmine käivitab sündmuste ahela, mis ajastatakse automaatselt kulisside taga ja mis rakendab kajapaketi saatmise mehhanismi vastavalt skriptis seatud ajastusparameetritele.

Selle tulemusena, kuna saadame ainult ühe paketi (pidage meeles, et atribuut MaxPackets määrati ühele), lõpeb selle üksiku kliendi pingiga algatatud sündmuste ahel ja simulatsioon läheb ooterežiimi. Kui see juhtub, on ülejäänud ajastatud sündmused sündmused Peatus serverile ja kliendile. Kui need sündmused on täidetud, ei jää enam sündmusi edasiseks töötlemiseks ja Simulaator::Run tagastab kontrolli. Simulatsioon on lõppenud.

Jääb üle vaid enda järelt koristada. Seda tehakse globaalse funktsiooni kutsumisega Simulaator:: Hävita. Kuna kutsuti abifunktsioonid (ehk madala taseme ns-3 kood), mis on korraldatud nii, et simulaatorisse sisestati konksud kõigi loodud objektide hävitamiseks. Te ei pidanud ise ühtegi neist objektidest jälgima – tuli vaid helistada Simulaator:: Hävita ja mine välja. Süsteem ns-3 teeb selle raske töö teie eest ära. Meie esimese ns-3 skripti, first.cc, ülejäänud read teevad just seda:

Simulator::Destroy ();
return 0;
}

Millal simulaator peatub?

ns-3 on diskreetsete sündmuste (DE) simulaator. Sellises simulaatoris on iga sündmus seotud selle täitmise ajaga ja simulatsioon jätkub sündmuste töötlemisega nende toimumise järjekorras simulatsiooni edenedes. Sündmused võivad põhjustada tulevaste sündmuste ajakava (näiteks võib taimer end ümber ajastada, et lõpetada loendamine järgmise intervalliga).

Esialgsed sündmused algatab tavaliselt olem, näiteks IPv6 ajastab võrgus teenuste leidmise, naabrite päringute jms. Rakendus ajastab esimese paketi saatmise sündmuse ja nii edasi. Kui sündmust töödeldakse, võib see genereerida nulli, ühe või mitu sündmust. Simulatsiooni edenedes toimuvad sündmused, mis lõppevad või tekitavad uusi. Simulatsioon peatub automaatselt, kui sündmuste järjekord on tühi või tuvastatakse erisündmus Peatus. Sündmus Peatus funktsiooni poolt genereeritud Simulaator::Stopp (peatusaeg).

On tüüpiline juhtum, kus Simulator::Stop on simulatsiooni peatamiseks absoluutselt vajalik: kui toimuvad isemajandavad sündmused. Isemajandavad (või korduvad) sündmused on sündmused, mis on alati ümber planeeritud. Selle tulemusena ei hoia nad sündmuste järjekorda alati tühjana. Seal on palju protokolle ja mooduleid, mis sisaldavad korduvaid sündmusi, näiteks:

• FlowMonitor – perioodiline kadunud pakettide kontroll;

• RIPng – marsruutimistabeli uuenduste perioodiline leviedastus;

• jne.

Sellistel juhtudel Simulaator::Stopp simulatsiooni õigeks peatamiseks. Lisaks, kui ns-3 on emuleerimisrežiimis, kasutatakse RealtimeSimulatorit simulatsioonikella sünkroonimiseks masina kellaga ja Simulaator::Stopp protsessi peatamiseks vajalik.

Paljud õpiku simulatsiooniprogrammid ei kutsu Simulaator::Stopp selgesõnaliselt, kuna need lõpevad automaatselt, kui järjekorras olevad sündmused on ammendatud. Kuid need programmid aktsepteerivad ka Simulator::Stop kõne. Näiteks järgmine lisalause esimeses näidisprogrammis ajastab selgesõnalise peatuse 11 sekundiks:

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

Ülaltoodu ei muuda tegelikult selle programmi käitumist, kuna see konkreetne simulatsioon lõpeb loomulikult 10 sekundi pärast. Kuid kui muudaksite ülaltoodud lauses peatumisaega 11 sekundilt 1 sekundile, märkaksite, et simulatsioon peatub enne, kui mis tahes väljund ekraanile jõuab (kuna väljund toimub pärast umbes 2 sekundilist simulatsiooniaega).

Enne Simulator::Run helistamist on oluline helistada Simulator::Stop; vastasel juhul ei pruugi Simulator::Run kunagi peatamise käivitamiseks põhiprogrammi juhtimist tagasi viia!

4.2.9 Skripti koostamine

Oleme muutnud teie lihtsate skriptide loomise triviaalseks. Kõik, mida pead tegema, on panna oma skript scratch-kataloogi ja see koostatakse automaatselt, kui käivitate Waf. Proovime. Minge tagasi kõrgeima taseme kataloogi ja kopeerige näited/tutorial/first.cc kataloogi kriimustada

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

Nüüd looge kasutades oma esimene näidisskript WAF:

$ ./waf

Peaksite nägema teateid, mis näitavad, et teie esimene näide on edukalt loodud.

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)

Nüüd saate näite käivitada (pange tähele, et kui ehitate programmi scratch kataloogi, peate selle käivitama kriimustada):

$ ./waf --run scratch/myfirst

Peaksite nägema sarnast väljundit:

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

Siin näete, et ehitussüsteem kontrollib, kas fail on koostatud, ja seejärel käivitab selle. Näete komponendi kirjet kajakliendis, mis näitab, et see saatis ühe 1024-baidise paketi kajaserverisse 10.1.1.2. Ka teie näete kajaserveris logimiskomponenti, et öelda, et see sai versioonist 1024 10.1.1.1 baiti. Kajaserver taasesitab vaikselt paketti ja kajakliendi logist on näha, et ta sai oma paketi serverilt tagasi.

4.3 ns-3 Lähtekood

Nüüd, kui olete mõnda ns-3 abimeest kasutanud, võite heita pilgu mõnda lähtekoodile, mis seda funktsiooni rakendab. Viimast koodi saab vaadata meie veebiserveris järgmiselt lingilt: https://gitlab.com/nsnam/ns-3-dev.git. Seal näete meie ns-3 arenduspuu Mercuriali kokkuvõtte lehte. Lehe ülaosas näete mitmeid linke,

summary | shortlog | changelog | graph | tags | files

Jätkake ja valige failide link. Selline näeb välja enamiku meie hoidlate tipptase:

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

Meie näidisskriptid on kataloogis näited. Kui klõpsate näidetel, näete alamkataloogide loendit. Üks alamkataloogi failidest õpetus - first.cc... Kui klõpsate esimene.cc näete koodi, mille just õppisite.

Lähtekood asub peamiselt kataloogis src. Lähtekoodi saate vaadata, klõpsates kataloogi nimel või klõpsates kataloogi nimest paremal oleval lingil failid. Kui klõpsate src kataloogil, näete src alamkataloogide loendit. Kui klõpsate seejärel põhialamkataloogil, leiate failide loendi. Esimene fail, mida näete (selle juhendi kirjutamise ajal), on katkesta.h. Kui klõpsate lingil katkesta.h, suunatakse teid domeeni lähtefaili katkesta.h, mis sisaldab kasulikke makrosid skriptidest väljumiseks, kui tuvastatakse ebanormaalsed tingimused. Selles peatükis kasutatud abimeeste lähtekoodi leiate kataloogist src/Applications/helper. Tutvuge julgelt kataloogipuus, et aru saada, mis kus asub, ja mõista ns-3 programmide stiili.

Allikas: www.habr.com

Lisa kommentaar