1. 程式人生 > >TCP keep-alive - 判斷TCP鏈路的連接情況

TCP keep-alive - 判斷TCP鏈路的連接情況

pan 內連接 soc 當前 簡單的 span lose keep 數據傳輸

TCP 是面向連接的 , 在實際應用中通常都需要檢測對端是否還處於連接中。如果已斷開連接,主要分為以下幾種情況:

1. 連接的對端正常關閉,即使用 closesocket 關閉連接。

2. 連接的對端非正常關閉,包括對端異常關閉,網絡斷開等情況。

對於第一種情況,對端正常關閉前都會告知對方,所以很好判斷是否連接著。

對於第二組情況,比較麻煩,方法如下:

?---------自己編寫心跳包程序,簡單的說也就是在自己的程序中加入一條線程,定時向對端發送數據包,查看是否有 ACK ,如果有則連接正常,沒有的話則連接斷開。

---------使用 TCP 的 keep-alive 機制,這個需要在 編程時對當前 SOCKET 進行相應設置即可,比較方便。

首先說一下 keep-alive 來判斷異常斷開的原理,其實 keep-alive 的原理就是 TCP 內嵌的一個心跳包。

以服務器端為例,如果當前 server 端檢測到超過一定時間(默認是 7,200,000 milliseconds ,也就是 2 個小時)沒有數據傳輸,那麽會 向client 端發送一個 keep-alive packet (該 keep-alive packet 就是 ACK 和當前 TCP 序列號減一的組合),此時 client 端應該為以下三種情況之一:

1. client 端仍然存在,網絡連接狀況良好。此時 client 端會返回一個 ACK 。 server 端接收到 ACK 後重置計時器,在 2 小時後再發送探測。如果 2 小時內連接上有數據傳輸,那麽在該時間基礎上向後推延 2 個小時。

2. 客戶端異常關閉,或是網絡斷開。在這兩種情況下, client 端都不會響應。服務器沒有收到對其發出探測的響應,並且在一定時間(系統默認為
1000 ms )後重復發送 keep-alive packet ,並且重復發送一定次數( 2000 XP 2003 系統默認為 5 次 , Vista 後的系統默認為 10 次)。

3. 客戶端曾經崩潰,但已經重啟。這種情況下,服務器將會收到對其存活探測的響應,但該響應是一個復位,從而引起服務器對連接的終止。

TCP keep-alive - 判斷TCP鏈路的連接情況