2010-03-11 81 views
4

我一直認爲如果你沒有實現心跳,就沒有辦法知道TCP連接的一端是否意外死亡。如果該進程只是在一邊被殺死,並沒有優雅地退出,那麼套接字無法發送FIN或讓對方知道它已關閉。Tcp Socket Closed

(見這裏的一些例如評論http://www.perlmonks.org/?node_id=566568)的

但有我連接到了一個新的「取消斷開功能的所有訂單」抵消現場訂單庫存訂貨服務器如果客戶端DIS -connects。即使當我殺死我的進程時,它也能正常工作,而且我的應用程序絕對沒有心跳。

那麼它是如何發現我什麼時候殺死了這個過程呢?我的應用程序在Windows Server 2003上運行,訂單服務器位於Suse Linux Enterprise Server 10上。Windows是否檢測到與套接字關聯的進程不再活動併發送FIN?

回答

7

當一個進程退出 - 無論出於何種原因 - 操作系統將關閉它打開的TCP連接。

還有許多其他方式TCP連接可以去死未被發現​​

  • 有人猛拉了網絡電纜其間。
  • 另一端的計算機被燒燬。
  • 一個NAT網關inbetween默默地丟棄連接
  • 在另一端的操作系統崩潰困難。
  • FIN數據包丟失。

雖然啓用了tcp keepalive,但最終會檢測到它 - 至少在幾個小時內。

+0

順便說一句,你可以詳細說明「FIN數據包如何丟失」嗎? – Pacerier 2012-07-25 03:13:49

+1

@Prier好吧,IP是不可靠的,有很多方式丟包或損壞。如果FIN報文(以及後續的FIN重傳報文或RST報文)丟失,那麼該對等方就不會知道這個事實。也許同行期待接收更多永不會發生的數據。 – nos 2012-07-25 14:44:31

+0

是的我的意思是「數據包丟失或損壞的方式」是什麼? – Pacerier 2012-07-27 07:02:06

2

據我所知,OS檢測進程終止,並關閉所有的文件描述符/插座/處理過程正在使用。所以,「殺」應用程序和「優雅地終止」沒有區別。當然,內核本身必須運行(=打開pc,連線......)。但是它在操作系統上發送FIN等工作... 另外,如果主機變得無法訪問/關閉,斷開...),中間網關(或客戶端本身)可能檢測到事件(例如丟失,DHCP租約未更新...),並回復發送給死亡主機的帶有ICMP錯誤(主機/網絡不可達)的數據包。這會導致對等的TCP連接斷開,但只有當客戶端有一些數據包要發送到主機時纔會發生。