În Linux, strategiile de QoS se inspectează și configurează folosind comanda tc
. Termenul folosit pentru strategiile de QoS este qdisc
(de la queueing discipline
).
Afisați detalii despre qdisc-ul implicit, asociat interfeței eth0
de pe stația gateway
:
# tc qdisc show dev eth0 qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
Observați că qdisc-ul implicit este pfifo_fast
(strategia implicită de QoS):
priority FIFO
.0
conține pachete, cozile 1 si 2 NU vor fi servite.
Ce reprezintă priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
? În Linux, kernel-ul asociază fiecărui pachet o prioritate, în functie de campul TOS (Type of Service) din header-ul IP. Prioritatea ne selectează una din cele 3 (sub)cozi din pfifo_fast: coada 0, 1 sau 2. Asocierile se fac după următorul tabel:
TOS Means Linux Priority Band ------------------------------------------------------- 0x0 Normal-Service 0 Best Effort 1 0x2 Minimize-Monetary Cost 1 Filler 2 0x4 Maximize-Reliability 0 Best Effort 1 0x6 mmc+mr 0 Best Effort 1 0x8 Maximize-Throughput 2 Bulk 2 0xa mmc+mt 2 Bulk 2 0xc mr+mt 2 Bulk 2 0xe mmc+mr+mt 2 Bulk 2 0x10 Minimize-Delay 6 Interactive 0 0x12 mmc+md 6 Interactive 0 0x14 mr+md 6 Interactive 0 0x16 mmc+mr+md 6 Interactive 0 0x18 mt+md 4 Int. Bulk 1 0x1a mmc+mt+md 4 Int. Bulk 1 0x1c mr+mt+md 4 Int. Bulk 1 0x1e mmc+mr+mt+md 4 Int. Bulk 1
Observăm că pachetele normale (cu TOS 0x00) sunt introduse în (sub)coada 1. La punctul anterior, fluxul UDP avea o pierdere semnificativă de pachete. O primă soluție ar fi marcarea pachetelor de voce și video cu un ToS favorabil (de exemplu, 0x10
), pentru a avea prioritate mai mare față de pachetele. Marcarea se realizează folosind lanțul mangle
al comenzii iptables
:
root@gateway:~# iptables -t mangle -A OUTPUT -p udp --dport 6000:8000 -j TOS --set-tos Minimize-Delay
Comanda anterioară marchează toate pachetele UDP cu porturile în intervalul 6000 și 8000 cu tag-ul Minimize-Delay
. Se observă că se poate folosi numele tag-ului în loc de valoare (0x10
).
Rulați din nou scriptul iperf-gateway.sh
pe stația gateway
și observați că procentele pierdute s-au diminuat foarte puțin. Nu e suficientă doar o prioritizare a pachetelor.