Laborator 01: Introducere în ns-3

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ă un mecanism de tracing atat in format text, cat ș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:

Instalare și configurare

Click to display ⇲

Click to hide ⇱

  • Dependențele necesare 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 update
student@isrm-vm-2020:~$ sudo apt -y install libgsl-dev gsl-bin libgslcblas0 \
    autoconf cvs bzr unrar \
    sqlite sqlite3 libsqlite3-dev \
    libxml2 libxml2-dev

Pe mașina virtuală de ISRM aveți deja toate pachetele instalate.

  • Clonăm codul sursă al simulatorului și ne mutăm pe versiunea 3.29:
student@isrm-vm-2020:~$ git clone https://gitlab.com/b12mihai1/ns-3-dev.git
student@isrm-vm-2020:~$ cd ~/ns-3-dev
student@isrm-vm-2020:~/ns-3-dev$ git checkout -b isrm_2020 remotes/origin/isrm_2020
student@isrm-vm-2020:~/ns-3-dev$ git submodule init
student@isrm-vm-2020:~/ns-3-dev$ git submodule update --remote --merge
student@isrm-vm-2020:~/ns-3-dev$ git submodule foreach git pull origin master   # in caz ca cea anterioara nu ne muta pe ultimul commit din master
student@isrm-vm-2020:~/ns-3-dev$ git branch -vvv
  • Pentru a compila simulatorul împreună cu modelele, vom folosi sistemul de build 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

Pentru a adăuga suport de C++11/14 și a beneficia de capabilitățile noi aduse de limbaj în cadrul simulărilor în pasul de configure putem seta variabila 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')

  • Validăm funcționarea corectă a buildului. Ultimul pas cu 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)

Rulare exemple existente

  1. se va folosi instalarea din ~/Desktop/ISRM/ns-3-dev, pregătită cu instrucțiunile de mai sus
  2. citit Tutorial ns-3, pe porțiuni
  3. în particular, secțiunile: Conceptual Overview, Building Topologies, Tracing,
  4. scopul este de a rula exemplele first.cc, second.cc, …, sixth.cc din examples/tutorial.

Î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. Odată ce build-ul de waf s-a incheiat 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:

Avem si un al doilea exemplu care arată traficul TCP schimbat între dispozitive:

Structura unui cod sursă al unei simulări în C++

Parcurgem codul sursă din ns3/examples/wifi-tcp.cc

Urmariți și explicațiile de aici: https://www.nsnam.org/docs/tutorial/html/building-topologies.html#building-a-wireless-network-topology

Structura modelului Wi-Fi

Î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:

  • PHY - modelul de canal, propagare, atenuare, senzitivitatea receptorilor
  • MAC:
    • LMAC (lower MAC): accesul la mediu (DCF/EDCA ca algoritmi de backoff pentru evitarea coliziunilor), RTS/CTS, ACK-uri de nivel 2
    • UMAC (upper MAC): beacon, probe request/probe response, WPA2 etc.
  • IPv4, TCP/UDP - tipul de trafic între noduri

Mai multe detalii pe wiki-ul ns-3

Debugging cu valgrind/gdb

Întrucât putem comite greseli in cadrul script-urilor, 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:

Development

  • Pentru lucrul acasă vă recomandăm să folosiți instrucțiunile din pagina setup ISRM deoarece are toate pachetele necesare (inclusiv Visual Studio Code cu toate dependențele necesare).

Dacă deja folosiți Visual Studio Code acasă, puteți să instalați extensia Remote development, dar trebuie ca extensiile instalate local să le reinstalați pe Visual Studio Code-ul vostru manual și pentru mediul “remote”.

isrm/laboratoare/new/01.txt · Last modified: 2020/02/24 20:26 by mbarbulescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0