2012-10-26 7 views
28

Ich öffne einen TCP-Socket und verbinde ihn mit einem anderen Socket irgendwo anders im Netzwerk. Ich kann dann erfolgreich Daten senden und empfangen. Ich habe einen Timer, der jede Sekunde etwas an die Steckdose sendet.TCP Socket keine Verbindungszeitüberschreitung

Dann unterbreche ich die Verbindung grob, indem ich die Verbindung gewaltsam verliere (in diesem Fall das Ethernetkabel herausziehen). Mein Socket meldet immer noch, dass Daten erfolgreich jede Sekunde geschrieben werden. Dies dauert etwa 1 Stunde und 30 Minuten, bis ein Schreibfehler auftritt.

Was gibt dieses Timeout an, wenn eine Steckdose das andere Ende endlich akzeptiert? Ist es das Betriebssystem (Ubuntu 11.04), ist es aus der TCP/IP-Spezifikation oder ist es eine Socket-Konfigurationsoption?

+2

Vielleicht [this] (http://stackoverflow.com/questions/5907527/application-control-of-tcp-retransmission-on-linux) gibt Antwort für Sie. – SKi

Antwort

49

Durch Ziehen des Netzwerkkabels wird die TCP-Verbindung (1) nicht unterbrochen, obwohl dadurch die Kommunikation gestört wird. Sie können das Kabel wieder anschließen und sobald die IP-Verbindung hergestellt ist, werden alle Rückdaten verschoben. Dies macht TCP auch in Mobilfunknetzen zuverlässig.

Wenn TCP Daten sendet, erwartet es eine ACK als Antwort. Wenn keiner innerhalb einiger Zeit kommt, überträgt er die Daten erneut und wartet erneut. Die Zeit, die zwischen Übertragungen gewartet wird, steigt im Allgemeinen exponentiell an.

Nach einer gewissen Anzahl von Übertragungswiederholungen oder einer gewissen Gesamtzeit ohne ACK wird TCP die Verbindung als "unterbrochen" betrachten. Wie oft oder wie lange es von Ihrem Betriebssystem und seiner Konfiguration abhängt, dauert in der Regel mehrere Minuten.

Von Linux tcp.7 man page:

tcp_retries2 (integer; default: 15; since Linux 2.2) 
      The maximum number of times a TCP packet is retransmitted in 
      established state before giving up. The default value is 15, which 
      corresponds to a duration of approximately between 13 to 30 minutes, 
      depending on the retransmission timeout. The RFC 1122 specified 
      minimum limit of 100 seconds is typically deemed too short. 

Dies ist wahrscheinlich der Wert, den Sie anpassen möchten, werden sich ändern, wie lange es, wenn Ihre Verbindung verschwunden ist zu erkennen, nimmt.

(1) Es gibt Ausnahmen. Wenn das Betriebssystem bemerkt, dass ein Kabel entfernt wurde, könnte es die oberen Schichten darüber informieren, dass alle Verbindungen als "kaputt" betrachtet werden sollten.

+1

Das war sehr hilfreich, danke für die Antwort! – corvid

+0

Ich mache täglich Tausende von HTTP-Anfragen, jetzt arbeite ich bei Websockets (nodejs), also wollte ich natürlich mehr über gute alte Sockets wissen, jetzt merke ich, wie schön SocketsWork ist. zuverlässige, verbindungsorientierte und Host-spezifische Protokoll, weil das ist, warum nein. Wiederholungen sind abhängig von OS! –