2010-07-20 117 views
0

我同時在不同的機器上的RHEL 5.3上運行TCP客戶端和TCP服務器。TCP連接 - 延遲關閉()和RST

  • 我在查殺服務器,FIN發送給客戶端。 ACK由客戶端OS立即返回。

  • 客戶端發現的關閉(由讀()返回零)和perfroms只有後90秒關閉。 在這個階段,我在兩邊都驗證了netstat,它和預期的一樣(服務器上的FIN_WAIT_2和客戶端上的CLOSE_WAIT)。

  • 由於客戶端的close()90秒後,客戶機的操作系統發送FIN到服務器,但在響應我們從服務器接收RST和不按預期ACK。

我也看到了幾次,由於「延遲」close(),客戶端的操作系統發送RST而不是FIN。

請注意,在這兩種情況下有雙方沒有未決讀取數據包,SO_LINGER選項沒有被激活。

任何想法?

+0

如果你殺死的服務器,還有的將是一個未決訴訟/包 - 關閉()從客戶端將無法達到你的服務器程序。 – nos 2010-07-20 11:04:16

回答

3

RST表明,一些「數據」丟失。在這種情況下,「數據」是客戶端乾淨地關閉套接字的信息 - 來自客戶端的FIN未報告給服務器端應用程序(因爲它已被終止)。

換句話說,在RST告訴服務器從來沒有看到最終的流從客戶端客戶端。

+0

謝謝!什麼會導致RST被客戶發送到「延遲」關閉()?我也面臨這個問題。 – dimba 2010-07-20 18:43:10

+0

@idimba:可能意味着客戶端從未見過連接結束('recv()'返回0)。 – caf 2010-07-20 22:19:34