tcp有keepalive功能,它和http的keepalive功能目的不一樣。tcp伺服器希望知道客戶端是否崩潰、重新啟動或者中間路由不通。保活定時器就提供這種功能。
在進一步介紹tcp的保活定時器前,先了解乙個概念:長連線和短連線。(tcp是長連線)
長連線:建立乙個連線,多個請求復用這個連線,最後再關閉連線。
短連線:建立乙個連線,傳輸乙個請求,然後關閉連線。
當伺服器傳送探測報文時,客戶端可能處於4種不同的情況:仍然正常執行、已經崩潰、已經崩潰並重啟了、
由於中間鏈路問題不可達。在不同的情況下,伺服器會得到不一樣的反饋。
(1) 客戶主機依然正常執行,並且從伺服器端可達
客戶端的tcp響應正常,從而伺服器端知道對方是正常的。保活定時器會在兩小時(7200s)以後繼續觸發。
(2) 客戶主機已經崩潰,並且關閉或者正在重新啟動
客戶端的tcp沒有響應,伺服器沒有收到對探測包的響應,此後每隔75s傳送探測報文,一共傳送9次。
socket函式會返回-1,errno設定為etimedout,表示連線超時。
(3) 客戶主機已經崩潰,並且重新啟動了
客戶端的tcp傳送rst,伺服器端收到後關閉此連線。
socket函式會返回-1,errno設定為econnreset,表示連線被對端復位了。
(4) 客戶主機依然正常執行,但是從伺服器不可達
雙方的反應和第二種是一樣的,因為伺服器不能區分對端異常與中間鏈路異常。
socket函式會返回-1,errno設定為ehostunreach,表示對端不可達。
在連線空閒兩小時後,在乙個連線上主動傳送乙個探查分組來完成保活功。主要是為伺服器應用程式提供的。
保活定時器預設設定是每隔兩小時傳送一次報文,每次重發10次,每次75秒超時。
(23)TCP的保活定時器
一 簡介 對於運輸層是否應該存在保活定時器的討論一直都有,一些專家覺得這應該有應用層自行維護。如果乙個給定的連線在2小時內沒有任何動作,那麼伺服器就向客戶傳送乙個探查報文段。客戶主機必須處於以下4個狀態之一。1 客戶主機依然正常執行,並從伺服器可達。客戶的tcp響應正常,而伺服器也知道對方的正常工作...
C 定時器保活機制引起的記憶體洩露問題
c 中有三種定時器,system.windows.forms中的定時器和system.timers.timer的工作方式是完全一樣的,所以,這裡我們僅討論system.timers.timer和system.threading.timer 先來看乙個例子 class program static v...
TCP的定時器
在tcp協議中有的時候需要定期或者按照某個演算法對某個事件進行觸發,那麼這個時候,tcp協議是使用定時器進行實現的。在tcp中,會有四種定時器 這四個定時器都有各自的具體作用。tcp是可靠的,因此,它對於發出去的資訊,沒有得到正常ack反饋的,都會啟動乙個重傳機制。這個重傳機制使用乙個重傳定時器,當...