Laborator 02: Introducere în ns-3

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.

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.

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:

Instalare și configurare

In cadrul laboratoarelor, vom folosi masina virtuala pe care o puteti descarca de aici. Pe VM au fost deja executati pasii de configurare de mai jos.

Pasi configurare masina virtuala

Pasi configurare masina virtuala

  • Dependențele necesare ns-3 sunt descrise în pagina de instalare. Pentru ISRM vom folosi următoarele pachete pe o distribuție Ubuntu:
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

Pe mașina virtuală de ISRM aveți deja toate pachetele instalate.

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
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)
  • Pentru a compila simulatorul împreună cu modelele de laborator, vom folosi sistemul de build waf:
student@isrm-vm:~/ns-3-dev$ ./waf configure --build-profile=debug --enable-examples --enable-tests
student@isrm-vm:~/ns-3-dev$ ./waf build -j4

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:

CXXFLAGS="-std=c++11" ./waf -d debug --enable-examples --enable-tests configure

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:

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')

  • 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.
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)

Pentru a realiza grafice, trebuie sa instalam si pachetele de Python:

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

Pentru a lansa aplicatia de Jupyter Notebook, rulati urmatoarea comanda:

student@isrm-vm:~$ jupyter-notebook

Rulare exemple existente

Pentru inceput, puteti parcurge Tutorial ns-3, indeosebi urmatoarele sectiuni:

Î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:

student@isrm-vm:~/ns3$ ./waf --run wifi-tcp
Waf: Entering directory `/home/student/ns3/build'
Waf: Leaving directory `/home/student/ns3/build'
Build commands will be stored in build/compile_commands.json
'build' finished successfully (1.282s)
1.1s:   45.8086 Mbit/s
1.2s:   55.3472 Mbit/s
(...)
10.9s:  50.8723 Mbit/s
 
Average throughput: 52.1959 Mbit/s

Alternativ puteți specifica calea completă către codul sursă:

student@isrm-vm:~/ns3$ ./waf --run examples/wireless/wifi-tcp

Dacă vrem să transmitem parametrii în linia de comandă simulării (deoarece wifi-tcp suportă), o putem face cu ghilimele:

student@isrm-vm:~/ns3$ ./waf --run "wifi-tcp --pcap --simulationTime=3"
Waf: Entering directory `/home/student/ns3/build'
Waf: Leaving directory `/home/student/ns3/build'
Build commands will be stored in build/compile_commands.json
'build' finished successfully (1.287s)
1.1s:   45.8086 Mbit/s
1.2s:   55.3472 Mbit/s
(...)
3.9s:   52.7565 Mbit/s
 
Average throughput: 52.9017 Mbit/s

Întrucât opțiunea --pcap activează mecanismul de 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:

student@isrm-vm:~/ns3$ ls AccessPoint*.pcap Station*.pcap
AccessPoint-0-0.pcap  Station-1-0.pcap

Iată un exemplu de schimb de pachete Wi-Fi pentru procedura de asociere a stației la access point:

Avem si un al doilea exemplu care arată traficul TCP schimbat între dispozitive:

Structura unui cod sursă al unei simulări în C++

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

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:

  • PHY - modelul de canal, propagare, atenuare, senzitivitatea receptorilor
  • MAC:
    • 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.
  • IPv4, TCP/UDP - tipul de trafic între noduri

Mai multe detalii pe wiki-ul ns-3

Debugging cu valgrind/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:

student@isrm-vm:~/ns3$ ./waf --command-template="valgrind \
    --leak-check=full --show-reachable=yes %s" \
    --run wifi-tcp
 
Waf: Entering directory `/home/student/ns3/build'
Waf: Leaving directory `/home/student/ns3/build'
Build commands will be stored in build/compile_commands.json
'build' finished successfully (0.936s)
==2901== Memcheck, a memory error detector
==2901== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==2901== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==2901== Command: /home/student/ns3/build/examples/wireless/ns3-dev-wifi-tcp-debug
 
==2901== 
(...)
=2901== LEAK SUMMARY:
(...)
==2901== For counts of detected and suppressed errors, rerun with: -v
==2901== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

Exemple de pe wiki-ul nsnam pentru lucrul cu:

Development

Dacă deja folosiți Visual Studio Code acasă, puteți să instalați extensia Remote development, dar trebuie ca extensiile instalate local să le reinstalați pe Visual Studio Code-ul vostru manual și pentru mediul “remote”.

Tasks

[00] Pregătirea mediului pentru viitoarele laboratoare

Codul sursă al laboratoarelor de ISRM este disponibil pe Github. Dacă vreți să lucrați pe propriul calculator atunci trebuie să urmați acești pași:

# Clonați repo-ul ns-3-dev de aici: https://gitlab.com/b12mihai1/ns-3-dev
git clone https://gitlab.com/b12mihai1/ns-3-dev.git
 
# Clonați repo-ul ns-3-labs în folderul ns-3-dev/examples
cd ns-3-dev/examples
git clone https://github.com/isrm-lab/ns3-labs.git
 
# Rulați build-ul sistemului de ns3
./waf configure --build-profile=debug --enable-examples --enable-tests
./waf build -j4

Pe 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:

student@isrm-vm-2020:~$ cd ns-3-dev
student@isrm-vm-2020:~$ student@isrm-vm-2020:~/ns-3-dev$ ./waf --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

[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:

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

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).

Pentru usurinta, salvati intr-un fisier output-ul obtinut in urma rularii scriptului de ns3.

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:

[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:

student@isrm-vm-2020:~$ sudo apt-get install tshark

Utilitarul Wireshark este un utilitar grafic pentru captură și inspecție de trafic de rețea. 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ă: pcap-tracing

[02a] Rularea simulării

student@isrm-vm:~/ns-3-dev$ ./waf --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

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?

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

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

Filtre Wireshark:

Exemplu rulare:

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
  • -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 ⇐ 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 acest tabel din standardul 802.11

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.

[02c] Analiza trace-ului ASCII

Mecanismul de tracing din ns-3 ne permite să logăm și în format ASCII evenimentele. Rulați simularea aferentă laboratorului 3 astfel:

./waf --run "lab3 --numberOfNodes=2 --payloadSize=1400 \
    --offeredRate=11Mbps --phyRate=DsssRate11Mbps --simulationTime=2 --tracing=true"

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:

r for received
d for dropped
+ for enqueued
- for dequeued
t is for transmitted #Relevant for WiFi tracefiles

A doua coloană reprezintă timestamp.

A treia coloană are următoarea semnificație:

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.

Apoi urmează o serie de nume de clase din sistemul de atribute al ns-3 (ns3::Ipv4Header, ns3::TcpHeader) și cu o listă de trace-uri specifice clasei respective.

isrm/laboratoare/new/02a.txt · Last modified: 2022/03/12 12:15 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