2009-12-16 29 views
9

cliente cierra el socket primero, cuando no hay muchos datos desde un servidor, apagado conexión TCP está bien como:conexiones TCP cuelgan sobre el estado CLOSE_WAIT

FIN --> 
    <-- ACK 
    <-- FIN, ACK 
ACK --> 

Cuando el servidor está busying envío de datos:

FIN --> 
    <-- ACK,PSH 
RST --> 

Y la conexión del servidor pasa al estado CLOSE_WAIT y se mantiene durante mucho tiempo.

¿Cuál es el problema aquí? relacionado con el cliente o relacionado al servidor? Esto sucede en Redhat5 para enchufes locales.

Este article habla de por qué se envía "RST", pero no sé por qué la conexión del servidor se atascó en CLOSE_WAIT y no envía un FIN.

[EDITAR] Ignore la información más importante, esto sucede en la emulación de red slirp de qemu. Parece ser un problema de error de deslizamiento para tratar con una conexión cercana.

Respuesta

0

Este es un conocido defect para qemu.

+0

Mejor URL: http://lists.gnu.org/archive/html/qemu-devel/2008-06/msg00372.html – qerub

2

Esto significa que quedan datos no leídos en la transmisión, que el cliente no ha terminado de leer.

Puede forzarlo utilizando la opción SO_LINGER. Here's relevant documentation para Linux (también vea la opción en sí, here), y [aquí está la función correspondiente2] para Win32.

Es el lado del servidor que permanece abierto, por lo que en el lado del servidor puede intentar deshabilitar SO_LINGER.

+0

Parece que SO_LINGER solo influye en la llamada close(), pero el servidor se cuelga en la llamada write()? –

+1

Si el servidor está pendiente de una llamada de escritura, probablemente haya llenado la ventana de TCP y la pila está esperando ACK del cliente antes de que pueda aceptar más datos para enviar ... –

0

Puede significar que el servidor no ha cerrado el socket. Puede decir esto fácilmente usando "lsof" para listar los descriptores de archivo abiertos por ese proceso que incluirá sockets TCP. La solución es hacer que el proceso cierre siempre el zócalo cuando esté terminado (incluso en casos de error, etc.)

+0

El problema es que el servidor está colgado en la escritura llamar, y no puedo detectar el error. –

Cuestiones relacionadas