2012-10-26 3 views
28

Aprire un socket TCP e collegarlo a un altro socket da qualche altra parte sulla rete. Posso quindi inviare e ricevere correttamente i dati. Ho un timer che invia qualcosa alla presa ogni secondo.TCP Socket nessun timeout di connessione

Interruzione brusca della connessione interrompendo forzatamente la connessione (estraendo il cavo Ethernet in questo caso). Il mio socket sta ancora segnalando che sta scrivendo correttamente i dati ogni secondo. Questo continua per circa 1 ora e 30 minuti, dove alla fine viene fornito un errore di scrittura.

Cosa specifica questo timeout in cui un socket accetta l'altra estremità è scomparsa? È il sistema operativo (Ubuntu 11.04), è dalla specifica TCP/IP o è un'opzione di configurazione del socket?

+2

Forse [questo] (http://stackoverflow.com/questions/5907527/application-control-of-tcp-retransmission-on-linux) dà la risposta per te. – SKi

risposta

49

Il cavo di rete non interromperà una connessione TCP (1) anche se interromperà le comunicazioni. È possibile ricollegare il cavo e una volta stabilita la connettività IP, tutti i dati di back si sposteranno. Questo è ciò che rende il TCP affidabile, anche su reti cellulari.

Quando TCP invia i dati, si aspetta un ACK in risposta. Se nessuno arriva entro una certa quantità di tempo, ritrasmette i dati e attende di nuovo. Il tempo che attende tra le trasmissioni generalmente aumenta in modo esponenziale.

Dopo un numero di ritrasmissioni o una quantità di tempo totale senza ACK, TCP considererà la connessione "interrotta". Quante volte o quanto tempo dipende dal tuo sistema operativo e dalla sua configurazione, ma in genere scade nell'ordine di molti minuti.

Da Linux di 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. 

Questo è probabilmente il valore si vorrà adattarsi al cambiamento quanto tempo ci vuole per rilevare se la connessione è svanito.

(1) Ci sono eccezioni a questo. Il sistema operativo, notando che un cavo è stato rimosso, potrebbe comunicare agli strati superiori che tutte le connessioni dovrebbero essere considerate "interrotte".

+1

Questo è stato molto utile grazie per la risposta! – corvid

+0

Ogni giorno faccio migliaia di richieste Http, ora sto lavorando su Websockets (nodejs), quindi, naturalmente, volevo sapere di più sui buoni vecchi socket, ora realizzo How Beautifully SocketsWork. affidabile, orientato alla connessione e protocollo specifico host perché questo è il motivo per cui no. di tentativi dipendono dal sistema operativo! –