Differences

This shows you the differences between two versions of the page.

Link to this comparison view

isrm:laboratoare:new:05 [2020/03/21 14:02]
vlad.traista [Ce vom face la laborator]
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 86: Line 94:
       * ce parametri se pot obține ca o funcție de coloane? Exemplu $probabilitate_{livrare} = primite/​trimise$  ​       * ce parametri se pot obține ca o funcție de coloane? Exemplu $probabilitate_{livrare} = primite/​trimise$  ​
       * ce grafice au axe care nu corespund direct unoar coloane din fișierul generat? cum se pot obține acele axe?       * ce grafice au axe care nu corespund direct unoar coloane din fișierul generat? cum se pot obține acele axe?
-  - prelucrați ​ieșirile simulatorului (stdout sau fișierul de trace) ​pentru a obține un fișier **text** de date intermediare cu semnificații clare pentru linii și coloane. Exemplu: fiecare linie e pentru o distanță, fiecare coloană e un counter de cadre sau un debit în Mbps       +  - prelucrați ​output-ul obtinut in urma rularilor succesive ​pentru a obține un fișier **text** de date intermediare cu semnificații clare pentru linii și coloane. Exemplu: fiecare linie e pentru o distanță, fiecare coloană e un counter de cadre sau un debit în Mbps       
-  ​- plotați interactiv datele intermediare. Unele grafice sunt o simplă dependență a două coloane (de exemplu Thruput(distanță)). Pentru combinații de coloane, gnuplot acceptă sintaxa ''>​ plot "​date"​ using 1:​($3*100.0/​$5) with ...''​ adică axa y este raportul coloanelor 3 și 5 în procente, iar axa x este coloana 1. Nu vă preocupați de partea estetică a graficelor (etichete, legendă, culori, etc).    ​+  ​
  
 ====== 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/​examplesgit clone https://​github.com/isrm-lab/ns3-labs.git 
-student@isrm:​~/​ns-3-dev/​scratchln -s ../examples/ns3-labs/​lab-04/​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 118: Line 131:
 </​code>​ </​code>​
  
 +Pentru a lansa aplicatia de Jupyter Notebook, rulati urmatoarea comanda:
 +
 +<code bash>
 +student@isrm-vm-2020:​~$ jupyter-notebook
 +</​code>​
  
 ====== Task-uri ====== ====== Task-uri ======
Line 143: 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 168: 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-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 197: 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 208: 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:
isrm/laboratoare/new/05.1584792120.txt.gz · Last modified: 2020/03/21 14:02 by vlad.traista
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0