ns-3
este un simulator de rețele (Ethernet
, Wi-Fi
, 4G
etc.) ce oferă:
UDP
/TCP
etc.)
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:
Cele mai importante pagini de parcurs despre ns-3
la început, dar și în timpul laboratoarelor sunt:
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.
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:
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
Î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 receptorilorMAC
:LMAC
(lower MAC
): accesul la mediu (DCF
/EDCA
ca algoritmi de backoff pentru evitarea coliziunilor), RTS/CTS
, ACK
-uri de nivel 2UMAC
(upper MAC
): beacon, probe request/probe response, WPA2
etc.IPv4
, TCP
/UDP
- tipul de trafic între noduriMai multe detalii pe wiki-ul ns-3
Î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:
# Clonați repo-ul ns-3-dev git clone --branch ns-3.35 https://gitlab.com/nsnam/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
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).
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:
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
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?
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
.
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:
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
wc -l
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-uritshark
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
.
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:
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.