QoS - Quality of Service - v0.4 |
Hier ist yes zusetzen wenn man das OPT_QOS einsetzen will und no wenn man das Gegenteil beabsichtigt
Mit QoS kann man die verfügbare Bandbreite regulieren und zum Beispiel auf verschiedene Ports, IP's und noch einiges mehr zu verteilen.
Ein Modem verwaltet eine Packet-Queue (Queue = Schlange, Reihe (in einer Schlange stehen)) in der Pakete gespeichert werden, die die verfügbare Bandbreite überschreiten. Bei DSL-Modems zum Beispiel, sind diese sehr groß. Das hat den Vorteil, daß recht gleichmäßig die maximale Bandbreite ausgenutzt werden kann. Denn schickt der Router an das Modem für kurze Zeit (sehr kurz) weniger Pakete, dann hat das Modem noch immer Pakete in der Queue, die es abzuarbeiten gilt. So eine Queue ist sehr simpel gehalten, denn dort geht alles der Reihe nacht, ist eben ein faires Modem :-D
Und hier kommt dann QoS ins Spiel. QoS verwaltet auch eine Packet-Queue, nur eben im Router selber und dort hat man die Möglichkeit König zu sein, eben zu entscheiden welches Paket zu erst darf und welche Pakete sich noch ein bischen zurückhalten müssen. Wenn alles richtig konfiguriert wurde, dann sendet QoS die Pakete gerade eben so schnell, daß sie nicht in die Packet-Queue des Modems landen. Das wäre so, als hätte man die Queue vom Modem in den Router geholt.
Noch etwas allgemeines zu den Geschwindigkeitseinheiten:
QoS unterstützt Mbit (Mega-Bit) und Kbit (Kilo-Bit), wobei gilt 1Mbit = 1024Kbit.
Hier sollte das Device eingetragen werden, über das Daten ins Internet übertragen werden.
Beispiele:QOS_INTERNET_DEV='ethX'
QOS_INTERNET_DEV='ppp0'
QOS_INTERNET_DEV='ipppX'
Maximale Downstreambandbreite des Internet-Zugangs. Siehe Hinweis zu den Geschwindigkeitseinheiten unter OPT_QOS.
Hinweis: Für zeitkritische Aufgaben, wie das bevorzugen von ACK-Paketen, ist es nötig die Bandbreite nicht höher zu setzen als wirklich vorhanden, da man sonst zwar innerhalb der Packet-Queue auf dem Router die Pakete sortiert, dies dann aber nicht ganz korrekt gemacht wird und letztendlich doch wieder in der Packet-Queue des Modems aufgehalten werden. Möglich ist es außerdem, das die vom Provider angegebene Bandbreite nicht hunderprozentig mit der wirklich verfügbaren übereinstimmt, es könnte ein bischen mehr oder auch weniger sein. Da ist also Ausprobieren angesagt.
Maximale Upstreambandbreite des Internet-Zugangs. Siehe Hinweis zu den Geschwindigkeitseinheiten unter OPT_QOS.
Hinweis: Siehe Hinweis bei QOS_INTERNET_BAND_DOWN.
Hier ist die Standardklasse für Pakete anzugeben, die aus dem Internet kommen. Alle Pakete, die nicht durch einen Filter in eine Klasse gesteckt wurden, landen dann in der angegebenen Klasse.
Wurde keine Klasse eingerichtet, für die die Variable QOS_CLASS_x_DIRECTION='down' gesetzt wurde, so setzt man:
QOS_INTERNET_DEFAULT_DOWN='0'
Beispiel:
QOS_INTERNET_DEFAULT_DOWN='2'eingetragen werden.
Verkehr der in eine nicht existierende Klasse geleitet wird, wird nur sehr langsam weiter geleitet. Wenn es einen Rest gibt, ist also unbedingt darauf zu achten, daß dieser in eine eigene Klasse gesteckt wird, die auch existiert.
Hier ist die Standardklasse für Pakete anzugeben, die in das Internet gehen. Alle Pakete, die nicht durch einen Filter in eine Klasse gesteckt wurden, landen dann in der angegebenen Klasse.
Wurde keine Klasse eingerichtet, für die die Variable QOS_CLASS_x_DIRECTION='up' gesetzt wurde, so setzt man:
QOS_INTERNET_DEFAULT_UP='0'
Das ganze funktioniert analog zu QOS_INTERNET_DEFAULT_DOWN.
Hier ist das Device anzugeben, über das das lokale Netzwerk angebunden ist.
Im standardfall wäre das also:
QOS_LOCALNET_DEV='eth0'
Maximale Übertragungsbandbreite ins lokalen Netz. Siehe Hinweis zu den Geschwindigkeitseinheiten unter OPT_QOS. Als Beispiel:
QOS_LOCALNET_BAND='10Mbit'
QOS_LOCALNET_BAND='100Mbit'
Hier ist die gewünschte Anzahl der Klassen (engl. Class) anzugeben.
Mit dieser Variable kann man Klassen verschachteln. Man gibt hier immer die Nummer der Vaterklasse an. Die Bandbreite die der Vaterklasse zugeteilt wurde, kann dann unter den Unterklassen weiter aufgeteilt werden. Die maximale Verschachtelungstiefe beträgt hier 4 Ebenen.
Soll die Klasse keine Unterklasse sein, so gibt man hier folgendes an:
QOS_CLASS_x_PARENT='0'Ihr wird dann je nachdem zu welcher Richtung sie gehört (sie QOS_CLASS_x_TYPE), maximal die in QOS_INTERNET_BAND_UP oder QOS_INTERNET_BAND_DOWN angegebene Bandbreite zugeteilt.
Bandbreite, die man der Klasse zusprechen will. Man könnte hier auch von einem Verhältnis sprechen. Siehe Hinweis zu den Geschwindigkeitseinheiten unter OPT_QOS.
Beispiel:
QOS_CLASS_1_MINBANDWIDTH='128kbit' QOS_CLASS_1_MAXBANDWIDTH='128kbit' QOS_CLASS_1_PARENT='0'Weiterhin hat man 3 Klassen dessen QOS_CLASS_x_MINBANDWIDTH- und QOS_CLASS_x_MAXBANDWIDTH-Einstellungen wie folgt aussehen und alle Unterklassen unserer ersten Klasse sind:
QOS_CLASS_2_PARENT='1' QOS_CLASS_2_MINBANDWIDTH='60kbit' QOS_CLASS_2_MAXBANDWIDTH='128kbit'Alle Unterklassen besitzen die selbe (oder auch keine) Priorität (siehe QOS_CLASS_x_PRIO).
QOS_CLASS_3_PARENT='1' QOS_CLASS_3_MINBANDWIDTH='40kbit' QOS_CLASS_3_MAXBANDWIDTH='128kbit'
QOS_CLASS_4_PARENT='1' QOS_CLASS_4_MINBANDWIDTH='28kbit' QOS_CLASS_4_MAXBANDWIDTH='128kbit'
Bandbreite, die man der Klasse maximal zuteilen will. Es macht keinen Sinn einen niedrigeren Wert als der in QOS_CLASS_x_MINBANDWIDTH einzutragen. Gibt man hier nichts an, so nimmt diese Variable automatisch den Wert von QOS_CLASS_x_MINBANDWIDTH an. Eine solche Klasse kann dann natürlich keine überschüssige Bandbreite beanspruchen.
Siehe Hinweis zu den Geschwindigkeitseinheiten unter OPT_QOS.
Mit dieser Variable wird angegeben, zu welcher Richtung die Klasse gehört. Soll sie zur Regulierung des Upstreams benutzt werden, so ist hier
QOS_CLASS_x_DIRECTION='up'anzugenben, für den Dwonstream analog:
QOS_CLASS_x_DIRECTION='down'
Hier wird geregelt, welche Priorität ein Klasse hat. Je niedriger die Nummer, desto höher die Priorität. Erlaubt sind werte zwischen 0 und 3. Wenn die Variable leer gelassen wird, so kommt das dem setzen einer 0 gleich.
Wenn eine Priorität gesetzt wird, dann wird darüber bestimmt, welcher Klasse zuerst Überschüssige Bandbreite angeboten wird. Um das klar zu machen, ändern wir das Beispiel aus QOS_CLASS_x_MINIMUMBANDWIDTH leicht ab:
QOS_CLASS_2_PARENT='1' QOS_CLASS_2_MINBANDWIDTH='60kbit' QOS_CLASS_2_MAXBANDWIDTH='128kbit' QOS_CLASS_2_PRIO='1'
QOS_CLASS_3_MINBANDWIDTH='40kbit' QOS_CLASS_3_PARENT='1' QOS_CLASS_3_MAXBANDWIDTH='128kbit' QOS_CLASS_3_PRIO='1'
QOS_CLASS_4_PARENT='1' QOS_CLASS_4_MINBANDWIDTH='28kbit' QOS_CLASS_4_MAXBANDWIDTH='128kbit' QOS_CLASS_4_PRIO='2'
Wie in dem Ursprungsbeispiel konsumiert Klasse 2 nur 20kbit und läßt somit einen Überschuß von 40kbit übrig. Klasse 3 und 4 wollen noch immer mehr Bandbreite als überhaupt verfügbar. Da nun aber Klasse 3 eine höhere Priorität als Klasse 4 hat, darf sie den Überschuß von 40kbit vertilgen.
Angenommen Klasse 3 braucht aber nur 20kbit des ursprünglichen Überschusses von 40kbit, dann bekommt Klasse 4 die restlichen 20kbit.
Nehmen wir nochmals etwas anderes an: Klasse 4 verbraucht gar keine Bandbreite und Klasse 2 und 3 wollen mehr als es überhaupt gibt. Dann bekommt jede erstmal ihre in QOS_CLASS_x_MINBANDWIDTH angegebene Bandbreite und der Rest wird unter ihnen im 60/40 Verhältnis aufgeteilt, da beide Klassen die selbe Priorität haben.
Wie man also sieht beeinflußt QOS_CLASS_x_PRIO nur, wie ein eventueller Bandbreitenüberschuß aufgeteilt wird.
Gewünschte Anzahl der der Filter angeben.
Mit dieser Variable stellt ihr ein, in welche Klasse das Paket, auf den dieser Filter zutrifft, gesteckt werden soll. Möchte man zum Beispiel die gefilterten Pakete in die Klasse, die mit den Variabeln QOS_CLASS_25_MINBANDWIDTH u.s.w. spezifiziert wurde, stecken, so müßte man hier
QOS_FILTER_x_CLASS='25'setzen.
IP-Adresse des zu begrenzenden Clients/Servers. Man kann hier auch IP Bereiche angeben zum Beispiel
QOS_FILTER_x_IP='192.168.6.0/24'
was auf alle Adressen in der Form 192.168.6.X zutrifft.
Diese Variable darf auch leer gelassen werden.
Übertragungen über diesen Port werden begrenzt. Falls die Variable leer ist, werden Übertragungen über sämtliche Ports limitiert. Wenn nach Ports gefilter wird, muß auch QOS_FILTER_x_TYPE etsprechend gesetzt werden.
Da sich die Ports beim Clientbetrieb von den Ports beim Serverbetrieb unterscheiden, muss angegeben werden ob der PC als Server oder als Client funktioniert. Das setzen dieser Variable ist nur wichtig im Zusammenhang mit QOS_FILTER_x_PORT
Mit dieser Variable kann man weitere Eigenschaften für den Router Aktiveren. Es darf hier höchstens eine der folgenden Möglichkeiten benutzt werden, denn eine Kombination macht keinen Sinn.
QOS_FILTER_x_OPTION='ACK'
Ein Paket das auf diese Option zutrifft, wird als Bestätigung für Datenpaket zurückgesendet. Wenn ihr z.B. einen großen Download am laufen habt, dann kommen bei euch viele Datenpakete an und für jedes muß eine Antwort gesendet werden, daß das Datenpaket angekommen ist. Lassen diese Bestätigungspakete auf sich warten, so so wartet der Datenversender ab, bis diese eingetroffen sind, bevor er neue Datenpakete sendet, was euch nicht so richtig schmeckt.
Das ganze ist insbesondere wichtig bei asymetrischen Verbindungen (ungleiche Up/Downstream-Bandbreite), wie sie bei den meisten privaten DSL-Angeboten üblich sind. Wird der meist relativ kleine Upstream an seine Grenzen gefahren, so stapeln sich die Pakete vor dem Ausgang förmlich auf und irgendwo in diesem riesigen Haufen sitzen hier und da die kleinen Bestätigungspakete. Im Normalfall geht das dann hübsch der Reihe nach. Bis das Bestätigungspaket dann an der Reihe ist, kann es gut sein, daß es so lange gedauert hat, daß unser Datenversender eine kleine Pause einlegt und was wie gesagt nicht gut für den Downstream ist.
Wir müssen also dafür sorgen, daß die Bestätigungspakete auf die Überholspur kommen, so daß sie in windeseile an allen "normalen" Paketen vorbeihuschen, damit sie auch noch rechtzeitig beim Datenversender ankommen. Wie sich dies Option sinnvoll mit einer Klasse kombinieren läßt, wird bei den Anwendungsbeispielen erläutert.
QOS_FILTER_x_OPTION='ICMP'
Ping-Pakete werden dazu benutzt, die Zeit zu messen, die ein Paket von A nach B braucht. Wenn ihr also ordentlich angeben wollt, dann gebt den Ping-Paketen z.B. eine höhere Priorität. Das hat jetzt nichts mit dem Spielen im Internet selber zu tun, also nicht denken nur weil ihr den Ping-Pakete den Vorrang gibt, daß ihr super niedrige Pingzeiten im Spiel bekommt...
QOS_FILTER_x_OPTION='TOSMD'
Erstmal zu TOS im allgemeinen:
TOS steht für "Type of Service". Eine Applikation kann für jedes Paket was es verschickt eines der 4 TOS-Bits setzen. Damit wird angegeben welche Behandlung für die Pakete vorgesehen sind. So kann z.B. SSH TOS-Minimum-Delay für das Versenden der ein und Ausgabe setzen und TOS-Maximum-Troughput für das Versenden von Dateien.
Generell benutzen Linux/Unix Programme diese Bits öfter als Windowsprogramme. Außerdem kann man z.B. auch it der Firewall die TOS-Bits für bestimmte Pakete setzen. Letztendlich kommt es dann aber auf die Router auf der Strecke an, ob die TOS-Bits beachtet werden, oder nicht.
Wirklich von Interesse für einen fli4l sind aber eigentlich nur die TOS-Bits Minimum-Delay und Maximum-Throughput.
Wird für Dienste benutzt, bei denen es wichtig ist, daß Pakete möglichst ohne Zeitverzögerung weitergeleitet werden. Empfolen wird dieses TOS-Bit für FTP (Kontrolldaten), Telnet und SSH.
QOS_FILTER_x_OPTION='TOSMT'
Wird für Dienste benutzt, bei denen es wichtig ist, daß große Datenmengen mit hoher Geschwindigkeit weitergeleitet werden. Empfolen wird dieses TOS-Bit für FTP-Data und WWW.
QOS_FILTER_x_OPTION='TOSMR'
Wird benutzt, wenn es wichtig ist, das man eine gewisse Sicherheit hat, daß die Daten an ihr Ziel gelangen, ohne das ein erneutes senden nötig ist. Empfolen wird dieses TOS-Bit für SNMP und DNS.
QOS_FILTER_x_OPTION='TOSMC'
Wird benutzt, wenn es wichtig ist die Kosten der Datenübertragung zu Minimieren. Empfolen wird dieses TOS-Bit für NNTP und SMTP.
Wie konfiguriert man OPT_QoS nun genau? Dies wird nun an einigen Beispielen gezeigt:
Ein einfaches Beispiel mit dem Ziel die Bandbreite auf 3 Rechner zu verteilen.
Dazu erstellen wir 4 Klassen (-> siehe QOS_CLASS_N und folgende) mit den jeweiligen Geschwindigkeiten (-> siehe QOS_CLASS_x_MINBANDWIDTH / QOS_CLASS_x_MAXBANDWIDTH) und haengen sie an die Klasse 0 (-> siehe QOS_CLASS_x_PARENT) also direkt an das Interface fuer "up" bzw. "down" (-> siehe QOS_CLASS_x_DIRECTION).
Die viert Klasse ist nur für eventuelle Besucher und bekommt weniger Bandbreite zugeteilt. Mit QOS_INTERNET_DEFAULT_DOWN='4' lassen wir in diesem Fall allen nicht gefilterten Verkehr in die vierte "Gast"-Klasse wandern. Da wir aber selten Gäste haben und die Bandbreite für die anderen 3 Klassen jeweils die selbe beträgt, bekommt jeder Rechner 1/3 der gesamten Bandbreite, effektiv also 256kbit.
Mit dieser Konfiguration haben wir allerdings erst das Grundgeruest erstellt. Jetzt muessen wir noch sagen welcher Verkehr durch welche Klasse geregelt werden soll.
Dazu benutzen wir Filter, welche den Verkehr den einzelnen Klassen zuordnen.
Wir erstellen also 3 Filter fuer die 3 Rechner (-> siehe QOS_FILTER_N und folgende) und Ordnen jeden Filter einer Klasse zu (-> siehe QOS_FILTER_x_CLASS). Jetzt koennen wir mit QOS_FILTER_x_IP, QOS_FILTER_x_PORT, QOS_FILTER_x_TYPE und QOS_FILTER_x_OPTION bestimmen was durch die jeweilige Klasse zu der der Filter gehoert geregelt werden soll.
Nennen wir das Interface 0 und die 3 Klassen 1, 2 und 3 und die 3 Filter F1, F2 und F3 ergibt sich Folgendes Bild:
Die Konfiguration sieht dann so aus:
Drei Rechner nach IP gefiltert die je 1/3 bekommen falls kein Gast anwesend ist:
OPT_QOS='yes' QOS_INTERNET_DEV='ppp0' # Device über das Daten ins Internet übertragen werden QOS_INTERNET_BAND_DOWN='768kbit' # Maximale Downstreambandbreite des Internet-Zugangs QOS_INTERNET_BAND_UP='128kbit' # Maximale Upstreambandbreite des Internet-Zugangs QOS_INTERNET_DEFAULT_DOWN='4' # Standardklasse für Down QOS_INTERNET_DEFAULT_UP='0' # Standardklasse für Up QOS_LOCALNET_DEV='eth0' # Device über das das lokale Netzwerk angebunden ist QOS_LOCALNET_BAND='10Mbit' # Maximale Übertragungsrate ins lokalen Netz (LAN) QOS_CLASS_N='4' QOS_CLASS_1_PARENT='0' # Vaterklasse QOS_CLASS_1_MINBANDWIDTH='232kbit' # Minimale Bandbeite, die der Klasse zugeteilt werden soll QOS_CLASS_1_MAXBANDWIDTH='768kbit' # Maximale Bandbreite, für die Klasse, leer entspricht MINBANDWITH QOS_CLASS_1_DIRECTION='down' # Richtung des Verkehrs, up oder down QOS_CLASS_1_PRIO='' # 0-3, leer entspricht 0 QOS_CLASS_2_PARENT='0' # Vaterklasse QOS_CLASS_2_MINBANDWIDTH='232kbit' # Minimale Bandbeite, die der Klasse zugeteilt werden soll QOS_CLASS_2_MAXBANDWIDTH='768kbit' # Maximale Bandbreite, für die Klasse, leer entspricht MINBANDWITH QOS_CLASS_2_DIRECTION='down' # Richtung des Verkehrs, up oder down QOS_CLASS_2_PRIO='' # 0-3, leer entspricht 0 QOS_CLASS_3_PARENT='0' # Vaterklasse QOS_CLASS_3_MINBANDWIDTH='232kbit' # Minimale Bandbeite, die der Klasse zugeteilt werden soll QOS_CLASS_3_MAXBANDWIDTH='768kbit' # Maximale Bandbreite, für die Klasse, leer entspricht MINBANDWITH QOS_CLASS_3_DIRECTION='down' # Richtung des Verkehrs, up oder down QOS_CLASS_3_PRIO='' # 0-3, leer entspricht 0 QOS_CLASS_4_PARENT='0' # Vaterklasse QOS_CLASS_4_MINBANDWIDTH='72kbit' # Minimale Bandbeite, die der Klasse zugeteilt werden soll QOS_CLASS_4_MAXBANDWIDTH='768kbit' # Maximale Bandbreite, für die Klasse, leer entspricht MINBANDWITH QOS_CLASS_4_DIRECTION='down' # Richtung des Verkehrs, up oder down QOS_CLASS_4_PRIO='' # 0-3, leer entspricht 0 QOS_FILTER_N='3' QOS_FILTER_1_CLASS='1' # Zielklasse QOS_FILTER_1_IP='192.168.0.2' # IP Adresse (oder Adressbereich), darf leer sein QOS_FILTER_1_PORT='' # Ziel- oder Sourceport, darf leer sein QOS_FILTER_1_TYPE='' # client oder server wenn nach Port gefiltert wird QOS_FILTER_1_OPTION='' # ACK, ICMP, TOSMD, TOSMT, TOSMR, TOSMC oder leer QOS_FILTER_2_CLASS='2' # Zielklasse QOS_FILTER_2_IP='192.168.0.3' # IP Adresse (oder Adressbereich), darf leer sein QOS_FILTER_2_PORT='' # Ziel- oder Sourceport, darf leer sein QOS_FILTER_2_TYPE='' # client oder server wenn nach Port gefiltert wird QOS_FILTER_2_OPTION='' # ACK, ICMP, TOSMD, TOSMT, TOSMR, TOSMC oder leer QOS_FILTER_3_CLASS='3' # Zielklasse QOS_FILTER_3_IP='192.168.0.4' # IP Adresse (oder Adressbereich), darf leer sein QOS_FILTER_3_PORT='' # Ziel- oder Sourceport, darf leer sein QOS_FILTER_3_TYPE='' # client oder server wenn nach Port gefiltert wird QOS_FILTER_3_OPTION='' # ACK, ICMP, TOSMD, TOSMT, TOSMR, TOSMC oder leer
Die Option QOS_INTERNET_DEFAULT_UP wurde auf 0 gesetzt da der Upstream nicht beschraenkt werden soll.
Ein Beispiel mit dem Ziel die Bandbreite auf 2 Rechner zu verteilen und die jeweiligen Bandbreiten pro Rechner wiederum noch ein zweites mal aufzuteilen auf einen Port und den restlichen Verkehr des jeweiligen Rechners.
Dazu erstellen wir erst einmal wieder 2 Klassen mit den jeweiligen Gesamtgeschwindigkeit und haengen sie direkt an das Interface fuer "up" bzw. "down" (-> siehe erstes Beispiel). Jetzt erstellen wir fuer den ersten Rechner an der ersten Klasse zwei weitere Klassen. Die Klassen werden genau so erstellt wie die beiden ersten Klassen direkt am Interface, allerdings mit einer Besonderheit: QOS_CLASS_x_PARENT ist jetzt nicht 0, sondern die Nummer der Klasse an die die Klassen angehaengt werden sollen. Ist dies z. B. QOS_CLASS_1, so muss man jetzt QOS_CLASS_x_PARENT von der Klasse die angehaengt werden soll auf 1 setzen. Das gleiche wird fuer den zweiten Rechner auch gemacht. Man haengt wieder zwei Klassen an die Klasse fuer den zweiten Rechner. Dies kann man nun nicht nur fuer zwei Rechner machen, sondern fuer so viele wie man moechte. Auch kann man so viele Unterklassen an einer Klasse erstellen wie man moechte.
Hiermit haben wir wieder das Grundgeruest erstellt und muessen nun mit den Filtern den Verkehr den einzelnen Klassen zuordnen. ( -> siehe erstes Beispiel)
Wir erstellen also 2 Filter fuer den ersten Rechner und 2 Filter fuer den zweiten Rechner. Jeweils einen Filter fuer den Port und einen Filter fuer den restlichen Verkehr vom Rechner. Hierbei ist unbedingt auf die Reihenfolge zu achten. Als erstes jeweils nur den Port und danach den Rest. Anders herum wuerde ja schon der Filter fuer den Rest alles einer Klasse zuordnen.
Nennen wir das Interface 0 und die 6 Klassen 1, 2, 3, 4, 5 und 6 und die 4 Filter F1, F2, F3 und F4 ergibt sich Folgendes Bild:
Die Konfiguration sieht dann so aus:
Zwei Klassen fuer 2 Rechner die je 1/2 bekommen, und zwar vom Interface, mit jeweils 2 Klassen fuer einen Port der 2/3 bekommt und den Rest der 1/3 bekommt, und zwar jeweils von der Vaterklasse:
OPT_QOS='yes' QOS_INTERNET_DEV='ppp0' # Device über das Daten ins Internet übertragen werden QOS_INTERNET_BAND_DOWN='768kbit' # Maximale Downstreambandbreite des Internet-Zugangs QOS_INTERNET_BAND_UP='128kbit' # Maximale Upstreambandbreite des Internet-Zugangs QOS_INTERNET_DEFAULT_DOWN='7' # Standardklasse für Down QOS_INTERNET_DEFAULT_UP='0' # Standardklasse für Up QOS_LOCALNET_DEV='eth0' # Device über das das lokale Netzwerk angebunden ist QOS_LOCALNET_BAND='10Mbit' # Maximale Übertragungsrate ins lokalen Netz (LAN) QOS_CLASS_N='6' QOS_CLASS_1_PARENT='0' # Vaterklasse QOS_CLASS_1_MINBANDWIDTH='384kbit' # Minimale Bandbeite, die der Klasse zugeteilt werden soll QOS_CLASS_1_MAXBANDWIDTH='768kbit' # Maximale Bandbreite, für die Klasse, leer entspricht MINBANDWITH QOS_CLASS_1_DIRECTION='down' # Richtung des Verkehrs, up oder down QOS_CLASS_1_PRIO='' # 0-3, leer entspricht 0 QOS_CLASS_2_PARENT='0' # Vaterklasse QOS_CLASS_2_MINBANDWIDTH='384kbit' # Minimale Bandbeite, die der Klasse zugeteilt werden soll QOS_CLASS_2_MAXBANDWIDTH='768kbit' # Maximale Bandbreite, für die Klasse, leer entspricht MINBANDWITH QOS_CLASS_2_DIRECTION='down' # Richtung des Verkehrs, up oder down QOS_CLASS_2_PRIO='' # 0-3, leer entspricht 0 QOS_CLASS_3_PARENT='1' # Vaterklasse QOS_CLASS_3_MINBANDWIDTH='256kbit' # Minimale Bandbeite, die der Klasse zugeteilt werden soll QOS_CLASS_3_MAXBANDWIDTH='768kbit' # Maximale Bandbreite, für die Klasse, leer entspricht MINBANDWITH QOS_CLASS_3_DIRECTION='down' # Richtung des Verkehrs, up oder down QOS_CLASS_3_PRIO='' # 0-3, leer entspricht 0 QOS_CLASS_4_PARENT='1' # Vaterklasse QOS_CLASS_4_MINBANDWIDTH='128kbit' # Minimale Bandbeite, die der Klasse zugeteilt werden soll QOS_CLASS_4_MAXBANDWIDTH='768kbit' # Maximale Bandbreite, für die Klasse, leer entspricht MINBANDWITH QOS_CLASS_4_DIRECTION='down' # Richtung des Verkehrs, up oder down QOS_CLASS_4_PRIO='' # 0-3, leer entspricht 0 QOS_CLASS_5_PARENT='2' # Vaterklasse QOS_CLASS_5_MINBANDWIDTH='256kbit' # Minimale Bandbeite, die der Klasse zugeteilt werden soll QOS_CLASS_5_MAXBANDWIDTH='768kbit' # Maximale Bandbreite, für die Klasse, leer entspricht MINBANDWITH QOS_CLASS_5_DIRECTION='down' # Richtung des Verkehrs, up oder down QOS_CLASS_5_PRIO='' # 0-3, leer entspricht 0 QOS_CLASS_6_PARENT='2' # Vaterklasse QOS_CLASS_6_MINBANDWIDTH='128kbit' # Minimale Bandbeite, die der Klasse zugeteilt werden soll QOS_CLASS_6_MAXBANDWIDTH='768kbit' # Maximale Bandbreite, für die Klasse, leer entspricht MINBANDWITH QOS_CLASS_6_DIRECTION='down' # Richtung des Verkehrs, up oder down QOS_CLASS_6_PRIO='' # 0-3, leer entspricht 0 QOS_FILTER_N='4' QOS_FILTER_1_CLASS='3' # Zielklasse QOS_FILTER_1_IP='192.168.0.2' # IP Adresse (oder Adressbereich), darf leer sein QOS_FILTER_1_PORT='80' # Ziel- oder Sourceport, darf leer sein QOS_FILTER_1_TYPE='client' # client oder server wenn nach Port gefiltert wird QOS_FILTER_1_OPTION='' # ACK, ICMP, TOSMD, TOSMT, TOSMR, TOSMC oder leer QOS_FILTER_2_CLASS='4' # Zielklasse QOS_FILTER_2_IP='192.168.0.2' # IP Adresse (oder Adressbereich), darf leer sein QOS_FILTER_2_PORT='' # Ziel- oder Sourceport, darf leer sein QOS_FILTER_2_TYPE='' # client oder server wenn nach Port gefiltert wird QOS_FILTER_2_OPTION='' # ACK, ICMP, TOSMD, TOSMT, TOSMR, TOSMC oder leer QOS_FILTER_3_CLASS='5' # Zielklasse QOS_FILTER_3_IP='192.168.0.3' # IP Adresse (oder Adressbereich), darf leer sein QOS_FILTER_3_PORT='80' # Ziel- oder Sourceport, darf leer sein QOS_FILTER_3_TYPE='client' # client oder server wenn nach Port gefiltert wird QOS_FILTER_3_OPTION='' # ACK, ICMP, TOSMD, TOSMT, TOSMR, TOSMC oder leer QOS_FILTER_4_CLASS='6' # Zielklasse QOS_FILTER_4_IP='192.168.0.3' # IP Adresse (oder Adressbereich), darf leer sein QOS_FILTER_4_PORT='' # Ziel- oder Sourceport, darf leer sein QOS_FILTER_4_TYPE='' # client oder server wenn nach Port gefiltert wird QOS_FILTER_4_OPTION='' # ACK, ICMP, TOSMD, TOSMT, TOSMR, TOSMC oder leer
Bei diesem Beispiel wurde die Option QOS_INTERNET_DEFAULT_DOWN so gewaehlt, daß der Verkehr, welcher nicht durch einen Filter einer Klasse zugeordnet wird, in eine nicht existierende Klasse gesteckt wird. Einfach aus dem Grund um das Beispiel zu vereinfachen und weil in dem Beispiel davon ausgegangen wird dass es keinen Rest gibt. Verkehr der in eine nicht existierende Klasse geleitet wird, wird nur sehr langsam weiter geleitet. Wenn es einen Rest gibt, ist also unbedingt darauf zu achten, daß dieser in eine eigene Klasse gesteckt wird, die auch existiert.
Die Option QOS_INTERNET_DEFAULT_UP wurde auf 0 gesetzt da der Upstream nicht beschraenkt werden soll.
Ein Beispiel, welches die allgemeine Funktionsweise von QoS versucht nahezubringen.
Auf diesem Bild ist noch einmal die Aufteilung aus dem zweiten Beispiel zu sehen, allerdings mit einer Erweiterung. An die Beiden Unterklassen der zweiten Klasse sind jeweils noch zwei weitere Unterklassen Angehaengt. Es ist also moeglich noch tiefer zu verschachteln. Allerdings bleibt hierbei zu beachten das es momentan nicht moeglich ist tiefer zu verschachteln als auf diesem Bild, also man darf maximal nur 3 Weitere Stufen nach dem Interface erstellen, danach ist Schluss. Dies ergibt dann eine Tiefe von 4, level 0 bis 3. In die "Breite" ist allerdings keine Grenze gesetzt. Man kann also an eine Unterklasse innerhalb einer Stufe so viele Klassen anhaengen wie man moechte.
Auf diesem Bild ist ausserdem noch zu erkennen, dass es auch moeglich ist mehr als einen Filter an eine Klasse zu haengen, so wie es an der Klasse 10 geschehen ist. Aber auch bei den Filtern bleibt zu beachten dass es Momentan nicht moeglich ist einen Filter mitten in den "Baum" zu heangen, so wie es mit F8 geschehen sollte.
Schauen wir uns nun als letztes noch den Sinn von Klassen und Unterklassen an. Klassen dienen dazu die Geschwindigkeit einer Verbindung einzustellen und zu regeln. Die Verteilung der Geschwindigkeit erfolgt wie bei QOS_CLASS_x_MINBANDWIDTH beschrieben. Allerdings kann dies einen Nachteil haben wenn man z.b. alle Klassen an eine Klasse haengt. Moechte man z.b. einem Rechner die haelfte der bandbreite geben und dem zweiten ebenfalls die haelfte allerdings aufgeteilt auf 2/3 http und 1/3 Rest also jeweils 2/6 und 1/6 vom ganzen. So geschieht nun folgendes: bei Vollast bekommt jeder seine haelfte. Uebertraegt der zweite jedoch nichts ueber http so bleibt ja 2/6 ueber. Diese 2/6 bekommt jedoch nun nicht der 2. Rechner alleine, sondern es wird nach dem beschriebenen Verfahren aufgeteilt. Um dieses zu verhindern erstellt man Unterklassen. Der Verkehr einer Klasse wird somit erst an die Unklassen verteilt, erst wenn diese nicht den Kompletten Verkehr beanspruchen wird der Rest an andere Klassen Verteilt. In dem Bild sind jeweils die Bereiche eingekreist welche zusammengehoren. Rot = 1, Blau = 2, Gruen = 5 und Orange = 6.
Beispielkonfiguration für das Bevorteilen von ACK-Paketen, damit der Downstream bei gleichzeitig starkem Upstream nicht einbricht:
OPT_QOS='yes' QOS_INTERNET_DEV='ppp0' # Device über das Daten ins Internet übertragen werden QOS_INTERNET_BAND_DOWN='768kbit' # Maximale Downstreambandbreite des Internet-Zugangs QOS_INTERNET_BAND_UP='128kbit' # Maximale Upstreambandbreite des Internet-Zugangs QOS_INTERNET_DEFAULT_DOWN='0' # Standardklasse für Down QOS_INTERNET_DEFAULT_UP='2' # Standardklasse für Up QOS_LOCALNET_DEV='eth0' # Device über das das lokale Netzwerk angebunden ist QOS_LOCALNET_BAND='10Mbit' # Maximale Übertragungsrate ins lokalen Netz (LAN)
Hier konfigurieren wir ppp0 als Internetdevice (DSL) und geben die für TDSL (und einiger anderer Provieder) übliche Up/Downstreambandbreiten an. Eventuell ist es nötig, daß wir die Upstreambandbreite noch um das eine oder andere Kilo-Bit herabsetzen, das muß man ausprobieren.
Da wir keine Klassen für den Downstream einrichten wollen, setzen wir QOS_INTERNET_DEFAULT_DOWN='0'. Für den Upstream soll die Klasse mit der Nummer 2 die Standardklasse sein. Das Netzwerkdevice ist eth0 und auf 10Mbit eingestellt.
QOS_CLASS_N='2' QOS_CLASS_1_PARENT='0' # Vaterklasse QOS_CLASS_1_MINBANDWIDTH='127kbit' # Minimale Bandbeite, die der Klasse zugeteilt werden soll QOS_CLASS_1_MAXBANDWIDTH='128kbit' # Maximale Bandbreite, für die Klasse, leer entspricht MINBANDWITH QOS_CLASS_1_DIRECTION='up' # Richtung des Verkehrs, up oder down QOS_CLASS_1_PRIO='' # 0-3, leer entspricht 0
QOS_CLASS_2_PARENT='0' # Vaterklasse QOS_CLASS_2_MINBANDWIDTH='1kbit' # Minimale Bandbeite, die der Klasse zugeteilt werden soll QOS_CLASS_2_MAXBANDWIDTH='128kbit' # Maximale Bandbreite, für die Klasse, leer entspricht MINBANDWITH QOS_CLASS_2_DIRECTION='up' # Richtung des Verkehrs, up oder down QOS_CLASS_2_PRIO='' # 0-3, leer entspricht 0
QOS_FILTER_N='1' QOS_FILTER_1_CLASS='1' # Zielklasse QOS_FILTER_1_IP='' # IP Adresse (oder Adressbereich), darf leer sein QOS_FILTER_1_PORT='' # Ziel- oder Sourceport, darf leer sein QOS_FILTER_1_TYPE='' # client oder server wenn nach Port gefiltert wird QOS_FILTER_1_OPTION='ACK' # ACK, ICMP, TOSMD, TOSMT, TOSMR, TOSMC oder leer
Zum Testen muß sucht man sich am besten eine gute oder mehrere Up- und Downloadquellen aus, von denen man weiß, daß sie sowohl den Up- als auch den Downstream voll auslasten können und läßt die Kabel glühen. Dabei sollte man einen Blick auf die Trafficanzeige des ImonC werfen. Am besten führt man das ganze auch mal ohne QoS durch.
Der Downstream sollte gar nicht oder wesentlich weniger stark einbrechen als ohne diese Konfiguration. Wie schon gesagt kann man die Lage noch verbessern, in dem man die Upstreambandbreite in Kilo-Bit-Schritten herabsetzt und dann die Auswirkungen beobachtet. Bei mir wurde zum Beispiel das Optimum bei 121kbit erreicht (kein Einbruch des Downstreams mehr). Dabei sind natürlich auch die MAXBANDWIDTH- und MINBANDWIDTH-Werte der Klassen entsprechend anzupassen.