Laborator 04 - Capacitatea ideală a mediului (continuare)

Concepte noi

Un mod explicit de rezervare a mediului se face prin intermefdiul pachetelor RTS/CTS. Emițătorul trimite RTS, iar receptorul răspunde cu CTS. În pașii 3 și 4 se transmit datele și confirmarea ACK în modul obișnuit. Diferența este acum că nodurile vecine au ocazia să estimeze durata conversației în 4 pași prin citirea câmpului Duration fie din RTS, fie din CTS.

Mai multe explicații despre RTS/CTS puteți citi:

Despre trafic TCP vă recomandăm reîmprospătarea cunoștințelor folosind TCP/IP Illustrated

[00] Pregătire laborator

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

[01] Capacitatea ideală simulare UDP 2 noduri RTS/CTS

Re-rulați simularea de capacitate ideală trafic UDP cu 2 noduri activând RTS/CTS.

mihai@wormhole:~/facultate/ns-3-dev$ ./waf --run "lab3 --numberOfNodes=2 \
   --payloadSize=1400 --offeredRate=11Mbps --phyRate=DsssRate11Mbps \
   --simulationTime=2 --tracing=true --enableRtsCts=true"

De ce este throughput-ul mai prost la UDP folosind RTS/CTS? Comparați cu rezultatul obținut la laboratorul trecut și cu cea dată de formulă.

Inspectați cele trei trace-uri generate: wifi-lab3.tr, AccessPoint-0-0.pcap Station-1-0.pcap

Ca template de bash pentru rularea scriptului, puteti folosi urmatorul template:

for mcs in 1 2 3 4
do
   for payload in 100 200 300 400
   do
        ./waf --run "lab3 --numberOfNodes=2 --payloadSize=$payload --offeredRate=11Mbps --phyRate=$mcs --simulationTime=2 --tracing=true --enableRtsCts=true"
   done
done

[02] Capacitatea ideală simulare TCP

Repetați experimentele de la traficul UDP din laborator 3, exercițiul 3 folosind trafic de tip TCP.

./waf --run "lab3 --numberOfNodes=2 --payloadSize=1400 \
   --offeredRate=11Mbps --phyRate=DsssRate11Mbps --simulationTime=2 --runTcp=true"

Parametrul phyRate (reprezinta MCS) va lua urmatoarele valori:

  • Pentru 802.11b:
  DsssRate1Mbps
  DsssRate2Mbps
  DsssRate5_5Mbps
  DsssRate11Mbps
  • Pentru 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.

Pentru a schimba standardul folosit in cadrul scriptului, modificati la linia.

Pe Oy pentru throughput extrageti valoarea obtinuta la Average throughput: 7.7728 Mbit/s

Puteți reduce timpii simulării folosind parametrul --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.

De ce iterăm peste aceste packet size-uri? Iată câteva valori din trafic real: VoIP ~ 20-300; DNS, TCP~ 500; Ethernet MTU=1500; 802.11 Beacon=380

[03] Capacitatea ideală simulare TCP cu RTS/CTS

Repetați experimentele de mai sus folosind RTS/CTS pentru traficul de tip TCP.

./waf --run "lab3 --numberOfNodes=2 --payloadSize=1400 \
   --offeredRate=11Mbps --phyRate=DsssRate11Mbps --simulationTime=2 --runTcp=true --enableRtsCts=true --tracing=true"

Înainte de a vă apuca de grafice: inspectați PCAP-ul și localizați pachetele de tip RTS/CTS. Ce MCS au acestea?

Îmbunătățește RTS/CTS situația TCP-ului?

[04] Capacitatea ideală simulare UDP/TCP multiple uplink

Vom evalua capacitatea în condiții noi: client unic vs. multipli uplink. Topologia este una specifică modului infrastructură, cu un AP și mai mulți clienți asociați, dar cadrele de beacon, autentificare și asociere sunt omise pentru simplitate. Realizați graficul doar pentru 802.11b, payloadSize=1460, phyRate=11Mbps

Scenariul pentru uplink este urmatorul: receptorul este reprezentat de AP, iar sursele sunt clienții 1..30 (pana la 30 de clienti).

Folosind acelasi script ca in exercitiile anterioare si variind doar numărul de clienți, construiti grafice care sa arate evolutia debitului cumulativ pentru toate fluxurile in functie de numarul de clienti. Realizati aceste grafice atat pentru trafic UDP, cat si pentru trafic TCP.

isrm/laboratoare/new/04.txt · Last modified: 2020/05/05 22:18 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