TCP保活(TCP keepalive)

原文鏈接:http://www.vants.org/?post=162


TCP保活(TCP keepalive)

作者:易隱者 發佈於:2012-10-15 11:30 Monday 分類:網絡分析

TCP保活的緣起

       雙方建立交互的連接,但是並不是一直存在數據交互,有些連接會在數據交互完畢後,主動釋放連接,而有些不會,那麼在長時間無數據交互的時間段內,交互雙方都有可能出現掉電、死機、異常重啓等各種意外,當這些意外發生之後,這些TCP連接並未來得及正常釋放,那麼,連接的另一方並不知道對端的情況,它會一直維護這個連接,長時間的積累會導致非常多的半打開連接,造成端系統資源的消耗和浪費,爲了解決這個問題,在傳輸層可以利用TCP的保活報文來實現。

TCP保活的作用

1, 探測連接的對端是否存活
        在應用交互的過程中,可能存在以下幾種情況:
(1), 客戶端或服務器端意外斷電、死機、崩潰、重啓
(2), 中間網絡已經中斷,而客戶端與服務器端並不知道
        利用保活探測功能,可以探知這種對端的意外情況,從而保證在意外發生時,可以釋放半打開的TCP連接。

2, 防止中間設備因超時刪除連接相關的連接表

       中間設備如防火牆等,會爲經過它的數據報文建立相關的連接信息表,併爲其設置一個超時時間的定時器,如果超出預定時間,某連接無任何報文交互的話,中間設備會將該連接信息從表中刪除,在刪除後,再有應用報文過來時,中間設備將丟棄該報文,從而導致應用出現異常,這個交互的過程大致如下圖所示:

點擊查看原圖

       這種情況在有防火牆的應用環境下非常常見,這會給某些長時間無數據交互但是又要長時間維持連接的應用(如數據庫)帶來很大的影響,爲了解決這個問題,應用本身或TCP可以通過保活報文來維持中間設備中該連接的信息,(也可以在中間設備上開啓長連接屬性或調高連接表的釋放時間來解決,但是,這個影響可能較大,有機會再針對這個做詳細的描述,在此不多說)。

常見應用故障場景:

       某財務應用,在客戶端需要填寫大量的表單數據,在客戶端與服務器端建立TCP連接後,客戶端終端使用者將花費幾分鐘甚至幾十分鐘填寫表單相關信息,終端使用者終於填好表單所需信息後,點擊“提交”按鈕,結果,這個時候由於中間設備早已經將這個TCP連接從連接表中刪除了,其將直接丟棄這個報文或者給客戶端發送RST報文,應用故障產生,這將導致客戶端終端使用者所有的工作將需要重新來過,給使用者帶來極大的不便和損失。

TCP保活報文格式:

1, TCP keepalive probe報文

       我們看到,TCP保活探測報文是將之前TCP報文的序列號減1,並設置1個字節,內容爲“00”的應用層數據,如下圖所示:

點擊查看原圖

發送keepalive probe報文之前的TCP報文

點擊查看原圖

 TCP keepalive probe報文


2, TCP keepalive ACK報文

        TCP保活探測確認報文就是對保活探測報文的確認, 其報文格式如下:

點擊查看原圖

TCP keepalive ACK報文

TCP保活報文交互過程

        TCP保活的交互過程大致如下圖所示:

點擊查看原圖


TCP保活可能帶來的問題

1, 中間設備因大量保活連接,導致其連接表滿

       網關設備由於保活問題,導致其連接表滿,無法新建連接(XX局網閘故障案例)或性能下降嚴重
2, 正常連接被釋放

       當連接一端在發送保活探測報文時,中間網絡正好由於各種異常(如鏈路中斷、中間設備重啓等)而無法將該保活探測報文正確轉發至對端時,可能會導致探測的一方釋放本來正常的連接,但是這種可能情況發生的概率較小,另外,一般也可以增加保活探測報文發生的次數來減小這種情況發生的概率和影響。

TCP保活的設置

        一般而言,保活探測主要在服務器端實現,如果應用層有相應的保活機制時,傳輸層的TCP保活就可以不用。

        在windows系統中,我們可以通過修改註冊表等來達到開啓、調整保活相關
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
KeepAliveInterval 
項:Tcpip\Parameters
數值類型:REG_DWORD - 時間(以毫秒爲單位)
有效範圍:1 - 0xFFFFFFFF
默認值:1000(1 秒)
說明:此參數確定在收到響應之前,保活重傳之間的時間間隔。一旦收到一個響應,將由 KeepAliveTime 值重新控制在下一次保活傳輸之前的延遲。如果經過 TcpMaxDataRetransmissions 指定的重新傳輸次數後仍無響應,將放棄連接。 
KeepAliveTime 
項:Tcpip\Parameters
數值類型:REG_DWORD - 時間(以毫秒爲單位)
有效範圍:1 - 0xFFFFFFFF
默認值:7,200,000(兩個小時)
說明:此參數控制 TCP 試圖通過發送保活數據包來驗證空閒連接是否仍然保持的次數。如果遠程系統仍然可以連接並且正在運行,它就會響應保活傳輸。默認情況下不發送保活數據包。應用程序可以在連接上啓用此功能。

       關於Linux、HP UNIX、IBM AIX、SUN solaris等系統keepalive參數的設置和修改,請大家自行百度谷歌,在此我就不做簡單搬磚的事情了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章