This is an old revision of the document!
ns-3
este un simulator de rețele (Ethernet, WiFi, 4G etc.) creat cu scopul de a oferi modele pentru studiul circulației unui pachet în rețea și de a oferi un engine pentru simulări de rețele complexe (noduri, modele de propagare, trafic UDP/TCP etc.). Pe lângă acestea oferă mecanism de tracing text și în format pcap. Este scris în C++ iar modelele se pot dezvolta în C++ sau Python. La ISRM vom folosi și vom dezvolta modele în C++ deoarece suportul este mai bun.
Obiectiv: Acest laborator oferă o idee de bază a modului în care funcționează simulatorul, cum se pregătește o simulare, unde se găsesc componentele interne, cum se configurează componentele de rețea, etc. În principal se prezintă exemple simple și explicații bazate pe experimente simple, familiare unui student care a luat un curs introductiv de rețele.
Cele mai importante pagini de parcurs despre ns-3
la început dar și în timpul laboratoarelor de ISRM sunt:
ns-3
sunt descrise în pagina de instalare. Pentru ISRM vom folosi următoarele pachete pe o distribuție Ubuntu:student@isrm-vm-2020:~$ sudo apt-get install libgsl-dev gsl-bin libgslcblas0 \ autoconf cvs bzr unrar \ sqlite sqlite3 libsqlite3-dev \ libxml2 libxml2-dev
student@isrm-vm-2020:~$ git clone https://gitlab.com/nsnam/ns-3-dev.git student@isrm-vm-2020:~$ cd ns-3-dev student@isrm-vm-2020:~$ git checkout -b release_ns-3.30.1 ns-3.30.1 student@isrm-vm-2020:~$ git branch -vvv master da1b41ed1 [origin/master] tcp: Ensure that congestion state is set after every notification * release_ns-3.30.1 82c05e41a Update RELEASE_NOTES for ns-3.30.1
waf
: student@isrm-vm-2020:~/ns-3-dev$ ./waf clean student@isrm-vm-2020:~/ns-3-dev$ ./waf configure --build-profile=debug --enable-examples --enable-tests student@isrm-vm-2020:~/ns-3-dev$ ./waf build -j4
CXXFLAGS
astfel:
CXXFLAGS="-std=c++11" ./waf -d debug --enable-examples --enable-tests configure
Versiunea de g++
atât pe sistemele din laborator cât și din mașina virtuală este 7.4.0
și are suport pentru C++14.
E posibil ca cei de la ns-3 să fi hardcodat în folderul rădăcină în wscript
standardul. E suficient să modificați linia următoare și puteți obține by default suportul pentru C++14:
student@isrm-vm-2020:~/ns-3-dev$ git diff wscript diff --git a/wscript b/wscript index 4283a2899..c0dd18ccd 100644 --- a/wscript +++ b/wscript @@ -250,7 +250,7 @@ def options(opt): dest='enable_desmetrics') opt.add_option('--cxx-standard', help=('Compile NS-3 with the given C++ standard'), - type='string', default='-std=c++11', dest='cxx_standard') + type='string', default='-std=c++14', dest='cxx_standard') # options provided in subdirectories opt.recurse('src')
test.py
este opțional, presupune rularea testelor unitare interne ale ns-3. Dacă primele două comenzi vă funcționează aveți un build stabil al simulatorului și putem începe să rulăm exemple de simulări. student@isrm-vm-2020:~/ns-3-dev$ ./waf --check-profile Waf: Entering directory `/home/student/ns-3-dev/build' Build profile: debug student@isrm-vm-2020:~/ns-3-dev$ ./waf --run hello-simulator Waf: Entering directory `/home/student/ns-3-dev/build' Waf: Leaving directory `/home/student/ns-3-dev/build' Build commands will be stored in build/compile_commands.json 'build' finished successfully (2.256s) Hello Simulator student@isrm-vm-2020:~/ns-3-dev$ ./test.py (...) 'build' finished successfully (1.799s) (...) 92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)
În cadrul laboratorului ne vom concentra pe simulări Wi-Fi (IEEE 802.11). Exemple de simulări (în afara celor pe care le veți primi pentru laboratorul de ISRM) găsiți în ns3/examples/wireless
Ne propunem să rulăm un exemplu simplu: ns3/examples/wireless/wifi-tcp.cc
. Acesta constă dintr-o stație (STA) care se conectează la un access point (AP) folosind 802.11n. Traficul este uplink de la STA la AP. O dată ce un build waf
ni s-a terminat cu succes la pasul anterior și hello-simulator
a rulat, putem rula orice exemplu astfel:
student@isrm-vm-2020:~/ns-3-dev$ ./waf --run wifi-tcp Waf: Entering directory `/home/vagrant/facultate/isrm/ns-3-dev/build' Waf: Leaving directory `/home/vagrant/facultate/isrm/ns-3-dev/build' Build commands will be stored in build/compile_commands.json 'build' finished successfully (1.282s) 1.1s: 45.8086 Mbit/s 1.2s: 55.3472 Mbit/s (...) 10.9s: 50.8723 Mbit/s Average throughput: 52.1959 Mbit/s
Alternativ îi puteți specifica calea completă către codul sursă:
student@isrm-vm-2020:~/ns-3-dev$ ./waf --run examples/wifi-tcp
Dacă vrem să transmitem parametrii în linia de comandă simulării (deoarece wifi-tcp
suportă) o putem face cu ghilimele:
student@isrm-vm-2020:~/ns-3-dev$ ./waf --run "wifi-tcp --pcap --simulationTime=3" Waf: Entering directory `/home/vagrant/facultate/isrm/ns-3-dev/build' Waf: Leaving directory `/home/vagrant/facultate/isrm/ns-3-dev/build' Build commands will be stored in build/compile_commands.json 'build' finished successfully (1.287s) 1.1s: 45.8086 Mbit/s 1.2s: 55.3472 Mbit/s (...) 3.9s: 52.7565 Mbit/s Average throughput: 52.9017 Mbit/s
Întrucât opțiunea –pcap
activează mecanismul de pcap tracing din ns-3 (vom discuta mai târziu despre acesta) putem vizualiza cu wireshark următoarele capturi care se generează în directorul curent:
student@isrm-vm-2020:~/ns-3-dev$ ls AccessPoint*.pcap Station*.pcap AccessPoint-0-0.pcap Station-1-0.pcap
Iată un exemplu de schimb de pachete wifi pentru procedura de asociere a stației la access point:
Iată și cum arată traficul TCP schimbat între dispozitive:
Parcurgem codul sursă din ns3/examples/wifi-tcp.cc
Urmariți și explicațiile de aici: https://github.com/libuv/libuv/blob/v1.x/src/strscpy.c
În cadrul laboratorului ne vom concentra pe simulări Wi-Fi (IEEE 802.11). ns-3
ne oferă posibilitatea de a configura toate nivelele din stiva OSI:
Mai multe detalii pe wiki-ul ns-3
Întrucât putem greși la scripturi waf
ne oferă posibilitatea de a ne rula scriptul cu valgrind
respectiv gdb
.
Pentru exemplul nostru:
student@isrm-vm-2020:~/ns-3-dev$ ./waf --command-template="valgrind \ --leak-check=full --show-reachable=yes %s" \ --run wifi-tcp Waf: Entering directory `/home/vagrant/facultate/isrm/ns-3-dev/build' Waf: Leaving directory `/home/vagrant/facultate/isrm/ns-3-dev/build' Build commands will be stored in build/compile_commands.json 'build' finished successfully (1.303s) ==21406== Memcheck, a memory error detector ==21406== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. ==21406== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info ==21406== Command: /home/vagrant/facultate/isrm/ns-3-dev/build/examples/wireless/ns3.30.1-wifi-tcp-debug ==21406== (...) =21406== LEAK SUMMARY: (...) ==21406== For counts of detected and suppressed errors, rerun with: -v ==21406== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Exemple de pe wiki-ul nsnam pentru lucrul cu: