Differences

This shows you the differences between two versions of the page.

Link to this comparison view

isrm:laboratoare:new:01 [2019/12/27 13:10]
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ă simulatorulcum 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 începutdar ș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 -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 masterultimul 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 laboratorcâ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''​
  
 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 169: 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 201: 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>​
  
isrm/laboratoare/new/01.1577445013.txt.gz · Last modified: 2019/12/27 13:10 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