ns-3 netwerk simulator handleiding. Hoofstuk 3

ns-3 netwerk simulator handleiding. Hoofstuk 3
hoofstuk 1,2

3 Aan die gang
3.1 Oorsig
3.2 Voorvereistes
3.2.1 Laai die ns-3-vrystelling af as 'n bronargief
3.3 Laai ns-3 af met Git
3.3.1 Laai ns-3 met Bake
3.4 Vergadering ns-3
3.4.1 Gebou met build.py
3.4.2 Bou met bak
3.4.3 Bou met Waf
3.5 Toets ns-3
3.6 Begin die skrip
3.6.1 Opdragreëlargumente
3.6.2 Ontfouting
3.6.3 Werksgids

Hoofstuk 3

Aan die gang kom

Hierdie hoofstuk is bedoel om die leser voor te berei om te begin met 'n rekenaar wat dalk nooit ns-3 geïnstalleer het nie. Dit dek ondersteunde platforms, voorvereistes, hoe om ns-3 te bekom, hoe om ns-3 te bou, en hoe om jou bou en eenvoudige programme te toets.

3.1 Oorsig

Die ns-3 simulator is gebou as 'n stelsel van samewerkende sagteware biblioteke. Tydens samestelling word die kode van gebruikersprogramme aan hierdie biblioteke gekoppel. Die C++- of Python-programmeertale word gebruik om pasgemaakte programme te skryf.

Ns-3 word as bronkode versprei, wat beteken dat die teikenstelsel 'n sagteware-ontwikkelingsomgewing moet hê om eers die biblioteke te bou en dan die gebruikersprogram te bou. In beginsel kan ns-3 as klaargemaakte biblioteke vir 'n spesifieke stelsel versprei word, en in die toekoms kan hulle op hierdie manier versprei word. Maar deesdae doen baie gebruikers eintlik hul werk deur ns-3 self te redigeer, so dit is nuttig om die bronkode te hê om die biblioteke te bou. Indien iemand die werk wil aanpak om klaargemaakte biblioteke en pakkette vir bedryfstelsels te skep, kontak asseblief die poslys ns-ontwikkelaars.

Vervolgens kyk ons ​​na drie maniere om ns-3 af te laai en te bou. Die eerste is om die amptelike weergawe van die hoofwebwerf af te laai en te bou. Die tweede is die keuse en samestelling van kopieë van ontwikkelingsweergawes van die basiese ns-3-installasie. Die derde is om bykomende bougereedskap te gebruik om meer uitbreidings vir ns-3 te laai. Ons sal elkeen deurgaan aangesien die gereedskap effens verskil.

Ervare Linux-gebruikers mag wonder hoekom ns-3 nie as 'n pakket verskaf word soos die meeste ander biblioteke wat 'n pakketbestuurder gebruik nie? Alhoewel daar binêre pakkette vir verskeie Linux-verspreidings (bv. Debian) is, redigeer die meeste gebruikers uiteindelik die biblioteke en moet hulle self ns-3 herbou, dus is dit handig om die bronkode beskikbaar te hê. Om hierdie rede sal ons daarop fokus om vanaf bron te installeer.

Vir die meeste toepassings ns-3 regte wortel nie nodig is nie, word dit aanbeveel om 'n onbevoorregte gebruikersrekening te gebruik.

3.2 Voorvereistes

Die hele stel beskikbare ns-3-biblioteke het 'n aantal afhanklikhede van derdeparty-biblioteke, maar meestal kan ns-3 gebou en gebruik word met ondersteuning vir verskeie algemene (dikwels by verstek geïnstalleerde) komponente: 'n C++ samesteller, Python, 'n bronkode-redigeerder (byvoorbeeld, Vim, emacs of Eclipse) en, indien ontwikkelingsbewaarplekke gebruik word, Git-weergawebeheerstelsels. Die meeste eerstekeergebruikers hoef nie bekommerd te wees as hul konfigurasie aandui dat sommige ns-3 gevorderde kenmerke ontbreek nie, maar vir diegene wat 'n volledige installasie wil hê, bied die projek 'n wiki wat bladsye insluit met baie nuttige wenke en truuks. Een so 'n bladsy is die Installasie-bladsy, met installasie-instruksies vir verskeie stelsels, beskikbaar by: https://www.nsnam.org/wiki/Installation.

Die Voorvereistes-afdeling van hierdie wiki verduidelik watter pakkette benodig word om algemene ns-3-opsies te ondersteun en verskaf ook die opdragte wat gebruik word om dit op algemene geure van Linux of macOS te installeer.

Jy kan van hierdie geleentheid gebruik maak om die ns-3 wiki-bladsy of die hoofwebwerf te verken: https://www.nsnam.org, want daar is baie inligting daar. Begin met die nuutste weergawe van ns-3 (ns-3.29), is die volgende gereedskap nodig om ns-3 te laat loop:

Gereedskappakket/weergawe

  • C++ samesteller
    clang++ of g++ (g++ weergawe 4.9 of hoër)
  • Python
    python2 weergawe >= 2.7.10, of python3 weergawe >=3.4
  • gaan
    enige nuutste weergawe (om toegang te verkry tot ns-3 op GitLab.com)
  • teer
    enige nuutste weergawe (vir die uitpak van ns-3-vrystelling)
  • bunzip2
    enige nuutste weergawe (vir die uitpak van die ns‑3-weergawe)

Om die verstekweergawe van Python na te gaan, tik python -V. Om die g++ weergawe na te gaan, tik g++ -v. Indien enige gereedskap ontbreek of te oud is, verwys asseblief na die installasiegids op die ns-3 wiki-bladsy.

Van nou af neem ons aan dat die leser Linux, MacOS of 'n Linux-emulator gebruik, en het ten minste die bogenoemde gereedskap.

3.2.1 Laai die ns-3-vrystelling af as 'n bronargief

Dit is die verloop van aksie vir 'n nuwe gebruiker wat die nuutste weergawe en pakketweergawes van ns-3 wil aflaai en eksperimenteer. ns-3-vrystellings word gepubliseer as saamgeperste bron-argiewe, soms genoem teerbal. teerbal is 'n spesiale sagteware-argiefformaat waarin verskeie lêers saam gekombineer word. Die argief word gewoonlik saamgepers. ns-3 selflaai proses via teerbal is eenvoudig, jy hoef net 'n vrystelling te kies, dit af te laai en uit te pak.

