Laborator 01: Introducere în ns-3

ns-3 este un simulator de rețele (Ethernet, Wi-Fi, 4G etc.) ce oferă:

  • modele pentru studiul circulației unui pachet în rețea
  • un engine pentru simulări de rețele complexe (noduri, modele de propagare, trafic UDP/TCP etc.)
  • un mecanism de tracing atat in format text, cat și în format pcap.

Simulatorul este scris în C++, iar modelele se pot dezvolta în C++ sau Python. In cadrul laboratoarelor vom folosi și vom dezvolta modele în C++ deoarece capabilitatile si suportul oferite in ns-3 sunt mai bune decat cele pentru Python.

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.
  • in principal vom discuta 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 sunt:

Instalare și configurare

In cadrul laboratoarelor, vom folosi masina virtuala pe care o puteti descarca de aici. Pe VM au fost deja executati pasii de configurare de mai jos.

Pasi configurare masina virtuala

Pasi configurare masina virtuala

  • 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:~$ sudo apt update
student@isrm-vm:~$ 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.

student@isrm-vm:~$ git clone https://gitlab.com/nsnam/ns-3-dev.git
student@isrm-vm:~$ cd ~/ns-3-dev
student@isrm-vm:~/ns-3-dev$ git checkout -b ns-332-rel ns-3.32
student@isrm-vm:~$ cd ~/ns-3-dev/examples
student@isrm-vm:~$ git clone https://github.com/isrm-lab/ns3-labs.git
student@isrm-vm:~$ cd ~/ns-3-dev/examples/ns3-labs && git log -1
commit 5214caf7fbc39b280edf47154ed95f2fcca78a7c (HEAD -> master, origin/master, origin/HEAD)
  • Pentru a compila simulatorul împreună cu modelele de laborator, vom folosi sistemul de build waf:
student@isrm-vm:~/ns-3-dev$ ./waf configure --build-profile=debug --enable-examples --enable-tests
student@isrm-vm:~/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:~/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:~/ns-3-dev$ ./waf --check-profile
Waf: Entering directory `/home/student/ns-3-dev/build'
Build profile: debug
student@isrm-vm:~/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:~/ns-3-dev$ ./test.py
(...)
'build' finished successfully (1.799s)
(...)
92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

Pentru a realiza grafice, trebuie sa instalam si pachetele de Python:

student@isrm-vm:~$ sudo apt-get update
student@isrm-vm:~$ sudo apt-get install python3-pip
student@isrm-vm:~$ pip3 install matplotlib jupyter
student@isrm-vm:~$ sudo ln -s ~/.local/bin/jupyter-notebook /usr/bin/jupyter-notebook

Pentru a lansa aplicatia de Jupyter Notebook, rulati urmatoarea comanda:

student@isrm-vm:~$ jupyter-notebook

Rulare exemple existente

Pentru inceput, puteti parcurge Tutorial ns-3, indeosebi urmatoarele sectiuni:

În cadrul laboratorului ne vom concentra pe simulări Wi-Fi (IEEE 802.11). Puteti gasi exemple de simulări (în afara celor pe care le veți primi pentru laboratorul de ISRM) î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. Putem rula orice exemplu astfel:

student@isrm-vm:~/ns3$ ./waf --run wifi-tcp
Waf: Entering directory `/home/student/ns3/build'
Waf: Leaving directory `/home/student/ns3/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 puteți specifica calea completă către codul sursă:

student@isrm-vm:~/ns3$ ./waf --run examples/wireless/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:~/ns3$ ./waf --run "wifi-tcp --pcap --simulationTime=3"
Waf: Entering directory `/home/student/ns3/build'
Waf: Leaving directory `/home/student/ns3/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:~/ns3$ ls AccessPoint*.pcap Station*.pcap
AccessPoint-0-0.pcap  Station-1-0.pcap

Iată un exemplu de schimb de pachete Wi-Fi 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/wireless/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:~/ns3$ ./waf --command-template="valgrind \
    --leak-check=full --show-reachable=yes %s" \
    --run wifi-tcp
 
Waf: Entering directory `/home/student/ns3/build'
Waf: Leaving directory `/home/student/ns3/build'
Build commands will be stored in build/compile_commands.json
'build' finished successfully (0.936s)
==2901== Memcheck, a memory error detector
==2901== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==2901== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==2901== Command: /home/student/ns3/build/examples/wireless/ns3-dev-wifi-tcp-debug
 
==2901== 
(...)
=2901== LEAK SUMMARY:
(...)
==2901== For counts of detected and suppressed errors, rerun with: -v
==2901== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

Exemple de pe wiki-ul nsnam pentru lucrul cu:

Development

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: 2021/01/01 18:24 by vlad.traista
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