Přenos dat mezi počítači (případně mezi počítačovými sítěmi) je vcelku obtížná záležitost. Ve většině případů si přejeme. aby data došla pokud možno co nejrychleji, nejbezpečněji, s minimálním zpožděním a rozptylem zpoždění atd. Právě toto nám zabezpečuje kvalita služby (QOS - quality of services).
QOS je určena následujícími parametry:
Při zajišťování QOS je třeba mít co největší šířku pásma a co nejmenší zpoždění, rozptyl a ztrátovost. Zpravidla pro nás některá data přenášená po síti mají větší cenu než jiná. Proto chceme mít možnost ovlivňovat QOS pro přijatá a odeslaná data podle různých kritérií, jako je cílový či zdrojový port, cílová či zdrojová IP adresa, velikost paketu atd.
Hodnota QOS závisí na všech vrstvách a komponentách síťového provozu (cílový počítač, zdrojový počítač, routery, huby, jednotlivé linky po kterých data putují) Některé z těchto komponent zpravidla nemůžeme ovlivnit, ale u některých to možné je. Naštěstí tedy máme možnost QOS poměrně jednoduše v Linuxu konfigurovat.
1: root qdisc
|
1:1 child class
/ | \
/ | \
/ | \
/ | \
1:10 1:11 1:12 child classes
| | |
| | |
| | |
10: 11: 12: qdisc
Čísla
- Př. u třídy 1:10 je 1 majoritní číslo a 10 minoritní číslo.
Třída - má stejně majoritní číslo jako rodič.
Qdisc - Jeho minoritní číslo je rovno 0. Přitom se často nezapisuje, tzn. 10:0 a 10: jsou 2 možnosti
zápisu stejného qdiscu.
Při příchodu na síťový interface je paket podle filtru pklasifikován např. takto:
1: -> 1:1 -> 1:11 -> 11:
Na konečné qdiscy je navázána implicitně pfifo_fast. Pokud to chceme změnit, je třeba provést změnu na jiný classless qdisc.
Druhy classfull qdisců:
# SMAZANI PUVODNIHO QDISCU NA ROZHRANI eth1
tc qdisc del dev eth1 root
# VYTVORENI htb KORENOVEHO QDISCU NA ROZHRANI eth1
# DEFAULT 10 ZNAMENA, ZE PAKETY KTERE NEVYHOVI ZADNEMU FILTRU DAVAME DO KONCOVEHO QDISCU 10:0
tc qdisc add dev eth1 root handle 1:0 htb default 10
# VYTVORENI TRID NA NEHO NAVAZANYCH
# RATE - OMEYENI POCTU PRENESENYCH DAT ZA 1 SEKUNDU
# CEIL - PRI POUZITI TOHOTO PARAMETRU SE KANAL MUZE "DELIT" SE SVYMI SOUROZENCI
# TZN. POKUD KANALEM 10 NEPROTEKAJI DATA, TAK KANALEM 11 MUZE PROTEKAT AZ 256kbit.
# CEIL BY MEL BYT VZDY VETSI NEZ RATE A MENSI NEZ RATE PREDKA.
tc class add dev eth1 parent 1:0 classid 1:1 htb rate 256kbit
tc class add dev eth1 parent 1:1 classid 1:10 htb rate 128kbit ceil 256kbit
tc class add dev eth1 parent 1:1 classid 1:11 htb rate 128kbit ceil 256kbit
# VYTVORENI QDISKŮ TYPU SFQ NAVAZANYCH NA TŘÍDY 1:10 A 1:11. HANDLE 10: IDENTIFIKACE PRO FILTRY.
# PERTURB 10 - POUZITO U SFQ. HASHOVACI FUNKCE ROZRAZUJICI DO PAKETY DO FRONT JE ZMENENA PO 10
# SEKUNDACH. 10 SEKUND JE IDEALNI HODNOTA PRO PERTURB.
tc qdisc add dev eth1 parent 1:10 handle 10:0 sfq perturb 10
tc qdisc add dev eth1 parent 1:11 handle 11:0 sfq perturb 10
# PRIKLAD DEFINICE FILTRU BEZ POUZITI IPTABLES. ROZRAZENI PODLE CILOVE IP ADRESY
tc filter add dev eth1 parent 1:1 protocol ip u32 match ip dst 10.0.0.10 flowid 1:10
tc filter add dev eth1 parent 1:1 protocol ip u32 match ip dst 10.0.0.11 flowid 1:11
# PRIKLAD DEF. FILTRU S POUZITIM IPTABLES A JEJICH TABULKY MANGLE. ROZRAZENI PODLE CILOVEHO PORTU.
iptables -t mangle -I FORWARD -d 10.0.0.10 -p tcp -i eth1 --dport 80 -j MARK --set-mark 10
iptables -t mangle -I FORWARD -d 10.0.0.10 -p tcp -i eth1 --dport 21 -j MARK --set-mark 11
tc filter add dev eth1 parent 1:1 protocol ip handle 10 fw flowid 1:10
tc filter add dev eth1 parent 1:1 protocol ip handle 11 fw flowid 1:11
Jak vidíme, konfigurace shapingu pomocí htb je poměrně jednoduchá a dává dobré výsledky z hlediska
přesnosti rate.
# NA eth0 NAVAZUJEME HANDLE ffff: PRO INGRESS. NASLEDNE VYTVARIME FILTR, KTERY # SE SNAZI OMEZIT PRICHOZI PROVOZ NA 256kbit POMOCI ZAHAZOVANI PAKETU. tc qdisc add dev eth0 handle ffff: ingress tc filter add dev eth0 parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate 256kbit burst 10k drop flowid :1Konfigurace policingu touto metodou ve srovnání s htb příliš přesná není (velikost přicházejících dat se tímto omezila asi na 440kbit.) Je však možno ovlivnit přesnost zmenšením kbelíku (parametr burst)
modprobe IMQ # Musíme přesměrovat příchozí provoz na naše virtuální IMQ zařízení ješte # před jeho jakýmkoliv zpracováním. iptables -t mangle -A PREROUTING -j IMQ # Nyní můžeme vytvořit strom stejně jako v předchozím případě. tc qdisc del dev imq0 root tc class add ...
[/root ]# modprobe bonding [/root ]# ip addr add 10.0.0.1/24 brd + dev bond0 [/root ]# ip link set dev bond0 up [/root ]# ifenslave bond0 eth2 eth3 master has no hw address assigned; getting one from slave! The interface eth2 is up, shutting it down it to enslave it. The interface eth3 is up, shutting it down it to enslave it. [/root ]# ifenslave bond0 eth2 eth3 [/root ]# cat /proc/net/bond0/info Bonding Mode: load balancing (round-robin) MII Status: up MII Polling Interval (ms): 0 Up Delay (ms): 0 Down Delay (ms): 0 Slave Interface: eth2 MII Status: up Link Failure Count: 0 Slave Interface: eth3 MII Status: up Link Failure Count: 0Vyčerpávající dokumentaci k této technice najdete v dokumentaci kernelu ($kernel_src/Documentation/networking/bonding.txt).