Geschwindigkeitsbegrenzender eingehender Verkehr

12

Ich habe nie ganz verstanden, ob es möglich ist, eingehenden Datenverkehr mit einer Rate zu begrenzen . Mir ist klar, dass es keine direkte Methode gibt, mit der ich die Übertragungsrate des Remoteservers für Pakete steuern kann (es sei denn, Sie haben die Kontrolle über beide Endpunkte). Unter Berücksichtigung dieser Einschränkung kann ich mithilfe von Download-Managern jedoch erfolgreich Download-Geschwindigkeitsbeschränkungen festlegen ?

Gibt es eine Verbindung zwischen TCP-Zeitlupenstart und ratenbegrenztem eingehendem Datenverkehr? Ist es möglich, mit den von slow-start beschriebenen Methoden die Rate des Sendens von Paketen durch den Absender künstlich zu begrenzen?

Als zusätzliche Überlegung sollte beachtet werden, dass der Server, auf dem Traffic Shaping implementiert werden soll, die PPPoE-Verbindung selbst herstellt und als Router für den Rest des Netzwerks fungiert.


Update: Die bisherigen Antworten geben einen guten Überblick über die Fragen, die ich gestellt habe, aber ich weiß immer noch nicht, wie Download-Manager den eingehenden Datenverkehr begrenzen können und ob es möglich ist, eine ähnliche Strategie auf einem zu implementieren Linux-Gateway-Box.

Richard Keller
quelle
Free Download Manager verwendet wahrscheinlich ihre eigenen Upload-Server und Torrent-Clients begrenzen meist die Anzahl der von ihnen verwendeten Verbindungen. Haben Sie sich auch mit "QOS" befasst?
DutchUncle
3
Die meisten Download-Manager beschränken einfach die Rate der zurückgesendeten ACKs und verlangsamen dadurch den eingehenden Datenstrom.
Chris S

Antworten:

12

Die Download-Manager arbeiten höchstwahrscheinlich wie im Trickle-Paper beschrieben .

Ein Prozess, der BSD-Sockel verwendet, kann eine eigene Ratenbegrenzung durchführen. Bei der Upstream-Begrenzung kann die Anwendung dies einfach dadurch tun, dass sie die Datenrate begrenzt, die in einen Socket geschrieben wird. In ähnlicher Weise kann eine Anwendung zur nachgeschalteten Begrenzung die Datenrate begrenzen, die sie aus einem Socket liest. Der Grund, warum dies funktioniert, ist jedoch nicht sofort ersichtlich. Wenn die Anwendung versäumt, Daten von einem Socket zu lesen, werden die Socket-Empfangspuffer voll. Dies wiederum führt dazu, dass das empfangende TCP ein kleineres Empfängerfenster (rwnd) anzeigt, wodurch ein Gegendruck auf die zugrunde liegende TCP-Verbindung entsteht und der Datenfluss eingeschränkt wird. Letztendlich wird durch diesen „Trickle-Down“ -Effekt eine durchgehende Ratenbegrenzung erreicht. Je nach Pufferung in allen Schichten des Netzwerkstapels kann die Übertragung dieses Effekts einige Zeit dauern.

Wenn Sie gelegentlich ein einzelnes Programm auf einem UNIX-System zeitlich beschränken müssen, ist eine einfache Lösung schwierig . Reales Traffic Shaping, wie Sie es an einem Gateway durchführen würden, kann mit durchgeführt werden tc. Dies ist in Kapitel 9 dokumentiert . Warteschlangendisziplinen für die Bandbreitenverwaltung des Linux Advanced Routing & Traffic Control HOWTO.

Sciurus
quelle
Tolle Antwort, genau das, wonach ich gesucht habe. Danke, Kopfgeld geht an dich.
Richard Keller
4

Im Fall eines 56k-Modems im Vergleich zu einer 4 Mbit / s-DSl-Leitung gibt es (normalerweise) keine Formgebung, die den Geschwindigkeitsunterschied bewirkt, sondern lediglich einen Unterschied in der Geschwindigkeit der Verbindung.

Der Grund, warum es schwierig ist, den eingehenden Verkehr zu beeinflussen, ist, dass das Übertragungsmedium keinen Puffer enthält. Sie akzeptieren entweder die eingehenden Bits oder sie gehen verloren. Damit der Datenverkehr eine Schnittstelle verlässt, können Sie Pakete so oft puffern und neu anordnen, wie Sie möchten (oder zumindest bis zum verfügbaren Pufferspeicher im Gerät).

