9.4. Terminologie

Es ist notwendig kompliziertere Konfigurationen richtig zu verstehen, daher zunächst die Erklärung von ein paar Konzepten. Aufgrund der Komplexität und der relativen Jugend der Sache, werden viele verschiedene Worte, die das gleiche bedeuten, verwendet.

Das Folgende basiert lose auf draft-ietf-diffserv-model-06.txt, An Informal Management Model for Diffserv Routers zu Deutsch: Ein informelles Managementmodell für Diffserv-Router. Aus draft-ietf-diffserv-model-06.txt ging die RFC3290 hervor.

Lies es für die genaue Definition der verwendeten Begriffe.

Queueing Discipline (qdisc)

Ein Algorithmus, der die Warteschlange eines Geräts verwaltet, entweder Eingehenden (Ingress) oder Eusgehende (Egress).

root qdisc

Die "root qdisc" ist die qdisc des angeschlossenen Geräts.

Classless qdisc

Eine qdisc ohne konfigurierbare interne Unterteilungen.

Classful qdisc

Eine "classful qdisc" beinhaltet mehrere Klassen. Einige dieser Klassen enthalten weitere qdisc, welche wiederum classful sein können, aber nicht müssen. Nach der strengen Definition *ist* pfifo_fast classful, weil es drei Bänder von Klassen beinhaltet. Jedoch von der Konfiguration aus Benutzersicht ist es classless, denn die Klassen können nicht mit dem tc-Werkzeug beeinflusst werden.

Classes

Eine "classful qdisc" kann viele Klassen haben und jede von ihnen innerhalb der qdisc. In eine Klasse wiederum, können mehrere Klassen hinzugefügt werden. So kann eine Klasse qdisc oder eine andere Klasse als Elternteil haben. Eine leaf-Klasse ist eine Klasse ohne Kind-Klassen. Diese Klasse hat 1 qdisc angehangen. Diese qdisc ist dafür verantwortlich, die Daten aus dieser Klasse zu senden. Wenn du eine Klasse erstellst, wird ihr eine FIFO-qdisc angehangen. Sobald eine Kind-Klasse hinzugefügt wird, wird diese qdisc entfernt. Für eine leaf-Klasse, kann diese FIFO-qdisc durch eine andere geeignetere qdisc ersetzt werden. Du kannst sogar diese FIFO-qdisc durch eine "classful qdisc" ersetzen, sodas du zusätzliche Klassen hinzufügen kannst.

Classifier

Jede "classful qdisc" braucht etwas, um zu bestimmen, zu welcher Klasse ein Paket gesendet wird. Das geschied mit dem "Classifier".

Filter

Klassifizierung wird unter Verwendung von Filtern durchgeführt. Ein Filter beinhaltet eine Reihe von Bedingungen, wenn sie passen, wird der entsprechende Filter benutzt.

Scheduling

Eine qdisc kann, mit Hilfe von einem Classifier, entscheiden, dass einige Pakete früher als andere gehen. Dieser Vorgang wird als Scheduling bezeichnet und wird beispielsweise durch die bereits erwähnte "pfifo_fast qdisc" ausgefährt. Scheduling wird auch "Reordering" genannt, aber dies ist verwirrend.

Shaping

Der Prozess der Verzögerung von ausgehenden, Traffic bestätigenden, Paketen, um eine konfigurierte maximale Geschwindigkeit zu gestalten. Shaping wird auf egress (Austritt) angwandt. Umgangssprachlich werden Drop-Pakete die den Traffic verlangsamen oft auch als Shaping bezeichnet.

Policing

Verzögerung oder Drop-Pakete, um den Traffic unter einer konfigurierten Bandbreite zu halten. In Linux kann Policing (Polizeiarbeit) nur ein Paket fallen lassen und nicht verzögern - es gibt kein 'ingress queue' (Eingangs-Warteschlange).

Work-Conserving

Die Work-Conserving von qdisc liefert immer ein Paket, sobald eines verfügbar ist. Mit anderen Worten, es wird nie ein Paket verzögert, wenn der Netzwerkadapter sendungsbereit ist (im Falle einer egress qdisc).

non-Work-Conserving

Einige Queues, wie zum Beispiel der Token Bucket Filter, können Pakete für eine bestimmte Zeit halten, um die Bandbreite zu begrenzen. Das bedeutet, sie weigern sich manchmal ein Paket zu übergeben, auch wenn es möglich währe.

Jetzt, da wir unsere Terminologie abgestimmt haben, schauen wir wo all diese Dinge sind.

                Userspace Programme
                     ^
                     |
     +---------------+-----------------------------------------+
     |               Y                                         |
     |    -------> IP Stack                                    |
     |   |              |                                      |
     |   |              Y                                      |
     |   |              Y                                      |
     |   ^              |                                      |
     |   |  / ----------> Forwarding ->                        |
     |   ^ /                           |                       |
     |   |/                            Y                       |
     |   |                             |                       |
     |   ^                             Y          /-qdisc1-\   |
     |   |                            Egress     /--qdisc2--\  |
  --->->Ingress                       Classifier ---qdisc3---- | ->
     |   Qdisc                                   \__qdisc4__/  |
     |                                            \-qdiscN_/   |
     |                                                         |
     +----------------------------------------------------------+
Dank an Jamal Hadi Salim für diese ASCII-Darstellung.

Der große Block stellt den Kernel dar. Der linke Pfeil steht für den, vom Netz kommenden, eingehenden Traffic in deine Maschine. Es geht dann zur Ingress Qdisc, wo die Filter auf das Paket angewendet und entschieden wird ob es fallen gelassen wird. Das nennt sich "Policing".

Dies geschieht schon in einem sehr frühen Stadium, noch ehe es viel vom Kernel zu sehen bekommt. Daher ist das ein sehr guter Ort um früh den Verkehr zu verwerfen, ohne viel CPU-Leistung zu verbauchen.

Darf das Paket weiter und sollte es für eine lokale Anwendung bestimmt sein, dann verarbeitet es der IP-Stack und übergibt es an ein Userpace-Programm. Das Paket kann auch ohne Angabe einer Anwendung sein, in diesem Fall wird es zum Egress (Austritt) weitergeleitet. Userspace-Programme können auch Daten liefern, die dann untersucht und zum Egress Classifier weitergeleitet werden.

Es wird untersucht und in die Warteschlange, zu einer beliebigen Anzahl von QDiscs, eingereiht. Im nicht konfigurierten Standardfall, gibt es nur eine installierte egress qdisc, die pfifo_fast, welche immer das Paket entgegen nimmt. Das nennt sich 'enqueueing' (Einreihen).

Das Paket sitzt nun in der qdisc und wartet darauf, dass der Kernel die Übertragung an die Netzwerkschnittstelle übernimmt. Das nennt sich 'dequeueing' (Ausreihen).

Dieses Bild gilt auch bei nur einem Netzwerkadapter - die Pfeile für Betreten und Verlassen des Kernels sollte nicht zu wörtlich genommen werden. Jeder Netzwerkadapter verfügt sowohl über Eingang als auch Ausgang.