2010-05-05 10 views
8

In letzter Zeit habe ich this Frage gestellt. Aber die Antwort passt nicht zu meinen Anforderungen, und ich weiß, dass Datei-Hosting-Provider es schaffen, die Geschwindigkeit zu begrenzen. Also ich frage mich, was ist der allgemeine Algorithmus/Methode, um das zu tun (ich meine Download Technik) - insbesondere Begrenzung einzelner Verbindung/Benutzer Download-Geschwindigkeit.Wie ist es möglich, die Download-Geschwindigkeit zu begrenzen?

@ back2dos Ich möchte einem bestimmten Benutzer eine bestimmte Download-Geschwindigkeit geben (entsprechend den Hardwarefähigkeiten natürlich) oder mit anderen Worten, dem Benutzer die Möglichkeit geben, eine bestimmte Datei mit etwa 20kb/s herunterzuladen. Sicher möchte ich eine Fähigkeit haben, das zu einem anderen Wert zu ändern.

+0

müssen Sie präziser sein. Was ist das Szenario? Wen soll die Download-Geschwindigkeit einschränken? der eines bestimmten Benutzers oder tatsächlich der gesamte Upload des Servers? Warum willst du die Geschwindigkeit begrenzen? usw. – back2dos

+1

@ back2dos Ich denke, dass "warum .." Teil ist irrelevant und wird sowieso nicht helfen. Bezüglich des Szenarios - darum bitte ich hier :). –

+0

ok, "warum" ist teilweise irrelevant. Die Frage ist: Was wollen Sie erreichen, was ist Ihr aktuelles Problem und was ist die gewünschte Lösung? und welche Mittel siehst du passend? Welchen Server benutzen Sie? Ohne genauer zu sein, würde ich sagen, der einfachste Weg ist, deinen Server in Neuseeland zu hosten: P also, um eine vernünftige Antwort zu bekommen, könntest du wenigstens so freundlich sein zu sagen, welchen Webserver du benutzt? und was "Grenze" bedeutet? Möchten Sie eine gleichmäßige Verteilung zwischen Benutzern erreichen? muss es HTTP sein? und so weiter. – back2dos

Antwort

6

Sie einen Token-Bucket verwenden könnten (http://en.wikipedia.org/wiki/Token_bucket)

+0

Ja, obwohl der Token-Bucket Bursts zulässt. Sie können einen Token-Buck in einer hierarchischen Konfiguration auch einfach und sauber verwenden (Sie könnten wahrscheinlich auch einen undichten Bucket in einer Hierarchie verwenden, aber das harte Limit des Leaky-Buckets, IMHO, kompliziert das). –

0

Nun, da diese Antwort wirklich allgemein ist, hier ist ein sehr einfacher Ansatz für Plain TCP:

Sie setzen die Ressourcen-Handler aller Download-Verbindung in eine Liste, gepaart w Informationen darüber, welche Daten angefordert werden, und Schleife durch sie. Dann schreibst du einen Teil der benötigten Daten auf den Sockel, vielleicht etwa 1,5K, was die bekannteste maximale Segmentgröße ist, soweit ich weiß. Wenn Sie auf der Liste sind, fangen Sie von vorne an. Bevor Sie neu beginnen, warten Sie einfach auf die gewünschte durchschnittliche Bandbreite.

Wenn zu viele Clients eine niedrigere Bandbreite haben, als Sie zulassen, wird der TCP-Puffer wahrscheinlich explodieren. Einige TCP-Bindungen erlauben es, die Größe der aktuell gepufferten Daten für einen Socket zu finden. Wenn es einen Schwellenwert überschreitet, können Sie den Socket einfach überspringen.

Wenn zu viele Clients angeschlossen sind, haben Sie nicht genug Zeit, um alle Sockets zu schreiben. Nach einer Schleife müssen Sie also "auf eine negative Zeit warten". Das Erhöhen der Chunk-Größe könnte in solchen Szenarien die Dinge beschleunigen, aber irgendwann wird Ihr Server nicht schneller.

Ein einfacherer Ansatz besteht darin, dies auf der Client-Seite zu tun, aber dies kann viel Overhead verursachen. Die einfache Idee ist, dass der Client 1K alle 50ms anfordert (vorausgesetzt, Sie wollen 20KB/s). Sie können dies sogar über HTTP tun, obwohl ich eine größere Chunk-Größe dringend vorschlage, da HTTP enorme Kosten verursacht.

Meine Vermutung ist, am besten ist es, einen Webserver zu finden, der solche Dinge out-of-the-box machen kann. Ich denke, Apache hat eine Reihe von Modulen für alle Arten von Quoten.

greetz
back2dos

Verwandte Themen