web-dev-qa-db-fra.com

TCP Socket sans délai d'expiration de connexion

J'ouvre une prise TCP et je la connecte à une autre prise ailleurs sur le réseau. Je peux ensuite envoyer et recevoir des données avec succès. J'ai un minuteur qui envoie quelque chose à la prise chaque seconde.

J'interromps alors grossièrement la connexion en perdant de force la connexion (en retirant le câble Ethernet dans ce cas). Mon socket signale toujours qu'il écrit avec succès des données toutes les secondes. Cela continue pendant environ 1 heure et 30 minutes, où une erreur d'écriture est finalement donnée.

Qu'est-ce qui spécifie ce time-out où une socket accepte enfin que l'autre extrémité ait disparu? S'agit-il du système d'exploitation (Ubuntu 11.04), de la spécification TCP/IP ou d'une option de configuration de socket?

40
oggmonster

Le fait de tirer sur le câble réseau ne rompra pas une connexion TCP (1) bien que cela perturbe les communications. Vous pouvez rebrancher le câble et une fois la connectivité IP établie, toutes les données rétrospectives se déplaceront. est ce qui rend TCP fiable, même sur les réseaux cellulaires.

Lorsque TCP envoie des données, il attend un ACK en réponse. Si aucun ne vient dans un certain laps de temps, il retransmet les données et attend à nouveau. Le temps qu'il attend entre les transmissions augmente généralement de façon exponentielle.

Après un certain nombre de retransmissions ou un certain temps total sans ACK, TCP considérera la connexion comme "rompue". Combien de fois ou combien de temps dépend de votre système d'exploitation et de sa configuration, mais généralement -out sur l'ordre de plusieurs minutes.

Depuis Linux page de manuel tcp.7 :

   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.

Il s'agit probablement de la valeur que vous souhaitez ajuster pour modifier le temps nécessaire pour détecter si votre connexion a disparu.

(1) Il y a des exceptions à cela. Le système d'exploitation, en remarquant qu'un câble est retiré, pourrait informer les couches supérieures que toutes les connexions doivent être considérées comme "rompues".

67
Brian White