# Ping implementierung in TCP mit fragen...



## lumo (7. Nov 2011)

Hallo

ich habe eine chat-anwendung geschrieben und auch einen PING eingebaut.
mein probem ist nun folgendes:

server und client am selben rechner, zugriff über localhost: ping: 0-6ms
server und client am selben rechner, zugriff über externe ip: ping 200-206ms
server und client am entfernten rechner (300km), zugriff über externe ip: ping ~270ms;

mir ist klar, dass man für ping normalerweise UDP verwendet, da es schneller ist.
mit den bestätigungen müsste ich den ping/2 dividieren, glaube ich.
also ein realistischer ping wäre ~35 gewesen, (70/2 wäre da eh genau )
ich mache während dem senden und empfangen, weder am client noch am server irgendwelche consolen ausgaben oder graphische aktionen.

der server sendet: packet(System.currentTimeMillis())
der client empfängt und sendet einfach das selbe paket wieder zurück;
der server empfängt und rechnet ping = (System.currentTimeMillis()-packet.getTimeStamp());

der effektive ping wäre dann ping/2;

was mir aber unklar ist, woher die 200ms herkommen...


----------



## TheDarkRose (7. Nov 2011)

Kommt immer darauf an wodurch geroutet wird und das ist oft unterschiedlich.


----------



## lumo (7. Nov 2011)

bei mir ist ein router gbit vorgeschaltet und ich hab eine 100mbit leitung...
aja, und manueller ping im cmd ist 30...


----------



## TheDarkRose (7. Nov 2011)

Ping = ICMP != UDP
Du machst da TCP und das ist klar, das dies etwas länger braucht, da je nach Nachrichtengröße mehrere Pakete verschickt werden, und für jedes Paket vom Empfänger mit einen ACK quittiert werden muss.


----------



## Lumaraf (7. Nov 2011)

In TCP gibt es noch eine Optimierung die zu leicht verzögerten Antworten führen kann. Die Optimierung läßt sich mit socket.setTcpNoDelay(true); deaktivieren. Unter Vista und 7 gibt es dabei aber leider einen Bug der bei dem Aufruf in einigen Fällen eine Exception verursacht.


----------



## TheDarkRose (7. Nov 2011)

Nicht nur das, sondern auch das der 3-Way handshake und das Quitteren jedes Paket bringt solche Zeiten einfach zusammen. Darum läuft ein Ping auch über ICMP.


----------



## lumo (7. Nov 2011)

Lumaraf hat gesagt.:


> In TCP gibt es noch eine Optimierung die zu leicht verzögerten Antworten führen kann. Die Optimierung läßt sich mit socket.setTcpNoDelay(true); deaktivieren. Unter Vista und 7 gibt es dabei aber leider einen Bug der bei dem Aufruf in einigen Fällen eine Exception verursacht.



das werd ich heute abend mal reingeben und testen! Danke!


----------



## lumo (10. Nov 2011)

jetzt ging der ping von 200 auf 100 runter


----------

