htb
este un qdisc classful (tratează traficul în mod diferențiat, în funcție de clasa din care face parte). Este varianta classful a tbf
(împarte traficul pe clase, apoi aplica tbf
pe fiecare în parte).
Clasele sunt organizate într-o structura de arbore. Cu cât o clasa este mai jos în ierarhie, cu atât este mai specifică. Fiecare clasă are asociată o strategie de QoS (qdisc). În mod implicit, qdisc-ul este pfifo_fast, iar acesta poate fi modificat.
Exemplu de ierarhie:
1: root qdisc (always present) | 1:1 child class (with default qdisc) / \ / \ 1:3 1:4 leaf classes (with user-defined qdiscs) | | 30: 40: qdiscs (sfq) (sfq)
Observații:
major:
este echivalentă cu major:0
.1:1
are un qdisc asociat (cel implicit).1:3
și 1:4
le-a fost schimbat qdisc-ul implicit (în loc de pfifo_fast
, avem sfq
, un qdisc ce funcționează după modelul Round Robin)Tratarea pachetelor:
1:1
, dar NU se potrivește cu clasa 1:3
sau 1:4
, va fi tratat conform qdisc-ului implicit al clasei 1:1
, adica pfifo_fast
.1:1
ȘI cu clasa 1:3
, va fi tratat conform qdisc-ului clasei 1:3
, adica sfq
.1:4
.Clasificarea pachetelor:
match
și clasa în care trebuie inclus pachetul.Ne propunem sa alocam cate o clasa fiecarui tip de trafic din cele definite în scenariu. Fiecare clasă de trafic va fi limitată la o lățime de bandă bine definită, astfel:
Toate configurațiile vor fi făcute pe interfața eth0
a stației gateway
(politifice de traffic shaping pot fi aplicate doar pentru traficul care iese pe o interfață). Mai întâi, trebuie să ștergem orice alt qdisc de pe interfața eth0
:
root@gateway:~# tc qdisc del dev eth0 root
Adăugam qdisc-ul htb
, cu majorul 1:
(sau 1:0
):
root@gateway:~# tc qdisc add dev eth0 root handle 1: htb
Definim prima clasa, cea pentru traficul de voce. Trebuie să specificăm:
1:
1:1
(majorul trebuie sa fie același cu al părintelui, minorul poate fi orice)root@gateway:~# tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit burst 128k
Procedăm analog și pentru restul claselor:
tc class add dev eth0 parent 1: classid 1:2 htb rate 40mbit burst 128k tc class add dev eth0 parent 1: classid 1:3 htb rate 5mbit burst 128k tc class add dev eth0 parent 1: classid 1:4 htb rate 3mbit burst 128k
Verificăm qdisc-ul asociat interfeței eth0
și ierarhia de clase adăugată:
root@gateway:~# tc qdisc show dev eth0 qdisc htb 1: root refcnt 2 r2q 10 default 0 direct_packets_stat 82 direct_qlen 1000 root@gateway:~# tc class show dev eth0 class htb 1:1 root prio 0 rate 1000Kbit ceil 1000Kbit burst 128Kb cburst 1600b class htb 1:2 root prio 0 rate 40000Kbit ceil 40000Kbit burst 128Kb cburst 1600b class htb 1:3 root prio 0 rate 5000Kbit ceil 5000Kbit burst 128Kb cburst 1600b class htb 1:4 root prio 0 rate 3000Kbit ceil 3000Kbit burst 128Kb cburst 1599b
Cu toate că am definit ierarhia de clase, nu am definit cum selectăm traficul pentru aceste clase. Vom folosi noțiunea de filtre oferită de utilitarul tc
. Definim primul filtru, ce selectează trafic cu portul destinație 8000
. Trebuie să specificam:
1:
- vom atasa toate filtrele în nodul rădăcina1
- toate filtrele vor avea aceeași prioritateu32
, ce poate face match pe header-ul IP1:1
:root@gateway:~# tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dport 8000 0xffff flowid 1:1
Procedăm analog și cu celelalte filtre:
root@gateway:~# tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dport 6000 0xffff flowid 1:2 root@gateway:~# tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dport 21 0xffff flowid 1:3 root@gateway:~# tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dport 80 0xffff flowid 1:4
Verificăm filtrele create:
root@gateway:~# tc filter show dev eth0 filter parent 1: protocol ip pref 1 u32 filter parent 1: protocol ip pref 1 u32 fh 800: ht divisor 1 filter parent 1: protocol ip pref 1 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:1 match 00001f40/0000ffff at 20 filter parent 1: protocol ip pref 1 u32 fh 800::801 order 2049 key ht 800 bkt 0 flowid 1:2 match 00001770/0000ffff at 20 filter parent 1: protocol ip pref 1 u32 fh 800::802 order 2050 key ht 800 bkt 0 flowid 1:3 match 00000015/0000ffff at 20 filter parent 1: protocol ip pref 1 u32 fh 800::803 order 2051 key ht 800 bkt 0 flowid 1:4 match 00000050/0000ffff at 20
Pe stația gateway, rulați din nou script-ul iperf-gateway.sh
. Asteptați 60 de secunde și inspectați output-ul afișat. Ce observați?
tbf
) pentru flow-urile UDP.