ns-3 netwurk simulator tutorial. Haadstik 3

ns-3 netwurk simulator tutorial. Haadstik 3
haadstik 1,2

3 Te begjinnen
3.1 Oersjoch
3.2 Betingsten
3.2.1 De ns-3-release downloade as boarne-argyf
3.3 Downloaden fan ns-3 mei Git
3.3.1 Laden fan ns-3 mei Bake
3.4 Gearstalling ns-3
3.4.1 Bouwe mei build.py
3.4.2 Bouwe mei Bake
3.4.3 Bouwe mei Waf
3.5 Testen ns-3
3.6 It skript útfiere
3.6.1 Arguminten foar kommandorigel
3.6.2 Debuggen
3.6.3 Wurkmap

Haadstik 3

Begjinne

Dit haadstik is bedoeld om de lêzer ta te rieden om te begjinnen mei in kompjûter dy't ns-3 mooglik nea ynstallearre hat. It behannelt stipe platfoarms, betingsten, hoe't jo ns-3 kinne krije, hoe't jo ns-3 bouwe, en hoe jo jo bouwe en ienfâldige programma's kinne testen.

3.1 Oersjoch

De ns-3-simulator is boud as in systeem fan gearwurkjende softwarebiblioteken. Tidens de gearstalling is de koade fan brûkersprogramma's keppele oan dizze bibleteken. De programmeartalen C ++ of Python wurde brûkt om oanpaste programma's te skriuwen.

Ns-3 wurdt ferspraat as boarnekoade, wat betsjut dat it doelsysteem in softwareûntwikkelingomjouwing moat hawwe om earst de bibleteken te bouwen en dan it brûkersprogramma te bouwen. Yn prinsipe, ns-3 koe wurde ferspraat as klearmakke bibleteken foar in spesifyk systeem, en yn 'e takomst se meie wurde ferdield op dizze wize. Mar tsjintwurdich dogge in protte brûkers har wurk troch ns-3 sels te bewurkjen, dus it is handich om de boarnekoade te hawwen om de bibleteken te bouwen. As immen it wurk oannimme wol fan it meitsjen fan klearmakke biblioteken en pakketten foar bestjoeringssystemen, nim dan kontakt op mei de mailinglist ns-ûntwikkelders.

Folgjende sille wy nei trije manieren sjen om ns-3 te downloaden en te bouwen. De earste is om de offisjele release te downloaden en te bouwen fan 'e haadside. De twadde is de seleksje en gearstalling fan kopyen fan ûntwikkeling ferzjes fan de basis ns-3 ynstallaasje. De tredde is om ekstra build-ark te brûken om mear útwreidingen foar ns-3 te laden. Wy sille elk trochgean, om't de ark wat oars binne.

Erfarne Linux-brûkers kinne har ôffreegje wêrom't ns-3 net wurdt levere as in pakket lykas de measte oare bibleteken dy't in pakketbehearder brûke? Hoewol't d'r binêre pakketten binne foar ferskate Linux-distribúsjes (bgl. Debian), binne de measte brûkers úteinlik de bibleteken te bewurkjen en ns-3 sels opnij op te bouwen, sadat de boarnekoade beskikber is handich. Om dizze reden sille wy rjochtsje op ynstallaasje fan boarne.

Foar de measte applikaasjes ns-3 rjochten woartel binne net nedich, is it oan te rieden om in unprivileged brûkersaccount te brûken.

3.2 Betingsten

De hiele set fan beskikbere ns-3-biblioteken hat in oantal ôfhinklikens fan biblioteken fan tredden, mar foar it grutste part kin ns-3 boud en brûkt wurde mei stipe foar ferskate mienskiplike (faak standert ynstalleare) komponinten: in C++-kompiler, Python, in boarnekoade-bewurker (bygelyks, vim, emacs of Eklips) en, as ûntwikkelingsrepositories wurde brûkt, Git ferzjekontrôlesystemen. De measte earste kear brûkers hoege gjin soargen te meitsjen as har konfiguraasje rapportearret dat guon ns-3 avansearre funksjes ûntbrekke, mar foar dyjingen dy't in folsleine ynstallaasje wolle, leveret it projekt in wiki dy't siden befettet mei in protte nuttige tips en trúkjes. Ien sa'n side is de Ynstallaasje side, mei ynstallaasje ynstruksjes foar ferskate systemen, beskikber op: https://www.nsnam.org/wiki/Installation.

De seksje Foareasken fan dizze wiki ferklearret hokker pakketten nedich binne om mienskiplike ns-3-opsjes te stypjen en jout ek de kommando's dy't brûkt wurde om se te ynstallearjen op gewoane smaken fan Linux of macOS.

