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 [2023/03/28 12:17] (current) dragos.niculescu [Modelul Friis] |
||
---|---|---|---|
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]] | + | * 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 9: | ||
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 17: | ||
====== 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 98: | ||
====== 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 129: | ||
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 161: | ||
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 247: | ||
===== [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 285: | ||
* 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 296: | ||
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: |