Skip to content
Snippets Groups Projects
Commit 1882ae3c authored by Martin Mareš's avatar Martin Mareš
Browse files

TC

parent 101f3cda
No related branches found
No related tags found
No related merge requests found
# Traffic Control (náhodné poznámky)
## Priority paketů
### Hlavička IP
- 1 byte, jeho význam se postupně mění
- původní význam (RFC 791):
- 3b priorita, 3b Type of Service, 2b RFU
- TOS: flagy "low delay", "high throughput", "high reliability"
- později se TOS rozšíříl o jeden z RFU bitů: "low monetary cost"
- některé protokoly mají běžný TOS
- předefinováno (RFC 2474):
- 6b pro DSCP (Differntiated Services Code Point) + 2b na ECN (viz níže)
- ECN zabírá původní 2b RFU (low monetary cost prakticky nikdo nepoužíval)
- DSCP má nějaké doporučené hodnoty odpovídající původním kombinacím pri+TOS,
zbytek je site-local
### Linux
- paket má prioritu (`u32 skb->priority`)
- může s ní manipulovat netfilter
- u příchozích paketů se automaticky spočítá podle TOS (priority 0-7)
- odchozí spojení: `setsockopt(SO_PRIORITY)`, na prioritu >6 je potřeba capability
- také lze nastavit `setsockopt(IP_TOS)`, což přenastaví i prioritu
- cgroup `net_prio` může overridovat prioritu pro procesy ve skupině
## Queueing Disciplines
- ingress qdisc: může jenom klasifikovat a zahazovat pakety
- lze obejít přeposíláním paketů do imq (Intermediate Queueing Device)
- egress qdisc: může i zpožďovat pakety
- fronta se síťovce přiřazuje pomocí tc qdisc
- default: sysctl net.core.default_qdisc
- ale pozor, některé síťovky mají svoji qdisc (třeba mq)
- fronty mohou mít třídy
- do tříd se rozděluje buďto automaticky nebo filtrem
- k třídě může být připojena další qdisc
- číslování major:minor
- root je obvykle 1:0 (lze zkrátit na 1:)
- vstup do qdisc je major:0, třídy uvnitř mohou mít různé minors
- vstup do qdisc je major:0, třídy uvnitř mají různé minors
- pfifo_fast
### Základní qdiscs
- pfifo / bfifo
- classless
- fronta s omezením velikost v paketech (pfifo) nebo bytech (bfifo)
- když se přeplní, zahazuje nejnovější paket (tail drop)
- pfifo_fast (default)
- classless
- 3 bands (priority)
- tabulka překládající 4 bity TOS na band
- tabulka překládající prioritu na band
- tbf (Token Bucket Filter)
- classless
- účtuje se v bytech
- limit (maximální množství dat ve frontě na tokeny)
- též jde zadat jako maximální latence
- burst (velikost kyblíku)
- mpu (minimální velikost paketu)
- rate
- mpu (minimální velikost paketu)
- cell (zaokrouhlování velikosti paketu)
- red (Random Early Detection)
- classless
- udržuje si průměrnou velikost fronty (EWMA)
- podle toho upravuje pravděpodobnost označení paketu (ECN), případně zahození
- pozor, není to shaper, ale jen fronta
- sfq (Stochastic Fairness Queueing)
- classless
- identifikuje flows (na základě filtru nebo hash(ipproto src+dst addr+port))
- round-robin přes flows
- hešovací funkce se randomizuje po nastavitelném intervalu (=> kolize jen krátkodobé)
- integrovaná RED
- prio
- classful
- bands (priority)
- filtry přidělují band
- bands (priority), přidělují se buď filtrem, nebo se tabulkou překládá priorita paketu
- pro každý band další qdisc
- vždy odesílá band s nejvyšší prioritou, který má co odeslat
- příklad:
# tc qdisc add dev eth0 root handle 1: prio
## This *instantly* creates classes 1:1, 1:2, 1:3
......@@ -44,10 +95,6 @@
- mqprio
- jako mqueue, ale navíc umí priority
- až 16 traffic classes, každé přiřadíme interval HW front
- překlad sbk->priority na traffic class, priorita se získá z:
- setsockopt
- iptables
- net_prio cgroup
- umí HW-offloaded shaper pro každou třídu
## Filtry
......@@ -58,8 +105,8 @@
Nebo:
# tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip dst 4.3.2.1/32 flowid 10:1
# tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 1.2.3.4/32 flowid 10:1
# tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match ip dst 4.3.2.1/32 flowid 10:1
# tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match ip src 1.2.3.4/32 flowid 10:1
# tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2
Nebo kombinace:
......@@ -73,19 +120,21 @@ Nebo kombinace:
- příjemnější matchování podle vlastností paketů (à la xtables)
- též HW offloading
- též jde klasifikovat podle fwmarků nebo routing realms (i pro zdrojové adresy!)
- ematch (výrazy; umí i volat netfilterové podmínky a hledat v ipsetech)
- cgroup (controller `net_cls` přiřazuje skupině class ID)
- policing filter: umí pakety nad/pod nějakou mez průtoku/velikosti
- zahazovat
- reklasifikovat na best-effort
- pipe: předat další akci v pořadí
- reklasifikovat (znovu spustit filtr)
- ht: hash table
- xt: zavolá chain v xtables
- ematch
- akce:
- drop
- mirred (mirror nebo redirect na jiné zařízení)
- lze definovat uživatelské (tc action)
- xt: zavolá chain v xtables
- vlan (změna VLAN tagu)
- nat (1:1 NAT)
- pedit (packet editor)
- lze definovat uživatelské (tc action, něco jako podprogramy)
## Advanced Queue Management
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment