Die grundlegenden Elemente beim Traffic Control unter Linux sind:
Immer wenn ein Paket gesendet werden soll wird es in die qdisc des entsprechenden Interfaces eingereiht. Sofort nach dem Einreihen in die qdisc erwartet der Kernel Pakete von der qdisc um diese an den Netzwerkkartentreiber weiterzuleiten.
Mit qdiscs (Queueing Discipline) kann festgelegt werden, in welcher Weise Daten gesendet werden. Es gibt einige unterschiedliche qdiscs, die mehr oder weniger komplex sind.
qdiscs, die keine Klassen unterstützen (classless qdiscs):
qdiscs, die Klassen unterstützen (classful qdiscs):
Manpage: tc-pfifo_fast
Die pfifo_fast qdisc ist eine sehr einfache qdisc ohne Unterstützung für Klassen und wird standardmäßig automatisch jedem Interface zugeordnet. Es gibt 3 Bänder, in die Pakete in Abhängigkeit ihres Type-of-Service (TOS) Flags gesteckt werden. Die Abbildung des TOS-Flags auf die Bänder wird entsprechend der priomap vorgenommen. Wenn noch Pakete in Band 0 warten, werden diese zuerst verarbeitet, danach alle aus Band 1 und zuletzt alle aus Band 2.
# tc -s -d qdisc ls dev eth2 qdisc pfifo_fast 0: bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 Sent 5223645364 bytes 9377278 pkt (dropped 0, overlimits 0 requeues 0) rate 0bit 0pps backlog 0b 0p requeues 0 Hier ist zu sehen, dass für eth2 die qdisc pfifo_fast aktiv ist. Es gibt 4 relevante Bits im TOS-Flag. Daher gibt es in der priomap 2^4=16 Werte.
Die Zuordnung der priomap zu den TOS-Flags ist standardmäßig folgendermaßen:
Höchste Priorität haben also Pakete mit TOS 8 oder 9 (Verzögerung minimieren oder Kosten minimieren und Verzögerung minimieren) |
Jedes einzelne der 3 Bänder kann so viele Pakete aufnehmen wie txqueuelen angibt. txqueuelen anzeigen: ip link show DEV # (siehe qlen) ifconfig DEV # (siehe txqueuelen) txqueuelen ändern:
ip link set DEV { txqueuelen | txqlen } NUMBER
ifconfig DEV txqueuelen NUMBER
|
Manpage: tc-tbf
Mit dem Token Bucket Filter kann die Übertragungsrate von ausgehenden Paketen begrenzt werden.
| Man kann sich diesen Filter folgendermaßen vereinfacht vorstellen: Es gibt einen Behälter (Bucket) mit einer festgelegten Größe (burst) in den mit einer bestimmten Geschwindigkeit (rate) Marken fallen. Der Behälter hat außerdem einen Eingang mit Warteschlange (limit/latency) und einen Ausgang für Pakete. Jedes Paket, dass zum Ausgang geleitet wird entfernt eine Marke aus dem Behälter. Mit der Füllrate des Behälters kann somit festgelegt werden wie schnell Pakete zum Ausgang geleitet werden.
Falls wenige Pakete durch den Filter geschickt wurden und somit der Behälter komplett mit Marken gefüllt ist kann so lange mit maximaler Datenrate gesendet werden wie Marken im Behälter vorhanden sind. Wenn das nicht erwünscht ist kann diese maximale Rate auch begrenzt werden (peakrate, mtu/minburst).
|
Größe der Eingangswarteschlange
Größe des Buckets in k:Kilobytes, m:Megabytes, mbit:Megabits, kbit:Kilobits oder b:Bytes
Gibt an wieviele Bytes von einem Paket mindestens beansprucht werden. (habe ich noch nicht richtig verstanden)
Bestimmt wie schnell der Behälter mit Marken gefüllt wird. (kbps, mbps, kbit, mbit, bps:Bytes/sec)
Maximale Rate, mit der Pakete gesendet werden dürfen.
Größe des Ausgangsbuckets. (Eigentlich ist ein zweiter Behälter an den “Haupt-Bucket” angefügt, mit dem die Ausgangsrate begrenzt werden kann) Die Parameter peakrate und mtu/minburst sind eher selten notwendig. Genaueres dazu ist in der Manpage zu finden. |
Einige qdiscs können Klassen beinhalten. In diesen Klassen können weitere qdiscs enthalten sein, in die Pakete eingereiht werden können. Diese Klassen können z.B. verwendet werden um ausgewählte Pakte bevorzugt zu behandeln.
Filter sind Teile von qdiscs und können im Zusammenhang mit Klassen verwendet werden um festzulegen welche Pakete in welche Klasse gesteckt werden.
Alle Operationen werden mit dem Programm tc ausgeführt. Im Folgenden einige grundlegende Kommandos.
| Kommando | Erklärung |
|---|---|
| tc [-s] [-d] qdisc ls [dev DEV] | Zeigt die vorhandenen qdiscs an. (Alle oder optional für ein ausgewähltes Device) -s gibt Statistiken mit aus (wieviele Bytes und Pakete die qdisc durchlaufen haben) -d zeigt Details mit an |
| tc [-s] [-d] class ls dev DEV | Zeigt die vorhandenen Klassen an. -s gibt Statistiken mit aus (wieviele Bytes und Pakete in der Klasse gelandet sind) -d zeigt Details mit an |
| tc filter ls dev DEV | Zeigt die vorhandenen Filter an. (Welche Pakete werden in welche Klasse gesteckt) |