Jo kinne profitearje fan dizze kâns om de ns-3 wiki-side of de haadwebside te ferkennen: https://www.nsnam.org, want dêr is in soad ynformaasje. Begjinnend mei de lêste ferzje fan ns-3 (ns-3.29), binne de folgjende ark nedich om ns-3 út te fieren:

Tool Package / Ferzje

  • C++ kompilator
    clang++ of g++ (g++ ferzje 4.9 of heger)
  • Python
    python2 ferzje >= 2.7.10, of python3 ferzje >=3.4
  • gean
    elke lêste ferzje (om tagong te krijen ta ns-3 op GitLab.com)
  • tar
    elke lêste ferzje (foar it útpakken fan ns-3 release)
  • byp2
    elke lêste ferzje (foar it útpakken fan de ns-3-release)

Om de standertferzje fan Python te kontrolearjen, typ python -V. Om de g++ ferzje te kontrolearjen, typ g++ -v. As der in ark ûntbrekt of te âld is, ferwize dan nei de ynstallaasjegids op 'e ns-3 wiki-side.

Fan no ôf geane wy ​​derfan út dat de lêzer Linux, MacOS, as in Linux-emulator draait, en op syn minst de boppesteande ark hat.

3.2.1 De ns-3-release downloade as boarne-argyf

Dit is de kursus fan aksje foar in nije brûker dy't de lêste release en pakketferzjes fan ns-3 downloade en eksperimintearje wol. ns-3 releases wurde publisearre as komprimearre boarne argiven, soms neamd tarball. tarball is in spesjale software-argyfformaat wêryn ferskate bestannen byinoar wurde kombinearre. It argyf wurdt meastentiids komprimearre. ns-3 boot proses fia tarball is simpel, jo moatte gewoan selektearje in release, download en útpakke it.

Litte wy oannimme dat jo, as brûker, ns-3 bouwe wolle yn in lokale map neamd wurkromte. Jo kinne in wurkkopy fan 'e release krije troch it folgjende yn te fieren yn' e Linux-konsole (ferfanging fan de passende ferzjenûmers, fansels)

$ 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 

Soarch omtinken foar it hjirboppe brûkte nut wget, dat is in kommandorigelark foar it downloaden fan objekten fan it ynternet. As jo ​​​​it net ynstalleare hawwe, kinne jo jo browser hjirfoar brûke.

Troch dizze stappen te folgjen sille jo nei de map ns-allinone-3.29 bringe, dêr moatte jo ferskate bestannen en mappen sjen

$ 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

Jo binne no ree om de ns-3 basisferdieling te bouwen en kinne trochgean nei de seksje oer it bouwen fan ns-3.

3.3 Downloaden fan ns-3 mei Git

De ns-3-koade is beskikber yn 'e Git-repositories op GitLab.com at https://gitlab.com/nsnam/. Groep nsnam bringt de ferskate repositories byinoar dy't brûkt wurde troch in iepen boarne projekt.

De maklikste manier om te begjinnen mei it brûken fan Git-repositories is om de omjouwing te gabeljen of te klonen ns-3-allinone. Dit is in set fan skripts dy't beheart it laden en gearstalling fan de meast brûkte ns-3 subsystemen. As jo ​​nij binne by Git, kinne de termen "foark" en "kloon" foar jo ûnbekend wêze; as dat sa is, riede wy oan dat jo de repository op GitLab.com gewoan klonen (meitsje jo eigen kopy) sa:

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

Op dit stadium is de werjefte fan jo map ns-3-allinone in bytsje oars as de hjirboppe beskreaune triemtafel foar release-argyf. It moat der sa útsjen:

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

Tink derom dat der in skript is download.py, dy't ek ns-3 en byhearrende boarnekoade ekstrahearje sil. Hjir hawwe jo in kar: download of de lêste ns-3-ûntwikkelingssnapshot:

$ python download.py

of leaver de ns-3 release mei help fan de flagge -n om it útjeftenûmer oan te jaan:

$ python download.py -n ns-3.29

Nei dizze stap nei de map ns-3-allinone ekstra repositories sille wurde ynladen ns-3, bakke, pybindgen и netanim.

remark
Op in masine mei skjinne Ubuntu16.04 moast ik it kommando feroarje nei dit: $ sudo python3 download.py -n ns-3.29 (hjirnei oersetternotysjes).

3.3.1 Laden fan ns-3 mei Bake

De boppesteande twa metoaden (boarne argyf as repository ns-3-allinone fia Git) binne nuttich foar it krijen fan de ienfâldichste ns-3 ynstallaasje mei meardere tafoegings (pybindgen te generearjen Python bindingen en netanim foar netwurkanimaasje). De tredde repository levere standert yn ns-3-allinone wurdt neamd bakke.

