This shows you the differences between two versions of the page.
isrm:laboratoare:new:03 [2020/03/07 23:16] vlad.traista [[03] Capacitatea ideală simulare] |
isrm:laboratoare:new:03 [2024/10/09 10:56] (current) dragos.niculescu |
||
---|---|---|---|
Line 43: | Line 43: | ||
- | ====== [00] Pregătire laborator ====== | + | ====== [01] Capacitatea ideală teoretica ====== |
- | + | ||
- | Intrați în directorul ''/home/student/Desktop/ISRM/ns-3-dev''. Rulați comanda: | + | |
- | + | ||
- | <code bash> | + | |
- | 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 | + | |
- | </code> | + | |
- | + | ||
- | 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: | + | |
- | + | ||
- | <code bash> | + | |
- | 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 | + | |
- | </code> | + | |
- | + | ||
- | Pentru a realiza grafice, trebuie sa instalam si pachetele de Python: | + | |
- | <code bash> | + | |
- | 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 | + | |
- | </code> | + | |
- | + | ||
- | Pentru a lansa aplicatia de Jupyter Notebook, rulati urmatoarea comanda: | + | |
- | + | ||
- | <code bash> | + | |
- | student@isrm-vm-2020:~$ jupyter-notebook | + | |
- | </code> | + | |
- | + | ||
- | Pe parcursul laboratorului, vom avea nevoie de utilitarul ''tshark'': | + | |
- | <code bash> | + | |
- | student@isrm-vm-2020:~$ sudo apt-get install tshark | + | |
- | </code> | + | |
- | ====== [01] Analiza capturii profilului de trafic ====== | + | |
- | + | ||
- | 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]] | + | |
- | + | ||
- | ===== [01a] Rularea simulării ===== | + | |
- | + | ||
- | <code bash> | + | |
- | 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 | + | |
- | </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''. | + | |
- | + | ||
- | ===== [01b] Analiza PCAP cu tshark ===== | + | |
- | + | ||
- | [[https://hackertarget.com/tshark-tutorial-and-filter-examples/|Exemple filtre]] | + | |
- | + | ||
- | 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 <= 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> | + | |
- | + | ||
- | ===== [01c] 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> | + | |
- | ./waf --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. | + | |
- | + | ||
- | + | ||
- | ====== [02] Capacitatea ideală teoretica ====== | + | |
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. | 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. | ||
- | ===== [02a] Durata unei tranzactii atomice ===== | + | ===== [01a] Durata unei tranzactii atomice ===== |
Inainte de a porni la calcul, trebuie sa vedem mai intai cum arata antetul de PHY pentru cele 2 standarde. | Inainte de a porni la calcul, trebuie sa vedem mai intai cum arata antetul de PHY pentru cele 2 standarde. | ||
Line 210: | Line 68: | ||
* 11b: slot time=20, SIFS=10, DIFS=50 | * 11b: slot time=20, SIFS=10, DIFS=50 | ||
* 11g: slot time=9, SIFS=10, DIFS=28 | * 11g: slot time=9, SIFS=10, DIFS=28 | ||
- | * arbitraj=numar de sloturi * slot time; Numarul de sloturi poate sa varieze, valoarea lui minima fiind de 31. Pentru laborator, vom folosi o valoare medie a timpului de arbitraj: 31 / 2 * slot time. | + | * arbitraj=numar de sloturi * slot time; Numarul de sloturi poate sa varieze de la 0 pana la o anumita valoare prestabilita, minimul acestei valori fiind de 31. Pentru laborator, vom folosi o valoare medie a timpului de arbitraj minim: 31 / 2 * slot time = 15.5 * slot time. |
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 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: | ||
Line 233: | Line 91: | ||
</spoiler> | </spoiler> | ||
- | ===== [02b] Calcul si grafice throughput ===== | + | ===== [01b] Calcul si grafice throughput ===== |
Vom calcula throughput-ul ca raportul dintre dimensiunea payload-ului UDP (date utile) si durata unei tranzactii. | Vom calcula throughput-ul ca raportul dintre dimensiunea payload-ului UDP (date utile) si durata unei tranzactii. | ||
Line 241: | Line 99: | ||
<spoiler> | <spoiler> | ||
Throughput_11b(x) = x*8 / (754 + (70 + x) * 8/ MCS) | Throughput_11b(x) = x*8 / (754 + (70 + x) * 8/ MCS) | ||
+ | |||
+ | La 802.11g, obtinem urmatoarea durata a tranzactiei atomice: 28 + 15.5 * 9 + 16 + 24 / 6 + (24 + 20 + 8 + x + 4) *8 / MCS + 10 + 16 + 24 / 6 + 14 * 8 / MCS | ||
+ | Throughput_11g(x) = x*8 / (217.5 + (70 + x) * 8/ MCS) | ||
</spoiler> | </spoiler> | ||
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. | 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: | + | Din moment ce throughput-ul depinde si de MCS, in cadrul fiecarui grafic vor trebui construite 4 curbe (subgrafice) care sa corespunda urmatoarelor valori de MCS: |
* pentru 802.11b - MCS: 1, 2, 5.5, 11 Mbps | * pentru 802.11b - MCS: 1, 2, 5.5, 11 Mbps | ||
* pentru 802.11g - MCS: 6, 12, 24, 54 Mbps | * pentru 802.11g - MCS: 6, 12, 24, 54 Mbps | ||
Line 305: | Line 166: | ||
plot_802_11_g_throughput() | plot_802_11_g_throughput() | ||
</code> | </code> | ||
- | ====== [03] Capacitatea ideală simulare ====== | ||
- | * Pentru un singur client, se vor repeta curbele de mai sus folosind ns-3. Modelul [[https://github.com/isrm-lab/ns3-labs/blob/master/lab3.cc|lab3.cc]] configurează la (0,0) un AP și n-1 noduri plasate în vecinătatea sa. Traficul este generat de la AP către fiecare nod. | + | ====== [02] Capacitatea ideală simulare ====== |
+ | |||
+ | * Pentru un singur client, se vor repeta curbele de mai sus folosind ns-3. Modelul [[https://github.com/isrm-lab/ns3-labs/blob/master/lab-03-04-capacity/lab3.cc|lab3.cc]] configurează la (0,0) un AP și n-1 noduri plasate în vecinătatea sa. Traficul este generat de la AP către fiecare nod. | ||
* Pentru capacitatea ideală, folosim un AP, un client, trafic de tip UDP. Exepmlu de rulare de interes (cu parametrii de interes) pentru acest task: | * Pentru capacitatea ideală, folosim un AP, un client, trafic de tip UDP. Exepmlu de rulare de interes (cu parametrii de interes) pentru acest task: | ||
<code bash> | <code bash> | ||
- | mihai@wormhole:~/facultate/ns-3-dev$ ./waf --run "lab3 --numberOfNodes=2 \ | + | mihai@wormhole:~/facultate/ns-3-dev$ ./ns3 run "lab3 --numberOfNodes=2 \ |
--payloadSize=1400 --offeredRate=11Mbps --phyRate=DsssRate11Mbps --simulationTime=2" | --payloadSize=1400 --offeredRate=11Mbps --phyRate=DsssRate11Mbps --simulationTime=2" | ||
Waf: Entering directory `/home/mihai/facultate/ns-3-dev/build' | Waf: Entering directory `/home/mihai/facultate/ns-3-dev/build' | ||
Line 330: | Line 192: | ||
''numberOfNodes'' reprezintă numărul total de noduri (inclusiv AP-ul). | ''numberOfNodes'' reprezintă numărul total de noduri (inclusiv AP-ul). | ||
+ | <note important> | ||
+ | Pentru a schimba standardul folosit in cadrul scriptului, modificati la [[https://github.com/isrm-lab/ns3-labs/blob/master/lab-03-04-capacity/lab3.cc#L111|linia]]. | ||
+ | </note> | ||
Parametrul ''phyRate'' (reprezinta MCS) va lua urmatoarele valori: | Parametrul ''phyRate'' (reprezinta MCS) va lua urmatoarele valori: | ||
* Pentru ''802.11b'': | * Pentru ''802.11b'': | ||
Line 365: | Line 230: | ||
</note> | </note> | ||
- | <note tip> | + | Puteti folosi acest template pentru construirea graficelor (va trebui sa implementati TODO-urile): |
- | De ce iterăm peste aceste packet size-uri? Iată câteva valori din trafic real: [[http://www.bandcalc.com/| VoIP]] ~ 20-300; DNS, TCP~ 500; Ethernet MTU=1500; 802.11 Beacon=380 | + | |
- | </note> | + | <code python> |
+ | 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() | ||
+ | | ||
- | ====== [04] Capacitatea ideală simulare TCP ====== | + | 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 | ||
- | Repetați experimentele de mai sus folosind trafic de tip TCP. | + | ax.legend() |
+ | |||
+ | plt.show() | ||
- | <code bash> | + | |
- | ./waf --run "lab3 --numberOfNodes=2 --payloadSize=1400 \ | + | if __name__ == '__main__': |
- | --offeredRate=11Mbps --phyRate=DsssRate11Mbps --simulationTime=2 --runTcp=true" | + | 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) | ||
</code> | </code> | ||
+ | |||
+ | Pentru mai multe informatii legate de list slicing in Python, puteti consulta aceasta [[https://www.geeksforgeeks.org/python-list-comprehension-and-slicing/| pagina]]. | ||
+ | |||
+ | <note tip> | ||
+ | De ce iterăm peste aceste packet size-uri? Iată câteva valori din trafic real: [[http://www.bandcalc.com/| VoIP]] ~ 20-300; DNS, TCP~ 500; Ethernet MTU=1500; 802.11 Beacon=380 | ||
+ | </note> | ||
+ | |||