Kom ons neem aan dat jy as gebruiker ns-3 wil bou in 'n plaaslike gids genaamd werkruimte. U kan 'n werkskopie van die vrystelling kry deur die volgende in die Linux-konsole in te voer (natuurlik die toepaslike weergawenommers te vervang)

$ cd 
$ mkdir workspace 
$ cd workspace 
$ wget https://www.nsnam.org/release/ns-allinone-3.29.tar.bz2 
$ tar xjf ns-allinone-3.29.tar.bz2 

Gee aandag aan die nut wat hierbo gebruik word wget, wat 'n opdragreëlinstrument is om voorwerpe van die internet af te laai. As jy dit nie geïnstalleer het nie, kan jy jou blaaier hiervoor gebruik.

Deur hierdie stappe te volg, sal jy na die ns-allinone-3.29 gids neem, daar behoort jy verskeie lêers en gidse te sien

$ cd ns-allinone-3.29
$ ls
bake constants.py ns-3.29 README
build.py netanim-3.108 pybindgen-0.17.0.post58+ngcf00cc0 util.py

Jy is nou gereed om 'n basiese ns-3 verspreiding te bou en kan aanbeweeg na die afdeling oor die bou van ns-3.

3.3 Laai ns-3 af met Git

Die ns-3-kode is beskikbaar in die Git-bewaarplekke op GitLab.com by https://gitlab.com/nsnam/. Groep nsnam bring die verskillende bewaarplekke bymekaar wat deur 'n oopbronprojek gebruik word.

Die maklikste manier om Git-bewaarplekke te begin gebruik, is om die omgewing te vurk of te kloon ns-3-allinoon. Dit is 'n stel skrifte wat die laai en samestelling van die mees gebruikte ns-3 substelsels bestuur. As jy nuut is by Git, is die terme "vurk" en "kloon" dalk vir jou onbekend; indien wel, beveel ons aan dat u eenvoudig die bewaarplek op GitLab.com kloon (maak u eie kopie) soos volg:

$ cd 
$ mkdir workspace 
$ cd workspace 
$ git clone https://gitlab.com/nsnam/ns-3-allinone.git 
$ cd ns-3-allinone 

Op hierdie stadium, die aansig van jou gids ns-3-allinoon effens anders as die vrystelling-argiefgids hierbo beskryf. Dit behoort so iets te lyk:

$ ls
build.py constants.py download.py README util.py

Neem asseblief kennis dat daar 'n skrif is aflaai.py, wat addisioneel ns-3 en gepaardgaande bronkode sal onttrek. Hier het jy 'n keuse: laai óf die nuutste ns-3-ontwikkelingsmomentopname af:

$ python download.py

of verkies die ns-3-vrystelling deur die vlag te gebruik -n om die vrystellingnommer aan te dui:

$ python download.py -n ns-3.29

Na hierdie stap na die gids ns-3-allinoon bykomende bewaarplekke sal afgelaai word ns-3, bak, pybindgen и netanim.

Let daarop
Op 'n masjien met skoon Ubuntu16.04, moes ek die opdrag na hierdie verander: $ sudo python3 download.py -n ns-3.29 (hierna vertalersaantekeninge).

3.3.1 Laai ns-3 met Bake

Bogenoemde twee metodes (bronargief of bewaarplek ns-3-allinoon via Git) is nuttig om die eenvoudigste ns-3-installasie te kry met veelvuldige byvoegings (pybindgen om Python-bindings te genereer en netanim vir netwerkanimasie). Die derde bewaarplek wat by verstek in ns-3-allinone verskaf word, word genoem bak.

Bak is 'n hulpmiddel vir gekoördineerde bou van sagteware uit veelvuldige bewaarplekke, ontwikkel vir die ns-3-projek. Bak kan gebruik word om ontwikkelingsweergawes van ns-3 te verkry, asook om uitbreidings van die basisweergawe van die ns-3 verspreiding af te laai en te bou, soos die omgewing Direkte Kode Uitvoering, WiegNetwerk Simulasie Wieg, die vermoë om nuwe Python-bindings en verskeie ns-3 "toepassings" te skep.

Let daarop
CradleNetwork Simulation Cradle is 'n raamwerk waarmee jy regte TCP/IP-netwerkstapels binne 'n netwerksimulator kan gebruik.

As jy verwag dat jou ns-3-installasie gevorderde of bykomende kenmerke sal hê, kan jy hierdie installasiepad volg.

In die nuutste ns-3-vrystellings Bak is by die teervrystelling gevoeg. Die vrystelling sluit 'n konfigurasielêer in waarmee u die huidige sagtewareweergawes ten tyde van die vrystelling kan aflaai. Dit is byvoorbeeld die weergawe Bak, wat met vrystelling ns-3.29 versprei word, kan gebruik word om komponente vir daardie vrystelling van ns-3 of vroeër te herwin, maar kan nie gebruik word om komponente vir latere vrystellings te herwin nie (indien die pakketbeskrywinglêer bakeconf.xml nie opgedateer nie).

Jy kan ook die nuutste kopie kry bakdeur die volgende opdrag in jou Linux-konsole in te voer (met die veronderstelling dat jy Git geïnstalleer het):

$ cd 
$ mkdir workspace 
$ cd workspace 
$ git clone https://gitlab.com/nsnam/bake.git

Wanneer jy die git-opdrag uitvoer, behoort jy iets soos die volgende te sien:

Cloning into 'bake'...
remote: Enumerating objects: 2086, done. 
remote: Counting objects: 100% (2086/2086), done. 
remote: Compressing objects: 100% (649/649), done. 
remote: Total 2086 (delta 1404), reused 2078 (delta 1399) 
Receiving objects: 100% (2086/2086), 2.68 MiB | 3.82 MiB/s, done. 
Resolving deltas: 100% (1404/1404), done.