Bakke is in ark foar koördinearre bou fan software út meardere repositories, ûntwikkele foar it ns-3 projekt. Bakke kin brûkt wurde om ûntwikkelingsferzjes fan ns-3 te krijen, lykas ek om útwreidingen fan 'e basisferzje fan' e ns-3-distribúsje te downloaden en te bouwen, lykas de omjouwing Direkte koade útfiering, CradleNetwork Simulaasje Cradle, de mooglikheid om nije Python-bindingen en ferskate ns-3 "apps" te meitsjen.

remark
CradleNetwork Simulation Cradle is in ramt wêrmei jo echte TCP/IP-netwurkstacks yn in netwurksimulator kinne brûke.

As jo ​​ferwachtsje dat jo ns-3 ynstallaasje avansearre of ekstra funksjes hat, kinne jo dit ynstallaasjepaad folgje.

Yn de lêste ns-3 releases Bakke waard tafoege oan de tar release. De release omfettet in konfiguraasjetriem wêrmei jo de aktuele softwareferzjes kinne downloade op it momint fan de frijlitting. Dat is bygelyks de ferzje Bakke. bakeconf.xml net bywurke).

Jo kinne ek it lêste eksimplaar krije bakketroch it folgjende kommando yn te fieren yn jo Linux-konsole (oannommen dat jo Git ynstalleare hawwe):

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

As jo ​​​​it git-kommando útfiere, moatte jo wat sjen as it folgjende:

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.

Nei it kommando foltôge klon jo moatte in map mei de namme hawwe bakke, wêrfan de ynhâld der sa útsjen moat:

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

Tink derom dat jo ferskate Python-skripts laden hawwe, in Python-module neamd bakke en in XML-konfiguraasjetriem. De folgjende stap is om dizze skripts te brûken om de ns-3-distribúsje fan jo kar te downloaden en te bouwen. Ferskate maatwurkdoelen binne beskikber:

  1. ns-3.29: module oerienkomt mei de release; it sil komponinten downloade fergelykber mei de frijlitting yn 'e tarball;

  2. ns-3-dev: in ferlykbere module, mar mei help fan koade út de ûntwikkeling beam;

  3. ns-allinone-3.29: In module dy't oare oanfoljende funksjes omfettet lykas Click-routing en Network Simulation Cradle, Openflow foar ns-3.

  4. ns-3-allinone: fergelykber mei de release ferzje fan de module alles yn ien, mar foar ûntwikkeling koade.

remark
Klik - Modulêre software-arsjitektuer foar it meitsjen fan routers.

Openflow is in protokol foar it behearen fan it proses fan it ferwurkjen fan gegevens oer in gegevensnetwurk troch routers en switches, it ymplementearjen fan software-definieare netwurktechnology.

De aktuele snapshot fan ûntwikkeling (net-release) ns-3 is te finen op:https://gitlab.com/nsnam/ns-3-dev.git.

De ûntwikkelders besykje dizze repositories yn in konsekwinte wurkjende folchoarder te hâlden, mar se binne yn it ûntwikkelingsgebiet en befetsje unreleased koade, dus as jo gjin nije funksjes brûke, selektearje dan de offisjele release.

Jo kinne de lêste ferzje fan 'e koade fine troch te blêdzjen troch de list mei repositories, of troch te gean nei de ns-3 Releases webside:https://www.nsnam.org/releases/ en klik op de lêste ferzje keppeling. Yn dit foarbyld sille wy trochgean mei ns-3.29.

No, om de ns-3-komponinten te krijen dy't wy nedich binne, sille wy it ark brûke Bakke. Lit ús in pear ynliedende wurden sizze oer it wurk Bakke.

Bake wurket troch pakketboarnen te laden yn in map boarne en it ynstallearjen fan de bibleteken yn de build map. Bakke kin útfierd wurde troch ferwizing nei de binêre, mar as jo wolle rinne Bakke net út de map wêryn it is ynladen, is it oan te rieden om it paad ta te foegjen bakke nei jo paad (PATH omjouwingsfariabele), bygelyks as folget (foarbyld foar Linux bash shell). Gean nei de map "bake" en set dan de folgjende omjouwingsfariabelen yn:

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

Dit sil it programma pleatse bake.py nei it shellpaad en sil oare programma's tastean de útfierbere en bibleteken te finen dy't it makke bakke. Yn guon gefallen fan gebrûk bakke, de hjirboppe beskreaune PATH- en PYTHONPATH-ynstelling is net fereaske, mar in folsleine build fan ns-3-allinone (mei ekstra pakketten) fereasket it normaal.

