This shows you the differences between two versions of the page.
|
isrm:laboratoare:new:05 [2020/03/21 14:54] vlad.traista [Pregătirea laboratorului] |
isrm:laboratoare:new:05 [2024/12/04 09:16] (current) dragos.niculescu |
||
|---|---|---|---|
| Line 3: | Line 3: | ||
| ====== Materiale ajutătoare ====== | ====== Materiale ajutătoare ====== | ||
| - | * Pentru cei curioși, mai ales pentru matematica din spate, recomandăm, pentru acest laborator, capitolul 2 din cartea [[http://web.cs.ucdavis.edu/~liu/289I/Material/book-goldsmith.pdf|Wireless Communications - Andrea Goldsmith]] | + | <hidden> |
| + | |||
| + | fix lab5.cc to print MAC PH TX RX correctly | ||
| + | </hidden> | ||
| + | |||
| + | * Pentru cei curioși, mai ales pentru matematica din spate, recomandăm, pentru acest laborator, capitolul 2 din cartea [[https://ctipub-my.sharepoint.com/:b:/g/personal/mbarbulescu_upb_ro/ESbjitohgCNNmTHzyAjT-xcBahQw5XPlZKFOAMOLLMLSdQ?e=VstVsm|Wireless Communications - Andrea Goldsmith]] | ||
| * Celor curioși cu privire la bazele mecanismelor de retransmisie din TCP recomandăm [[http://www.pcvr.nl/tcpip/tcp_time.htm|capitolul 21 din TCP Illustrated]] | * Celor curioși cu privire la bazele mecanismelor de retransmisie din TCP recomandăm [[http://www.pcvr.nl/tcpip/tcp_time.htm|capitolul 21 din TCP Illustrated]] | ||
| Line 9: | Line 14: | ||
| Acest model calculează puterea la receptor după următoarea formulă | Acest model calculează puterea la receptor după următoarea formulă | ||
| - | [[https://www.nsnam.org/doxygen/classns3_1_1_log_distance_propagation_loss_model.html#details|descrisă în pagina ns-3]] | + | [[https://www.nsnam.org/docs/models/html/propagation.html#logdistancepropagationlossmodel|descrisă în pagina ns-3]] |
| + | |||
| Atributele pe care le putem controla din ns-3 sunt: exponentul, distanța de referință la care atenuarea e calculată și atenuarea de referință. | Atributele pe care le putem controla din ns-3 sunt: exponentul, distanța de referință la care atenuarea e calculată și atenuarea de referință. | ||
| Line 15: | Line 22: | ||
| ====== Modelul Three Log Distance ====== | ====== Modelul Three Log Distance ====== | ||
| - | Este la fel ca log distance însă folosește trei exponenți diferiți pentru "near, middle, far". Este descris [[https://www.nsnam.org/doxygen/classns3_1_1_three_log_distance_propagation_loss_model.html#details|matematic aici]]. ns-3 ne oferă posibilitatea de a configura distanțele și exponenții pentru "near, middle, far" și atenuarea de referință. | + | Este la fel ca log distance însă folosește trei exponenți diferiți pentru "near, middle, far". Este descris [[https://www.nsnam.org/doxygen/classns3_1_1_three_log_distance_propagation_loss_model.html#details|matematic în manualul ns3]]. |
| + | |||
| + | $$L = L_0 + 10 n \log(\frac{d}{d_0})$$ | ||
| + | |||
| + | |||
| + | ns-3 ne oferă posibilitatea de a configura distanțele și exponenții pentru "near, middle, far" și atenuarea de referință. | ||
| ====== Modelul Nakagami ====== | ====== Modelul Nakagami ====== | ||
| - | Este o generalizare a [[https://en.wikipedia.org/wiki/Rayleigh_fading|modelului popular Rayleigh]] (îl găsiți și în Goldsmith - TODO pagina). Descrierea lui este [[https://www.nsnam.org/doxygen/classns3_1_1_nakagami_propagation_loss_model.html#details|aici]], dar și în paper-ul scris de M. Nakagami: {{:isrm:laboratoare:new:nakagami1960.pdf|}}. | + | Este o generalizare a [[https://en.wikipedia.org/wiki/Rayleigh_fading|modelului popular Rayleigh]]. Descrierea lui este [[https://www.nsnam.org/doxygen/classns3_1_1_nakagami_propagation_loss_model.html#details|aici]], dar și în paper-ul scris de M. Nakagami: {{:isrm:laboratoare:new:nakagami1960.pdf|}}. |
| ====== Modelul Friis ====== | ====== Modelul Friis ====== | ||
| - | https://www.nsnam.org/doxygen/classns3_1_1_friis_propagation_loss_model.html#details | + | |
| + | Formula clasică din curs [[ https://www.nsnam.org/docs/models/html/propagation.html#friispropagationlossmodel | Friis ]]. | ||
| ====== Combaterea pierderilor ====== | ====== Combaterea pierderilor ====== | ||
| Line 90: | Line 103: | ||
| ====== Pregătirea laboratorului ====== | ====== Pregătirea laboratorului ====== | ||
| + | |||
| + | <note important> | ||
| + | Pe [[:isrm:mv|mașina virtuală]] aveți tot ce trebuie în ''/home/student/ns-3-dev''. | ||
| + | |||
| + | Dacă lucrați pe alt dispozitiv trebuie să rulați comenzile: | ||
| <code bash> | <code bash> | ||
| - | student@isrm:~$ git clone https://gitlab.com/b12mihai1/ns-3-dev.git | + | student@isrm-vm-2020:~$ git clone https://gitlab.com/nsnam/ns-3-dev.git |
| - | student@isrm:~$ cd ns-3-dev/ | + | student@isrm-vm-2020:~$ cd ~/ns-3-dev |
| - | student@isrm:~/ns-3-dev$ git checkout -b isrm_2020 remotes/origin/isrm_2020 | + | student@isrm-vm-2020:~/ns-3-dev$ git checkout -b ns-332-rel ns-3.32 |
| - | student@isrm:~/ns-3-dev$ git submodule update --init --recursive | + | student@isrm-vm-2020:~$ cd ~/ns-3-dev/examples |
| - | student@isrm:~/ns-3-dev$ cd scratch/ | + | student@isrm-vm-2020:~/ns-3-dev/examples$ git clone https://github.com/isrm-lab/ns3-labs.git |
| - | student@isrm:~/ns-3-dev/scratch$ ln -s ../examples/ns3-labs/lab-05-06-mcs/lab5.cc lab5.cc | + | student@isrm-vm-2020:~$ cd ~/ns-3-dev |
| - | student@isrm:~/ns-3-dev/scratch$ cd .. | + | student@isrm-vm-2020:~$ ./waf configure --build-profile=debug --enable-examples --enable-tests |
| - | student@isrm:~/ns-3-dev$ ./waf configure --build-profile=debug --enable-examples --enable-tests && ./waf build -j4 | + | student@isrm-vm-2020:~$ ./waf build -j4 |
| - | student@isrm:~/ns-3-dev$ ./waf --run "lab5 --apManager=ns3::ConstantRateWifiManager --phyRate=ErpOfdmRate54Mbps --propagationModel=0" | + | |
| </code> | </code> | ||
| + | </note> | ||
| Parametrii pe care simularea noastră îi primește: | Parametrii pe care simularea noastră îi primește: | ||
| Line 116: | Line 134: | ||
| cmd.AddValue("pcap", "Enable/disable PCAP Tracing", pcapTracing); | cmd.AddValue("pcap", "Enable/disable PCAP Tracing", pcapTracing); | ||
| cmd.AddValue("tries", "Max number of attempts to send frame (Short and Long Retry limit for station)", tries); | cmd.AddValue("tries", "Max number of attempts to send frame (Short and Long Retry limit for station)", tries); | ||
| - | </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> | </code> | ||
| Line 156: | Line 166: | ||
| Sarcina voastră este să plotați pe axa X distanța și pe axa Y throughput în Mbps - deci funcția throughput(distanță) pentru cele 4 modele prezentate mai sus în laborator. | Sarcina voastră este să plotați pe axa X distanța și pe axa Y throughput în Mbps - deci funcția throughput(distanță) pentru cele 4 modele prezentate mai sus în laborator. | ||
| + | |||
| + | Va puteti folosi de urmatorul template: | ||
| + | |||
| + | <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_NAKAGAMI = '/home/student/ns-3-dev/nakagami.txt' | ||
| + | DATA_FILE_LOG = '/home/student/ns-3-dev/log.txt' | ||
| + | DATA_FILE_LOG3 = '/home/student/ns-3-dev/log3.txt' | ||
| + | DATA_FILE_FRIIS = '/home/student/ns-3-dev/friis.txt' | ||
| + | columns = ['distance', '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_nakagami = np.genfromtxt(DATA_FILE_NAKAGAMI, delimiter=' ', names=columns, dtype=None) | ||
| + | sim_data_log = np.genfromtxt(DATA_FILE_LOG, delimiter=' ', names=columns, dtype=None) | ||
| + | sim_data_log3 = np.genfromtxt(DATA_FILE_LOG3, delimiter=' ', names=columns, dtype=None) | ||
| + | sim_data_friis = np.genfromtxt(DATA_FILE_FRIIS, delimiter=' ', names=columns, dtype=None) | ||
| + | |||
| + | def plot_distance_throughput_correlation(sim_data_nakagami, sim_data_log, sim_data_log3, sim_data_friis): | ||
| + | # 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('Distance (m)') | ||
| + | plt.ylabel('Throughput [Mbps]') | ||
| + | plt.title('Throughput distance correlation') | ||
| + | |||
| + | # Aici este construit efectiv graficul. Campul label va fi folosit in cadrul legendei graficului | ||
| + | # Daca in fisierul de output aveti toate valorile de distanta si de throughput, o sa remarcati ca pentru aceeasi distanta | ||
| + | # o sa aveti mai multe valori de throughput (din cauza ca in scenariul din script se avanseaza cu cate 5 metri si se sta pe loc | ||
| + | # o anumita durata de timp). Pentru simplitate, o sa alegem oricare valoare de throughput pentru o anumita distanta. Din moment ce | ||
| + | # pentru fiecare distanta se printeaza 10 valori, este suficient sa ne folosim de Python slicing si sa luam valorile din lista din | ||
| + | # 10 in 10. sim_data_nakagami['distance'][::10] inseamna ca din lista sim_data_nakagami['distance'] o sa iau elementele de pe | ||
| + | # pozitia 0, 10, 20 si tot asa. | ||
| + | ax.plot(sim_data_nakagami['distance'][::10], sim_data_nakagami['throughput'][::10], label='Nakagami') | ||
| + | ax.plot(sim_data_log['distance'][::10], sim_data_log['throughput'][::10], label='Log') | ||
| + | ax.plot(sim_data_log3['distance'][::10], sim_data_log3['throughput'][::10], label='3 Log') | ||
| + | ax.plot(sim_data_friis['distance'][::10], sim_data_friis['throughput'][::10], label='Friis') | ||
| + | ax.legend() | ||
| + | |||
| + | plt.show() | ||
| + | |||
| + | |||
| + | if __name__ == '__main__': | ||
| + | plot_distance_throughput_correlation(sim_data_nakagami, sim_data_log, sim_data_log3, sim_data_friis) | ||
| + | |||
| + | </code> | ||
| <hidden> | <hidden> | ||
| Line 181: | Line 252: | ||
| ===== [02] Packet delivery ratio UDP ===== | ===== [02] Packet delivery ratio UDP ===== | ||
| - | Plotați packet delivery ratio la nivel fizic (''tries=1'') și la nivel MAC (''tries=4,10'') pentru distanțele implicite din model, pentru trafic UDP. | + | Plotați packet delivery ratio la nivel fizic (''tries=1'') și la nivel MAC (''tries=4,10'') in functie de distanta pentru distanțele implicite din model, pentru trafic UDP. Prin packet delivery ratio se intelege raportul dintre numarul de pachete primite si numarul de pachete trimise (RX/TX). |
| Pentru ''tries=1'' alegeți ultimele două coloane pentru a contoriza pachetele trimise/primite - sunt extrase la nivel PHY. | Pentru ''tries=1'' alegeți ultimele două coloane pentru a contoriza pachetele trimise/primite - sunt extrase la nivel PHY. | ||
| - | Pentru ''tries=4,10'' alegeți pen-ultimele două coloane pentru a contoriza pachetele trimise/primite - sunt extrase la nivel MAC. | + | Pentru ''tries=4,10'' alegeți coloanele 4-5 pentru a contoriza pachetele trimise/primite - sunt extrase la nivel MAC. |
| + | |||
| + | <note important>Modelul ramane acelasi: Nakagami - pentru aceste rulari. Comanda este: | ||
| + | |||
| + | <code bash> | ||
| + | ./waf --run "lab5 --apManager=ns3::ConstantRateWifiManager --phyRate=ErpOfdmRate54Mbps --propagationModel=0 --tries=1" | ||
| + | </code> | ||
| + | |||
| + | Din ea veti varia numarul de ''tries'' | ||
| + | </note> | ||
| Line 210: | Line 290: | ||
| * Activați RTS/CTS pentru acest caz (''tries=1''). De ce nu se îmbunătățește situația TCP-ului? | * Activați RTS/CTS pentru acest caz (''tries=1''). De ce nu se îmbunătățește situația TCP-ului? | ||
| - | Plotați capacitatea obținută de TCP pentru ''tries=4, 10''. Explicați diferențele față de comportarea UDP în același setup. Observație: Capacitatea TCP crește când reîncercările la nivel MAC ascund pierderile. | + | Plotați capacitatea si packet delivery ratio obținute de TCP pentru ''tries=4, 10''. Explicați diferențele față de comportarea UDP în același setup. Observație: Capacitatea TCP crește când reîncercările la nivel MAC ascund pierderile. |
| **Bonus**: Vă puteți adăuga trace pentru pachete pierdute la nivel MAC în simulare astfel (vedeți și [[https://www.nsnam.org/docs/release/3.29/doxygen/_trace_source_list.html|documentația ns-3 - All TraceSources]]): | **Bonus**: Vă puteți adăuga trace pentru pachete pierdute la nivel MAC în simulare astfel (vedeți și [[https://www.nsnam.org/docs/release/3.29/doxygen/_trace_source_list.html|documentația ns-3 - All TraceSources]]): | ||
| Line 221: | Line 301: | ||
| Pe callbackurile mai sus definiți două funcții simple care incrementează un contor global. Cu acest tracing: Analizați pachetele pierdute și justificați folosind timpii de emisie ai pachetelor. | Pe callbackurile mai sus definiți două funcții simple care incrementează un contor global. Cu acest tracing: Analizați pachetele pierdute și justificați folosind timpii de emisie ai pachetelor. | ||
| - | ===== [04] ACK L2 vs L4 ===== | + | ===== [04 - Bonus] ACK L2 vs L4 ===== |
| Repetați experimentele cu TCP și UDP activând PCAP tracing. Urmăriți în PCAP momentul în care transmițătorul pachetelor de date UDP/TCP (adică AP-ul) nu mai primește ACK-urile de L2: | Repetați experimentele cu TCP și UDP activând PCAP tracing. Urmăriți în PCAP momentul în care transmițătorul pachetelor de date UDP/TCP (adică AP-ul) nu mai primește ACK-urile de L2: | ||