This is an old revision of the document!
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ă
# tc qdisc show dev tap1 qdisc htb 1: root refcnt 2 r2q 10 default 0 direct_packets_stat 940 # tc class show dev tap1 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 131055b cburst 1575b 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 1593b
* Cu toate ca am definit ierarhia de clase, nu am definit cum impartim traficul in aceste clase. Pentru aceasta, avem nevoie de filtre.
* Definim primul filtru, ce selecteaza trafic cu portul destinatie 8000. Trebuie sa specificam: protocolul de nivel 3: IP parintele: “1:” - vom atasa toate filtrele in nodul radacina prioritatea: “1” - toate filtrele vor avea aceeasi prioritate tipul de filtru: “u32”, ce poate face match pe header-ul IP. Alte filtre sunt “rsvp”, “route” etc., dar sunt folosite cu alte scopuri. conditia de match: portul destinatie (8000), si masca (0xffff - dorim sa facem match pe toti cei 16 biti) clasa in care va fi incadrat traficul (flowid): “1:1”
tc filter add dev tap1 protocol ip parent 1: prio 1 u32 match ip dport 8000 0xffff flowid 1:1
* Procedam analog si cu celelalte filtre:
tc filter add dev tap1 protocol ip parent 1: prio 1 u32 match ip dport 6000 0xffff flowid 1:2 tc filter add dev tap1 protocol ip parent 1: prio 1 u32 match ip dport 21 0xffff flowid 1:3 tc filter add dev tap1 protocol ip parent 1: prio 1 u32 match ip dport 80 0xffff flowid 1:4
* Verificam filtrele create:
# tc filter show dev tap1 filter parent 1: protocol ip pref 1 u32 fh 800::801 order 2049 key ht 800 bkt 0 flowid 1:1 match 00001f40/0000ffff at 20 filter parent 1: protocol ip pref 1 u32 fh 800::802 order 2050 key ht 800 bkt 0 flowid 1:2 match 00001770/0000ffff at 20 filter parent 1: protocol ip pref 1 u32 fh 800::803 order 2051 key ht 800 bkt 0 flowid 1:3 match 00000015/0000ffff at 20 filter parent 1: protocol ip pref 1 u32 fh 800::804 order 2052 key ht 800 bkt 0 flowid 1:4 match 00000050/0000ffff at 20
* Pe masina fizica, rulati din nou script-ul iperf-client.sh. Asteptati 60 de secunde. Inspectati output-ul de pe masina virtuala. Ce observati? Fiecare flux de trafic nu a depasit banda alocata. Packet-loss-ul este foarte mic pentru flow-urile UDP.