Nadat die opdrag voltooi is kloon jy moet 'n gids met die naam hê bak, waarvan die inhoud iets soos hierdie moet lyk:

$ cd bake
$ ls
bake bakeconf.xml bake.py doc examples generate-binary.py test TODO

Let daarop dat jy verskeie Python-skrifte gelaai het, 'n Python-module genaamd bak en 'n XML-konfigurasielêer. Die volgende stap is om hierdie skrifte te gebruik om die ns-3 verspreiding van jou keuse af te laai en te bou. Verskeie pasmaakteikens is beskikbaar:

  1. ns-3.29: module wat ooreenstem met die vrystelling; dit sal komponente soortgelyk aan die vrystelling in die tarball aflaai;

  2. ns-3-dev: 'n soortgelyke module, maar met behulp van kode van die ontwikkelingsboom;

  3. ns-allinone-3.29: 'n Module wat ander bykomende kenmerke insluit, soos klikroetering en Network Simulation Cradle, Openflow vir ns-3.

  4. ns-3-allinoon: soortgelyk aan die vrystelling weergawe van die module allinone, maar vir ontwikkelingskode.

Let daarop
Klik - modulêre sagteware-argitektuur vir die skep van routers.

Openflow is 'n protokol vir die bestuur van die proses van verwerking van data wat oor 'n datanetwerk deur routers en skakelaars oorgedra word, wat sagteware-gedefinieerde netwerktegnologie implementeer.

Die huidige ontwikkelingsmomentskoot (nie-vrystelling) ns-3 kan gevind word by:https://gitlab.com/nsnam/ns-3-dev.git.

Die ontwikkelaars probeer om hierdie bewaarplekke in 'n konsekwente werkende toestand te hou, maar hulle is in die ontwikkelingsarea en bevat kode wat nie vrygestel is nie, so as jy nie van plan is om nuwe kenmerke te gebruik nie, kies dan die amptelike vrystelling.

Jy kan die nuutste weergawe van die kode vind deur deur die lys van bewaarplekke te blaai, of deur na die ns-3 Releases-webblad te gaan:https://www.nsnam.org/releases/ en klik op die nuutste weergawe skakel. In hierdie voorbeeld gaan ons voort met ns-3.29.

Nou, om die ns-3-komponente te kry wat ons benodig, sal ons die instrument gebruik Bak. Kom ons sê 'n paar inleidende woorde oor die werk Bak.

Bak werk deur pakketbronne in 'n gids te laai bron en die installering van die biblioteke in die bougids. Bak kan uitgevoer word deur die binêre te verwys, maar as jy wil hardloop Bak nie van die gids waarin dit afgelaai is nie, is dit raadsaam om die pad by te voeg bak na jou pad (PATH omgewingsveranderlike), byvoorbeeld soos volg (voorbeeld vir Linux bash shell). Gaan na die "bak"-gids en stel dan die volgende omgewingsveranderlikes in:

$ export BAKE_HOME=`pwd` 
$ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin 
$ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/lib

Dit sal die program plaas bak.py na die doppad en sal ander programme toelaat om die uitvoerbare en biblioteke wat dit geskep het, te vind bak. In sommige gebruiksgevalle bak, is die PATH- en PYTHONPATH-instelling hierbo beskryf nie nodig nie, maar 'n volledige bou van ns-3-allinone (met bykomende pakkette) vereis dit gewoonlik.

Gaan na jou werkgids en voer die volgende in die konsole in:

$ ./bake.py configure -e ns-3.29

Volgende sal ons vra Bak kyk of ons genoeg gereedskap het om die verskillende komponente te laai. Skakel:

$ ./bake.py check

Jy behoort iets soos die volgende te sien:

> Python - OK 
> GNU C++ compiler - OK 
> Mercurial - OK 
> Git - OK 
> Tar tool - OK 
> Unzip tool - OK 
> Make - OK 
> cMake - OK 
> patch tool - OK 
> Path searched for tools: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...

Veral oplaai-instrumente soos Mercurial, CVS, Git en Bazaar is noodsaaklik in hierdie stap, aangesien dit ons toelaat om die kode te kry. Installeer op hierdie stadium die ontbrekende gereedskap op die gewone manier vir jou stelsel (as jy weet hoe) of kontak jou stelseladministrateur vir hulp.

Probeer dan om die sagteware af te laai:

$ ./bake.py download

die resultaat moet iets soos:

>> Searching for system dependency setuptools - OK 
>> Searching for system dependency libgoocanvas2 - OK 
>> Searching for system dependency gi-cairo - OK 
>> Searching for system dependency pygobject - OK 
>> Searching for system dependency pygraphviz - OK 
>> Searching for system dependency python-dev - OK 
>> Searching for system dependency qt - OK 
>> Searching for system dependency g++ - OK 
>> Downloading pybindgen-0.19.0.post4+ng823d8b2 (target directory:pybindgen) - OK 
>> Downloading netanim-3.108 - OK 
>> Downloading ns-3.29 - OK

Dit sal beteken dat drie bronne afgelaai is. Gaan nou na die brongids en tik ls; Jy behoort te sien:

$ cd source 
$ ls
netanim-3.108 ns-3.29 pybindgen

Nou is jy gereed om die ns-3 verspreiding te bou.

3.4 Vergadering ns-3

Soos met die aflaai van ns-3, is daar verskeie maniere om ns-3 te bou. Die belangrikste ding wat ons wil beklemtoon, is dat ns-3 gebou is met behulp van 'n bou-instrument genaamd WAFhieronder beskryf. Die meeste gebruikers sal met WAF, maar daar is 'n paar handige skrifte om jou te help om te begin of meer komplekse bouwerk te organiseer. So asseblief, voor jy lees oor WAF, gaan kyk na bou.py en samestelling met bak.

3.4.1 Gebou met build.py

Внимание! Hierdie boustap is slegs beskikbaar vanaf die bronargiefweergawe verkry soos hierbo beskryf; en nie afgelaai via git of bak nie.

