Tengo problemas con una conexión a Internet que parece "congelar" aleatoriamente las conexiones tcp arbitrarias cuando no se han utilizado durante un tiempo. Las conexiones permanecen establecidas, pero no se reciben datos.
Cuando esto sucede, netstat aún muestra el estado de la conexión como ESTABLISHED
en la computadora local:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name Timer
tcp 0 53 192.168.0.10:41129 173.255.235.238:143 ESTABLISHED 8219/gnutls-cli on (79.31/13/0)
..y el servidor remoto:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name Timer
tcp 0 0 173.255.235.238:143 68.5.174.98:41129 ESTABLISHED 5303/imapd off (0.00/0/0)
Sin embargo, parece que no se transfieren datos en absoluto. Si ejecuto strace en el proceso local y remoto, ambos solo muestran una secuencia repetitiva de llamadas seleccionadas (con diferentes fds, por supuesto), por ejemplo
select(6, [0 5], NULL, NULL, {0, 50000}) = 0 (Timeout)
select(6, [0 5], NULL, NULL, {0, 50000}) = 0 (Timeout)
select(6, [0 5], NULL, NULL, {0, 50000}) = 0 (Timeout)
La conexión a Internet en general no parece afectada, todavía puedo establecer nuevas conexiones al mismo servicio en el mismo servidor sin ningún problema. Sin embargo, las aplicaciones locales afectadas parecen ignorar el problema y simplemente se bloquean.
Aproximadamente 10 minutos después del intento de transmisión en el extremo local, la conexión en el extremo remoto desaparece del netstat (no pude detectar ningún estado intermedio), pero aún permanece ESTABLISHED
en el extremo local.
Finalmente, después de algunos minutos más, la aplicación local aborta con un tiempo de espera y también desaparece de la salida netstat local.
Cuando miro una captura de paquetes de esta conexión en el lado del cliente, hay un largo (esperado) período de inactividad que parece desencadenar el problema, luego el extremo local intenta transmitir algunos datos nuevamente pero nunca recibe un ACK. En cambio, salen 15 retransmisiones TCP, con intervalos que aumentan de 0.3 segundos a 120 segundos. No se captura ninguna actividad después de eso.
¿Alguien tiene una sugerencia de cómo podría depurar esto para averiguar dónde se encuentra el problema y cómo solucionarlo?
Además y / o como una solución temporal: ¿hay alguna forma de reducir globalmente el tiempo de espera en el cliente y / o servidor para reducir el tiempo antes de que la aplicación local aborte?
fuente