Für Protokolle, die eine Schicht über TCP haben (ich weiß nicht, ob dies bei Torrents der Fall ist), wäre es eine einfache Angelegenheit, Anfragen nach weiteren Daten zu steuern. Andernfalls müsste die Anwendung mit dem Betriebssystem kommunizieren, um das ACKing der Pakete zu verzögern. Die meisten UDP-basierten Protokolle verfügen zwangsläufig über eine ACK / Resend-Logik im app-spezifischen Protokoll, sodass es an diesem Punkt fast trivial ist, diese zu beschleunigen.

Ein möglicher Weg wäre, den Verkehr aus dem Internet auf der LAN-Seite Ihres DSL-Routers zu formen, da Sie zu diesem Zeitpunkt einen Ausgangsport formen würden.

Vatine
quelle
3

Ich kann nicht antworten, warum Sie keine Lösungen gefunden haben, die es erlauben, eingehende Daten zu formen (und keine, die mir nicht bekannt sind), aber wie schnell der Absender Daten empfangen kann, weiß der Empfänger:

Das grundlegende Design von TCP / IP besteht darin, dass für jedes Paket, das die Quelle an das Ziel sendet, darauf gewartet werden muss, dass das Ziel (mit einem ACKPaket) antwortet , dass es das Paket empfangen hat.

Wenn Sie also einen 4-Mbit / s-Absender und einen 56-Kbit / s-Empfänger haben, muss der Absender zwischen dem Senden von Paketen warten, damit der Empfänger auf jedes Paket antwortet Niveau).

Was passiert also, wenn der Absender bereits 56 KBit / s Daten sendet und dann versucht, etwas mehr zu senden?

Das Paket geht verloren. (Nun, möglicherweise im Puffer eines Switches in der Warteschlange, aber wenn sich dieser füllt, geht das Paket verloren.) Da das Paket verloren gegangen ist, empfängt der Empfänger es nie und sendet daher nie ein ACKPaket. Da der Absender dieses ACKPaket nie empfängt (weil es nie gesendet wurde, aber auch verloren gehen oder das Netzwerk unterbrochen werden könnte), muss der Absender das zusätzliche Paket erneut senden . Es sitzt und versucht, das Paket erneut zu senden, bis es durch ist und die ACKAntwort darauf zurückkommt.

Um es noch einmal zusammenzufassen: Sobald der Absender die Bandbreite des Empfängers ausgeschöpft hat, muss er das nächste Paket anhalten und erneut senden, bis genügend Bandbreite zur Verfügung steht, damit es durchkommt. Dadurch wird die Sendegeschwindigkeit effektiv auf das Maximum reduziert, mit dem der Client empfangen kann. (Und es gibt Optimierungsmethoden, um die Anzahl der erneuten Sendevorgänge eines Pakets in diesem Fall zu verringern. Dabei verlangsamt sich der Absender grundsätzlich jedes Mal, wenn ein Paket erneut gesendet werden muss. Dies würde jedoch den Rahmen dieser vereinfachten Beschreibung sprengen.

Darth Android
quelle
1

Sie können dies mit einer ifb-Schnittstelle tun.

Mit einer ifb-Schnittstelle können Sie den Eingangsfluss von eth0 (oder was auch immer) zum Ausgang in ifb0 leiten (zum Beispiel) und dort die Grenzwertregeln anwenden.

Überprüfen Sie diese URL der Linux Foundation: http://www.linuxfoundation.org/collaborate/workgroups/networking/ifb

Und diese Skripte, die den Zu- und Abgang von Banden beschränken: https://github.com/rfrail3/misc/blob/master/tc/traffic-control.sh

Ricardo Fraile
quelle
0

Schauen Sie sich wondershaper an: http://lartc.org/wondershaper/

In Bezug auf eingehenden Verkehr:

This is slightly trickier as we can't really influence how fast the internet
ships us data. We can however drop packets that are coming in too fast,
which causes TCP/IP to slow down to just the rate we want. Because we don't
want to drop traffic unnecessarily, we configure a 'burst' size we allow at
higher speed.

Now, once we have done this, we have eliminated the downstream queue totally
(except for short bursts), and gain the ability to manage the upstream queue
with all the power Linux offers.
dmourati
quelle
-2

benutze UFW (Uncomplicated Fire Wall) http://ubuntuforums.org/showthread.php?t=1260812

Dieser Thread zeigt ein einfaches Beispiel, bei dem standardmäßig IPs mit 6 Treffern innerhalb von 30 Sekunden verweigert werden:

sudo ufw limit ssh/tcp

Auch ein "erweiterter" Befehl mit festgelegten Werten für Zeit und Trefferzahl

sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP

TonsOfFun111
quelle
1
Das hat wirklich nichts mit der Frage zu tun.
3.