În cadrul laboratorului, vom explora principalele strategii de QoS din Linux. Pentru a observa comportamentul strategiilor implementate, vom folosi un model de trafic, compus din:
Traficul nu va fi real ci îl vom simula cu ajutorul lui iperf
prezentat anterior.
Fiecare tip de trafic din cele considerate mai sus are anumite caracteristici și constrângeri. Pentru o funcționare optimă, trebuie să ținem seama de acestea:
Dupa cum ați observat la exercițiul anterior, o conexiune iperf
client-server generează un singur tip de trafic (implicit, trafic TCP pe portul 5001). Noi dorim să generăm mai multe tipuri de trafic, concomitent, pentru a vedea cum se afectează între ele. Deci va trebui să instanțiem mai multe astfel de perechi, în background.
Vom crea un script cu numele iperf-client1.sh
care va porni 4 servere iperf
pe stația client1
(urmăriți comentariile):
#!/bin/bash # Asculta trafic UDP, pe port-ul 8000 - fluxul de voce iperf --server --udp --port 8000 &> out1.txt & # Asculta trafic UDP, pe port-ul 6000 - fluxul video iperf --server --udp --port 6000 &> out2.txt & # Asculta trafic TCP, pe port-ul 21 - fluxul FTP # Daca nu se specifica --udp, implicit este TCP iperf --server --port 21 &> out3.txt & # Asculta trafic TCP, pe port-ul 80 - fluxul HTTP # Daca nu se specifica --udp, implicit este TCP. iperf --server --port 80 &> out4.txt & echo "iperf servers started. Now run the script on the gateway."
Vom crea pe stația gateway
un script cu numele iperf-gateway.sh
care se va conecta la cele 4 servere pornite pe stația client1
, generând cele 4 tipuri de trafic prezentate anterior. Simulăm tipurile de trafic prin generare de pachete ce au caracteristici asemănătoare cu cele din cazurile reale. Urmăriți comentariile din fișier:
#!/bin/bash IP_VM="192.168.1.1" TIME=60 # Durata unui test # Initiaza un flux UDP catre server, pe portul 8000 # Fiecare datagrama are dimensiunea de 128 octeti (tipic pentru pachetele de voce) # Se trimite la o rata de 640Kbps (dorim sa simulam 10 conversatii VoIP, a cate 64Kbps) iperf -x SC --client $IP_VM --port 8000 --udp --len 128 --bandwidth 640K --time $TIME > out3.txt 2> /dev/null & # Initiaza un flux UDP catre server, pe portul 6000 # Fiecare datagrama are dimensiunea maxima (pentru ca nu o specificam explicit) # Se trimite la o rata de 30Mbps iperf -x SC --client $IP_VM --port 6000 --udp --bandwidth 30M --time $TIME > out4.txt 2> /dev/null & # Initiaza un flux TCP catre server, pe portul 80 (HTTP) # Limitam dimensiunea unui segment la 512 octeti iperf -x SC --client $IP_VM --port 80 --mss 512 --time $TIME > out1.txt 2> /dev/null & # Initiaza un flux TCP catre server, pe portul 21 (FTP) # Dimensiunea unui segment va fi de 1400 octeti (dorim ca fluxul FTP sa fie mai agresiv) # Dimensiunea ferestrei TCP va fi de 256K (dorim ca fluxul FTP sa fie mai agresiv) iperf -x SC --client $IP_VM --port 21 --window 256K --mss 1400 --time $TIME > out2.txt 2> /dev/null & wait for i in out*; do echo; cat $i; done rm out*.txt
Rulați script-urile create anterior (iperf-client1.sh
pe stația client1
și iperf-gateway.sh
pe stația gateway
). Așteptați 60 de secunde și inspectați output-ul de pe stația gateway
. Ce observați?
Observăm că fluxurile UDP au suferit packet loss, ele neavând nici un mecanism pentru retransmitere sau reglare a vitezei în funcție e starea legăturii. Pentru fluxul video, o pierdere de pachete de câteva procente este inacceptabilă. În continuare vom studia mecanismele implicite de QoS din Linux și cum putem preveni aceste pierderi de pachete.