This is an old revision of the document!


05. Lorem ipsum

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:

  • Fiecare clasa este identificată printr-un major și un minor, sub forma “major:minor”. Toate clasele dintr-o ierarhie trebuie să aiba același major.
  • Fiecare qdisc este identificat doar printr-un major. Minorul este întotdeauna zero. O scriere de forma major: este echivalentă cu major:0.
  • Deși nu este reprezentat, clasa 1:1 are un qdisc asociat (cel implicit).
  • Claselor 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:

  • Dacă un pachet se potrivește cu clasa 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.
  • Dacă un pachet se potrivește cu clasa 1:1 ȘI cu clasa 1:3, va fi tratat conform qdisc-ului clasei 1:3, adica sfq.
  • Analog pentru clasa 1:4.

Clasificarea pachetelor:

  • Pentru a decide din ce clasă face parte un pachet, trebuie definite filtre.
  • Un filtru specifică condițiile de match și clasa în care trebuie inclus pachetul.
  • De obicei, filtrele se atașează rădăcinii.

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:

  • voce: 1Mbps
  • video: 40Mbps
  • FTP: 5Mbps
  • HTTP: 3Mbps

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:

  • părintele, care este 1:
  • id-ul, fie acesta 1:1 (majorul trebuie sa fie același cu al părintelui, minorul poate fi orice)
  • parametrii htb: viteza și depășirea (burst-ul) acceptată
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.

saisp/labs/11/contents/05.1400404731.txt.gz · Last modified: 2014/05/18 12:18 by mihai.carabas
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0