Internet bol navrhnutý pre prácu v režime best effort. Každý paket má rovnakú prioritu a nedochádza k umelému obmedzovaniu prevádzky. V prípade, že máme obmedzenú šírku pásma, je takéto riešenie nevyhovujúce. Z hľadiska užívateľa je rozdiel či meškajú pakety prinášajúce súbor cez FTP, alebo pakety pre VoIP. Iným problémom môže byť férovosť k rôznym uzlom v sieti.
Je teda vhodné rozdeliť dáta podľa nejakých atribútov do tried. Napríklad:
IP hlavička paketu obsahuje pole ToS (Type of service) špecifikujúce typ prenášaných dát (nastavuje odosielateľ paketu). Smerovače sa na jeho základe rozhodnú kam paket pošlú. Jeden z najstarších prístupov, moc sa neuchytil.
Klient komunikuje zo sieťou a pokúša sa rezervovať si zdroje pre spojenie. Používa sa RSVP (Resource reSerVation Protocol). Klient najprv požiada o pridelenie zdrojov pre určitý tok pričom špecifikuje aké má tok požiadavky. Ak sieť môže naplniť požiadavok, rezervuje zdroje a klient začne s prenosom. Je nutná komunikácia z mnohými prvkami v sieti. Zabezpečuje QoS pre jednotlivé dátové toky. Malo používane kvôli veľkej réžií.
Podobne ako u ToS routingu používame pole v hlavičke paketu. Rozdiel je v tom, že priradenie tohoto poľa neprevádza klient, ale smerovače na základe určitej klasifikácie. Narozdiel od Integrated services zabezpečuje QoS pre jednotlivé triedy.
Pre zabezpečenie kvality služby a zabráneniu zahltenia linky používame obmedzenie šírky pásma pre určité toky. Takto môžeme napríklad uprednostňovať VoIP pred FTP spojením (pakety s FTP môžu byt úmyselne zahadzované alebo zdržované). Používame fronty a klasifikáciu.
Pre obmedzovanie šírky pásma používame fronty. Fronty sú buffery kde sú uložené pakety čakajúce na odbavenie. Vo frontách môže dochádzať k prekladaniu paketov, k ich oneskoreniu či zahodeniu. Spôsob práce s paketmi určuje queue discipline (qdisc). Existujú dva druhy: triedne a beztriedne. Rozdiel je predovšetkým v tom, že triedne môžu mať potomkov, vďaka čomu môžeme vytvoriť hierarchickú štruktúru. Ku Konfigurácií front v linuxe používame utilitu tc obsiahnutú v balíku iproute.
Aby pakety spadli do správnej fronty, musia byt najprv správne klasifikované. Ku konfigurácií klasifikácie v linux používame iptables a utilitu tc. Typicky sledujeme ip adresy zdroja a cieľa, porty, typ protokolu a ToS pole v IP hlavičke.
CEIL=240 tc qdisc add dev eth0 root handle 1: htb default 15 tc class add dev eth0 parent 1: classid 1:1 htb rate ${CEIL}kbit ceil ${CEIL}kbit tc class add dev eth0 parent 1:1 classid 1:10 htb rate 80kbit ceil 80kbit prio 0 tc class add dev eth0 parent 1:1 classid 1:11 htb rate 80kbit ceil ${CEIL}kbit prio 1 tc class add dev eth0 parent 1:1 classid 1:12 htb rate 20kbit ceil ${CEIL}kbit prio 2 tc class add dev eth0 parent 1:1 classid 1:13 htb rate 20kbit ceil ${CEIL}kbit prio 2 tc class add dev eth0 parent 1:1 classid 1:14 htb rate 10kbit ceil ${CEIL}kbit prio 3 tc class add dev eth0 parent 1:1 classid 1:15 htb rate 30kbit ceil ${CEIL}kbit prio 3 tc qdisc add dev eth0 parent 1:12 handle 120: sfq perturb 10 tc qdisc add dev eth0 parent 1:13 handle 130: sfq perturb 10 tc qdisc add dev eth0 parent 1:14 handle 140: sfq perturb 10 tc qdisc add dev eth0 parent 1:15 handle 150: sfq perturb 10Reťazce "sfq" a "htb" určujú queue discipline, "rate" základnú rýchlosť, "ceil" max rýchlosť, "prio" je priorita. Hierarchia tried vyzerá nasledovne:
+---------+ | root 1: | +---------+ | +---------------------------------------+ | class 1:1 | +---------------------------------------+ | | | | | | +----+ +----+ +----+ +----+ +----+ +----+ |1:10| |1:11| |1:12| |1:13| |1:14| |1:15| +----+ +----+ +----+ +----+ +----+ +----+Nasledujúce príkazy zabezpečia, že pakety s daný markerom _n_ (handle _n_ fw) padnú do správnej fronty. Marker je číslo patriace paketu vrámci jadra.
tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10 tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11 tc filter add dev eth0 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:12 tc filter add dev eth0 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:13 tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:14 tc filter add dev eth0 parent 1:0 protocol ip prio 6 handle 6 fw classid 1:15Priradenie markeru prevedieme cez iptables.
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 22 -j MARK --set-mark 0x1 iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 22 -j RETURNPriradenie paketu fronte môžeme vykonať aj priamo (t.j. bez iptables+marker) pomocou príkazu tc filter.
tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 4.3.2.1/32 \ match ip sport 80 0xffff flowid 10:1Do fronty budú zaraďované pakety zo zdrojovej ip 1.2.3.4 port 80.