標籤:keepalive tcp
一 基本原理
TCP的Keepalive可以簡單理解成為keep tcp alive,用來檢測TCP sockets的串連是否正常或是已經斷開。
Keeplived的原理很簡單,當建立一個TCP串連時,發送端就會建立一些計時器,其中一些計時器就是處理keeplaive相關問題的。當keepalive的計時器計數到0時,發送端就會向對端發送一些不含資料的keepalive資料包並開啟ACK標誌。如果得到keepalive探測包的回複,就可以認為當前的TCP串連正常,不用擔心使用者層面的具體實現。事實上,TCP允許處理資料流,而不是資料包,所以對於使用者程式來說零位元組的資料包沒有危害。
開啟keepalive會對防火牆或者路由器產生額外的流量。
keepalive主要承擔兩個任務:
檢測死掉的對端串連
keepalive可以用於在對端死掉並發送通知之前檢測到對端的串連狀態。核心錯誤或者強制終止對端的應用程式進程都可能造成這種情況發生。還有一種情況使用keepalive來檢測對端是否死掉是對端依然存活但是串連到對端之前的網路已經斷開。
假想主機A和主機B之前一個簡單的TCP串連:在A與B之間有一個簡單的三向交握,A發送SYN到B,然後B發送SYN+ACK到A,最後A發送ACK到B。現在就建立起了一個穩定的TCP串連,等待某方通過這個通道傳輸資料。現在問題就來了:拔掉主機B的電源,主機B在沒有任何通知主機A當前串連即將關閉的情況會立即關機。對於主機A,正準備接收資料,但是不知道主機B已經關機。現在主機B開機,主機A和主機B又處於正常狀態,主機A知道還有一個與主機B的活動串連,但是主機B不知道。
在網路斷開的情況下阻止與對端的TCP串連斷開。
參考資料:
http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/index.html
本文出自 “Linux SA John” 部落格,請務必保留此出處http://john88wang.blog.51cto.com/2165294/1622146
Linux下TCP的keepalive相關參數學習