2009-12-16 13 views
9

client chiude il socket prima, quando non c'è più dati da server, arresto connessione TCP è bene così:connessioni TCP appendere stato CLOSE_WAIT

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

Quando il server è affaccendava di invio dati:

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

E la connessione al server arriva allo stato CLOSE_WAIT e resta in attesa per un lungo periodo.

Qual è il problema qui? correlato al client o al server? Questo succede su Redhat5 per i socket locali.

Questo article parla del motivo per cui viene inviato "RST", ma non so perché la connessione al server si è bloccata su CLOSE_WAIT e non invia una FIN.

[EDIT] Ho ignorato le informazioni più importanti, questo accade sull'emulazione della rete slirp di qemu. Sembra essere un problema di bug slirp per gestire una connessione chiusa.

risposta

0

Questo noto defect per qemu.

+0

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

2

Ciò significa che ci sono dati non letti lasciati nello stream, che il client non ha finito di leggere.

È possibile forzarlo utilizzando l'opzione SO_LINGER. Here's relevant documentation per Linux (vedi anche l'opzione stessa, here), e [ecco la funzione corrispondente 2] per Win32.

È il lato server che rimane aperto, quindi è sul lato server è possibile provare a disabilitare SO_LINGER.

+0

Sembra che SO_LINGER influenzi solo la chiamata a close(), ma il server si blocchi su call() invece? –

+1

Se il server è in attesa di una chiamata di scrittura, probabilmente hai riempito la finestra TCP e lo stack è in attesa di ACK dal client prima che possa accettare più dati da inviare ... –

0

Può significare che il server non ha chiuso il socket. Puoi facilmente dirlo usando "lsof" per elencare i descrittori di file aperti da quel processo che includeranno i socket TCP. La correzione è di avere il processo sempre chiuso il socket quando è finito (anche in casi di errore, ecc.)

+0

Il problema è che il server è bloccato in scrittura chiamata, e non riesco a rilevare l'errore. –