This is an old revision of the document!
Teorie:
Scopul acestui laborator este de a calcula capacitatea unui canal 802.11 pentru diverse standarde, în condiții ideale. Vom face o analiză teoretică folosind temporizările, randomizările, și dimensiunile antetelor din standard, versus estimarea în simulator.
Intrați în directorul /home/student/Desktop/ISRM/ns-3-dev
. Rulați comenzile:
git remote add isrm https://gitlab.com/b12mihai1/ns-3-dev.git git remote update git checkout -b isrm_2020 remotes/isrm/isrm_2020 git submodule init git submodule update --remote --merge git submodule foreach git pull origin master # in caz ca cea anterioara nu ne muta pe ultimul commit din master
Dacă directorul nu există rulați comenzile de mai jos și țineți minte unde aveți ns-3-dev
folder cu toate lucrurile compilate:
git clone https://gitlab.com/b12mihai1/ns-3-dev.git ~/ns-3-dev cd ~/ns-3-dev git checkout -b isrm_2020 remotes/origin/isrm_2020 git submodule init git submodule update --remote --merge git submodule foreach git pull origin master ./waf configure --build-profile=debug --enable-examples --enable-tests && ./waf build -j4
Pentru a realiza grafice, trebuie sa instalam si pachetele de Python:
student@isrm-vm-2020:~$ sudo apt-get update student@isrm-vm-2020:~$ sudo apt-get install python3-pip student@isrm-vm-2020:~$ pip3 install matplotlib jupyter student@isrm-vm-2020:~$ sudo ln -s ~/.local/bin/jupyter-notebook /usr/bin/jupyter-notebook
Pentru a lansa aplicatia de Jupyter Notebook, rulati urmatoarea comanda:
student@isrm-vm-2020:~$ jupyter-notebook
Pe parcursul laboratorului, vom avea nevoie de utilitarul tshark
:
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 ⇐ 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.
In cadrul acestui exercitiu vom calcula capacitatea unui canal 802.11 pentru standardele 802.11b
si 802.11g
, în condiții optime. Vom face o analiză teoretică folosind temporizările, randomizările și dimensiunile antetelor din standard.
Inainte de a porni la calcul, trebuie sa vedem mai intai cum arata antetul de PHY pentru cele 2 standarde.
Pentru 802.11b, avem un antet PHY de 192 de biti care este trimis la un MCS de 1 Mbps:
Pentru 802.11g, avem un antet PHY de 16 us plus 24 de biti care sunt transmisi la un MCS de 6 Mbps:
Pentru inceput, vom calcula durata minima (in microsecunde) a unei tranzacții atomice de transmitere a unui cadru de date. Aceasta durata poate fi calculata ca suma duratelor urmatoarelor componente: DIFS, arbitraj, PHY header, MAC header, IP/UDP header, UDP Payload de x octeți, FCS (CRC), SIFS, antent PHY, ACK. Motivul pentru care avem un al doilea antet PHY este pentru ca mesajul de ACK este precedat la randul lui de un antet PHY.
Folosiți duratele temporizărilor specificate în standard și dimensiunile antetelor PHY din schemele de mai sus:
Header-ul de MAC pentru standardul 802.11 arata in felul urmator (dimensiunile sunt in octeti). Nu luati in calcul a patra adresa MAC care este optionala:
Header-ul IPv4 arata in felul urmator:
Header-ul UDP arata in felul urmator:
Mesajele de ACK au dimensiunea de 14 octeti.
Calculati duratele tranzactiilor atomice pentru 802.11b
si 802.11g
.
Durata unei tranzactii atomice pentru 802.11b
este:
Vom calcula throughput-ul ca raportul dintre dimensiunea payload-ului UDP (date utile) si durata unei tranzactii.
Calculati throughput-ul in Mbps pentru standardele 802.11b
si 802.11g
. Tineti cont ca throughput-ul va fi dependent de dimensiunea payload-ului UDP si de MCS.
Realizati cate un grafic pentru standardele 802.11b
si 802.11g
care sa evidentieze evolutia throughput-ului in Mbps (axa Oy) in functie de dimensiunea payload-ului UDP (axa Ox). Puteti varia dimensiunea payload-ului de la 0 la 1400 de octeti.
Din moment ce throughput-ul depinde si de MCS, n cadrul fiecarui grafic vor trebui construite 4 curbe (subgrafice) care sa corespunda urmatoarelor valori de MCS:
Graficele la care trebuie sa ajungeti sunt urmatoarele:
Pentru realizarea graficelor, puteti folosi urmatorul template:
import copy import numpy as np import matplotlib import matplotlib.pyplot as plt MCS_802_11_B = [1, 2, 5.5, 11] MCS_802_11_G = [6, 12, 24, 54] PAYLOAD_SIZES = [100 * i for i in range(15)] def compute_throughput_802_11_b(payload_size, mcs): #TODO - replace tput with the correct value based on the payload_size and mcs tput = 0 return tput def compute_throughput_802_11_g(payload_size, mcs): #TODO - replace tput with the correct value based on the payload_size and mcs tput = 0 return tput def plot_802_11_b_throughput(): # Apelul subplots poate fi folosit pentru a crea mai multe subgrafice in cadrul aceluiasi grafic sau in cadrul unor grafice diferite # Prin figsize se specifica dimensiunea graficului fig, ax = plt.subplots(figsize=(12,12)) # Valori stilistice pentru grafic ax.grid(color='b', alpha=0.5, linestyle='dashed', linewidth=0.5) # Denumirile axelor Ox si Oy, precum si titlul graficului plt.xlabel('Payload size [bytes]') plt.ylabel('Throughput [Mbps]') plt.title('802.11b throughput') # Aici este construit efectiv graficul. Campul label va fi folosit in cadrul legendei graficului for mcs in MCS_802_11_B: tput_values = [compute_throughput_802_11_b(payload_size, mcs) for payload_size in PAYLOAD_SIZES] ax.plot(PAYLOAD_SIZES, tput_values, label='%s' % mcs) ax.legend() plt.show() def plot_802_11_g_throughput(): #TODO pass if __name__ == '__main__': plot_802_11_b_throughput() plot_802_11_g_throughput()
mihai@wormhole:~/facultate/ns-3-dev$ ./waf --run "lab3 --numberOfNodes=2 \ --payloadSize=1400 --offeredRate=11Mbps --phyRate=DsssRate11Mbps --simulationTime=2" Waf: Entering directory `/home/mihai/facultate/ns-3-dev/build' Waf: Leaving directory `/home/mihai/facultate/ns-3-dev/build' Build commands will be stored in build/compile_commands.json 'build' finished successfully (4.605s) Flow 1 (10.0.0.2 -> 10.0.0.1) Tx Packets: 1964 Tx Bytes: 2804592 TxOffered: 11.2311 Mbps Rx Packets: 1388 Rx Bytes: 1982064 Throughput: 7.93722 Mbps Average throughput: 7.7728 Mbit/s
numberOfNodes
reprezintă numărul total de noduri (inclusiv AP-ul).
Parametrul phyRate
(reprezinta MCS) va lua urmatoarele valori:
802.11b
:DsssRate1Mbps DsssRate2Mbps DsssRate5_5Mbps DsssRate11Mbps
802.11g
:ErpOfdmRate6Mbps ErpOfdmRate9Mbps ErpOfdmRate12Mbps ErpOfdmRate18Mbps ErpOfdmRate24Mbps ErpOfdmRate36Mbps ErpOfdmRate48Mbps ErpOfdmRate54Mbps
Parametrul offeredRate
corespunde traficului trimis de aplicație în socketul UDP. Pe linia de comandă trebuie dați parametrii relevanți pentru dimensiunea pachetului și rata dorită de UDP.
Scopul acestui task este să repetați graficele precedente/teoretice folosind simularea în ns-3
. Puncte de evaluare pentru payloadSize
: 20, 50, 100, 500, 1000, 1500.
Average throughput: 7.7728 Mbit/s
--simulationTime=1
Puteti folosi acest template pentru construirea graficelor (va trebui sa implementati TODO-urile):
import copy import numpy as np import matplotlib import matplotlib.pyplot as plt # Calea absoluta catre fisierul de date din care citim # TODO - trebuie inlocuita cu calea corecta DATA_FILE_802_11_B = '/home/student/ns-3-dev/output_802_11_b.txt' DATA_FILE_802_11_G = '/home/student/ns-3-dev/output_802_11_g.txt' columns = ['mcs', 'payload_size', 'throughput'] # Citim datele din fisier # Argumentul delimiter precizeaza care este delimitatorul dintre coloane # Argumentul skip_header precizeaza cate linii nu vor fi citite pornind cu inceputul fisierului # Argumentul names este unul foarte util deoarece permite asocierea de nume pentru coloanele din fisier si # de asemenea duce la un acces foarte usor al datelor in script. In acest exemplu, names va fi egal cu ['x', 'y'] # ceea ce inseamna ca putem accesa valorile din prima coloana prin sim_data['x']. # Argumentul dtype setat specifica modul in care vor fi interpretate coloanele (string-urile ca string-uri, float-urile ca float-uri). # In absenta acestui argument, valorile din coloane vor fi interpretate ca float. sim_data_802_11_b = np.genfromtxt(DATA_FILE_802_11_B, delimiter=' ', names=columns, dtype=None) #TODO - decomentati linia dupa ce ati obtinut fisierul de output pentru 802.11g # sim_data_802_11_g = np.genfromtxt(DATA_FILE_802_11_G, delimiter=' ', names=columns, dtype=None) def plot_802_11_b_throughput(sim_data): data = copy.deepcopy(sim_data) # Apelul subplots poate fi folosit pentru a crea mai multe subgrafice in cadrul aceluiasi grafic sau in cadrul unor grafice diferite # Prin figsize se specifica dimensiunea graficului fig, ax = plt.subplots(figsize=(12,12)) # Valori stilistice pentru grafic ax.grid(color='b', alpha=0.5, linestyle='dashed', linewidth=0.5) # Denumirile axelor Ox si Oy, precum si titlul graficului plt.xlabel('Payload size [bytes]') plt.ylabel('Throughput [Mbps]') plt.title('802.11b throughput') # Aici este construit efectiv graficul. Campul label va fi folosit in cadrul legendei graficului #TODO # Daca in fisierul de output aveti toate valorile de MCS, este posibil sa aveti nevoie de Python slicing pentru # a construi graficele usor. Exemplu: data['mcs'][0:6] sau data['throughput'][0:6] pentru a extrage primele 6 elemente din # coloana. ax.legend() plt.show() def plot_802_11_g_throughput(sim_data): data = copy.deepcopy(sim_data) # Apelul subplots poate fi folosit pentru a crea mai multe subgrafice in cadrul aceluiasi grafic sau in cadrul unor grafice diferite # Prin figsize se specifica dimensiunea graficului fig, ax = plt.subplots(figsize=(12,12)) # Valori stilistice pentru grafic ax.grid(color='b', alpha=0.5, linestyle='dashed', linewidth=0.5) # Denumirile axelor Ox si Oy, precum si titlul graficului plt.xlabel('Payload size [bytes]') plt.ylabel('Throughput [Mbps]') plt.title('802.11g throughput') # Aici este construit efectiv graficul. Campul label va fi folosit in cadrul legendei graficului #TODO ax.legend() plt.show() if __name__ == '__main__': plot_802_11_b_throughput(sim_data_802_11_b) #TODO - decomentati linia dupa ce ati obtinut fisierul de output pentru 802.11g # plot_802_11_g_throughput(sim_data_802_11_g)
Pentru mai multe informatii legate de list slicing in Python, puteti consulta aceasta pagina.
Repetați experimentele de mai sus folosind trafic de tip TCP.
./waf --run "lab3 --numberOfNodes=2 --payloadSize=1400 \ --offeredRate=11Mbps --phyRate=DsssRate11Mbps --simulationTime=2 --runTcp=true"