Wanneer jy met 'n vrystellingsargief werk teerbalIn ns-3-allinoon Daar is 'n handige skrif wat die samestelling van die komponente makliker kan maak. Dit word build.py genoem. Hierdie program sal die projek vir jou op die nuttigste manier opstel. Neem egter kennis dat meer gevorderde opstelling en werk met ns-3 gewoonlik die gebruik van ns-3 se eie boustelsel, Waf, behels, wat later in hierdie tutoriaal bekendgestel sal word.

As jy afgelaai het met behulp van teerbal, dan in jou gids ~/werkspasie 'n gids met 'n naam iets soos ns-allinone-3.29. Voer die volgende in:

$ ./build.py --enable-examples --enable-tests

Wanneer gebel word bou.py Ons het opdragreëlargumente gebruik om die voorbeelde en toetse wat in hierdie tutoriaal gebruik word, te bou, wat nie by verstek in ns-3 gebou is nie. By verstek bou die program ook alle beskikbare modules. Dan, as jy wil, kan jy ns-3 bou sonder voorbeelde en toetse, of modules uitsluit wat nie vir jou werk nodig is nie.

Jy sal baie samesteller-uitsetboodskappe sien wat deur die skrif vertoon word terwyl dit die verskillende dele wat jy gelaai het, bou. Eerstens sal die draaiboek probeer om die animeerder te bou netanim, dan die bindingsgenerator pybindgen en uiteindelik ns-3. Wanneer die proses voltooi is, behoort jy die volgende te sien:

Waf: Leaving directory '/path/to/workspace/ns-allinone-3.29/ns-3.29/build'
'build' finished successfully (6m25.032s) 

Modules built:
antenna                aodv                     applications
bridge                 buildings                config-store
core                   csma                     csma-layout
dsdv                   dsr                      energy 
fd-net-device          flow-monitor             internet
internet-apps          lr-wpan                  lte
mesh                   mobility                 mpi
netanim (no Python)    network                  nix-vector-routing 
olsr                   point-to-point           point-to-point-layout 
propagation            sixlowpan                spectrum 
stats                  tap-bridge               test (no Python) 
topology-read          traffic-control          uan 
virtual-net-device     visualizer               wave 
wifi                   wimax 

Modules not built (see ns-3 tutorial for explanation):
brite                  click                    openflow 
Leaving directory ./ns-3.29

In die laaste drie reëls van die lys sien ons 'n boodskap oor modules wat nie gebou is nie:

Modules not built (see ns-3 tutorial for explanation):
brite                     click

Dit beteken eenvoudig dat sommige ns-3-modules wat afhanklik is van eksterne biblioteke dalk nie gebou is nie, of dat dit nie nodig is om vir hierdie opset gebou te word nie. Dit beteken nie dat die simulator nie saamgestel is of dat die saamgestelde modules nie reg sal werk nie.

3.4.2 Bou met bak

As jy bake hierbo gebruik het om bronkode van die projekbewaarplekke te kry, kan jy voortgaan om dit te gebruik om ns-3 te bou. Skakel:

$ ./bake.py build

en jy behoort iets te sien soos:

>> Building pybindgen-0.19.0.post4+ng823d8b2 - OK 
>> Building netanim-3.108 - OK 
>> Building ns-3.29 - OK

vinnig: Jy kan ook beide die aflaai- en boustappe gelyktydig doen deur "bake.py deploy" te roep.

Die samestelling van alle komponente kan misluk, maar montering sal voortgaan as 'n komponent nie nodig is nie. Byvoorbeeld, 'n onlangse oordraagbaarheidskwessie was dit castxml kan met gereedskap saamgestel word bak nie op alle platforms nie. In hierdie geval sal 'n boodskap soos hierdie verskyn:

>> Building castxml - Problem 
> Problem: Optional dependency, module "castxml" failed
This may reduce the functionality of the final build.
However, bake will continue since "castxml" is not an essential dependency.
For more information call bake with -v or -vvv, for full verbose mode.

Maar castxml net nodig as jy opgedateerde Python-bindings wil skep. Vir die meeste gebruikers is dit nie nodig nie (ten minste totdat hulle ns-3 verander), so sulke waarskuwings kan vir eers veilig geïgnoreer word.

As dit misluk, sal die volgende opdrag jou 'n wenk gee oor ontbrekende afhanklikhede:

$ ./bake.py show

Die verskillende afhanklikhede van die pakkette wat jy probeer bou, sal gelys word.

3.4.3 Bou met Waf

Tot op hierdie punt, om ns-3 te begin bou, het ons óf die skrif gebruik bou.py, of gereedskap bak. Hierdie gereedskap is nuttig vir die bou van ns-3 en die instandhouding van biblioteke. Trouens, om te bou, gebruik hulle die bou-instrument WAF uit gids ns-3. WAF geïnstalleer met die ns-3 bronkode. Die meeste gebruikers gaan vinnig oor na direkte gebruik om die ns-3 te konfigureer en saam te stel WAF. So, om voort te gaan, gaan asseblief na die ns-3 gids wat jy oorspronklik geskep het.

Dit word tans nie streng vereis nie, maar dit sal nuttig wees om 'n bietjie terug te spoor en te sien hoe om veranderinge aan die projekkonfigurasie aan te bring. Waarskynlik die nuttigste konfigurasieverandering wat u kan maak, is om 'n geoptimaliseerde weergawe van die kode te skep. By verstek het jy jou projek gekonfigureer om 'n ontfoutweergawe te bou. Kom ons kyk na 'n projek om 'n geoptimaliseerde samestelling te skep. Om aan Waf te verduidelik dat dit geoptimaliseerde bouwerk moet maak wat voorbeelde en toetse insluit, sal jy die volgende opdragte moet uitvoer:

$ ./waf clean 
$ ./waf configure --build-profile=optimized --enable-examples --enable-tests

Dit sal begin WAF buite die plaaslike gids (vir u gerief). Die eerste opdrag maak skoon van die vorige bou, dit is gewoonlik nie streng nodig nie, maar dit is goeie praktyk (sien ook bouprofiele hieronder); dit sal voorheen geskepte biblioteke en objeklêers wat in die gids geleë is, uitvee bou/. Wanneer die projek herkonfigureer is en die boustelsel die verskillende afhanklikhede nagaan, behoort u uitvoer soortgelyk aan die volgende te sien:

Setting top to      : /home/ns3user/workspace/bake/source/ns-3-dev
Setting out to      : /home/ns3user/workspace/bake/source/ns-3-dev/build
Checking for 'gcc' (C compiler)        : /usr/bin/gcc 
Checking for cc version                : 7.3.0 
Checking for 'g++' (C++ compiler)      : /usr/bin/g++ 
Checking for compilation flag -march=native support : ok 
Checking for compilation flag -Wl,--soname=foo support : ok 
Checking for compilation flag -std=c++11 support       : ok 
Checking boost includes   : headers not found, please ,!provide a --boost-includes argument (see help) 
Checking boost includes   : headers not found, please ,!provide a --boost-includes argument (see help) 
Checking for program 'python'            : /usr/bin/python 
Checking for python version >= 2.3       : 2.7.15 python-config                                                                     : /usr/bin/python-config
Asking python-config for pyembed '--cflags --libs --ldflags' flags : yes
Testing pyembed configuration                                      : yes
Asking python-config for pyext '--cflags --libs --ldflags' flags   : yes
Testing pyext configuration                                        : yes

Checking for compilation flag -fvisibility=hidden support          : ok 
Checking for compilation flag -Wno-array-bounds support            : ok 
Checking for pybindgen location          : ../pybindgen ,!(guessed) 
Checking for python module 'pybindgen'   : 0.19.0. ,!post4+g823d8b2 
Checking for pybindgen version           : 0.19.0. ,!post4+g823d8b2 
Checking for code snippet                : yes 
Checking for types uint64_t and unsigned long equivalence : no 
Checking for code snippet                                 : no 
Checking for types uint64_t and unsigned long long equivalence     : yes 
Checking for the apidefs that can be used for Python bindings                       : gcc-LP64 
Checking for internal GCC cxxabi         : complete 
Checking for python module 'pygccxml'    : not found 
Checking for click location              : not found 
Checking for program 'pkg-config'        : /usr/bin/pkg- ,!config 
Checking for 'gtk+-3.0'                  : not found 
Checking for 'libxml-2.0'                : yes 
checking for uint128_t                   : not found 
checking for __uint128_t                 : yes 
Checking high precision implementation   : 128-bit integer ,!(default) 
Checking for header stdint.h             : yes 
Checking for header inttypes.h           : yes 
Checking for header sys/inttypes.h       : not found 
Checking for header sys/types.h          : yes 
Checking for header sys/stat.h           : yes 
Checking for header dirent.h             : yes 
Checking for header stdlib.h             : yes 
Checking for header signal.h             : yes 
Checking for header pthread.h            : yes 
Checking for header stdint.h             : yes 
Checking for header inttypes.h           : yes 
Checking for header sys/inttypes.h       : not found
Checking for library rt                  : yes 
Checking for header sys/ioctl.h          : yes 
Checking for header net/if.h             : yes 
Checking for header net/ethernet.h       : yes 
Checking for header linux/if_tun.h       : yes 
Checking for header netpacket/packet.h   : yes 
Checking for NSC location                : not found 
Checking for 'sqlite3'                   : not found 
Checking for header linux/if_tun.h       : yes 
Checking for python module 'gi'          : 3.26.1 
Checking for python module 'gi.repository.GObject'      : ok 
Checking for python module 'cairo'                      : ok 
Checking for python module 'pygraphviz'                 : 1.4rc1 
Checking for python module 'gi.repository.Gtk'          : ok 
Checking for python module 'gi.repository.Gdk'          : ok 
Checking for python module 'gi.repository.Pango'        : ok 
Checking for python module 'gi.repository.GooCanvas'    : ok 
Checking for program 'sudo'                             : /usr/bin/sudo 
Checking for program 'valgrind'                         : not found 
Checking for 'gsl' : not found python-config            : not found 
Checking for compilation flag -fstrict-aliasing support : ok 
Checking for compilation flag -fstrict-aliasing support : ok 
Checking for compilation flag -Wstrict-aliasing support : ok 
Checking for compilation flag -Wstrict-aliasing support : ok 
Checking for program 'doxygen'                          : /usr/bin/doxygen
---- Summary of optional ns-3 features:
Build profile : optimized
Build directory : 
BRITE Integration : not enabled (BRITE not enabled (see option --with- ,!brite)) 
DES Metrics event collection : not enabled (defaults to disabled) 
Emulation FdNetDevice        : enabled 
Examples                     : enabled 
File descriptor NetDevice    : enabled 
GNU Scientific Library (GSL) : not enabled (GSL not found) 
Gcrypt library               : not enabled
(libgcrypt not found: you can use ,!libgcrypt-config to find its location.) GtkConfigStore               : not enabled (library 'gtk+-3.0 >= 3.0' not fou   nd)
MPI Support                  : not enabled (option --enable-mpi not selected)
ns-3 Click Integration       : not enabled (nsclick not enabled (see option --with- ,!nsclick))
ns-3 OpenFlow Integration   : not enabled (Required boost libraries not found) 
Network Simulation Cradle    : not enabled (NSC not found (see option --with-nsc))
PlanetLab FdNetDevice         : not enabled (PlanetLab operating system not detected ,!(see option --force-planetlab)) PyViz visualizer : enabled 
Python API Scanning Support   : not enabled (Missing 'pygccxml' Python module)
Python Bindings : enabled 
Real Time Simulator           : enabled 
SQlite stats data output      : not enabled (library 'sqlite3' not found)
Tap Bridge                    : enabled 
Tap FdNetDevice               : enabled
Tests                         : enabled 
Threading Primitives          : enabled 
Use sudo to set suid bit   : not enabled (option --enable-sudo not selected)
XmlIo                         : enabled
'configure' finished successfully (6.387s)

