This shows you the differences between two versions of the page.
isrm:laboratoare:new:01 [2020/12/24 15:09] mbarbulescu |
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ă 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. | + | ''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 ===== | ||
- | <spoiler> | + | |
+ | 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 update | + | student@isrm-vm:~$ sudo apt update |
- | student@isrm-vm-2020:~$ sudo apt -y install libgsl-dev gsl-bin libgslcblas0 \ | + | 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 29: | Line 40: | ||
<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:~/ns-3-dev$ git checkout -b ns-332-rel ns-3.32 | + | student@isrm-vm:~/ns-3-dev$ git checkout -b ns-332-rel ns-3.32 |
</code> | </code> | ||
Line 37: | Line 48: | ||
<code bash> | <code bash> | ||
- | student@isrm-vm-2020:~$ cd ~/ns-3-dev/examples | + | student@isrm-vm:~$ cd ~/ns-3-dev/examples |
- | student@isrm-vm-2020:~$ git clone https://github.com/isrm-lab/ns3-labs.git | + | student@isrm-vm:~$ git clone https://github.com/isrm-lab/ns3-labs.git |
- | student@isrm-vm-2020:~$ cd ~/ns-3-dev/examples/ns3-labs && git log -1 | + | student@isrm-vm:~$ cd ~/ns-3-dev/examples/ns3-labs && git log -1 |
commit 5214caf7fbc39b280edf47154ed95f2fcca78a7c (HEAD -> master, origin/master, origin/HEAD) | commit 5214caf7fbc39b280edf47154ed95f2fcca78a7c (HEAD -> master, origin/master, origin/HEAD) | ||
</code> | </code> | ||
Line 46: | Line 57: | ||
<code bash> | <code bash> | ||
- | student@isrm-vm-2020:~/ns-3-dev$ ./waf configure --build-profile=debug --enable-examples --enable-tests | + | student@isrm-vm:~/ns-3-dev$ ./waf configure --build-profile=debug --enable-examples --enable-tests |
- | student@isrm-vm-2020:~/ns-3-dev$ ./waf build -j4 | + | student@isrm-vm:~/ns-3-dev$ ./waf build -j4 |
</code> | </code> | ||
Line 62: | Line 73: | ||
<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 83: | 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 92: | 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) | ||
(...) | (...) | ||
92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors) | 92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors) | ||
+ | </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> | </code> | ||
Line 102: | Line 127: | ||
===== Rulare exemple existente ===== | ===== Rulare exemple existente ===== | ||
- | - se va folosi instalarea din ~/Desktop/ISRM/ns-3-dev, pregătită cu instrucțiunile de mai sus | + | Pentru inceput, puteti parcurge [[https://www.nsnam.org/docs/tutorial/html/index.html|Tutorial ns-3]], indeosebi urmatoarele sectiuni: |
- | - citit [[https://www.nsnam.org/docs/tutorial/html/index.html|Tutorial ns-3]], pe porțiuni | + | - [[https://www.nsnam.org/docs/tutorial/html/conceptual-overview.html|Conceptual Overview]] |
- | - în particular, secțiunile: [[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]], | + | - [[https://www.nsnam.org/docs/tutorial/html/building-topologies.html|Building Topologies]] |
- | - scopul este de a rula exemplele ''first.cc, second.cc, ..., sixth.cc'' din examples/tutorial. | + | - [[https://www.nsnam.org/docs/tutorial/html/tracing.html|Tracing]] |
- | Î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'' | + | Î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. Odată ce build-ul de ''waf'' s-a incheiat cu succes la pasul anterior și ''hello-simulator'' a rulat, putem rula orice exemplu astfel: | + | 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 125: | 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 147: | 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|}} | ||
- | Avem si un al doilea exemplu care 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 164: | 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'' |
Urmariți și explicațiile de aici: https://www.nsnam.org/docs/tutorial/html/building-topologies.html#building-a-wireless-network-topology | 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 ===== | ===== 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 187: | Line 212: | ||
<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 214: | Line 240: | ||
===== Development ===== | ===== Development ===== | ||
- | |||
- | * Pentru lucrul 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> |