Tenemos una aplicación de servidor que enfrenta problemas de agotamiento de TCP en alrededor de 4000 conexiones. Esto ocurrirá cada 3 o 4 semanas (aproximadamente). El proveedor, que ha creado esta aplicación de servidor, nos dice después de examinar la salida de netstat -b que algunas conexiones permanecen abiertas incluso si los clientes se han caído.
Me dieron la tarea de investigar por qué una aplicación de cliente en particular no está cerrando la conexión TCP correctamente. Creo que si una computadora cliente se apaga, no puede informar POSIBLEMENTE desde el servidor que todavía se establece una conexión TCP con ese cliente. Lamentablemente, no puedo encontrar ninguna información para validar mi punto de vista. No quiero perder más tiempo investigando un problema potencial que no creo que pueda ser un problema.
tldr;
¿Puede un servidor informar una conexión establecida a una computadora que está apagada?
fuente
Sí, es posible. Como David y Paul declararon en sus respuestas, no hay ningún mecanismo en TCP (que no sea TCP keep-alives, que es opcional) para detectar una conexión medio abierta. Depende del proveedor de la aplicación determinar el estado de la conexión y tomar las medidas adecuadas en consecuencia.
En lo que respecta a TCP, no hay detección ni distinción entre una conexión medio abierta y una conexión inactiva larga.
Tendrá que comenzar a solucionar este problema desde la capa 1 (física) del modelo OSI hasta la capa 7 (aplicación) para averiguar dónde está ocurriendo el problema. Mi consejo sería instalar y ejecutar un programa de captura de paquetes en uno de los clientes afectados hasta que ocurra el problema, y luego analizar la captura para tratar de determinar qué está causando que el cliente no cierre la conexión.
fuente
Cuando una estación de trabajo desea cerrar una conexión con un servidor, envía un FIN de TCP. Si el cliente no se comporta correctamente y no cierra sus conexiones, de hecho podrían permanecer establecidos en el servidor. Puede establecer tiempos de espera para conexiones abiertas en el servidor para limpiarlas, aunque sería mejor encontrar la causa. ¿En qué puerto están entrando las conexiones abiertas? Una vez que sepa a qué servicio se está accediendo, podrá identificar la aplicación cliente que está llegando al servidor.
fuente