This shows you the differences between two versions of the page.
isrm:laboratoare:new:02a [2022/03/06 11:45] mbarbulescu |
isrm:laboratoare:new:02a [2024/10/16 09:04] (current) dragos.niculescu |
||
---|---|---|---|
Line 19: | Line 19: | ||
===== 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. | + | In cadrul laboratoarelor, vom folosi masina virtuala pe care o puteti descarca de [[https://ocw.cs.pub.ro/courses/isrm/mv|aici]], sau urma instrucțiunilde de instalare specifice Linux. |
- | + | ||
- | <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: | + | |
- | + | ||
- | <code bash> | + | |
- | 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 | + | |
- | </code> | + | |
- | + | ||
- | <note tip> | + | |
- | Pe mașina virtuală de ISRM aveți deja toate pachetele instalate. | + | |
- | </note> | + | |
- | + | ||
- | * 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> | + | |
- | 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 | + | |
- | </code> | + | |
- | + | ||
- | * Clonăm [[https://github.com/isrm-lab/ns3-labs|modelele din laborator (aici trebuie doar să fim pe master, ultimul commit)]] | + | |
- | + | ||
- | <code bash> | + | |
- | 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) | + | |
- | </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> | + | |
- | + | ||
- | <note tip> | + | |
- | 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: | + | |
- | + | ||
- | <code bash> | + | |
- | CXXFLAGS="-std=c++11" ./waf -d debug --enable-examples --enable-tests configure | + | |
- | </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. | + | |
- | + | ||
- | 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> | + | |
- | 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') | + | |
- | </code> | + | |
- | </note> | + | |
- | + | ||
- | * 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. | + | |
- | + | ||
- | <code bash> | + | |
- | 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) | + | |
- | </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 ===== | ||
Line 137: | Line 33: | ||
<code bash> | <code bash> | ||
- | student@isrm-vm:~/ns3$ ./waf --run wifi-tcp | + | student@isrm-vm:~/ns3$ cd lab02 |
+ | student@isrm-vm:lab02$ ../ns3 run wifi-tcp --cwd . | ||
Waf: Entering directory `/home/student/ns3/build' | Waf: Entering directory `/home/student/ns3/build' | ||
Waf: Leaving directory `/home/student/ns3/build' | Waf: Leaving directory `/home/student/ns3/build' | ||
Line 153: | Line 50: | ||
<code bash> | <code bash> | ||
- | student@isrm-vm:~/ns3$ ./waf --run examples/wireless/wifi-tcp | + | student@isrm-vm:lab02$ ../ns3 run examples/wireless/wifi-tcp --cwd . |
</code> | </code> | ||
- | Dacă vrem să transmitem parametrii în linia de comandă simulării (deoarece ''wifi-tcp'' suportă), o putem face cu ghilimele: | + | Această simulare are parametri expuși pe linia ei de comandă (nu a ns3): |
<code bash> | <code bash> | ||
- | student@isrm-vm:~/ns3$ ./waf --run "wifi-tcp --pcap --simulationTime=3" | + | student@isrm-vm:lab02$ ../ns3 run "wifi-tcp --help" |
+ | </code> | ||
+ | |||
+ | Dacă vrem să transmitem parametri în linia de comandă simulării, o putem face cu ghilimele: | ||
+ | |||
+ | <code bash> | ||
+ | student@isrm-vm:lab02$ ../ns3 run "wifi-tcp --pcap --simulationTime=3" --cwd . | ||
Waf: Entering directory `/home/student/ns3/build' | Waf: Entering directory `/home/student/ns3/build' | ||
Waf: Leaving directory `/home/student/ns3/build' | Waf: Leaving directory `/home/student/ns3/build' | ||
Line 175: | Line 78: | ||
<code bash> | <code bash> | ||
- | student@isrm-vm:~/ns3$ ls AccessPoint*.pcap Station*.pcap | + | student@isrm-vm:lab02$ ls AccessPoint*.pcap Station*.pcap |
AccessPoint-0-0.pcap Station-1-0.pcap | AccessPoint-0-0.pcap Station-1-0.pcap | ||
</code> | </code> | ||
Line 212: | Line 115: | ||
<code bash> | <code bash> | ||
- | student@isrm-vm:~/ns3$ ./waf --command-template="valgrind \ | + | student@isrm-vm:~/ns3$ ./ns3 run --command-template="valgrind \ |
--leak-check=full --show-reachable=yes %s" \ | --leak-check=full --show-reachable=yes %s" \ | ||
--run wifi-tcp | --run wifi-tcp | ||
Line 244: | Line 147: | ||
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". | 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> | ||
+ | |||
+ | ===== Tasks ===== | ||
+ | |||
+ | ===== [00] Pregătirea mediului pentru viitoarele laboratoare ===== | ||
+ | |||
+ | <note tip>Codul sursă al laboratoarelor de ISRM este disponibil pe [[https://github.com/isrm-lab/ns3-labs|Github]]. | ||
+ | </note> | ||
+ | |||
+ | Pe [[:isrm:mv|mașina virtuală]] laboratoarele sunt deja descărcate și sunt disponibile în folderul ''/home/student/ns-3-dev/examples/ns3-labs''. Pentru a valida funcționalitatea rulați: | ||
+ | |||
+ | <code bash> | ||
+ | student@isrm-vm:~$ cd ns-3-dev | ||
+ | student@isrm-vm:~/ns-3-dev$ ./ns3 run lab3 | ||
+ | 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 (1.453s) | ||
+ | Flow 1 (10.0.0.2 -> 10.0.0.1) | ||
+ | Tx Packets: 9341 | ||
+ | Tx Bytes: 14011500 | ||
+ | TxOffered: 11.2117 Mbps | ||
+ | Rx Packets: 5962 | ||
+ | Rx Bytes: 8943000 | ||
+ | Throughput: 7.15599 Mbps | ||
+ | |||
+ | Average throughput: 7.02085 Mbit/s | ||
+ | </code> | ||
+ | |||
+ | * Aflați parametrii specifici cu care poate fi rulat laboratorul 3. | ||
+ | * Ce face opțiunea --PrintGlobals, și ce parametri interesanți expune? | ||
+ | |||
+ | ===== [01] Grafic throughput ===== | ||
+ | |||
+ | Scriptul ''ns3/examples/wireless/wifi-tcp.cc'' afiseaza la fiecare 100ms throughput-ul TCP. Realizati un grafic care sa arate evolutia throughput-ului TCP in timp. | ||
+ | |||
+ | Tineti cont de faptul ca datele afisate in urma rularii scriptului de ns3 arata in felul urmator: | ||
+ | |||
+ | <code bash> | ||
+ | 1.1s: 45.8086 Mbit/s | ||
+ | 1.2s: 55.936 Mbit/s | ||
+ | 1.3s: 55.936 Mbit/s | ||
+ | 1.4s: 49.6947 Mbit/s | ||
+ | 1.5s: 56.1715 Mbit/s | ||
+ | 1.6s: 53.2275 Mbit/s | ||
+ | 1.7s: 49.3414 Mbit/s | ||
+ | 1.8s: 56.2893 Mbit/s | ||
+ | 1.9s: 49.3414 Mbit/s | ||
+ | </code> | ||
+ | |||
+ | Primul pas este stabilirea formatului in care trebuie sa arate fisierul CSV/text in care veti salva datele care vor urma sa fie trasate in grafic. In cazul nostru, o sa avem nevoie de 2 coloane: momentul de timp si throughput (date afisate in urma rularii scriptului de ns3). | ||
+ | |||
+ | <note tip>Pentru usurinta, salvati intr-un fisier output-ul obtinut in urma rularii scriptului de ns3.</note> | ||
+ | |||
+ | Odata stabilit formatul datelor din fisierul CSV/text, trebuie sa parsam output-ul obtinut in urma rularii scriptului. Ne intereseaza doar valorile numerice ceea ce inseamna ca va trebui sa scapam de sirurile de caractere ''s:'' si ''Mbit/s'' folosind utilitarele oferite de Bash precum ''awk'', ''cut'' sau ''tr''. | ||
+ | |||
+ | Graficul ar trebui sa arate astfel: | ||
+ | |||
+ | {{:isrm:laboratoare:new:tcp_tput_evolution.png}} | ||
+ | |||
+ | ====== [02] Analiza capturii profilului de trafic ====== | ||
+ | |||
+ | Pe parcursul exercițiului, vom avea nevoie de utilitarul ''tshark''. Pe mașina virtuală ar trebui să fie deja instalat, dacă nu: | ||
+ | |||
+ | <code bash> | ||
+ | student@isrm-vm:~$ sudo apt-get install tshark | ||
+ | </code> | ||
+ | |||
+ | Utilitarul Wireshark este un utilitar grafic pentru captură și inspecție de trafic de rețea. [[https://www.wireshark.org/docs/man-pages/tshark.html|Tshark]] este un wireshark pentru terminal. Are avantajul de a folosi limbajul wireshark pentru filtre (condițiile pot fi create în wireshark si apoi copiate cu copy/paste), dar în același timp oferă controlul afișarii la stdout. | ||
+ | |||
+ | Până acum foloseați de obicei aceste utilitare pentru a analiza o captură real-time de pachete pe o interfață sau o captură ''pcap''/''pcapng'' obținută cu ''tcpdump''. | ||
+ | |||
+ | Simulatorul ''ns-3'' ne oferă un mecanism de tracing foarte puternic de analiză: [[https://www.nsnam.org/docs/release/3.30/tutorial/singlehtml/index.html#pcap-tracing|pcap-tracing]] | ||
+ | |||
+ | ===== [02a] Rularea simulării ===== | ||
+ | |||
+ | <code bash> | ||
+ | student@isrm-vm:~/ns-3-dev$ ./ns3 run "wifi-tcp --pcap=true" | ||
+ | (...) | ||
+ | student@isrm-vm:~/ns-3-dev$ ls -al *.pcap | ||
+ | -rw-rw-r-- 1 mihai mihai 76129717 Mar 4 15:44 AccessPoint-0-0.pcap | ||
+ | -rw-rw-r-- 1 mihai mihai 80172767 Mar 4 15:44 Station-1-0.pcap | ||
+ | </code> | ||
+ | |||
+ | Deschideți oricare din cele două capturi cu Wireshark. Filtrați și afișați doar pachetele TCP. Fără a citi codul simulării și nici descrierea de la începutul sursei, ci doar PCAP-urile, care credeți că e direcția traficului? Sunt două noduri: 0 și 1 - 0->1 sau 1->0? | ||
+ | |||
+ | <note tip> | ||
+ | Primul număr din numele PCAP-ului generat este indexul nodului din simulare, iar al doilea număr e interfața de rețea (un nod poate avea mai multe interfețe de rețea). În simulare nodul 0 e AP (access point) și 1 este stație mobilă (STA). Un pachet care ajunge la STA (nodul 1) dar care a fost aruncat nu va putea fi văzut în captura ''Station-1-0.pcap'' dar în ''AccessPoint-0-0.pcap'' îl vom putea vedea. | ||
+ | |||
+ | Acest lucru e util când vom analiza de ce se pierd pachete în WiFi | ||
+ | </note> | ||
+ | |||
+ | Determinați canalul routerului și frecvența centrală a lui analizând câmpurile din secțiunea ''802.11 radio information'' sau ''Radiotap Header''. | ||
+ | |||
+ | ===== [02b] Analiza PCAP cu tshark ===== | ||
+ | |||
+ | <note tip>Filtre Wireshark: | ||
+ | * [[https://hackertarget.com/tshark-tutorial-and-filter-examples/|Exemple filtre]] | ||
+ | * Documentația filtrelor de [[https://www.wireshark.org/docs/dfref/w/wlan_mgt.html|WLAN în Wireshark]] | ||
+ | * Cheatsheet filtre Wifi în Wireshark/tshark: {{:isrm:laboratoare:new:wireshark_802.11_filters_-_reference_sheet.pdf|}} | ||
+ | |||
+ | </note> | ||
+ | |||
+ | |||
+ | Exemplu rulare: | ||
+ | |||
+ | <code bash> | ||
+ | student@isrm-vm:~/ns-3-dev$ tshark -T fields -e frame.time_epoch \ | ||
+ | -e frame.number -e ip.src \ -r ./AccessPoint-0-0.pcap '(ip.proto == 6) && (ip.src == 10.0.0.1)' > frames.txt | ||
+ | </code> | ||
+ | |||
+ | * ''-T fields'' indică câmpurile din pachete care se doresc printate | ||
+ | |||
+ | Colecție de câmpuri de interes: | ||
+ | |||
+ | ^ opțiune pentru -e ^ semnificație ^ | ||
+ | | frame.time_epoch | timpul de la începutul simulării | | ||
+ | | frame.number | numărul cadrului | | ||
+ | | ip.src | adresa IP sursă | | ||
+ | | ip.id | IP identifier field | | ||
+ | | ip.ttl | câmpul TTL din headerul de IP | | ||
+ | | wlan.flags | câmpul flags din headerul WLAN | | ||
+ | | wlan.seq | numărul de secvență WLAN | | ||
+ | | wlan.fcs_good | cadrul WLAN este validat de câmpul FCS | | ||
+ | |||
+ | |||
+ | * ''(ip.proto == 6) && (ip.src == 10.0.0.1)'' indică condiția de filtrare a pachetelor din .pcap - pachete de tip TCP (proto=6) și IP sursă; folosește acelasi limbaj ca și wireshark | ||
+ | |||
+ | Exerciții: | ||
+ | |||
+ | * Folosind ''tshark'' cu filtrul ''wlan.fc.type_subtype == 0x08'' extrageți și numărați câte pachete de tip beacon trimite AP-ul din captura ''./AccessPoint-0-0.pcap'' | ||
+ | * Hint: pentru contorizare în bash puteți folosi ''wc -l'' | ||
+ | * Folosiți câmpurile ''frame.time_epoch'' de la câteva linii consecutive și determinați la ce interval de timp (în ''ms'') AP-ul (access point-ul) trimite beacon-uri | ||
+ | |||
+ | * Folosind ''tshark'' extrageți în 2 fișiere separate, fiecare fișier având filtrul ''wlan.fc.type_subtype <= 0x0011'' (subtipul mai mic sau egal cu 0x0011) și celălalt ''wlan.fc.type_subtype == 0x0028'' următoarele câmpuri: ''frame.time_epoch'', ''wlan_radio.phy'', ''frame.number''. | ||
+ | * Ce puteți spune despre PHY type-ul din primul fișier, dar al doilea? Ce credeți că se întâmplă | ||
+ | * Dacă sunteți curioși ce inseamna type/subtype, consultați [[https://community.cisco.com/t5/wireless-mobility-documents/802-11-frames-a-starter-guide-to-learn-wireless-sniffer-traces/ta-p/3110019#toc-hId--1447989924|acest tabel din standardul 802.11]] | ||
+ | |||
+ | <note tip> | ||
+ | Veți vedea și la curs și vom vedea și pe parcursul laboratoarelor: cadrele de date se trimit cu cel mai mare MCS posibil (în anumite condiții) iar cele de management/control (e.g. beacon, probe request) cu cel mai mic MCS stabilit intre AP și STA - motivul este că pentru acestea vrem o constelație robustă deoarece pierderile nu sunt acceptabile pentru cadre de control. | ||
+ | </note> | ||
+ | |||
+ | ===== [02c] Analiza trace-ului ASCII ===== | ||
+ | |||
+ | Mecanismul de [[https://www.nsnam.org/docs/tutorial/html/tracing.html|tracing din ns-3]] ne permite să logăm și în format ASCII evenimentele. Rulați simularea aferentă laboratorului 3 astfel: | ||
+ | |||
+ | <code bash> | ||
+ | ./ns3 run "lab3 --numberOfNodes=2 --payloadSize=1400 \ | ||
+ | --offeredRate=11Mbps --phyRate=DsssRate11Mbps --simulationTime=2 --tracing=true" | ||
+ | </code> | ||
+ | |||
+ | Vom obține două trace-uri: unul PCAP (cum am analizat mai sus) și unul text: ''wifi-lab3.tr''. Deschideți și inspectați fișierul. | ||
+ | |||
+ | Explicația conținutului fișierului: | ||
+ | |||
+ | Prima literă este: | ||
+ | |||
+ | <code bash> | ||
+ | r for received | ||
+ | d for dropped | ||
+ | + for enqueued | ||
+ | - for dequeued | ||
+ | t is for transmitted #Relevant for WiFi tracefiles | ||
+ | </code> | ||
+ | |||
+ | A doua coloană reprezintă timestamp. | ||
+ | |||
+ | A treia coloană are următoarea semnificație: | ||
+ | |||
+ | <note>name of the event in the configuration namespace, sometimes called the configuration path name. The NodeList value represents the node (A=0, etc), the DeviceList represents the interface, and the final part of the name repeats the action: Drop, MacRx, Enqueue, Dequeue.</note> | ||
+ | |||
+ | Apoi urmează o serie de nume de clase din [[https://www.nsnam.org/doxygen/group__attribute.html|sistemul de atribute al ns-3]] (''ns3::Ipv4Header, ns3::TcpHeader'') și cu o listă de trace-uri specifice clasei respective. | ||
+ | |||