¿La conexión permanece activa pero el punto final está inactivo?

¿La conexión permanece activa pero el punto final está inactivo?

¿Alguien tiene una idea de qué causaría que una conexión TCP (del lado del cliente) permaneciera en el estado ESTABLECIDO durante aproximadamente 24 horas, aunque se reiniciara el servidor? ¡El proceso del cliente permanece en la llamada al sistema recv y permanece así sin causar un error!

El cliente está en una instalación de Ubuntu 11.04. Esto ya me ha pasado varias veces, pero parece que no puedo entender por qué ni cómo solucionarlo.

Respuesta1

La conexión permanece ESTABLECIDA en un lado y inexistente en el otro porque ese es el estado en el que se encontraba después de que se reinició el servidor. El cliente no tiene idea de que el servidor se reinició y el servidor no tiene idea de que el cliente cree que todavía está conectado. A menos que el cliente intente utilizar la conexión, permanecerá así para siempre. (A menos que estén habilitados los keepalive, en cuyo caso permanecerá así durante aproximadamente dos días).

¿Por qué el cliente espera eternamente al servidor? O el cliente o el protocolo están rotos. Si el cliente no sigue el protocolo, el cliente no funciona. Si el protocolo no especifica cómo detectar una conexión inactiva, el protocolo está roto.

TCP no detecta una conexión inactiva para un extremo que no intenta enviar datos. Entonces, cada protocolo superpuesto a TCPdebediseñarse para tener esto en cuenta. Si esta conexión bloqueada no es un comportamiento aceptable, entonces este protocolo está roto porque permite este comportamiento inaceptable (o el cliente está roto por no seguir el protocolo).

¿La especificación del protocolo realmente dice que esperemos?para siemprepara datos? Si es así, cuestionaría la cordura de los desarrolladores del protocolo.

información relacionada