ConnectionTimeout versus SocketTimeout

135

Ich habe ein Problem mit einer Bibliothek, die ich verwende. Es könnte die Bibliothek sein oder ich könnte sie falsch benutzen!

Grundsätzlich, wenn ich das mache (Timeout in Millisekunden)

_ignitedHttp.setConnectionTimeout(1);  // v short
_ignitedHttp.setSocketTimeout(60000);  // 60 seconds

Es wird keine Timeout-Ausnahme generiert und es funktioniert einwandfrei, wenn ich jedoch Folgendes tue:

_ignitedHttp.setConnectionTimeout(60000);  // 60 seconds
_ignitedHttp.setSocketTimeout(1);          // v short

Ich bekomme eine Socket-Ausnahme.

Meine Frage ist also, warum ich eine Verbindungsausnahme nicht simulieren kann. Verstehe ich den Unterschied zwischen einem Socket und einem Verbindungs-Timeout falsch? Die Bibliothek ist hier (noch nicht offiziell freigegeben).

Robert
quelle

Antworten:

227

Ein Verbindungszeitlimit tritt nur beim Starten der TCP-Verbindung auf. Dies geschieht normalerweise, wenn der Remote-Computer nicht antwortet. Dies bedeutet, dass der Server heruntergefahren wurde, Sie den falschen IP / DNS-Namen, den falschen Port verwendet haben oder die Netzwerkverbindung zum Server unterbrochen ist.

Ein Socket-Timeout dient zur Überwachung des kontinuierlichen eingehenden Datenflusses. Wenn der Datenfluss für das angegebene Zeitlimit unterbrochen wird, gilt die Verbindung als blockiert / unterbrochen. Dies funktioniert natürlich nur bei Verbindungen, bei denen ständig Daten empfangen werden.

Wenn Sie das Socket-Timeout auf 1 setzen, müssen alle Millisekunden neue Daten empfangen werden (vorausgesetzt, Sie lesen den Datenblock weise und der Block ist groß genug)!

Wenn nur der eingehende Stream länger als eine Millisekunde blockiert, tritt eine Zeitüberschreitung auf.

Robert
quelle
1
Könnten Sie jemals ein Verbindungszeitlimit bekommen, wenn der Server nicht ausfällt, aber zu beschäftigt ist? Oder wäre das ein Socket-Timeout?
Robert
9
Dies hängt davon ab, ob die TCP-Verbindung hergestellt wurde, bevor der Server überlastet ist. Andernfalls wird eine Socket-Ausnahme angezeigt. Andernfalls wird eine Verbindungsausnahme angezeigt, die darauf hinweist, dass die TCP-Verbindung nicht hergestellt werden konnte.
Robert
2
In Anbetracht der hohen Latenz besonders älterer Mobilfunknetze muss das Verbindungszeitlimit auf einige Sekunden eingestellt werden (z. B. 10s oder besser 10000 ms). Das Socket-Timeout würde ich nur festlegen, wenn Sie nicht mehrere Verbindungen verwenden, da HTTP die Verbindung nach einer Anforderung wiederverwenden kann.
Robert
1
Bedeutet dies, dass beim Festlegen eines Socket-Timeouts (z. B. 1 Minute) die Verbindung nach 1 Minute Inaktivität unterbrochen wird, wo sie normalerweise wiederverwendet wird, wenn kein Timeout festgelegt wurde?
Robert
2
@ Robert Sie erhalten nicht unbedingt eine Verbindungsausnahme, wenn der Server zu ausgelastet ist. Es ist plattformabhängig von der Serverplattform. Ein Socket-Lesezeitlimit beendet die Verbindung nicht. Es verursacht nur eine SocketTimeoutException. Ob die Verbindung noch verwendbar ist, muss der Antrag entscheiden. Es gibt sicherlich nichts an der API, was besagt, dass Sie nicht mehr E / A am Socket ausprobieren können. Ihre Aussage, keine Zeitüberschreitungen zu verwenden, wenn Sie mehrere Verbindungen verwenden, macht keinen Sinn. Zu viele Fehlinformationen hier.
Marquis von Lorne
83

Ein Verbindungszeitlimit ist die maximale Zeit, die das Programm warten möchte, um eine Verbindung zu einem anderen Prozess herzustellen. Zu diesem Zeitpunkt erhalten oder veröffentlichen Sie keine Anwendungsdaten, sondern stellen lediglich die Verbindung selbst her.

Ein Socket-Timeout ist das Timeout beim Warten auf einzelne Pakete. Es ist ein weit verbreitetes Missverständnis, dass ein Socket-Timeout das Timeout ist, um die vollständige Antwort zu erhalten. Wenn Sie also eine Socket-Zeitüberschreitung von 1 Sekunde und eine Antwort aus 3 IP-Paketen haben, bei der jedes Antwortpaket 0,9 Sekunden benötigt, um eine Gesamtantwortzeit von 2,7 Sekunden zu erreichen, tritt keine Zeitüberschreitung auf.

entpnerd
quelle
3
In Ordnung. 1. Können wir also sagen, dass SocketTimeout nur dann ins Bild kommt, wenn bereits eine Verbindung hergestellt wurde? 2. Was ist, wenn etwa 5 Minuten nach dem Empfang der 3 Pakete kein Datenfluss vorliegt? Wird es eine SocketTimeout-Ausnahme geben, nachdem das 3. Paket empfangen wurde?
Saurabh Patil
2
@ SaurabhPatil 1. Ja. Eine Bestätigung finden Sie in der technischen Übersicht von Wikipedia zum HTTP-Protokoll . 2. Sobald das Ende der Nachricht gesendet wurde, werden keine weiteren Daten benötigt, sodass kein Socket-Timeout auftritt. Siehe diese Antwort zum Thema.
Entpnerd
7
Ich wünschte, sie hätten "Socket-Timeout" als "Leerlauf-Timeout" bezeichnet.
Manish Maheshwari