TCP的四種定時器簡單記錄

TCP管理的4個不同的定時器:

1.重傳定時器:用於當希望收到另一端的確認。

2.堅持定時器:使窗口大小信息保持不斷流動。

3.保活定時器:檢測TCP空閒連接的另一端何時崩潰或重啓。

4.2MSL定時器:測量一個連接處於TIME_WAIT狀態的時間。MSL(報文段最大生存時間)

 

重傳定時器

規定:第一次發送後所設置的超時時間爲1.5秒,之後爲3、6、12、24、48、多個64秒,     第一次到最後一次的時間差約爲9分                  鍾,定義該值的變量名爲tcp_ip_abort_interval。

若收到特定報文段的確認之前計時器已經超時,則重傳該報文,並把計時器復位。

慢啓動並不完全正確,慢啓動期間進入網絡的分組數增加的速率仍然是在增加的,只有在達到ssthresh擁塞避免算法起作用時,這種增加的速率纔會慢下來。

 

堅持定時器

根本目的是防止接收端回覆的ACK報文丟失,導致發送端不能及時發送下一個報文的死鎖情況。其作用是使窗口大小信息保持不斷流動。

當接收端回覆的通告窗口爲0,從而使客戶端停止發送任何數據時,發送方的堅持定時器開始計時,第一次觸發堅持定時器重新發送報文的時間間隔約爲5秒,之後的時間間隔約爲5、6、12、24、48、多個60秒,這與重傳定時器觸發的時間間隔類似,值得注意的時,堅持定時器與重傳定時器不同的是:堅持定時器的TCP從不放棄發送窗口探查,之後的探查每隔60秒發送一次,一直持續到窗口被打開或者TCP連接被終止。此外,堅持定時器重發的窗口探查爲字節數爲1的報文,這降低了對網絡上帶寬的佔用。

 

TCP的保活定時器:(通常用於服務器)

    我們之前提到過TCP的半打開(half-open)連接,即一端已經關閉或者異常終止而沒有通知另一端所引起。保活功能就是試圖在服務器端檢測到這種半打開的連接。

    但也有人提出異議,如果TCP的兩端都沒有異常,而是中間路由器因爲某種原因down掉而又重新啓動,保活功能將會認爲TCP的一端出現問題而將一個很好的連接斷掉,他們認爲保活功能不應該在TCP中提供,而應該由應用程序完成,例如,BGP協議每30秒向對端發送一個應用的探查;osfp協議默認hello消息10秒,dead 40秒,即如果40s沒有收到hello消息,就認爲鄰居down掉了。

      規定:如果一個給定的連接在默認的兩個小時(tcp_keepidle = 14400 每個代表500ms)之內沒有任何動作,則服務器就向客戶發送一個探查報文段,客戶機一定處於以下四種狀態之一:

(1).客戶機正常運行,並從服務器可達。這時,服務器將keepalive timer復位。

(2).客戶機已經崩潰或者關閉或者重新啓動。客戶機的TCP沒有響應,服務器將在75秒超時後在此向客戶機發送探查報文段,總共發送10個,每個間隔75秒(tcp_keepintvl = 150),如果服務器都沒有收到響應,則終止TCP連接。

(3).客戶機崩潰並已經重新啓動。此時如之前提到的半打開連接,客戶端不再承認與服務器的tcp連接,它會向服務器發送RST響應,終止該連接。

(4).客戶機正常運行,但是服務器不可達。這時,服務器的探查報文超時,接下來的操作與情況(2)相同。

 

2MSL定時器:

TIME_WAIT狀態也稱爲2MSL等待狀態。每個具體TCP實現必須選擇一個報文段最大生存時間(MSL)。它是任何報文段被丟棄前在網絡內的最長時間(默認爲2分鐘,實現中常設置爲30秒,1分鐘或2分鐘)。正如前文所提2MSL狀態,2MSL定時器在TCP終止的四次握手中的第四次握手開始啓動,此時發送FIN方處於LAST_ACK狀態,而發送ACK方處於TIME_WAIT狀態,爲了確保它發送的最後一個ACK可以順利的到達服務器,2MSL定時器啓動,直至到達預定的時間才復位結束,雙方進入CLOSED狀態。如果主動關閉方在被動關閉方的TIME_WAIT狀態不等待一段時間就直接釋放連接並進入 CLOSED 狀態,那麼主動關閉方無法收到來自被動關閉方重發的 FIN+ACK 報文段,也就不會再發送一次確認ACK 報文段,因此被動關閉方就無法正常進入CLOSED狀態。

此外,還有一點要說明,即使主動關閉方順利收到ACK並且進入CLOSED狀態,被動關閉方仍然要等待2MSL時間,並且,這段時間內,被動關閉方的端口不可以被其他應用程序使用,要等到2MSL時間結束纔可繼續使用。當連接處於2MSL等待階段時任何遲到的報文段都將被丟棄。不過在實際應用中可以通過設置SO_REUSEADDR選項達到不必等待2MSL時間結束再使用此端口。


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