Ursache:
Um mit dem Netz zu kommunizieren, muss ein Programm Datenpakete mit Informationen an ein Gerät, wie eine ISDN-Karte, schicken. Dabei können mehrere Programme um das Gerät konkurrieren und deswegen gibt es dafür eine Warteschlange, eine sog. "Queue", in die die Pakete vom Programm hinein geschickt werden. Sobald das Gerät dann Zeit hat, holt es das Datenpaket aus der Warteschlange und verschickt es. bei eingehenden Verbindungen, so sieht es das Internetprotokoll TCP/IP vor, muss zu eingegangenen Daten eine Empfangsbestätigung verschickt werden, also kann ein Download durchaus einen Upload beeinflussen. Nun ist es so, dass unter Linux (das betrifft zumindest RedHat 9 und SuSE 9.1) standardmäßig die Warteschlange nach dem sog. "FIFO"-Prinzip abgearbeitet wird. FIFO steht hier für "First In, First Out" und bedeutet nichts anderes, als dass die Pakete, die zuerst in die Warteschlange kommen, auch die ersten sind die verschickt werden. Das führt nun bei langsamen Internetverbindungen dazu, dass ein ausgehender oder eingehender Datenstrom von einem Programm die Warteschlange mit einem Haufen Paketen füllt und andere Programme sich mit ihren Paketen hinten anstellen müssen und am Ende der Schlange verhungern.
Lösungsansatz:
Linux bietet eine Möglichkeit an das "Queuing" zu ändern. Statt der FIFO-Strategie zum Abarbeiten der Warteschlange, kann man bei Linux auch das sogenannte "SFQ" einstellen. SFQ steht hier bei für "Stochastic Fair Queuing". Dieses versucht die Pakete verschiedener Programme in einer möglichst fairen Reihenfolge abzuarbeiten, damit kein Datenstrom alle anderen blockiert, wie es bei FIFO der Fall ist. Warum dieses Verfahren nicht der Standard unter Linux is, weiß wohl nur Linux Torvalds.
|
# set sfq scheduling for packets on ippp0: /usr/sbin/tc qdisc add dev ippp0 root sfq perturb 10 # show settings: /usr/sbin/tc -s -d qdisc ls |
Die erste Zeile aktiviert für das Gerät "ippp0" den SFQ Modus. "ippp0" ist auf meinem System die ISDN-Karte.
Die zweite Zeile gibt die Einstellungen der Geräte auf der Kommandozeile aus, sodass man, wenn man dieses Script auf der Konsole ausführt, gleich die aktuellen Einstellungen angezeigt bekommt.
Schritt B: Automatisches ausführen des Scripts.
Nun geht es darum, diese Einstellung wirksam zu mchen, sobald eine Internetverbindung aufgebaut wird.
Unter SuSE Linux 9.1 und wahrscheilich auch einigen anderen Distributionen, gibt es ein Verzeichnis in denen Startscripte untergebracht sind, die in dieser Situation ausgeführt werden. Das Verzeichnis heißt: "/etc/ppp/ip-up.d", dahin kopiert man demzufolge auch das gerade erzeugte Script.
Ist die Datei "trafficshaper.sh" nach "/etc/ppp/ip-up.d" kopiert, seid ihr fertig mit der Konfiguration. Fehlt nur noch:
Schritt C: Konfiguration testen.
Öffnet dazu ein Konsolenfenster, trennt die Internetverbindung und verbindet erneut. Nun gebt auf der Kommandozeile ein:
/usr/sbin/tc -s -d qdisc ls
Wenn alles gut gelaufen ist, sollte dort in etwa soetwas stehen:
qdisc pfifo_fast 0: dev eth0 [Unknown qdisc, optlen=20]
Sent 497960 bytes 844 pkts (dropped 0, overlimits 0)
qdisc sfq 8002: dev ippp0 limit 128p quantum 1536b flows 128/1024 perturb 10sec
Sent 1425442 bytes 11328 pkts (dropped 0, overlimits 0)
Wie ihr seht, ist für das Gerät "ippp0" der SFQ Modus aktiviert und damit sollte ein langer Download auch nicht mehr derart die Verbinung für andere Programme blockieren, wie er es vorher tat.