TCP的定時器

2021-09-16 11:56:59 字數 2566 閱讀 6139

建立連線定時器(connection-establishment timer)

重傳定時器(retransmission timer)

延遲應答定時器(delayed ack timer)

堅持定時器(persist timer)

保活定時器(keepalive timer)

fin_wait_2定時器(fin_wait_2 timer)

time_wait定時器 (time_wait timer, 也叫2msl timer)

建立連線的過程中,在傳送syn時, 會啟動乙個定時器(預設應該是3秒),如果syn包丟失了, 那麼3秒以後會重新傳送syn包的(當然還會啟動乙個新的定時器, 設定成6秒超時),當然也不會一直沒完沒了的發syn包,

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

重傳時間=2*rtt;

延遲應答也被成為捎帶ack, 這個定時器是在延遲應答的時候使用的。 為什麼要延遲應答呢? 延遲應答是為了提高網路傳輸的效率。

舉例說明,比如服務端收到客戶端的資料後, 不是立刻回ack給客戶端, 而是等一段時間(一般最大200ms),這樣如果服務端要是有資料需要發給客戶端,那麼這個ack就和服務端的資料一起發給客戶端了, 這樣比立即回給客戶端乙個ack節省了乙個資料報。

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

如上圖所示,sun想bsdi傳送資料。其中第8個報文通告接收方自己視窗大小為0,此時傳送方會暫停傳送資料。待收到第9個報文中新的視窗通告,又重新傳送資料。

假設第9個報文丟失,此時就會發生死鎖:接收等待新的資料,而傳送方此時知道接收方的視窗為0,不會傳送資料。為了避免這種現象:傳送方會使用乙個堅持定時器來周期性地向接收方查詢,以便發現視窗是否增大。這個週期性的報文稱為視窗探查報文。

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

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

如果乙個連線在兩個小時之內沒有任何動作,則伺服器就向客戶傳送乙個探查報文段。客戶主機必須處於一下4個狀態之一:

1)客戶主機依然正常執行,並從伺服器可達。伺服器在2個小時以後將保活計時器復位。

2)客戶主機已經崩潰,並且關閉或者正在重新啟動。在任何一種情況下,客戶的tcp都沒有響應,伺服器也收不到對探查的響應,並在75秒後超時。伺服器總共傳送10個這樣的探查,每個間隔75秒。如果伺服器沒有收到乙個響應,就會認為客戶主機已經關閉並終止連線。

3)客戶主機崩潰並已經重新啟動。這是伺服器將收到乙個對其保活探查的響應,但是這個響應是乙個復位,使得伺服器終止這個連線。

4)客戶主機正常執行,但是伺服器不可達。這與狀態2相同,tcp不能夠區分狀態4與狀態2的區別,它所能發現的就是沒有收到探查的響應。

主動關閉的一端呼叫完close以後(即發fin給被動關閉的一端, 並且收到其對fin的確認ack)則進入fin_wait_2狀態。如果這個時候因為網路突然斷掉、被動關閉的一段宕機等原因,導致主動關閉的一端不能收到被動關閉的一端發來的fin,主動關閉的一段總不能一直傻等著,佔著資源不撒手吧?這個時候就需要fin_wait_2定時器出馬了, 如果在該定時器超時的時候,還是沒收到被動關閉一端發來的fin,那麼不好意思, 不等了, 直接釋放這個鏈結

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

ime_wait狀態也稱為2msl等待狀態。每個具體tcp實現必須選擇乙個報文段最大生存時間msl(maximum segment lifetime),它是任何報文段被丟棄前在網路內的最長時間。當tcp 執行乙個主動關閉,並發回最後乙個ack,該連線必須在time_wait狀態停留的時間為2倍的msl,這樣可以:

1)讓tcp再次傳送最後的ack以防止這個ack丟失(另一端超時並重發最後的fin)。

2)在2msl等待時間,插中使用的本地埠在預設情況下不能再被使用。在連線處於2msl等待時,任何遲到的報文段將被丟棄。

tcp提供了連線的一端在結束它的傳送後還能接收來自另一端資料的能力。

TCP的定時器

在tcp協議中有的時候需要定期或者按照某個演算法對某個事件進行觸發,那麼這個時候,tcp協議是使用定時器進行實現的。在tcp中,會有四種定時器 這四個定時器都有各自的具體作用。tcp是可靠的,因此,它對於發出去的資訊,沒有得到正常ack反饋的,都會啟動乙個重傳機制。這個重傳機制使用乙個重傳定時器,當...

TCP的定時器

在tcp協議中有的時候需要定期或者按照某個演算法對某個事件進行觸發,那麼這個時候,tcp協議是使用定時器進行實現的。在tcp中,會有四種定時器 這四個定時器都有各自的具體作用。tcp是可靠的,因此,它對於發出去的資訊,沒有得到正常ack反饋的,都會啟動乙個重傳機制。這個重傳機制使用乙個重傳定時器,當...

TCP定時器詳解

tcp使用四種定時器 timer,也稱為 計時器 重傳計時器 retransmission timer 堅持計時器 persistent timer 保活計時器 keeplive timer 時間等待計時器 time wait timer。當傳送端收到零視窗的確認時,就啟動堅持計時器,當堅持計時器截...