Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
P
Povídání o Linuxu
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Deploy
Releases
Package registry
Model registry
Operate
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Martin Mareš
Povídání o Linuxu
Commits
1882ae3c
Commit
1882ae3c
authored
1 year ago
by
Martin Mareš
Browse files
Options
Downloads
Patches
Plain Diff
TC
parent
101f3cda
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
tc.md
+66
-17
66 additions, 17 deletions
tc.md
with
66 additions
and
17 deletions
tc.md
+
66
−
17
View file @
1882ae3c
# 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ř m
ohou mít
různé minors
-
vstup do qdisc je major:0, třídy uvnitř m
ají
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 p
arent 10:0 protocol ip
prio 1 u32 match ip dst 4.3.2.1/32 flowid 10:1
# tc filter add dev eth0 p
arent 10:0 protocol ip
prio 1 u32 match ip src 1.2.3.4/32 flowid 10:1
# tc filter add dev eth0 p
rotocol ip parent 10:
prio 1 u32 match ip dst 4.3.2.1/32 flowid 10:1
# tc filter add dev eth0 p
rotocol 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
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment