diff --git a/tc.md b/tc.md index 9a0cc0c7551072b490c00904efb3e2be715c0f48..41166b6b78176ef85ac9a0b644c18903ba39f587 100644 --- a/tc.md +++ b/tc.md @@ -1,32 +1,83 @@ # 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