Gean nei jo wurkmap en fier it folgjende yn yn 'e konsole:

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

Folgjende sille wy freegje Bakke kontrolearje as wy genôch ark hawwe om de ferskate komponinten te laden. Dial:

$ ./bake.py check

Jo moatte wat sjen as it folgjende:

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

Benammen upload ark lykas Mercurial, CVS, Git en Bazaar binne essensjeel yn dizze stap, om't se ús de koade kinne krije. Ynstallearje op dit punt de ûntbrekkende ark op 'e gewoane manier foar jo systeem (as jo witte hoe) of nim kontakt op mei jo systeembehearder foar help.

Besykje dan de software te downloaden:

$ ./bake.py download

it resultaat moat sa'n ding wêze as:

>> 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 sil betsjutte dat trije boarnen binne ynladen. Gean no nei de boarne map en typ ls; Jo moatte sjen:

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

No binne jo ree om de ns-3-distribúsje te bouwen.

3.4 Gearstalling ns-3

Lykas by it downloaden fan ns-3, binne d'r ferskate manieren om ns-3 te bouwen. It wichtichste ding dat wy wolle beklamje is dat ns-3 is boud mei in build ark neamd Wafhjirûnder beskreaun. De measte brûkers sille wurkje mei Waf, mar d'r binne in pear handige skripts om jo te helpen te begjinnen of kompleksere builds te organisearjen. Dus asjebleaft, foardat jo oer lêze Waf, Sjoch ris nei build.py en gearkomste mei bakke.

3.4.1 Bouwe mei build.py

Wês opsichtich! Dizze boustap is allinich beskikber fanút de boarne-argyfferzje krigen lykas hjirboppe beskreaun; en net ynladen fia git of bake.

By it wurkjen mei in release argyf tarball, yn ns-3-allinone D'r is in handich skript dat it gearstallen fan de komponinten makliker meitsje kin. It hjit build.py. Dit programma sil it projekt foar jo op 'e nuttichste manier ynstelle. Tink derom lykwols dat mear avansearre opset en wurk mei ns-3 meastentiids omfettet it brûken fan ns-3's eigen buildsysteem, Waf, dat letter yn dizze tutorial sil wurde yntrodusearre.

As jo ​​​​downloade mei tarball, dan yn jo map ~/wurkromte in map mei in namme sa as ns-allinone-3.29. Typ it folgjende yn:

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

Wannear't neamd build.py Wy brûkten kommando-rigelarguminten om de foarbylden en tests te bouwen dy't brûkt wurde yn dizze tutorial, dy't net standert binne boud yn ns-3. Standert bout it programma ek alle beskikbere modules. Dan, as jo wolle, kinne jo bouwe ns-3 sûnder foarbylden en tests, of útslute modules dy't net nedich binne foar jo wurk.

Jo sille in protte kompilator-útfierberjochten sjen werjûn troch it skript as it de ferskate dielen bouwt dy't jo hawwe laden. Earst sil it skript besykje de animator te bouwen netanim, dan de binende generator pybindgen en úteinlik ns-3. As it proses foltôge is, moatte jo it folgjende sjen:

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

Yn 'e lêste trije rigels fan' e list sjogge wy in berjocht oer modules dy't net binne boud:

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

Dit betsjut gewoan dat guon ns-3-modules dy't ôfhinklik binne fan eksterne biblioteken, miskien net boud binne, of dat se net nedich binne om te bouwen foar dizze konfiguraasje. Dit betsjut net dat de simulator net is gearstald of dat de gearstalde modules net goed wurkje.

3.4.2 Bouwe mei Bake

As jo ​​​​Bake hjirboppe hawwe brûkt om boarnekoade te krijen fan 'e projektrepositories, kinne jo it trochgean brûke om ns-3 te bouwen. Dial:

$ ./bake.py build

en jo moatte wat sjen as:

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

hint: Jo kinne ek de download- en bouwstappen tagelyk dwaan troch "bake.py deploy" te roppen.

It gearstallen fan alle komponinten kin mislearje, mar de gearstalling sil trochgean as in komponint net fereaske is. Bygelyks, in resinte portabiliteitsprobleem wie dat castxml kin wurde gearstald troch ark bakke net op alle platfoarms. Yn dit gefal sil in berjocht as dit ferskine:

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

Mar, castxml allinnich nedich as jo wolle meitsje bywurke Python bindings. Foar de measte brûkers is d'r gjin ferlet fan dit (op syn minst oant se feroarje ns-3), dus sokke warskôgings kinne feilich negearre wurde foar no.

As it mislearret, sil it folgjende kommando jo in hint jaan oer ûntbrekkende ôfhinklikens:

