Mein Kollege glaubte, es liege an der physischen Distanz, obwohl ich glaube, dass es nicht darauf ankommt. Meines Wissens nach ist es egal, wo sich der Server befindet, sobald Sie den ersten Handshake ausgeführt und der Datenfluss gestartet haben. Das Ergebnis sollte fast dasselbe sein. Vermisse ich hier etwas? Wie funktioniert es wirklich?
Sie hatten beide irgendwann Recht, aber Ihr Verständnis ist größtenteils richtig ... heute :). Es gibt ein paar Faktoren, die sich zwischen der älteren Antwort Ihres Freundes und den Fähigkeiten, die wir heute haben, geändert haben.
- TCP-Fensterskalierung
- Host Buffer Tuning
Der Unterschied in den Ergebnissen, den Sie gesehen haben, könnte beeinflusst worden sein durch:
- Paketverlust
- Parallele TCP-Übertragungen
TCP Window Scaling: Der Bandbreitenverzögerungseffekt
Wie Ihr Freund bereits erwähnt hat, litten ältere TCP-Implementierungen unter den Beschränkungen der ursprünglichen 16-Bit-Empfangsfenstergröße im TCP-Header (siehe RFC 793: Abschnitt 3.1 ). RWIN steuert, wie viele nicht bestätigte Daten in einem einzelnen TCP-Socket warten können. 16-Bit-RWIN-Werte beschränken Internetpfade mit Produkten mit hoher Bandbreitenverzögerung (und viele der heutigen Internetverbindungen mit hoher Bandbreite würden durch einen 16-Bit-Wert begrenzt).
Für hohe RTT-Werte ist es hilfreich, eine sehr große RWIN zu haben. Wenn Ihre Pfad-RTT von Malaysia in die USA etwa 200 ms beträgt, würde Sie die ursprüngliche TCP-RWIN auf 2,6 Mbit / s beschränken.
Durchsatz max = Rcv_Win / RTT
* Durchsatz max = 65535 * 8 / 0,200 *
Durchsatz max = 2,6 Mbit / s
RFC 1323 definierte einige "TCP-Optionen", um diese Einschränkungen zu überwinden. Eine dieser TCP-Optionen ist "Fensterskalierung". Es wird ein Skalierungsfaktor eingeführt, der den ursprünglichen RWIN-Wert multipliziert, um den vollen Wert des Empfangsfensters zu erhalten. Die Verwendung von Fensterskalierungsoptionen ermöglicht eine maximale RWIN von 1073725440 Byte. Dieselben Berechnungen anwenden:
Durchsatz max = Rcv_Win / RTT
* Durchsatz max = 1073725440 * 8 / 0,200 *
Durchsatz max = 42,96 Gbit / s
Denken Sie daran, dass TCP die RWIN über die Dauer einer Übertragung allmählich erhöht, solange der Paketverlust kein Problem darstellt. Um wirklich hohe Übertragungsraten über eine Verbindung mit hoher Verzögerung zu sehen, müssen Sie eine große Datei übertragen (damit TCP Zeit hat, das Fenster zu vergrößern), und der Paketverlust kann kein Problem für die Verbindung sein.
Paketverlust
Internet-Verbindungen über den Pazifischen Ozean sind manchmal ziemlich überlastet. Ein Teil meiner Familie lebt in Taiwan. Bei der Verwendung von Google Talk treten regelmäßig Probleme auf. Ich sehe oft einen Paketverlust von über 0,5%, wenn ich ihre DSL-Leitung aus den USA anpinge. Wenn Sie einen Verlust von etwa 0,5% für den "langsameren" Server feststellen, wird der Durchsatz für einen einzelnen TCP-Socket sehr leicht begrenzt.
Parallele TCP-Streams
Zu Ihrer Information, einige Geschwindigkeitstest-Websites verwenden parallele TCP-Streams, um den Durchsatz zu erhöhen . Dies kann sich auf die angezeigten Ergebnisse auswirken, da parallele TCP-Streams den Durchsatz drastisch erhöhen, falls der Pfad Paketverluste aufweist. Ich habe gesehen, dass vier parallele TCP-Streams ein 5-Mbit / s-Kabelmodem vollständig auslasten, bei dem ein konstanter Paketverlust von 1% auftrat. Normalerweise würde ein Verlust von 1% den Durchsatz eines einzelnen TCP-Streams verringern.
Bonusmaterial: Host Buffer Tuning
Viele ältere Betriebssystemimplementierungen hatten Sockets mit begrenzten Puffern. Bei älteren Betriebssystemen (wie Windows 2000) spielte es keine Rolle, ob über TCP große Datenmengen übertragen werden konnten. Die Socket-Puffer wurden nicht so eingestellt, dass sie die Vorteile der großen RWIN nutzen konnten. Es wurden viele Untersuchungen durchgeführt, um eine hohe Leistung bei TCP-Übertragungen zu ermöglichen . Moderne Betriebssysteme (für diese Antwort können wir Windows Vista und später "modern" nennen) enthalten bessere Pufferzuweisungsmechanismen in ihren Socket-Puffer-Implementierungen.