2009-12-16 76 views
9

客戶先關閉插座,當沒有從服務器多數據,TCP連接關閉是好的,如:TCP連接掛在CLOSE_WAIT狀態

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

當服務器忙於發送數據:

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

服務器連接進入CLOSE_WAIT狀態並掛在那裏很長時間。

這裏有什麼問題嗎?客戶端相關或服務器相關?這發生在本地套接字的Redhat5上。

這個article談論爲什麼發送「RST」,但我不知道爲什麼服務器連接停留在CLOSE_WAIT上,並且不發送FIN。

[編輯]我忽略了最重要的信息,這發生在QEMU的SLIRP網絡仿真。這似乎是一個處理密切聯繫的問題。

回答

0

這是一個已知的defect用於QEMU的插座。

+0

更好的網址:http://lists.gnu.org/archive/html/qemu-devel/2008-06/msg00372.html – qerub 2012-02-09 17:24:08

2

這意味着有流中留在讀數據時,該客戶端還沒有讀完。

您可以通過使用SO_LINGER選項強制其關閉。用於Linux的Here's relevant documentation(另請參閱選項本身here),以及Win32的[這裏是匹配函數2]。

這是保持開放的服務器端,所以它在服務器端,你可以嘗試禁用SO_LINGER

+0

似乎SO_LINGER隻影響close()調用,但服務器掛在write()調用上呢? – 2009-12-16 10:17:39

+1

如果服務器上寫電話掛,那麼你可能已經填補了TCP窗口和堆棧從客戶端等待ACK的,纔可以接受更多的數據發送... – 2009-12-16 14:45:54

0

這可能意味着服務器尚未關閉套接字。您可以通過使用「lsof」列出由該進程打開的包含TCP套接字的文件描述符來輕鬆地說明這一點。解決方法是有過程中始終關閉時,它的完成(甚至在錯誤情況等)

+0

的問題是服務器掛在寫打電話,我無法檢測到錯誤。 – 2009-12-17 01:51:21