$ ./bake.py show

De ferskate ôfhinklikens fan 'e pakketten dy't jo besykje te bouwen sille wurde neamd.

3.4.3 Bouwe mei Waf

Oant dit punt, om te begjinnen mei it bouwen fan ns-3, hawwe wy it skript brûkt build.py, of ark bakke. Dizze ark binne nuttich foar it bouwen fan ns-3 en it ûnderhâld fan biblioteken. Yn feite, om te bouwen se rinne it bou ark Waf út de ns-3 map. Waf ynstalleare mei de ns-3 boarnekoade. De measte brûkers geane fluch troch nei direkt gebrûk om de ns-3 te konfigurearjen en te sammeljen Waf. Dat, om troch te gean, gean asjebleaft nei de ns-3-map dy't jo oarspronklik makke hawwe.

Dit is op dit stuit net strikt ferplicht, mar it sil nuttich wêze om in bytsje werom te folgjen en te sjen hoe't jo wizigingen meitsje kinne yn 'e projektkonfiguraasje. Wierskynlik de meast brûkbere konfiguraasjewiziging dy't jo kinne meitsje is om in optimalisearre ferzje fan 'e koade te meitsjen. Standert hawwe jo jo projekt ynsteld om in debugferzje te bouwen. Litte wy nei in projekt sjen om in optimalisearre build te meitsjen. Om Waf út te lizzen dat it optimalisearre builds moat meitsje dy't foarbylden en tests omfetsje, moatte jo de folgjende kommando's útfiere:

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

Dit sil lansearje Waf bûten de lokale map (foar jo gemak). De earste kommando skjin út de foarige build, dit is meastal net strikt nedich, mar it is goede praktyk (sjoch ek build profilen hjirûnder); dit sil earder oanmakke biblioteken en objektbestannen wiskje dy't yn 'e map lizze bouwe/. As it projekt opnij is konfigureare en it bousysteem de ferskate ôfhinklikens kontrolearret, moatte jo útfier sjen lykas de folgjende:

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)

Notysje asjebleaft it lêste diel fan 'e fermelding hjirboppe. Guon ns-3-opsjes binne standert net ynskeakele of fereaskje systeemstipe om goed te funksjonearjen. Bygelyks, om XmlTo yn te skeakeljen, moat de bibleteek oanwêzich wêze op it systeem libxml-2.0. As dizze bibleteek net fûn is en de oerienkommende ns-3-funksje net ynskeakele is, sil in berjocht werjûn wurde. Tink derom ek dat it mooglik is om it kommando te brûken sudo om it suid-bit "set groep ID by runtime" yn te stellen foar bepaalde programma's. It is net standert ynskeakele en dêrom ferskynt dizze funksje as "net ynskeakele". As lêste, om in list te krijen mei ynskeakele opsjes, brûk Waf mei parameter --check-config.

Litte wy no werom gean en weromgean nei de debugbuild mei foarbylden en tests.

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

It bousysteem is no ynsteld en jo kinne debug-ferzjes fan ns-3-programma's bouwe troch gewoan te typen:

$ ./waf

De boppesteande stappen hawwe jo miskien twongen om twa kear in diel fan it ns-3-systeem te bouwen, mar no witte jo hoe't jo de konfiguraasje feroarje en optimalisearre koade bouwe.

Om te kontrolearjen hokker profyl aktyf is foar in opjûne projektkonfiguraasje, is d'r in kommando:

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

It boppesteande senario build.py stipet ek arguminten --enable-examples и --enable-tests, mar oare opsjes Waf it stipet net direkt. Dit sil bygelyks net wurkje:

$ ./build.py --disable-python

de reaksje sil sa wêze:

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

De spesjale operator - - kin lykwols brûkt wurde om ekstra parameters troch te jaan wafdus ynstee fan it boppesteande sil it folgjende kommando wurkje:

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

om't it it haadkommando genereart ./waf configure --disable-python. Hjir binne wat mear ynliedende tips oer Waf.

Omgean bou flaters

ns-3-releases wurde hifke op de lêste C++-kompilers dy't beskikber binne op it momint fan frijlitting op mienskiplike Linux- en MacOS-distribúsjes. Yn 'e rin fan' e tiid wurde lykwols nije distribúsjes frijlitten mei nije gearstallers, en dizze nijere gearstallers hawwe de neiging om mear pedantysk te wêzen oer warskôgings. ns-3 konfigurearret syn build om alle warskôgingen as flaters te behanneljen, dus soms as jo in âldere ferzje op in nijere systeem útfiere, kin in kompilerwarskôging de build stopje.

Bygelyks, d'r wie earder in release fan ns-3.28 foar Fedora 28, dy't in nije grutte ferzje omfette gcc (gcc-8). It bouwen fan de release ns-3.28 of eardere ferzjes ûnder Fedora 28, mei Gtk2+ ynstalleare, sil de folgjende flater foarkomme:

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

Yn releases begjinnend fan ns-3.28.1, yn Waf in opsje is beskikber te lossen dizze problemen. It skeakelet it ynstellen fan de "-Werror" flagge yn g++ en clang++ út. Dit is de opsje "--disable-werror" en moat tapast wurde by konfiguraasje:

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

Konfigurearje of gearstalle

Guon kommando's Waf hawwe betsjutting allinnich yn de konfiguraasje faze, en guon binne allinnich jildich yn de bou faze. As jo ​​​​bygelyks de ns-3-emulaasjefunksjes wolle brûke, kinne jo de bitynstelling ynskeakelje Súd mei help fan sudo, lykas hjirboppe beskreaun. Dit sil de kommando's foar konfiguraasjestap oerskriuwe, en dus kinne jo de konfiguraasje feroarje mei it folgjende kommando, dat ek foarbylden en tests omfettet.

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

As jo ​​dit dogge Waf sil starte sudoom programma's foar oanmeitsjen fan emulaasjekoade socket te feroarjen om te rinnen mei tagongsrjochten woartel. de Waf D'r binne in protte oare opsjes beskikber foar de konfiguraasje en boustappen. Om jo opsjes te ferkennen, ynfiere:

$ ./waf --help

Yn 'e folgjende seksje sille wy wat testen relatearre opsjes brûke.

Assembly Profilen

Wy hawwe al sjoen hoe't jo kinne konfigurearje Waf foar gearkomsten debug и optimalisearre:

$ ./waf --build-profile=debug

D'r is ek in tuskenlizzende assemblageprofyl, release. Opsje -d is synonym mei --build-profile. It bouprofyl kontrolearret it gebrûk fan logging, bewearingen, en kompilatoroptimalisaasje-skeakels:

ns-3 netwurk simulator tutorial. Haadstik 3

Sa't jo sjen kinne, logging en bewearingen binne allinnich beskikber yn debug builds. De oanrikkemandearre praktyk is om jo skript te ûntwikkeljen yn debug-modus, en dan werhelle runs út te fieren (foar statistyk of parameterwizigingen) yn in optimalisearre buildprofyl.

As jo ​​​​koade hawwe dy't allinich moatte rinne yn bepaalde buildprofilen, brûk dan de Code Wrapper Macro:

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;)

Standert, Waf plakken build artefakten yn de build map. Jo kinne in oare útfiermap opjaan mei de opsje - -outbygelyks:

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

Troch dit te kombinearjen mei buildprofilen, kinne jo maklik wikselje tusken ferskate kompilaasjeopsjes:

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

Dêrmei kinne jo wurkje mei meardere gearkomsten sûnder dat jo de lêste gearkomste elke kear moatte oerskriuwe. As jo ​​oerskeakelje nei in oar profyl, Waf sil it allinich kompilearje, sûnder alles folslein opnij te kompilearjen.

As jo ​​op dizze manier bouwprofilen wikselje, moatte jo foarsichtich wêze om elke kear deselde konfiguraasjeopsjes te jaan. It definiearjen fan ferskate omjouwingsfariabelen sil jo helpe om flaters te foarkommen:

$ 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

Compilers en flaggen

Yn de boppesteande foarbylden Waf om ns-3 te bouwen brûkt de C++-kompiler fan GCC ( g ++). Jo kinne lykwols dejinge dy't jo brûke feroarje Waf C ++ kompilator, troch it definiearjen fan de CXX omjouwingsfariabele. Om bygelyks de C++-kompiler Clang te brûken, clang++,

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

Op deselde wize kinne jo konfigurearje Waf te brûken ferspraat kompilaasje brûkend distcc:

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

Mear ynformaasje oer distcc en ferspraat kompilaasje is te finen op 'e projektside yn' e seksje Dokumintaasje. Om kompilerflaggen ta te foegjen by it konfigurearjen fan ns-3, brûk de omjouwingsfariabele CXXFLAGS_EXTRA.

ynstelling

Waf kin brûkt wurde om bibleteken te ynstallearjen op ferskate plakken op it systeem. Standert binne de kompilearre bibleteken en útfierbere bestannen yn 'e map bouwe, en om't Waf de lokaasje fan dizze biblioteken en útfierbere bestannen wit, is it net nedich om de biblioteken earne oars te ynstallearjen.

