2013-02-08 48 views
0

我正在學習tcp-ip協議棧,服務器端與客戶端的連接。我寫了一個簡單的客戶服務器。客戶端和服務器能夠在沒有任何問題的情況下將數據傳輸給對方。我在同一臺機器上運行客戶端和服務器。當我用ctrl + c關閉服務器時,我發現內核正在發送RST信號而不是FIN。 (請參考我的問題:Active closure of server sockets服務器發送復位信號而不是FIN

稍微調查一下,我意識到我的一個客戶端正在讀取調用,並且相應的服務器線程處於無限循環中無所事事(我的部分有些bug)。但是當我刪除那無限的while循環時,我看到了預期的行爲。我可以看到FIN在兩個方向發送。

所以,我想知道爲什麼tcp層在第一種情況下發送RST。

回答

0

最終,你放棄等待另一端接受數據。

+0

如果你從鏈接問題中看到我的tcpdump,那麼就沒有FIN數據包。所以,似乎像服務器端插座永遠不會發送FIN – user2026599

+0

最終誰放棄?哪裏有同行不接受數據的證據? – EJP

+0

最終發送數據的一方放棄嘗試優雅的關閉。同行沒有接受數據,因爲它被困在無盡的循環中。此時,發送方將發送RST,而另一方的讀取將返回錯誤。 –