03. [10p] Clasificarea folosind ToS

Î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):

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.