As brûkers leaver bûten de build-map te ynstallearjen, kinne se it kommando útfiere ./waf ynstallearje. De standert foarheaksel foar ynstallaasje is / usr / lokaaldêrom ./waf ynstallearje sil ynstallearje programma yn / usr / local / bin, biblioteken yn / usr / local / lib en koptekstbestannen yn /usr/local/include. Superuser-rjochten moatte normaal ynsteld wurde mei in standert foarheaksel, dus in typysk kommando soe wêze sudo ./waf ynstallearje. As it wurdt lansearre, sil Waf earst kieze om de dielde biblioteken te brûken yn 'e build-map, en sykje dan nei biblioteken lâns it paad nei de biblioteken konfigureare yn' e lokale omjouwing. Dus by it ynstallearjen fan bibleteken op in systeem, is it in goede praktyk om te kontrolearjen dat de juste bibleteken wurde brûkt. Brûkers kinne kieze om te ynstallearjen mei in oar foarheaksel troch de opsje troch te jaan tidens konfiguraasje --prefixbygelyks:

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

As letter, nei it bouwen, de brûker it ynstallaasjekommando ynfiert ./waf, sil it foarheaksel brûkt wurde /opt/local.

team ./waf clean moat brûkt wurde foardat it projekt opnij konfigureare as de ynstallaasje sil brûke Waf ûnder in oar foarheaksel.

Dus, om ns-3 te brûken is d'r gjin need om te skiljen ./waf install. De measte brûkers sille dit kommando net nedich wêze om't Waf sil de aktuele bibleteken ophelje út 'e build-map, mar guon brûkers kinne dit nuttich fine as har aktiviteiten it wurkje mei programma's bûten de ns-3-map.

Waf single

Op it boppeste nivo fan 'e ns-3 boarnebeam is d'r mar ien Waf-skript. As jo ​​​​ienris begjinne te wurkjen, sille jo in protte tiid yn 'e map besteegje scratch/ of djipper ynsrc/... en tagelyk moatte rinne Waf. Jo kinne gewoan ûnthâlde wêr't jo binne en rinne Waf as folget:

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

mar dit sil ferfeelsum en flaterber wêze, dus d'r binne bettere oplossingen. Ien mienskiplike manier is om in tekstbewurker te brûken lykas emacs of vim, wêryn twa terminalsesjes wurde iepene, ien wurdt brûkt om ns-3 te bouwen, en de twadde wurdt brûkt om de boarnekoade te bewurkjen. As jo ​​mar hawwe tarball, dan kin in omjouwingsfariabele helpe:

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

$ cd scratch 
$ waff build

Yn 'e modulemap kin it ferleidend wêze om in triviale waf-skript ta te foegjen lykas exec ../../waf. Asjebleaft, doch dat net. Dit is betiizjend foar newbies en, as it min dien wurdt, liedt ta hurd te detektearjen bouflaters. De hjirboppe werjûn oplossingen binne it paad dat moat wurde brûkt.

3.5 Testen ns-3

Jo kinne de ienheidstests fan 'e ns-3-distribúsje útfiere troch it skript út te fieren ./test.py:

$ ./test.py

Dizze testen wurde útfierd parallel mei Waf. Uteinlik moatte jo in berjocht sjen dat seit:

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

Dit is in wichtich berjocht foar in identifisearje valgrind crashes, crashes of flaters, oanjout problemen mei de koade of ynkompatibiliteit tusken ark en koade.

Jo sille ek sjen de definitive útfier fan Waf en in tester dy't elke test útfiert, dy't der sa útsjen sil:

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)

Dit kommando wurdt normaal útfierd troch brûkers om fluch te kontrolearjen dat de ns-3-distribúsje goed boud is. (Tink derom dat de folchoarder fan 'e "PASS: ..."-rigels oars kin wêze, dit is normaal. Wat wichtich is, is dat de gearfettingsline oan 'e ein fan it rapport sjen lit dat alle tests trochjûn binne; gjin tests mislearre of ferûngelokke.) En Wafen test.py sil parallelisearje wurk oer de beskikbere prosessor kearnen fan 'e masine.

3.6 It skript útfiere

Wy meastal rinne skripts ûnder kontrôle Waf. Dit lit it bousysteem derfoar soargje dat dielde biblioteekpaden goed ynsteld binne en dat de bibleteken beskikber binne by runtime. Om it programma út te fieren, brûk gewoan Waf mei parameter - -run. Litte wy it ns-3-ekwivalint fan it ubiquitous programma útfiere Hallo wrâldtroch it folgjende te typen:

$ ./waf --run hello-simulator

Waf sil earst kontrolearje dat it programma goed boud is en bouwe as it nedich is. Dan Waf sil in programma útfiere dat de folgjende útfier produsearret.

Hello Simulator

