networking tcp network-programming timeout

networking - Socket TCP sin tiempo de espera de conexión



network-programming timeout (1)

Al tirar del cable de red no se romperá una conexión TCP (1) aunque interrumpirá las comunicaciones. Puede volver a enchufar el cable y, una vez establecida la conectividad IP, todos los datos retrospectivos se moverán. Esto es lo que hace que TCP sea confiable, incluso en redes celulares.

Cuando TCP envía datos, espera un ACK en respuesta. Si no aparece ninguna dentro de un cierto período de tiempo, retransmite los datos y espera nuevamente. El tiempo que espera entre transmisiones generalmente aumenta exponencialmente.

Después de un número de retransmisiones o de una cantidad de tiempo total sin ACK, TCP considerará que la conexión está "rota". Cuántas veces o por cuánto tiempo depende de su sistema operativo y su configuración, pero generalmente se agota el tiempo en el orden de varios minutos.

Desde la página man de tcp.7 de Linux:

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.

Es probable que sea el valor que desee ajustar para cambiar el tiempo que lleva detectar si su conexión se ha desvanecido.

(1) Hay excepciones a esto. El sistema operativo, al notar que se retira un cable, podría notificar a las capas superiores que todas las conexiones deben considerarse "rotas".

Abro un socket TCP y lo conecto a otro socket en otro lugar de la red. Entonces puedo enviar y recibir datos con éxito. Tengo un temporizador que envía algo al zócalo cada segundo.

Luego, interrumpí groseramente la conexión perdiendo por fuerza la conexión (sacando el cable de Ethernet en este caso). Mi socket sigue informando que está escribiendo datos con éxito cada segundo. Esto continúa durante aproximadamente 1 hora y 30 minutos, donde finalmente se produce un error de escritura.

¿Qué especifica este tiempo de espera en el que un socket finalmente acepta que el otro extremo ha desaparecido? ¿Es el sistema operativo (Ubuntu 11.04), es de la especificación TCP / IP o es una opción de configuración de socket?