Table of Contents

Laborator 03 - Capacitatea ideală a mediului

Materiale ajutătoare

Teorie:

Concepte

Scop

Scopul acestui laborator este de a calcula capacitatea unui canal 802.11 pentru diverse standarde, în condiții ideale. Vom face o analiză teoretică folosind temporizările, randomizările, și dimensiunile antetelor din standard, versus estimarea în simulator.

[00] Pregătire laborator

Pe 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:

student@isrm-vm-2020:~$ git clone https://gitlab.com/nsnam/ns-3-dev.git
student@isrm-vm-2020:~$ cd ~/ns-3-dev
student@isrm-vm-2020:~/ns-3-dev$ git checkout -b ns-332-rel ns-3.32
student@isrm-vm-2020:~$ cd ~/ns-3-dev/examples
student@isrm-vm-2020:~/ns-3-dev/examples$ git clone https://github.com/isrm-lab/ns3-labs.git
student@isrm-vm-2020:~$ cd ~/ns-3-dev
student@isrm-vm-2020:~$ ./waf configure --build-profile=debug --enable-examples --enable-tests
student@isrm-vm-2020:~$ ./waf build -j4

Pentru a lansa aplicatia de Jupyter Notebook, rulati urmatoarea comanda:

student@isrm-vm-2020:~$ jupyter-notebook

[01] 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.

[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.

Pentru 802.11b, avem un antet PHY de 192 de biti care este trimis la un MCS de 1 Mbps:

Pentru 802.11g, avem un antet PHY de 16 us plus 24 de biti care sunt transmisi la un MCS de 6 Mbps:

Pentru inceput, vom calcula durata minima (in microsecunde) a unei tranzacții atomice de transmitere a unui cadru de date. Aceasta durata poate fi calculata ca suma duratelor urmatoarelor componente: DIFS, arbitraj, PHY header, MAC header, IP/UDP header, UDP Payload de x octeți, FCS (CRC), SIFS, antent PHY, ACK. Motivul pentru care avem un al doilea antet PHY este pentru ca mesajul de ACK este precedat la randul lui de un antet PHY.

Antetele de MAC, IP, UDP, payload-ul UDP, FCS si ACK-ul se transmit prin aer la rata MCS, măsurată în bps.

Folosiți duratele temporizărilor specificate în standard și dimensiunile antetelor PHY din schemele de mai sus:

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 IPv4 arata in felul urmator:

Header-ul UDP arata in felul urmator:

Mesajele de ACK au dimensiunea de 14 octeti.

Calculati duratele tranzactiilor atomice pentru 802.11b si 802.11g.

Durata unei tranzactii atomice pentru 802.11b este:

Click to display ⇲

Click to hide ⇱

50 + 310 + 192 / 1 + (24 + 20 + 8 + x + 4) *8 / MCS + 10 + 192 / 1 + 14 * 8 / MCS

[01b] Calcul si grafice throughput

Vom calcula throughput-ul ca raportul dintre dimensiunea payload-ului UDP (date utile) si durata unei tranzactii.

Calculati throughput-ul in Mbps pentru standardele 802.11b si 802.11g. Tineti cont ca throughput-ul va fi dependent de dimensiunea payload-ului UDP si de MCS.

Click to display ⇲

Click to hide ⇱

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)

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, in cadrul fiecarui grafic vor trebui construite 4 curbe (subgrafice) care sa corespunda urmatoarelor valori de MCS:

Graficele la care trebuie sa ajungeti sunt urmatoarele:

Pentru realizarea graficelor, puteti folosi urmatorul template:

import copy
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
 
MCS_802_11_B = [1, 2, 5.5, 11]
MCS_802_11_G = [6, 12, 24, 54]
PAYLOAD_SIZES = [100 * i for i in range(15)]
 
def compute_throughput_802_11_b(payload_size, mcs):
    #TODO - replace tput with the correct value based on the payload_size and mcs
    tput = 0
    return tput
 
def compute_throughput_802_11_g(payload_size, mcs):
    #TODO - replace tput with the correct value based on the payload_size and mcs
    tput = 0
    return tput
 
def plot_802_11_b_throughput():
    # 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
    for mcs in MCS_802_11_B:
        tput_values = [compute_throughput_802_11_b(payload_size, mcs) for payload_size in PAYLOAD_SIZES]
        ax.plot(PAYLOAD_SIZES, tput_values, label='%s' % mcs)
    ax.legend()
 
    plt.show()
 
def plot_802_11_g_throughput():
    #TODO
    pass
 
if __name__ == '__main__':
    plot_802_11_b_throughput()
    plot_802_11_g_throughput()

[02] Capacitatea ideală simulare

mihai@wormhole:~/facultate/ns-3-dev$ ./waf --run "lab3 --numberOfNodes=2 \
     --payloadSize=1400 --offeredRate=11Mbps --phyRate=DsssRate11Mbps --simulationTime=2"
Waf: Entering directory `/home/mihai/facultate/ns-3-dev/build'
Waf: Leaving directory `/home/mihai/facultate/ns-3-dev/build'
Build commands will be stored in build/compile_commands.json
'build' finished successfully (4.605s)
Flow 1 (10.0.0.2 -> 10.0.0.1)
  Tx Packets: 1964
  Tx Bytes:   2804592
  TxOffered:  11.2311 Mbps
  Rx Packets: 1388
  Rx Bytes:   1982064
  Throughput: 7.93722 Mbps
 
Average throughput: 7.7728 Mbit/s

numberOfNodes reprezintă numărul total de noduri (inclusiv AP-ul).

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

Parametrul phyRate (reprezinta MCS) va lua urmatoarele valori:

  DsssRate1Mbps
  DsssRate2Mbps
  DsssRate5_5Mbps
  DsssRate11Mbps
  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.

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