Let asseblief op die laaste deel van die lys hierbo. Sommige ns-3-opsies is nie by verstek geaktiveer nie of vereis stelselondersteuning om behoorlik te funksioneer. Byvoorbeeld, om XmlTo te aktiveer, moet die biblioteek teenwoordig wees op die stelsel libxml-2.0. As hierdie biblioteek nie gevind is nie en die ooreenstemmende ns-3-funksie nie geaktiveer is nie, sal 'n boodskap vertoon word. Let ook daarop dat dit moontlik is om die opdrag te gebruik sudo om die suid-bit "set group ID at runtime" vir sekere programme te stel. Dit is nie by verstek geaktiveer nie en daarom verskyn hierdie kenmerk as "nie geaktiveer". Ten slotte, om 'n lys van geaktiveerde opsies te kry, gebruik WAF met parameter --check-config.

Kom ons gaan nou terug en skakel terug na die ontfoutbou wat voorbeelde en toetse bevat.

$ ./waf clean 
$ ./waf configure --build-profile=debug --enable-examples --enable-tests

Die boustelsel is nou opgestel en jy kan ontfoutweergawes van ns-3-programme bou deur eenvoudig te tik:

$ ./waf

Die stappe hierbo het jou dalk gedwing om twee keer 'n deel van die ns-3-stelsel te bou, maar nou weet jy hoe om die konfigurasie te verander en geoptimaliseerde kode te bou.

Om te kyk watter profiel aktief is vir 'n gegewe projekkonfigurasie, is daar 'n opdrag:

