die Erkennung von TCP/IP-packet-loss
Habe ich die tcp-Kommunikation über das socket-code wie :
public void openConnection() throws Exception
{
socket = new Socket();
InetAddress iNet = InetAddress.getByName("server");
InetSocketAddress sock = new InetSocketAddress(iNet, Integer.parseInt(port));
socket.connect(sock, 0);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
- und send-Methode als :
synchronized void send(String message)
{
try
{
out.println(message);
}
catch (Exception e)
{
throw new RuntimeException(this.getClass() + ": Error Sending Message: "
+ message, e);
}
}
Und ich Lesen von Webseiten, auf denen TCP/IP nicht garantieren, Lieferung Paket, wiederholt es aber, wenn Netz ist zu sehr damit beschäftigt, Paket kann gelöscht werden([link]).Eins
Pakete können gelöscht werden, wenn die übertragung von Daten zwischen Systemen aus zwei wichtigen Gründen:
- Schwere Netzwerk-Auslastung und die daraus resultierenden Staus
- Fehlerhafte Netzwerk-hardware oder Anschlüsse
TCP wurde entwickelt, um in der Lage sein zu reagieren, wenn Sie Pakete in einem Netzwerk. Wenn ein Paket erfolgreich an seinen Bestimmungsort, das Ziel-system sendet eine Bestätigungsnachricht zurück an die Quell-system. Wenn diese Bestätigung nicht innerhalb einer bestimmten Intervall, kann das entweder daran, dass das Ziel-system nie das Paket erhalten hat, oder weil das Paket mit der Bestätigung war selbst verloren. In jedem Fall, wenn die Bestätigung nicht empfangen wird, durch die source-system in der vorgegebenen Zeit, die source-system wird davon ausgegangen, dass das Ziel-system noch nie die Nachricht erhalten und sendet es neu aus. Es ist leicht zu sehen, dass, wenn die Leistung des Netzes schlechter, Pakete gehen verloren in den ersten Platz, und die erhöhte Belastung aus diesen weiterleiten von Nachrichten ist nur die Erhöhung der Last auf das Netzwerk, was bedeutet, dass mehr Pakete verloren gehen. Dieses Verhalten kann dazu führen, dass sehr schnell die Bildung einer kritischen situation auf das Netzwerk.
Gibt es eine Möglichkeit, dass ich erkennen kann wenn Paket erfolgreich empfangen wurde durch das Ziel ist oder nicht, ich bin nicht sicher, dass out.println(message);
wirft eine Ausnahme, als dieses ist, nicht blockierenden Aufruf. Es wird die Nachricht in einem Puffer und zurück zu lassen, TCP/IP seine Arbeit tun.
Hilfe?
- Das ganze Weiterverbreitung Prozess erfolgt in einer anderen Ebene. Sie don ' T haben Zugang zu über Java. Es ist für Sie erledigt.
- Aber ist garantiert, dass die re-übertragung auftreten wird, und erfolgreich zu sein? Kann es nicht scheitern?
- Das ist TCP für Sie. Es wird weiterhin wiederholt (mehr oder weniger). Sie würde wahrscheinlich ein timeout-Fehler, wenn es nicht erfolgreich war, nach einer gewissen Zeit.
- ja, über das timeout, wo bekomme ich das timeout? In java oder woanders?
- Es wird weitergegeben, um Java, ja. Überprüfen Sie heraus die
Socket
javadoc.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als dein Zitat sagt, ist TCP design zu reagieren automatisch auf die Ereignisse, die Sie erwähnen in diesem text. Als solche, die Sie nicht haben, etwas zu tun, auf dieser Ebene, denn diese wird von der TCP-Implementierung, die Sie verwenden (z.B. in der OS).
TCP hat einige features, die nicht Teil der Arbeit für Sie, aber Sie Fragen sich zu Recht, über Ihre Beschränkungen (viele Leute denken, dass TCP als garantierte Lieferung Protokoll, ohne Kontext).
Es ist ein interessante Diskussion auf der Linux Kernel Mailing-Liste ("Re: Client empfängt die TCP-Pakete, nicht aber ACK") über diese.
In Ihrem Anwendungsfall praktisch bedeutet dies, dass Sie sollten behandeln Sie Ihre TCP-Verbindung als ein Strom von Daten, die in jeder Richtung (der klassische Fehler ist, anzunehmen, dass, wenn Sie senden von n bytes aus am Ende wirst du Lesen n bytes in einen einzigen Puffer Lesen Sie am anderen Ende), und behandeln Sie mögliche Ausnahmen.
Umgang
java.io.IOException
s richtig (insbesondere Unterklassen injava.net
) decken Fehler-Fällen auf der Ebene, die Sie beschreiben: wenn Sie einen haben, einen wiederholen-Strategie (je nachdem, was die Anwendung und deren Benutzer gemeint ist, zu tun). Verlassen Sie sich auf timeouts zu (nicht-Satz eine Buchse, wie Sperrung für immer).Anwendung Protokolle können auch entworfen werden, um Ihre eigenen Quittierung beim Empfang von Kommandos oder Anfragen.
Dies ist eine Frage der Zuordnung von Verantwortlichkeiten auf verschiedenen Ebenen. Die TCP-stack-Implementierung mit der packet loss Probleme, die Sie erwähnen, und werfen eine Fehlermeldung/exception aus, wenn es kann es nicht reparieren sich von selbst. Seine Aufgabe ist die Kommunikation mit dem remote-TCP-stack. Da in den meisten Fällen werden Sie wollen Ihre Anwendung zu sprechen, um eine remote-Anwendung, es muss eine zusätzliche Bestätigung oben auf, dass. Im Allgemeinen ist die Anwendung Protokoll muss so gestaltet werden, um diese Fälle zu behandeln. (Sie können gehen eine Anzahl von Schichten bis in einigen Fällen, je nachdem, welche Person gemeint ist, die Verantwortung zu übernehmen, zur Bearbeitung der Anfragen/Befehle.)
out.println(mesaage)
ist non-blocking call und es erfolgt die Rückkehr nach dem senden der Nachricht nicht interessieren, ob Sie erreichte Reiseziel, oder nicht?TCP/IP nicht das Paket verwerfen. Der congestion-control-algorithmen innerhalb der TCP-Implementierung kümmern Weiterverbreitung. Unter der Annahme, dass es einen stetigen Strom von Daten gesendet, wird der Empfänger erkennen, welche Sequenz-Nummern erhielt er an den Absender zurück. Der Absender kann mit den Danksagungen zu entnehmen, der die Pakete erneut gesendet werden müssen. Der Absender hält die Pakete, bis Sie anerkannt wurden.
Als Anwendung, es sei denn, die TCP-Implementierung bietet Mechanismen zur Meldung von Staus, die beste, die Sie tun können, ist festzustellen eine für die Zeitüberschreitung, wenn die Transaktion abgeschlossen werden kann. Wenn das timeout Auftritt, bevor die Transaktion abgeschlossen ist, kann die Anwendung erklären das Netz, um zu überlasteten für die Anwendung um erfolgreich zu sein.
Code, was Sie brauchen. Wenn Sie brauchen, Danksagung, Sie umzusetzen. Wenn Sie möchten, dass der Absender den Empfänger bekam die information, dann haben die Empfänger senden, die irgendeine Art von Bestätigung.
Von einer Anwendung Sicht, TCP stellt eine bidirektionale, byte-stream. Können Sie kommunizieren was auch immer Informationen, die Sie wünschen, dass nur durch die Angabe von streams von bytes, vermitteln die Informationen, die Sie brauchen, um zu kommunizieren.
Nicht versuchen, TCP irgendetwas anderes tun. Versuchen Sie nicht zu "lehren " TCP" Protokoll.