This shows you the differences between two versions of the page.
isrm:laboratoare:new:01 [2019/12/27 13:00] mbarbulescu [Rulare exemple existente] |
isrm:laboratoare:new:01 [2021/01/01 18:24] (current) vlad.traista [Development] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Laborator 01: Introducere în ns-3 ====== | ====== 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ă 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. | + | ''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. | ||
- | **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. | + | 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''. |
- | Cele mai importante pagini de parcurs despre ''ns-3'' la început dar și în timpul laboratoarelor de ISRM sunt: | + | **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: | ||
* [[https://www.nsnam.org/docs/tutorial/html/index.html|Tutorial pentru utilizatori]] | * [[https://www.nsnam.org/docs/tutorial/html/index.html|Tutorial pentru utilizatori]] | ||
* [[https://www.nsnam.org/docs/manual/html/index.html|Development & Manual]] | * [[https://www.nsnam.org/docs/manual/html/index.html|Development & Manual]] | ||
===== Instalare și configurare ===== | ===== Instalare și configurare ===== | ||
+ | |||
+ | In cadrul laboratoarelor, vom folosi masina virtuala pe care o puteti descarca de [[https://ocw.cs.pub.ro/courses/isrm/mv|aici]]. Pe VM au fost deja executati pasii de configurare de mai jos. | ||
+ | |||
+ | <spoiler Pasi configurare masina virtuala> | ||
* Dependențele necesare ''ns-3'' sunt descrise în [[https://www.nsnam.org/wiki/Installation|pagina de instalare]]. Pentru ISRM vom folosi următoarele pachete pe o distribuție Ubuntu: | * Dependențele necesare ''ns-3'' sunt descrise în [[https://www.nsnam.org/wiki/Installation|pagina de instalare]]. Pentru ISRM vom folosi următoarele pachete pe o distribuție Ubuntu: | ||
<code bash> | <code bash> | ||
- | student@isrm-vm-2020:~$ sudo apt-get install libgsl-dev gsl-bin libgslcblas0 \ | + | student@isrm-vm:~$ sudo apt update |
+ | student@isrm-vm:~$ sudo apt -y install libgsl-dev gsl-bin libgslcblas0 \ | ||
autoconf cvs bzr unrar \ | autoconf cvs bzr unrar \ | ||
sqlite sqlite3 libsqlite3-dev \ | sqlite sqlite3 libsqlite3-dev \ | ||
Line 24: | Line 37: | ||
</note> | </note> | ||
- | * Clonăm codul sursă al simulatorului și ne mutăm pe ultima versiune a sa 3.30: | + | * Clonăm [[https://gitlab.com/nsnam/ns-3-dev|codul sursă al simulatorului nsnam/ns-3]] și ne mutăm pe versiunea 3.32: |
<code bash> | <code bash> | ||
- | student@isrm-vm-2020:~$ git clone https://gitlab.com/nsnam/ns-3-dev.git | + | student@isrm-vm:~$ git clone https://gitlab.com/nsnam/ns-3-dev.git |
- | student@isrm-vm-2020:~$ cd ns-3-dev | + | student@isrm-vm:~$ cd ~/ns-3-dev |
- | student@isrm-vm-2020:~$ git checkout -b release_ns-3.30.1 ns-3.30.1 | + | student@isrm-vm:~/ns-3-dev$ git checkout -b ns-332-rel ns-3.32 |
- | 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 | + | |
</code> | </code> | ||
- | * Pentru a compila simulatorul împreună cu modelele, vom folosi sistemul de build ''waf'': | + | * Clonăm [[https://github.com/isrm-lab/ns3-labs|modelele din laborator (aici trebuie doar să fim pe master, ultimul commit)]] |
<code bash> | <code bash> | ||
- | student@isrm-vm-2020:~/ns-3-dev$ ./waf clean | + | student@isrm-vm:~$ cd ~/ns-3-dev/examples |
- | student@isrm-vm-2020:~/ns-3-dev$ ./waf configure --build-profile=debug --enable-examples --enable-tests | + | student@isrm-vm:~$ git clone https://github.com/isrm-lab/ns3-labs.git |
- | student@isrm-vm-2020:~/ns-3-dev$ ./waf build -j4 | + | student@isrm-vm:~$ cd ~/ns-3-dev/examples/ns3-labs && git log -1 |
+ | commit 5214caf7fbc39b280edf47154ed95f2fcca78a7c (HEAD -> master, origin/master, origin/HEAD) | ||
+ | </code> | ||
+ | |||
+ | * Pentru a compila simulatorul împreună cu modelele de laborator, vom folosi sistemul de build ''waf'': | ||
+ | |||
+ | <code bash> | ||
+ | student@isrm-vm:~/ns-3-dev$ ./waf configure --build-profile=debug --enable-examples --enable-tests | ||
+ | student@isrm-vm:~/ns-3-dev$ ./waf build -j4 | ||
</code> | </code> | ||
Line 50: | Line 68: | ||
</code> | </code> | ||
- | 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. | + | 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: | 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: | ||
<code bash> | <code bash> | ||
- | student@isrm-vm-2020:~/ns-3-dev$ git diff wscript | + | student@isrm-vm:~/ns-3-dev$ git diff wscript |
diff --git a/wscript b/wscript | diff --git a/wscript b/wscript | ||
Line 76: | Line 94: | ||
<code bash> | <code bash> | ||
- | student@isrm-vm-2020:~/ns-3-dev$ ./waf --check-profile | + | student@isrm-vm:~/ns-3-dev$ ./waf --check-profile |
Waf: Entering directory `/home/student/ns-3-dev/build' | Waf: Entering directory `/home/student/ns-3-dev/build' | ||
Build profile: debug | Build profile: debug | ||
- | student@isrm-vm-2020:~/ns-3-dev$ ./waf --run hello-simulator | + | student@isrm-vm:~/ns-3-dev$ ./waf --run hello-simulator |
Waf: Entering directory `/home/student/ns-3-dev/build' | Waf: Entering directory `/home/student/ns-3-dev/build' | ||
Waf: Leaving directory `/home/student/ns-3-dev/build' | Waf: Leaving directory `/home/student/ns-3-dev/build' | ||
Line 85: | Line 103: | ||
'build' finished successfully (2.256s) | 'build' finished successfully (2.256s) | ||
Hello Simulator | Hello Simulator | ||
- | student@isrm-vm-2020:~/ns-3-dev$ ./test.py | + | student@isrm-vm:~/ns-3-dev$ ./test.py |
(...) | (...) | ||
'build' finished successfully (1.799s) | 'build' finished successfully (1.799s) | ||
Line 92: | Line 110: | ||
</code> | </code> | ||
+ | Pentru a realiza grafice, trebuie sa instalam si pachetele de Python: | ||
+ | <code bash> | ||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | Pentru a lansa aplicatia de Jupyter Notebook, rulati urmatoarea comanda: | ||
+ | |||
+ | <code bash> | ||
+ | student@isrm-vm:~$ jupyter-notebook | ||
+ | </code> | ||
+ | |||
+ | </spoiler> | ||
===== Rulare exemple existente ===== | ===== Rulare exemple existente ===== | ||
- | Î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'' | + | Pentru inceput, puteti parcurge [[https://www.nsnam.org/docs/tutorial/html/index.html|Tutorial ns-3]], indeosebi urmatoarele sectiuni: |
+ | - [[https://www.nsnam.org/docs/tutorial/html/conceptual-overview.html|Conceptual Overview]] | ||
+ | - [[https://www.nsnam.org/docs/tutorial/html/building-topologies.html|Building Topologies]] | ||
+ | - [[https://www.nsnam.org/docs/tutorial/html/tracing.html|Tracing]] | ||
- | 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: | + | Î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: | ||
<code bash> | <code bash> | ||
- | student@isrm-vm-2020:~/ns-3-dev$ ./waf --run wifi-tcp | + | student@isrm-vm:~/ns3$ ./waf --run wifi-tcp |
- | Waf: Entering directory `/home/vagrant/facultate/isrm/ns-3-dev/build' | + | Waf: Entering directory `/home/student/ns3/build' |
- | Waf: Leaving directory `/home/vagrant/facultate/isrm/ns-3-dev/build' | + | Waf: Leaving directory `/home/student/ns3/build' |
Build commands will be stored in build/compile_commands.json | Build commands will be stored in build/compile_commands.json | ||
'build' finished successfully (1.282s) | 'build' finished successfully (1.282s) | ||
Line 112: | Line 150: | ||
</code> | </code> | ||
- | Alternativ îi puteți specifica calea completă către codul sursă: | + | Alternativ puteți specifica calea completă către codul sursă: |
<code bash> | <code bash> | ||
- | student@isrm-vm-2020:~/ns-3-dev$ ./waf --run examples/wifi-tcp | + | student@isrm-vm:~/ns3$ ./waf --run examples/wireless/wifi-tcp |
</code> | </code> | ||
- | Dacă vrem să transmitem parametrii în linia de comandă simulării (deoarece ''wifi-tcp'' suportă) o putem face cu ghilimele: | + | Dacă vrem să transmitem parametrii în linia de comandă simulării (deoarece ''wifi-tcp'' suportă), o putem face cu ghilimele: |
<code bash> | <code bash> | ||
- | student@isrm-vm-2020:~/ns-3-dev$ ./waf --run "wifi-tcp --pcap --simulationTime=3" | + | student@isrm-vm:~/ns3$ ./waf --run "wifi-tcp --pcap --simulationTime=3" |
- | Waf: Entering directory `/home/vagrant/facultate/isrm/ns-3-dev/build' | + | Waf: Entering directory `/home/student/ns3/build' |
- | Waf: Leaving directory `/home/vagrant/facultate/isrm/ns-3-dev/build' | + | Waf: Leaving directory `/home/student/ns3/build' |
Build commands will be stored in build/compile_commands.json | Build commands will be stored in build/compile_commands.json | ||
'build' finished successfully (1.287s) | 'build' finished successfully (1.287s) | ||
Line 134: | Line 172: | ||
</code> | </code> | ||
- | Întrucât opțiunea ''--pcap'' activează mecanismul de [[https://www.nsnam.org/docs/tutorial/html/tracing.html#pcap|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: | + | Întrucât opțiunea ''%%--%%pcap'' activează mecanismul de [[https://www.nsnam.org/docs/tutorial/html/tracing.html#pcap|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: |
<code bash> | <code bash> | ||
- | student@isrm-vm-2020:~/ns-3-dev$ ls AccessPoint*.pcap Station*.pcap | + | student@isrm-vm:~/ns3$ ls AccessPoint*.pcap Station*.pcap |
AccessPoint-0-0.pcap Station-1-0.pcap | AccessPoint-0-0.pcap Station-1-0.pcap | ||
</code> | </code> | ||
- | Iată un exemplu de schimb de pachete wifi pentru procedura de asociere a stației la access point: | + | Iată un exemplu de schimb de pachete Wi-Fi pentru procedura de asociere a stației la access point: |
{{:isrm:laboratoare:new:sample-pcap-caputre-ns3.png?500|}} | {{:isrm:laboratoare:new:sample-pcap-caputre-ns3.png?500|}} | ||
- | Iată și cum arată traficul TCP schimbat între dispozitive: | + | Avem si un al doilea exemplu care arată traficul ''TCP'' schimbat între dispozitive: |
{{:isrm:laboratoare:new:capture-tcp_traffic_ns3.png?500|}} | {{:isrm:laboratoare:new:capture-tcp_traffic_ns3.png?500|}} | ||
Line 151: | Line 189: | ||
===== Structura unui cod sursă al unei simulări în C++ ===== | ===== Structura unui cod sursă al unei simulări în C++ ===== | ||
- | Parcurgem codul sursă din ''ns3/examples/wifi-tcp.cc'' | + | Parcurgem codul sursă din ''ns3/examples/wireless/wifi-tcp.cc'' |
- | <note warning> | + | Urmariți și explicațiile de aici: https://www.nsnam.org/docs/tutorial/html/building-topologies.html#building-a-wireless-network-topology |
- | TODO - de explicat părțile importante (setup canal, setup wifi device, setup trafic/internet stack helper ... ) | + | |
- | </note> | + | |
===== Structura modelului Wi-Fi ===== | ===== 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: | + | Î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 | + | * ''PHY'' - modelul de canal, propagare, atenuare, senzitivitatea receptorilor |
- | * MAC: | + | * ''MAC'': |
- | * LMAC (lower MAC): accesul la mediu (DCF/EDCA ca algoritmi de backoff pentru evitarea coliziunilor), RTS/CTS, ACK-uri de nivel 2 | + | * ''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. | + | * ''UMAC'' (upper ''MAC''): beacon, probe request/probe response, ''WPA2'' etc. |
- | * IPv4, TCP/UDP - tipul de trafic între noduri | + | * ''IPv4'', ''TCP''/''UDP'' - tipul de trafic între noduri |
{{:isrm:laboratoare:new:wifiarchitecture.png?600|}} | {{:isrm:laboratoare:new:wifiarchitecture.png?600|}} | ||
Line 171: | Line 207: | ||
===== Debugging cu valgrind/gdb ===== | ===== Debugging cu valgrind/gdb ===== | ||
- | Întrucât putem greși la scripturi ''waf'' ne oferă posibilitatea de a ne rula scriptul cu ''valgrind'' respectiv ''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: | Pentru exemplul nostru: | ||
<code bash> | <code bash> | ||
- | student@isrm-vm-2020:~/ns-3-dev$ ./waf --command-template="valgrind \ | + | student@isrm-vm:~/ns3$ ./waf --command-template="valgrind \ |
--leak-check=full --show-reachable=yes %s" \ | --leak-check=full --show-reachable=yes %s" \ | ||
--run wifi-tcp | --run wifi-tcp | ||
- | Waf: Entering directory `/home/vagrant/facultate/isrm/ns-3-dev/build' | + | Waf: Entering directory `/home/student/ns3/build' |
- | Waf: Leaving directory `/home/vagrant/facultate/isrm/ns-3-dev/build' | + | Waf: Leaving directory `/home/student/ns3/build' |
Build commands will be stored in build/compile_commands.json | Build commands will be stored in build/compile_commands.json | ||
- | 'build' finished successfully (1.303s) | + | 'build' finished successfully (0.936s) |
- | ==21406== Memcheck, a memory error detector | + | ==2901== Memcheck, a memory error detector |
- | ==21406== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. | + | ==2901== 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 | + | ==2901== 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 | + | ==2901== Command: /home/student/ns3/build/examples/wireless/ns3-dev-wifi-tcp-debug |
- | ==21406== | + | |
+ | ==2901== | ||
(...) | (...) | ||
- | =21406== LEAK SUMMARY: | + | =2901== LEAK SUMMARY: |
(...) | (...) | ||
- | ==21406== For counts of detected and suppressed errors, rerun with: -v | + | ==2901== For counts of detected and suppressed errors, rerun with: -v |
- | ==21406== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) | + | ==2901== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) |
</code> | </code> | ||
Line 203: | Line 240: | ||
===== Development ===== | ===== Development ===== | ||
- | |||
- | * Pentru lucru acasă vă recomandăm să folosiți instrucțiunile din pagina [[isrm:mv|setup ISRM]] deoarece are toate pachetele necesare (inclusiv Visual Studio Code cu toate dependențele necesare | ||
<note tip> | <note tip> | ||
- | Dacă deja folosiți Visual Studio Code acasă puteți pe host să vă instalați extensia [[https://code.visualstudio.com/docs/remote/remote-overview|Remote development]] dar trebuie apoi extensiile instalate să le reinstalați pe Visual Studio Code-ul vostru manual și pentru "remote". | + | Dacă deja folosiți Visual Studio Code acasă, puteți să instalați extensia [[https://code.visualstudio.com/docs/remote/remote-overview|Remote development]], dar trebuie ca extensiile instalate local să le reinstalați pe Visual Studio Code-ul vostru manual și pentru mediul "remote". |
</note> | </note> | ||