$ ./waf --check-profile 
Waf: Entering directory `/path/to/ns-3-allinone/ns-3.29/build' 
Build profile: debug

Bogenoemde scenario bou.py ondersteun ook argumente --enable-examples и --enable-tests, maar ander opsies WAF dit ondersteun nie direk nie. Dit sal byvoorbeeld nie werk nie:

$ ./build.py --disable-python

die reaksie sal soos volg wees:

build.py: error: no such option: --disable-python

Die spesiale operateur - - kan egter gebruik word om bykomende parameters deur te gee wafdus in plaas van bogenoemde sal die volgende opdrag werk:

$ ./build.py -- --disable-python

omdat dit die hoofopdrag genereer ./waf configure --disable-python. Hier is nog 'n paar inleidende wenke oor WAF.

Hantering van boufoute

ns-3-vrystellings word getoets op die nuutste C++-samestellers wat beskikbaar is ten tyde van vrystelling op algemene Linux- en MacOS-verspreidings. Met verloop van tyd word nuwe verspreidings egter met nuwe samestellers vrygestel, en hierdie nuwer samestellers is geneig om meer pedanties oor waarskuwings te wees. ns-3 konfigureer sy bou om alle waarskuwings as foute te hanteer, so soms as jy 'n ouer weergawe op 'n nuwer stelsel gebruik, kan 'n samestellerwaarskuwing die bou stop.

Daar was byvoorbeeld voorheen 'n vrystelling van ns‑3.28 vir Fedora 28, wat 'n nuwe hoofweergawe ingesluit het gcc (gcc-8). Om die vrystelling ns-3.28 of vroeër weergawes onder Fedora 28 te bou, met Gtk2+ geïnstalleer, sal die volgende fout voorkom:

/usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses ,!in declaration of ‘__gtk_reserved1’ [-Werror=parentheses] void (*__gtk_reserved1);

In vrystellings wat vanaf ns‑3.28.1 begin, in WAF 'n opsie is beskikbaar om hierdie probleme op te los. Dit deaktiveer die instelling van die "-Werror" vlag in g++ en clang++. Dit is die "--disable-werror" opsie en moet tydens konfigurasie toegepas word:

$ ./waf configure --disable-werror --enable-examples --enable-tests

Konfigureer of monteer

Sommige opdragte WAF het slegs betekenis in die konfigurasiefase, en sommige is slegs geldig in die boufase. As jy byvoorbeeld die ns-3-emulasiekenmerke wil gebruik, kan jy die bisinstelling aktiveer selfmoord gebruik sudo, soos hierbo beskryf. Dit sal die konfigurasiestap-opdragte ignoreer, en dus kan jy die konfigurasie verander deur die volgende opdrag te gebruik, wat ook voorbeelde en toetse insluit.

$ ./waf configure --enable-sudo --enable-examples --enable-tests

As jy dit doen WAF sal begin sudoom emulasiekode-sokskeppingsprogramme te verander om met toestemmings te loop wortel. In WAF Daar is baie ander opsies beskikbaar vir die konfigurasie en boustappe. Om jou opsies te verken, voer in:

$ ./waf --help

In die volgende afdeling sal ons 'n paar toetsverwante opsies gebruik.

Vergadering profiele

Ons het reeds gesien hoe jy kan konfigureer WAF vir samekomste ontfout и geoptimaliseer:

$ ./waf --build-profile=debug

Daar is ook 'n intermediêre monteerprofiel, vrystel. Opsie -d is sinoniem met --build-profile. Die bouprofiel beheer die gebruik van aanteken-, bewerings- en samestelleroptimaliseringskakelaars:

ns-3 netwerk simulator handleiding. Hoofstuk 3

Soos u kan sien, is aanteken en bewerings slegs beskikbaar in ontfoutingsbou. Die aanbevole praktyk is om jou skrip in ontfoutingsmodus te ontwikkel, en dan herhaalde lopies uit te voer (vir statistieke of parameterveranderings) in 'n geoptimaliseerde bouprofiel.

As jy kode het wat net in sekere bouprofiele moet loop, gebruik die Code Wrapper Makro:

NS_BUILD_DEBUG (std::cout << "Part of an output line..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Done: " << timer << std::endl;)

Verstek, WAF plaas bou-artefakte in die bougids. U kan 'n ander uitvoergids spesifiseer deur die opsie te gebruik - -out, byvoorbeeld:

$ ./waf configure --out=my-build-dir

Deur dit met bouprofiele te kombineer, kan jy maklik wissel tussen verskillende samestellingsopsies:

$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf build
... 
$ ./waf configure --build-profile=optimized --out=build/optimized 
$ ./waf build
...

Wat jou toelaat om met veelvuldige samestellings te werk sonder om die nuutste samestelling elke keer te hoef te herskryf. Wanneer jy na 'n ander profiel oorskakel, WAF sal net dit saamstel, sonder om alles heeltemal te hersaamstel.

Wanneer jy bouprofiele op hierdie manier verander, moet jy versigtig wees om elke keer dieselfde konfigurasie-opsies te gee. Om verskeie omgewingsveranderlikes te definieer sal jou help om foute te vermy:

$ export NS3CONFIG="--enable-examples --enable-tests" 
$ export NS3DEBUG="--build-profile=debug --out=build/debug"
$ export NS3OPT=="--build-profile=optimized --out=build/optimized" 

$ ./waf configure $NS3CONFIG $NS3DEBUG
$ ./waf build 
... 
$ ./waf configure $NS3CONFIG $NS3OPT
$ ./waf build

Samestellers en vlae

In die bogenoemde voorbeelde WAF om ns-3 te bou, gebruik die C++ samesteller van GCC ( g ++). Jy kan egter die een wat jy gebruik verander WAF C++ samesteller, deur die CXX omgewingsveranderlike te definieer. Byvoorbeeld, om die C++ samesteller Clang te gebruik, clang++,

$ CXX="clang++" ./waf configure 
$ ./waf build 

Op dieselfde manier kan jy konfigureer WAF verspreide samestelling te gebruik met behulp van distcc:

$ CXX="distcc g++" ./waf configure 
$ ./waf build

Meer inligting oor distcc en verspreide samestelling kan gevind word op die projekbladsy in die Dokumentasie-afdeling. Om samestellervlae by te voeg wanneer ns-3 gekonfigureer word, gebruik die CXXFLAGS_EXTRA omgewingsveranderlike.

installasie

WAF kan gebruik word om biblioteke op verskillende plekke op die stelsel te installeer. By verstek is die saamgestelde biblioteke en uitvoerbare programme in die gids geleë bou, en aangesien Waf die ligging van hierdie biblioteke en uitvoerbare programme ken, is dit nie nodig om die biblioteke op enige ander plek te installeer nie.

As gebruikers verkies om buite die bougids te installeer, kan hulle die opdrag uitvoer ./waf installeer. Die verstek voorvoegsel vir installasie is / usr / plaaslikedaarom ./waf installeer sal programme installeer in / Usr / local / bin, biblioteke in / Usr / local / lib en koplêers in /usr/local/insluit. Supergebruikersregte moet gewoonlik met 'n verstekvoorvoegsel gestel word, so 'n tipiese opdrag sal wees sudo ./waf installeer. Wanneer dit bekendgestel word, sal Waf eers kies om die gedeelde biblioteke in die bougids te gebruik, en dan na biblioteke soek langs die pad na die biblioteke wat in die plaaslike omgewing gekonfigureer is. Wanneer u biblioteke op 'n stelsel installeer, is dit dus 'n goeie praktyk om seker te maak dat die regte biblioteke gebruik word. Gebruikers kan kies om met 'n ander voorvoegsel te installeer deur die opsie tydens konfigurasie deur te gee --prefix, byvoorbeeld:

./waf configure --prefix=/opt/local

As die gebruiker later, na die bou, die installasie-opdrag invoer ./waf, sal die voorvoegsel gebruik word /opt/local.

Span ./waf clean moet gebruik word voordat die projek herkonfigureer word as die installasie sal gebruik WAF onder 'n ander voorvoegsel.

Dus, om ns-3 te gebruik, hoef u nie te bel nie ./waf install. Die meeste gebruikers sal nie hierdie opdrag nodig hê nie, want WAF sal die huidige biblioteke van die bougids optel, maar sommige gebruikers kan dit nuttig vind as hul aktiwiteite behels dat hulle met programme buite die ns-3-gids werk.

Waf enkel

Op die boonste vlak van die ns-3-bronboom is daar net een Waf-skrif. Sodra jy begin werk, sal jy baie tyd in die gids spandeer scratch/ of dieper insrc/... en terselfdertyd moet hardloop WAF. Jy kan net onthou waar jy is en hardloop WAF soos volg:

$ ../../../waf ...

maar dit sal vervelig en foutgevoelig wees, so daar is beter oplossings. Een algemene manier is om 'n teksredigeerder te gebruik soos emacs of Vim, waarin twee terminale sessies oopgemaak word, word een gebruik om ns-3 te bou, en die tweede word gebruik om die bronkode te wysig. As jy maar het teerbal, dan kan 'n omgewingsveranderlike help:

$ export NS3DIR="$PWD" 
$ function waff { cd $NS3DIR && ./waf $* ; } 

$ cd scratch 
$ waff build

In die modulegids kan dit dalk aanloklik wees om 'n onbenullige waf-skrif soos exec ../../waf. Asseblief, moenie dit doen nie. Dit is verwarrend vir nuwelinge en, wanneer dit swak gedoen word, lei dit tot boufoute wat moeilik is om op te spoor. Die oplossings hierbo getoon is die pad wat gebruik moet word.

3.5 Toets ns-3

Jy kan die ns-3-verspreiding se eenheidstoetse laat loop deur die skrip uit te voer ./toets.py:

$ ./test.py

Hierdie toetse word parallel met WAF. Uiteindelik behoort u 'n boodskap te sien wat sê:

92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

Dit is 'n belangrike boodskap vir die identifisering van valgrind-ongelukke, ineenstortings of foute, wat probleme met die kode of onversoenbaarheid tussen gereedskap en kode aandui.

Jy sal ook die finale uitset van sien WAF en 'n toetser wat elke toets uitvoer, wat so iets sal lyk:

Waf: Entering directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
Waf: Leaving directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
'build' finished successfully (1.799s) 

Modules built:
aodv           applications          bridge
click          config-store          core
csma           csma-layout           dsdv
emu            energy                flow-monitor
internet       lte                   mesh
mobility       mpi                   netanim
network        nix-vector-routing    ns3tcp
ns3wifi        olsr                  openflow
point-to-point point-to-point-layout propagation
spectrum       stats                 tap-bridge
template       test                  tools
topology-read  uan                   virtual-net-device
visualizer     wifi                  wimax

PASS: TestSuite ns3-wifi-interference
PASS: TestSuite histogram 

...

PASS: TestSuite object
PASS: TestSuite random-number-generators
92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

Hierdie opdrag word gewoonlik deur gebruikers uitgevoer om vinnig te verifieer dat die ns-3 verspreiding korrek gebou is. (Let daarop dat die volgorde van die "SLAAG: ..."-lyne anders kan wees, dit is normaal. Wat belangrik is, is dat die opsommingsreël aan die einde van die verslag wys dat alle toetse geslaag het; geen toetse het gedruip of omgeval nie.) En WAFEn toets.py sal werk oor die beskikbare verwerkerkerne van die masjien paralleliseer.

3.6 Begin die skrip

Ons voer gewoonlik skrifte onder beheer uit WAF. Dit laat die boustelsel toe om te verseker dat gedeelde biblioteekpaaie korrek gestel is en dat die biblioteke tydens looptyd beskikbaar is. Om die program te laat loop, gebruik eenvoudig WAF met parameter - -run. Kom ons hardloop die ns-3 ekwivalent van die alomteenwoordige program hello worlddeur die volgende te tik:

$ ./waf --run hello-simulator

Waf sal eers kyk of die program reg gebou is en bou indien nodig. Toe WAF sal 'n program uitvoer wat die volgende uitset produseer.

Hello Simulator

Baie geluk! Jy is nou 'n ns-3 gebruiker!

Wat moet ek doen as ek nie resultate sien nie?

As jy boodskappe sien WAFwat aandui dat die bou suksesvol voltooi is, maar jy sien nie die uitset nie "Hallo Simulator", dan is daar 'n moontlikheid dat jy in die [Bou-met-Waf]-afdeling jou boumodus na oorgeskakel het geoptimaliseer, maar het gemis om terug te skakel na die modus ontfout. Alle konsole-uitvoer wat in hierdie handleiding gebruik word, gebruik 'n spesiale ns-3-komponent wat aanteken en word gebruik om persoonlike boodskappe na die konsole te druk. Uitvoer vanaf hierdie komponent word outomaties gedeaktiveer wanneer geoptimaliseerde kode saamgestel word - dit is "geoptimaliseer". As jy nie die "Hallo Simulator"-uitvoer sien nie, voer die volgende in:

$ ./waf configure --build-profile=debug --enable-examples --enable-tests

aan te pas WAF om ontfoutweergawes van ns-3-programme te bou, wat voorbeelde en toetse insluit. U moet dan die huidige ontfoutweergawe van die kode herbou deur te tik

$ ./waf

Nou as jy die program hardloop hallo-simulator, moet jy die verwagte resultaat sien.

3.6.1 Opdragreëlargumente

Om opdragreëlargumente na die ns-3-program deur te gee, gebruik die volgende patroon:

$ ./waf --run <ns3-program> --command-template="%s <args>"

Vervang na die naam van jou program en aan die argumente. Argument - -command-template vir WAF is in wese 'n resep vir die bou van die werklike opdragreël WAF gebruik om die program uit te voer. Waf kontroleer dat die bou voltooi is, stel die gedeelde biblioteekpaaie, gebruik dan die verskafde opdragreëlsjabloon en vervang die programnaam vir die %s-plekhouer om die uitvoerbare te noem. As jy hierdie sintaksis ingewikkeld vind, is daar 'n eenvoudiger weergawe wat die ns-3-program en sy argumente ingesluit in enkele aanhalingstekens behels:

$ ./waf --run '<ns3-program> --arg1=value1 --arg2=value2 ...'

Nog 'n besonder nuttige voorbeeld is om toetsreekse selektief te laat loop. Kom ons neem aan daar is 'n toetssuite genaamd mytest (in werklikheid is daar nie). Hierbo het ons die ./test.py-skrip gebruik om 'n aantal toetse parallel uit te voer, wat die toetsprogram herhaaldelik oproep toetsloper. Bel toetsloper direk om een ​​toets uit te voer:

$ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"

Argumente sal na die program oorgedra word toetsloper. Aangesien mytest nie bestaan ​​nie, sal 'n foutboodskap gegenereer word. Om die beskikbare toetsloper-opsies te druk, voer in:

$ ./waf --run test-runner --command-template="%s --help"

3.6.2 Ontfouting

Om ns-3-programme onder 'n ander nutsprogram te laat loop, soos 'n ontfouter (byvoorbeeld, gdb) of 'n geheuetoetsinstrument (byvoorbeeld, valgrind), gebruik 'n soortgelyke vorm - -command-template = "…". Byvoorbeeld, om in die ontfouter te hardloop gdb jou hello-simulator ns-3 program met argumente:

$ ./waf --run=hello-simulator --command-template="gdb %s --args <args>"

Let daarop dat die ns-3-programnaam saam met die argument kom - -run, en die bestuurshulpmiddel (hier gdb) is die eerste teken in die argument - -command-template. Opsie - -args verslae gdbdat die res van die opdragreël aan die "onderste" program behoort. (Sommige weergawes gdb verstaan ​​nie die opsie nie - -args. In hierdie geval, verwyder die program argumente van - -command-template en gebruik die opdragstel gdb args.) Ons kan hierdie resep en die vorige een kombineer om die toets onder die ontfouter uit te voer:

$ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"

3.6.3 Werksgids

Waf moet gelanseer word vanaf sy ligging aan die bokant van die ns-3 boom. Hierdie gids word die werkgids waar die uitvoerlêers geskryf sal word. Maar wat as jy hierdie lêers buite die ns-3-bronboom wil hou? Gebruik argument - -cwd:

$ ./waf --cwd=...

Jy sal dit dalk geriefliker vind om die uitvoerlêers in jou werkgids te kry. In hierdie geval kan die volgende indirekte aksie help:

$ function waff {
CWD="$PWD" 
cd $NS3DIR >/dev/null 
./waf --cwd="$CWD" $*
cd - >/dev/null 
}

Hierdie versiering van die vorige weergawe van die opdrag behou die huidige werkgids, gaan na die gids WAFen gee dan opdrag WAF om die werksgids terug te verander na die huidige werkgids wat gestoor is voordat die program begin word. Ons noem die span - -cwd Vir volledigheid hardloop die meeste gebruikers eenvoudig Waf vanaf die topvlakgids en genereer uitvoerlêers daar.

Vervolg: Hoofstuk 4

Bron: will.com

Voeg 'n opmerking