2016-07-09 28 views
1

Ich versuche, ein Spiel mit einem Multiplayer-Aspekt zu machen, aber bevor ich in den Kopf tauchte, habe ich versucht, eine einfache Ping-ähnliche Anwendung zu arbeiten . Aus irgendeinem Grund bekomme ich unter Windows ziemlich schlechte Ping-Zeiten (400ms oder so), während wenn ich es auf einem Mac versuche, ist es viel, viel besser (8ms oder so).Schlechte Latenz bei Windows im Vergleich zu Mac mit TCP in Java

Ich habe meinen Server und meinen Client. Der Server erstellt eine Socket clientSock mit serverSock.accept(), wobei serverSock eine andere Socket an Port 12234 ist. Der Client stellt eine Verbindung mit dem an meinem externen IP-Port 12234 mit einem anderen Socket in einer separaten Anwendung.

Mein Ping sendet im Grunde nur eine Nachricht der aktuellen Systemzeit auf meinem Client an den Server, und der Server sendet das gleich zurück, wo der Client die neue aktuelle Zeit von der empfangenen zurück subtrahiert und diese ausdruckt.

Java ist auf allen Computern, auf denen ich es getestet habe, auf dem neuesten Stand (3 Windows-Computer, 2 Macs und eine Windows Virtual Machine).

Seltsamerweise erhielt die Windows VM die gleichen 8 oder 9 ms Ping wie die Macs, während die Standalone Windows Maschinen im Bereich von 400ms lagen.

Eine andere seltsame Eigenart ist, dass wenn ich schneller ping, die Ping-Zeit auf etwa 200ms unter Windows sinkt.

Auch wenn ich meine externe Adresse an der Befehlszeile/Terminal ping, ist es etwa 1ms für beide Windows und Mac.

Alle Vorschläge oder Ideen würden sehr geschätzt werden!

Vielen Dank im Voraus!

+1

Sind sowohl die Windows- und die OSX Maschinen auf dem gleichen Netzwerk? Führen die Windows-Systeme eine Art Firewall aus? Alles andere, was zwischen den Systemen, die netzwerkbezogen sein könnten, unterschiedlich sein könnte? Zählen Sie die Latenz auch unter Windows und OSX auf die gleiche Weise? –

+0

Alle Maschinen befinden sich im selben Netzwerk. Ich bin ziemlich sicher, dass die Windows-Maschinen eine Firewall haben, nur weil sie standardmäßig eine Firewall haben, oder? Ich bin mir nicht sicher, wie es sich von Windows zu Mac unterscheidet. Können Sie sich irgendwelche anderen Diagnosewerkzeuge vorstellen, um so etwas zu testen? –

+0

Die Latenz wird auf die gleiche Weise gezählt, vorausgesetzt, dass die Java-Uhr auf beiden Systemen funktioniert. –

Antwort

1

Das Problem wurde gelöst.

Wie sich herausstellt, verwendet Windows Nagles Algorithmus, um Bandbreite zu sparen. Der Algorithmus führt jedoch eine Pufferzeit von 200ms ein, bevor Pakete tatsächlich gesendet werden.

Der Grund für die langsame Ping-Zeit unter Windows ist ein Ergebnis davon. Die ~ 400ms Zeiten sind 200ms, die vom Client ausgehen und dann 200ms vom Server zurück zum Client gehen.

All dies kann durch Aufrufen vonsetTcpNoDelay() an den Sockeln an beiden Enden gelöst werden.

http://www.rgagnon.com/javadetails/java-0294.html https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setTcpNoDelay(boolean)

+0

Für Spiele mit hohem Durchsatz und niedriger Latenz verwendet UDP nahezu einheitlich Spiele für die Kommunikation mit Spielen. TCP ist für nicht kritische Dinge wie Chat oder für Dinge, die geliefert werden müssen, aber es gibt keine Latenzbeschränkungen. –