1. 程式人生 > >Tcp的四種定時器和三次握手四次揮手協議

Tcp的四種定時器和三次握手四次揮手協議

TCP使用四種定時器(Timer,也稱為“計時器”):

重傳計時器(Retransmission Timer) 
堅持計時器(Persistent Timer) 
保活計時器(Keeplive Timer) 
時間等待計時器(Time_Wait Timer) 
(1)重傳計時器: 重傳定時器:為了控制丟失的報文段或丟棄的報文段,也就是對報文段確認的等待時間。當TCP傳送報文段時,就建立這個特定報文段的重傳計時器,可能發生兩種情況:若在計時器超時之前收到對報文段的確認,則撤銷計時器;若在收到對特定報文段的確認之前計時器超時,則重傳該報文,並把計時器復位; 重傳時間=2RTT;* RTT的值應該動態計算。常用的公式是:RTT=previous RTTi + (1-i)current RTT。i的值通常取90%,即新的RTT是以前的RTT值的90%加上當前RTT值的10%。

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

(2)堅持計時器: 專門為對付零視窗通知而設立的。

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

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

(3)保活計時器:

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

(4)時間等待計時器:

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

TIME_WAIT是主動關閉連線的一端最後進入的狀態,而不是直接變成CLOSED的狀態,為什麼呢? 第一個原因是萬一最後一個ACK丟失了,對端會重傳的,這個在超時之前的重新收到對端的FIN也可以回ACK,而不是RST。 另外一個原因是防止老連線的包在新連線裡面出現,影響了新連線。有這個2MSL的時間,可以在2個MSL時間之內不會建立同樣四元組(源IP, 源埠,目的IP,目的埠)的連線,也就不會出現老的包影響新連線的事情。