tcp四種定時器

2021-07-02 23:51:38 字數 2609 閱讀 7162

定時器在tcp可靠傳輸的過程中起著舉足輕重的作用。tcp在建立連線之後可能(保活keep-alive定時器是可選的)會 啟動四個定時器。

tcp使用四種定時器(timer,也稱為「計時器」):

重傳計時器:retransmission timer

堅持計時器:persistent timer

保活計時器:keeplive timer

時間等待計時器:time_wait timer。

(1)重傳計時器:retransmission timer

重傳定時器:為了控制丟失的報文段或丟棄的報文段,也就是對報文段確認的等待時間。當tcp傳送報文段時,就建立這個特定報文段的重傳計時器,可能發生兩種情況:若在計時器超時之前收到對報文段的確認,則撤銷計時器;若在收到對特定報文段的確認之前計時器超時,則重傳該報文,並把計時器復位;

重傳時間=2*rtt;

rtt的值應該動態計算。常用的公式是:rtt=previous rtt*i + (1-i)*current rtt。i的值通常取90%,即新的rtt是以前的rtt值的90%加上當前rtt值的10%.

karn演算法:對重傳報文,在計算新的rtt時,不考慮重傳報文的rtt。因為無法推理出:傳送端所收到的確認是對上一次報文段的確認還是對重傳報文段的確認。乾脆不計入。

(2)堅持計時器:persistent timer

專門為對付零視窗通知而設立的。

當傳送端收到零視窗的確認時,就啟動堅持計時器,當堅持計時器截止期到時,傳送端tcp就傳送乙個特殊的報文段,叫探測報文段,這個報文段只有乙個位元組的資料。探測報文段有序號,但序號永遠不需要確認,甚至在計算對其他部分資料的確認時這個序號也被忽略。探測報文段提醒接收端tcp,確認已丟失,必須重傳。

堅持計時器的截止期設定為重傳時間的值,但若沒有收到從接收端來的響應,則傳送另乙個探測報文段,並將堅持計時器的值加倍和並復位,傳送端繼續傳送探測報文段,將堅持計時器的值加倍和復位,知道這個值增大到閾值為止(通常為60秒)。之後,傳送端每隔60s就傳送乙個報文段,直到視窗重新開啟為止;

補充:堅持定時器的原理是簡單的,當tcp伺服器收到了客戶端的0滑動視窗報文的時候,就啟動乙個定時器來計時,並在定時器溢位的時候向向客戶端查詢視窗是否已經增大,如果得到非零的視窗就重新開始傳送資料,如果得到0視窗就再開乙個新的定時器準備下一次查詢。通過觀察可以得知,tcp的堅持定時器使用1,2,4,8,16……64秒這樣的普通指數退避序列來作為每一次的溢位時間。

糊塗視窗綜合症

tcp的視窗協議,會引起一種通常叫做糊塗視窗綜合症的問題,具體表現為,當客戶端通告乙個小的非零視窗時,伺服器立刻傳送小資料給客戶端並充滿其緩衝區,一來二去就會讓網路中充滿小tcp資料報,從而影響網路利用率。對於傳送方和接收端的這種糊塗行為。

再次補充:

tcp通過讓接收方指明希望從傳送方接收的資料位元組數(即視窗大小)來進行流量控制。如果視窗大小為 0會發生什麼情況呢?這將有效地阻止傳送方傳送資料,直到視窗變為非0為止。

tcp不對ack報文段進行確認, tcp只確認那些包含有資料的ack報文段。

如果乙個確認丟失了(這個確認是」接收方「向」傳送方「傳送的ack,通知」傳送方「自己的視窗已經非0了),則雙方就有可能因為等待對方而使連線終止:接收方等待接收資料(因為它已經向傳送方通告了乙個非 0的視窗),而傳送方在等待允許它繼續傳送資料的視窗更新。為防止這種死鎖情況的發生,傳送方使用乙個堅持定時器 (persist timer)來周期性地向接收方查詢,以便發現視窗是否已增大。這些從傳送方發出的報文段稱為視窗探查 (window probe)。

(3)保活計時器:keeplive timer

每當伺服器收到客戶的資訊,就將keeplive timer復位,超時通常設定2小時,若伺服器超過2小時還沒有收到來自客戶的資訊,就傳送探測報文段,若傳送了10個探測報文段(沒75秒傳送乙個)還沒收到響應,則終止連線。

補充:保活定時器更加的簡單,還記得ftp或者http伺服器都有sesstion time機制麼?因為tcp是面向連線的,所以就會出現只連線不傳送資料的「半開放連線」,伺服器當然要檢測到這種連線並且在某些情況下釋放這種連線,這就是保活定時器的作用。其時限根據伺服器的實現不同而不通。另外要提到的是,當其中一端如果崩潰並重新啟動的情況下,如果收到該端「前生」的保活探察,則要傳送乙個rst資料報文幫助另一端結束連線。

(4)時間等待計時器:time_wait timer

在連線終止期使用,當tcp關閉連線時,並不認為這個連線就真正關閉了,在時間等待期間,連線還處於一種中間過度狀態。這樣就可以時重複的fin報文段在到達終點後被丟棄,這個計時器的值通常設定為一格報文段壽命期望值的兩倍。

補充:2msl定時器:msl是報文段做大生存時間(maximum segment lifetime),設定這個定時器有兩個目的:

其一是為了測量連線處於time_wait狀態的時間.這樣可以讓tcp再次傳送最後的ack以防止這個ack丟失(如果丟失,另一端會重傳fin)。

其二,為允許老的重複分節在網路中消逝。具體可以解釋為,如果乙個tcp連線在斷開之前有迷途分節尚未消逝,在斷開該tcp連線之後立刻重啟乙個同樣的連線(雙方的ip位址和埠port相同),這時之前的迷途的老分節可能對新的新的tcp連線接收,從而造成未定義的錯誤。為了避免這種情況,tcp規定在time_wait狀態,不能啟動乙個連線的化身。既然time_wait狀態維持2msl,這就保證了乙個連線上的分組及其應該在 2msl內都會消失。

tcp四種定時器

tcp使用四種定時器 timer,也稱為 計時器 重傳計時器 retransmission timer 堅持計時器 persistent timer 保活計時器 keeplive timer 時間等待計時器 time wait timer。1 重傳計時器 重傳定時器 為了控制丟失的報文段或丟棄的報文...

解讀TCP 四種定時器

一.tcp的四種定時器 tcp使用四種定時器 timer,也稱為 計時器 重傳計時器 retransmission timer 堅持計時器 persistent timer 保活計時器 keeplive timer 時間等待計時器 time wait timer。1 重傳計時器 重傳定時器 為了控制...

TCP的四種定時器

tcp在建立連線後會啟動四個定時器 重傳計時器 retransmission timer 堅持計時器 persistent timer 保活計時器 keeplive timer 2msl定時器 time wait timer 1 重傳計時器 tcp的傳送方沒有在規定的時間內收到確認就要重傳已傳送的報...