Pregunta ¿Es posible que una conexión TCP permanezca abierta cuando el cliente se ha desconectado?


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.

Se me ha encomendado la tarea de investigar por qué una aplicación cliente en particular no cierra correctamente la conexión TCP. Creo que si un equipo cliente se apaga, no puede informar POSIBLE desde el servidor que todavía se haya establecido una conexión TCP con ese cliente. Desafortunadamente, no puedo encontrar ninguna información para validar mi vista. No quiero perder más tiempo investigando un problema potencial que no creo que pueda ser un problema.

tldr;

¿Puede un servidor reportar una conexión establecida a una computadora que está apagada?


12
2017-12-07 01:18


origen




Respuestas:


TCP no hace ningún esfuerzo por detectar una conexión muerta, excepto en un lado que está transmitiendo datos. Es responsabilidad del código de la aplicación llamar a la pila TCP para hacer esto. ¿Qué protocolo está involucrado aquí? (El de encima de TCP.)

Es una "solución" horriblemente fea, pero puede habilitar TCP keepalives. Hay más en este artículo.


13
2017-12-07 01:30



Probablemente quiso decir capa y es la capa de sesión en la parte superior de la capa de transporte, que es donde reside TCP. - Rilindo
@Rilindo: En la práctica, y en este caso particular, tienes una aplicación que realiza llamadas a la pila TCP. El protocolo en la parte superior de TCP (HTTP, POP, o lo que sea) generalmente especifica cómo hacerlo, porque los diseñadores de esos protocolos sabían que TCP no podía hacerlo por sí mismo. - David Schwartz
Vaya, mi error. Su capa 7, entonces. - Rilindo
No voy a habilitar keepalives en este punto, pero es útil saber que existe la opción. Ese artículo parece sugerir que ya existe un tiempo de espera de 2 horas ... AFAIK, las conexiones se mantienen abiertas durante días / semanas. - Josh Smeaton
Lo más probable es que los keepalives no estén habilitados. Algún código tiene que habilitarlos. Parece que la aplicación está simplemente dañada si ni siquiera habilita keepalives y no tiene un mecanismo de tiempo de espera / cosecha. ¿De qué protocolo estamos hablando? (HTTP? SMTP? FTP?) - David Schwartz


Sí, es posible. Como David y Paul indicaron 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 apropiadas en consecuencia.

En lo que respecta a TCP, no hay detección o 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 intentar determinar qué está causando que el cliente no cierre la conexión.


8
2017-12-07 01:54



O haz que el vendedor implemente tiempos de espera razonables :) - Shane Madden♦


Cuando una estación de trabajo quiere cerrar una conexión con un servidor, envía un TCP FIN. Si el cliente no se comporta correctamente y no cierra sus conexiones, de hecho podría permanecer establecido en el servidor. Puede establecer tiempos de espera para que las conexiones abiertas en el servidor las limpien, aunque sería mejor encontrar la causa. ¿En qué puerto entran las conexiones abiertas? Una vez que sepa a qué servicio se está accediendo, es posible que pueda identificar la aplicación cliente que está afectando al servidor.


5
2017-12-07 01:23



Sabemos que el cliente es el problema aparente. Es una aplicación de escritorio que cientos de nuestros usuarios usan diariamente. Supongo que el problema es el bloqueo de la aplicación, un restablecimiento completo o una tarea final. Pensé en todas esas situaciones que el servidor estaría al tanto de la conexión interrumpida. - Josh Smeaton
En lo que respecta al servidor, la conexión está abierta a menos que reciba un FIN o un RST del cliente. Sin eso, el servidor asume que la conexión aún está establecida pero que el cliente no tiene datos para enviar. No hay diferencia entre una conexión medio abierta y una conexión inactiva en lo que respecta al servidor. - joeqwerty
@joeqwerty: Es cierto, sin embargo el servidor podría decida que no desea mantener abierta una conexión indefinidamente y podría implementar algún mecanismo de tiempo de espera / cierre. Eso es lo que David Schwartz quiso decir en su respuesta por "es responsabilidad del código de la aplicación". Entonces el servidor puede haga una diferencia entre una conexión medio abierta y una conexión inactiva si así lo desea. Sin embargo, para TCP, no hay diferencia entre una conexión medio abierta y una conexión inactiva. - sleske
@sleske: Estuvo de acuerdo en que el código de la aplicación podría hacer esto, pero TCP no puede hacerlo a menos que estén habilitados los keep-alives. - joeqwerty