Differences

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

Link to this comparison view

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. ​
 +
  
isrm/laboratoare/new/02a.1646559946.txt.gz · Last modified: 2022/03/06 11:45 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