wake-up-neo.com

Was ist der Unterschied zwischen Verbindung und Lesezeitlimit für Sockets?

3 Fragen:

  1. Was ist der Unterschied zwischen Verbindung und Lesen Timeout für Sockets?

  2. Was bedeutet Verbindung Timeout auf "unendlich" gesetzt? In welcher Situation kann es in einer Endlosschleife bleiben? und was kann auslösen, dass die Endlosschleife stirbt?

  3. Was bedeutet lesen Timeout auf "unendlich" gesetzt? In welcher Situation kann es in einer Endlosschleife bleiben? und was kann auslösen, dass die Endlosschleife stirbt?

156
corgrath

1) Was ist der Unterschied zwischen Verbindungs- und Lesezeitlimit für Sockets?

Das Verbindungs-Timeout ist das Timeout beim Herstellen der ersten Verbindung. Abschluss des TCP Verbindungs-Handshakes. Das Lese-Timeout ist das Timeout beim Warten auf das Lesen von Daten1. Insbesondere wenn der Server Sekunden nach dem letzten Byte kein Byte <timeout> sendet, wird ein Zeitüberschreitungsfehler beim Lesen ausgelöst.

2) Was bedeutet das Verbindungszeitlimit "unendlich"? In welcher Situation kann es in einer Endlosschleife bleiben? und was kann auslösen, dass die Endlosschleife stirbt?

Dies bedeutet, dass der Verbindungsversuch möglicherweise für immer blockiert werden kann. Es gibt keine Endlosschleife, aber der Verbindungsversuch kann durch einen anderen Thread, der den Socket schließt, aufgehoben werden. (Ein Thread.interrupt() -Aufruf kann ebenfalls den Trick ausführen ... nicht sicher.)

3) Was bedeutet es, wenn das Zeitlimit für das Lesen auf "unendlich" eingestellt ist? In welcher Situation kann es in einer Endlosschleife bleiben? Was kann auslösen, dass die Endlosschleife endet?

Dies bedeutet, dass ein Aufruf von read im Socket-Stream für immer blockiert sein kann. Wieder gibt es keine Endlosschleife, aber die read kann durch einen Thread.interrupt() -Aufruf entsperrt werden, indem der Socket geschlossen und (natürlich) das andere Ende Daten gesendet oder die Verbindung geschlossen wird.


1 - Es ist nicht ... wie ein Kommentator dachte ... die Zeitüberschreitung, wie lange ein Socket offen oder im Leerlauf sein kann.

190
Stephen C

Hierbei handelt es sich um Zeitlimitwerte, die von JVM für TCP= Verbindungsaufbau erzwungen werden und auf das Lesen von Daten vom Socket warten.

Wenn der Wert auf unendlich eingestellt ist, werden Sie nicht ewig warten. Dies bedeutet einfach, dass JVM keine Zeitüberschreitung hat und das Betriebssystem für alle Zeitüberschreitungen verantwortlich ist. Die Zeitüberschreitungen unter dem Betriebssystem können jedoch sehr lang sein. In einem langsamen Netzwerk habe ich Zeitüberschreitungen von bis zu 6 Minuten festgestellt.

Selbst wenn Sie das Zeitlimit für Socket festlegen, funktioniert es möglicherweise nicht, wenn das Zeitlimit im systemeigenen Code auftritt. Wir können das Problem unter Linux reproduzieren, indem wir eine Verbindung zu einem durch eine Firewall blockierten Host herstellen oder das Kabel vom Switch abziehen.

Der einzige sichere Weg, um das TCP timeout zu behandeln, besteht darin, den Verbindungscode in einem anderen Thread auszuführen und den Thread zu unterbrechen, wenn es zu lange dauert.

7
ZZ Coder