Ping implementierung in TCP mit fragen...

lumo

Top Contributor
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...
 
bei mir ist ein router gbit vorgeschaltet und ich hab eine 100mbit leitung...
aja, und manueller ping im cmd ist 30...
 
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.
 
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.
 
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.
 

Zurück
Oben