tcp協議中的定時器
什麼是計時器呢?我們可以理解成一塊鬧鐘,隔一段時間響一次,提醒tcp做特定的事情。tcp要正常工作,必須要有特定的計時器。
tcp使用四種定時器(timer,也稱為「計時器」):
重傳計時器(retransmission timer
)、堅持計時器(persistent timer)、
保活計時器(keeplive timer)、
時間等待計時器(time_wait timer)。
1、重傳計時器
(retransmission timer)
為了防止報文丟失或者損壞,tcp在傳送乙個報文以後啟動重傳定時器,
如果定時器溢位之前該報文的ack還未到達,則重傳該報文。重傳定時器超時時間
(retransmision timeout)依賴於往返時間rtt,而rtt在傳輸的過程中是動態變化的,
而且變化範圍較大,精準的計算rtt較困難,tcp有時間戳選項,為準確的計算rtt提供
了方便。
tcp保證可靠傳輸是依賴帶確認的重傳機制。在滑動視窗協議中,接受視窗會在連續收到的包序列中的最後乙個包向接收端傳送乙個ack,當網路擁堵的時候,傳送端的資料報和接收端的ack包都有可能丟失。tcp為了保證資料可靠傳輸,就規定在重傳的「時間片」到了以後,如果還沒有收到對方的ack,就重發此包,以避免陷入無限等待中。
當tcp傳送報文段時,就建立該特定報文的重傳計時器。可能發生兩種情況:
1.若在計時器截止時間到之前收到了對此特定報文段的確認,則撤銷此計時器。
2.若在收到了對此特定報文段的確認之前計時器截止時間到,則重傳此報文段,並將計時器復位。
2、堅持計時器(persistent timer)
專門為對付零視窗通知而設立的。
零視窗:傳送端向接收端傳送資料報知道接受視窗填滿了,然後接受視窗告訴傳送方接受視窗填滿了停止傳送資料。此時的狀態稱為「零視窗」狀態,傳送端和接收端視窗大小均為0.直到接受tcp傳送確認並宣布乙個非零的視窗大小。但這個確認會丟失。我們知道tcp中,對確認是不需要傳送確認的。若確認丟失了,接受tcp並不知道,而是會認為他已經完成了任務,並等待著傳送tcp接著會傳送更多的報文段。但傳送tcp由於沒有收到確認,就等待對方傳送確認來通知視窗大小。雙方的tcp都在永遠的等待著對方。這是一種死鎖狀態。
當傳送端收到零視窗的確認時,就啟動堅持計時器,當堅持計時器截止期到時,傳送端tcp就傳送乙個特殊的報文段,叫探測報文段,這個報文段只有乙個位元組的資料。探測報文段有序號,但序號永遠不需要確認,甚至在計算對其他部分資料的確認時這個序號也被忽略。探測報文段提醒接收端tcp,確認已丟失,必須重傳。
堅持計時器的截止期設定為重傳時間的值,但若沒有收到從接收端來的響應,則傳送另乙個探測報文段,並將堅持計時器的值加倍和並復位,傳送端繼續傳送探測報文段,將堅持計時器的值加倍和復位,知道這個值增大到閾值為止(通常為60秒)。之後,傳送端每隔60s就傳送乙個報文段,直到視窗重新開啟為止。
3、保活計時器(keeplive timer)
每當伺服器收到客戶的資訊,就將keeplive timer復位,超時通常設定2小時,若伺服器超過2小時還沒有收到來自客戶的資訊,就傳送探測報文段,若傳送了10個探測報文段(沒75秒傳送乙個)還沒收到響應,則終止連線。
保活計時器使用在某些實現中,用來防止在兩個tcp之間的連線出現長時間的空閒。假定客戶開啟了到伺服器的連線,傳送了一些資料,然後就保持靜默了。也許這個客戶出故障了。在這種情況下,這個連線將永遠的處理開啟狀態。
要解決這種問題,在大多數的實現中都是使伺服器設定保活計時器。每當伺服器收到客戶的資訊,就將計時器復位。通常設定為兩小時。若伺服器過了兩小時還沒有收到客戶的資訊,他就傳送探測報文段。若傳送了10個探測報文段(每乙個像個75秒)還沒有響應,就假定客戶除了故障,因而就終止了該連線。
這種連線的斷開不會使用四次握手,而是直接硬性的中斷和客戶端的tcp連線。
4、時間等待計時器(time_wait timer)
時間等待計時器是在四次握手的時候使用的。
在連線終止期使用,當tcp關閉連線時,並不認為這個連線就真正關閉了,在時間等待期間,連線還處於一種中間過度狀態。這樣就可以時重複的fin報文段在到達終點後被丟棄,這個計時器的值通常設定為一格報文段壽命期望值的兩倍。
msl是報文段最大生存時間(maximum segment lifetime),設定這個定時器
有兩個目的其一是為了測量連線處於time_wait狀態的時間.這樣可以讓tcp再次傳送最後
的ack以防止這個ack丟失(如果丟失,另一端會重傳fin)。
其二,為允許老的重複分節在網路中消逝。
四次握手的簡單過程是這樣的:假設客戶端準備中斷連線,首先向伺服器端傳送乙個fin的請求關閉包(fin=final),然後由established過渡到fin-wait1狀態。伺服器收到fin包以後會傳送乙個ack,然後自己有established進入close-wait.此時通訊進入半雙工狀態,即留給伺服器乙個機會將剩餘資料傳遞給客戶端,傳遞完後伺服器傳送乙個fin+ack的包,表示我已經傳送完資料可以斷開連線了,就這便進入last_ack階段。客戶端收到以後,傳送乙個ack表示收到並同意請求,接著由fin-wait2進入time-wait階段。伺服器收到ack,結束連線。此時(即客戶端傳送完ack包之後),客戶端還要等待2msl(msl=maxinum segment lifetime最長報文生存時間,2msl就是兩倍的msl)才能真正的關閉連線。
TCP協議中的定時器
tcp協議中的定時器 1 連線建立 connection establishment 定時器 在傳送syn報文段建立一條新連線時啟動。如果在75秒內沒有收到響應,連線建立將中止。2 重傳 retransmission 定時器 在tcp傳送某個資料段時設定。在滑動視窗協議中,接受視窗會在連續收到的包序...
TCP協議中的定時器
1 連線建立 connection establishment 定時器 在傳送syn報文段建立一條新連線時啟動。如果在75秒內沒有收到響應,連線建立將中止。2 重傳 retransmission 定時器 在tcp傳送某個資料段時設定。在滑動視窗協議中,接受視窗會在連續收到的包序列中的最後乙個包向接收...
總結TCP協議中的定時器
上回說到tcp協議保持資料傳輸可靠性的一種手段就是定時器 詳情戳小白的福音 秒懂udp協議 tcp協議。那麼本文就總結一下tcp協議中用到的定時器及其作用。tcp協議共有四種定時器 timer,也稱為 計時器 1.超時重傳計時器 retransmission timer為了控制丟失的報文段或丟棄的報...