Lokwinske! Jo binne no in ns-3 brûker!

Wat moat ik dwaan as ik gjin resultaten sjoch?

As jo ​​sjogge berjochten Wafoanjout dat de bou mei súkses foltôge, mar jo sjogge de útfier net "Hallo Simulator", dan is d'r in mooglikheid dat jo yn 'e seksje [Build-with-Waf] jo bouwmodus oerskeakele hawwe nei optimalisearre, mar miste wikseljen werom nei de modus debug. Alle konsole-útfier brûkt yn dizze tutorial brûkt in spesjale ns-3-komponint dy't logging útfiert en wurdt brûkt om oanpaste berjochten nei de konsole te printsjen. Utfier fan dizze komponint wurdt automatysk útskeakele as optimalisearre koade wurdt kompilearre - it is "optimalisearre". As jo ​​​​de útfier "Hallo Simulator" net sjogge, fier dan it folgjende yn:

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

oan te passen Waf om debug-ferzjes fan ns-3-programma's te bouwen, dy't foarbylden en tests befetsje. Jo moatte dan de aktuele debug-ferzje fan 'e koade opnij opbouwe troch te typen

$ ./waf

No as jo it programma útfiere hallo-simulator, Jo moatte it ferwachte resultaat sjen.

3.6.1 Arguminten foar kommandorigel

Om kommando-rigelarguminten troch te jaan oan it ns-3-programma, brûk it folgjende patroan:

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

Ferfange nei de namme fan jo programma en nei de arguminten. Argumint - -command-template foar Waf is yn wêzen in resept foar it bouwen fan de eigentlike kommandorigel Waf brûkt om it programma út te fieren. Waf kontrolearret dat de bou kompleet is, stelt de dielde bibleteekpaden yn, brûkt dan it levere kommandorigel-sjabloan en ferfangt de programmanamme foar de %s-plakhâlder om de útfierbere te neamen. As jo ​​​​dizze syntaksis yngewikkeld fine, is d'r in ienfâldiger ferzje dy't it ns-3-programma omfettet en syn arguminten ynsletten yn inkele quotes:

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

In oar benammen nuttich foarbyld is it selektyf útfieren fan testsuites. Litte wy oannimme dat d'r in testsuite is mei de namme mytest (yn feite is d'r net). Hjirboppe hawwe wy it ./test.py-skript brûkt om in oantal testen parallel út te fieren, dy't it testprogramma hieltyd wer opropt test-runner. Belje test-runner direkt om ien test út te fieren:

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

Arguminten sille wurde trochjûn oan it programma test-runner. Sûnt mytest net bestiet, sil in flaterberjocht oanmakke wurde. Om de beskikbere test-runner-opsjes te printsjen, ynfiere:

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

3.6.2 Debuggen

Om ns-3-programma's út te fieren ûnder in oar hulpprogramma, lykas in debugger (bygelyks, gdb) of in ark foar ûnthâldtest (bygelyks, valgrind), brûke in ferlykbere foarm - -command-template = "…". Bygelyks om te rinnen yn 'e debugger gdb jo hello-simulator ns-3 programma mei arguminten:

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

Tink derom dat de ns-3 programma namme komt mei it argumint - -run, en it behearprogramma (hjir gdb) is it earste token yn it argumint - -command-template. Opsje - -args ynformearret gdbdat de rest fan 'e kommandorigel heart by it "legere" programma. (Guon ferzjes gdb begryp de opsje net - -args. Yn dit gefal, fuortsmite de programma arguminten út - -command-template en brûk de kommando set gdb args.) Wy kinne dit resept en it foarige kombinearje om de test ûnder de debugger út te fieren:

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

3.6.3 Wurkmap

Waf moat wurde lansearre út syn lokaasje oan de top fan 'e ns-3 beam. Dizze map wurdt de wurkmap wêr't de útfierbestannen skreaun wurde. Mar wat as jo dizze bestannen bûten de ns-3 boarnebeam hâlde wolle? Brûk argumint - -cwd:

$ ./waf --cwd=...

Jo kinne it handiger fine om de útfierbestannen yn jo wurkmap te krijen. Yn dit gefal kin de folgjende yndirekte aksje helpe:

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

Dizze dekoraasje fan 'e foarige ferzje fan it kommando behâldt de hjoeddeistige wurkmap, giet nei de map Wafen dan ynstruearret Waf om de wurkmap werom te feroarjen nei de aktuele wurkmap bewarre foardat it programma start. Wy neame it team - -cwd Foar folsleinens rinne de measte brûkers Waf gewoan út 'e map op topnivo en generearje dêr útfierbestannen.

Ferfolch: Haadstik 4

Boarne: www.habr.com

Add a comment