如何管理定時器 詳解TCP四種定時器和四個定時器

2021-10-14 17:52:14 字數 4662 閱讀 2711

重傳計時器:retransmission timer

堅持計時器:persistent timer

保活計時器:keeplive timer

時間等待計時器:time_wait timer。

(1)重傳計時器:

很明顯重傳定時器是用來計算tcp報文段的超時重傳時間的(至於超時重傳時間的確定,這裡涉及到一大堆的演算法,書上有說,我這裡不細談了)。每傳送乙個報文段就會啟動重傳定時器,如果在定時器時間到後還沒收到對該報文段的確認,就重傳該報文段,並將重傳定時器復位,重新計算;如果在規定時間內收到了對該報文段的確認,則撤銷該報文段的重傳定時器。

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

重傳時間=2*rtt;

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

(2)堅持計時器:persistent timer

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

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

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

(3)保活計時器:keeplive timer

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

伺服器應用程式用來探知客戶主機是否崩潰並啟動,或者崩潰關機等場景。

具體來說客戶主機必定處於以下4中狀態之一:

正常執行。tcp響應正常,服務端知道客戶端工作正常,伺服器在兩小時後將保活定時器復位,如果這兩小時之間有應用程式通過這個連線通訊,保活定時器在交換資料後的未來兩小時再復位;此時的伺服器應用程式不需要感知保活定時器

客戶主機崩潰,並且關閉或者正在重啟。伺服器總共傳送10個探查,每個間隔75秒,如果沒有任何響應,認為客戶主機關閉並終止連線;

客戶主機崩潰但已經重啟。伺服器收到保活探查的響應,但響應回會是個復位,使得伺服器終止連線;

客戶主機正常,但是服務不可達。與2類似,只能得到沒有探查響應

缺點在於:1短暫差錯可能使得乙個好的連線被釋放;2保活浪費不必要的頻寬;

(4)時間等待計時器:time_wait timer,也叫2msl定時器

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

2msl定時器測量乙個連線處於time—wait黃台的時間,通常為2msl(報文段壽命的兩倍)。2msl定時器的設定主要是為了確保傳送的最後乙個ack報文段能夠到達對方,並防止之前與本連線有關的由於延遲等原因而導致已失效的報文被誤判為有效。

關閉視窗的場景:接收方通告傳送方接收的資料視窗為0,這個時候傳送方不再傳送資料;

開啟視窗ack丟失的危害:當接收方通告了乙個視窗為非0的ack,此ack由於某種原因丟失,此時傳送方在永遠的等視窗開啟的通知,接收方則永遠的在等新資料的到來,這樣有可能因為等待而造成連線關閉。

解決策略:使用堅持定時器,週期性的向接收方查詢,以便發現視窗的變化

對於伺服器來講,如果處理的速度過於緩慢,他會將通告視窗的值設定的越來越小,甚至是小於報文頭,這種情況下,通訊的效率極其低下,這種情況稱作糊塗視窗綜合症。

接收方:當視窗增加乙個報文段大小(mss)或者可以增加接收方快取空間一半時,才通告視窗大小

傳送方:當可以傳送乙個滿長度的報文、傳送至少是接收方通告視窗大小的一半的報文或者是可以傳送任何資料並且不希望接收ack(這種情況,資料都已經確認了)

nagle演算法中,當報文太小的時候就不傳送,這裡的小,可以看出傳送方傳送的報文小於報文段大小

對每個連線,tcp管理4個不同的定時器。

tcp在傳送乙份資料後,啟動重傳定時器,在經過若干時間後如果沒有收到ack,則重傳該資料,這個時間間隔通常如下:1s, 3s, 6s, 12s, 24, 48s, 和多個64s。這個指數關係被稱為指數退避。tcp會一直嘗試重傳該資料,在9分鐘以後放棄。

假定有如下情況:接收方接收到一定量的資料,發現本地快取滿了,於是傳送乙個視窗大小為0的ack給傳送方,傳送方在接收到該ack後停止傳送。一段時間後,接收方有空餘的視窗,於是傳送乙個視窗大小非0的ack以更新視窗,不幸的是該ack丟失了,於是整個連線被停止。堅持定時器正是為了解決這個問題,它在接收到乙個視窗大小為0的ack以後,啟動乙個定時器,定時去查詢是否視窗已經更新(同樣採用指標退避)。

有如下情況,連線建立好以後,傳送方不傳送任何資料,這樣一直下去(有可能是傳送方系統崩潰,或者網路被意外切斷),這就導致服務端一直占用該連線,浪費資源。保活定時器通常每兩小時傳送乙個探測請求以檢視對方是否存活。

2msl時間是為了讓tcp有時間傳送最後乙個ack,防止該ack丟失。

堅持定時器

乙個例子

為了觀察到實際中的堅持定時器,我們啟動乙個接收程序。它監聽來自客戶的連線請求,接受該連線請求,然後在從網上讀取資料前休眠很長一段時間。

sock程式可以通過指定乙個暫停選項 - p使伺服器在接受連線和進行第一次讀動作之間進入休眠。我們以這種方式呼叫伺服器:

svr4 % sock -i -s -p100000 5555
該命令在從網路上讀資料之前休眠 100 000秒(27.8小時)。客戶執行在主機bsdi上,並向伺服器的5555埠執行1024位元組的寫操作。下圖給出了tcpdump的輸出結果(我們已經在結果中去掉了連線的建立過程)。

報文段1 ~ 1 3顯示的是從客戶到伺服器的正常的資料傳輸過程,有9216個位元組的資料填充了視窗。伺服器通告視窗大小為4096位元組,且預設的插口快取大小為4096位元組。但實際上它一共接收了9216位元組的資料,這是在s v r 4中tcp**和流子系統(stream subsystem)之間某種形式互動的結果。

在報文段1 3中,伺服器確認了前面 4個資料報文段,然後通告視窗為 0,從而使客戶停止傳送任何其他的資料。這就引起客戶設定其堅持定時器。如果在該定時器時間到時客戶還沒有接收到乙個視窗更新,它就探查這個空的視窗以決定視窗更新是否丟失。由於伺服器程序處於休眠狀態,所以tcp快取9216位元組的資料並等待應用程序讀取。

請注意客戶發出的視窗探查之間的時間間隔。在收到乙個大小為 0的視窗通告後的第1個(報文段1 4)間隔為4.949秒,下乙個(報文段16)間隔是4.996秒,隨後的間隔分別約為6,12,24,48和60秒。

為什麼這些間隔總是比5、6、12、24、48和60小乙個零點幾秒呢?因為這些探查被tcp的500 ms定時器超時例程所觸發。當定時器時間到時,就傳送視窗探查,並大約在4 ms之後收到乙個應答。

接收到應答使得定時器被重新啟動,但到下乙個時鐘滴答之間的時間則約為500減4ms。計算堅持定時器時使用了普通的 tcp指數退避。對乙個典型的區域網連線,首次超時時間算出來是1 . 5秒,第2次的超時值增加一倍,為 3秒,再下次乘以4為6秒,之後再乘以8為1 2秒等。但是堅持定時器總是在5 ~ 6 0秒之間,這與我們在上圖中觀察到的現象一致。

視窗探查包含乙個位元組的資料(序號為 9 2 1 7)。tcp總是允許在關閉連線前傳送乙個位元組的資料。請注意,儘管如此,所返回的視窗為0的ack並不是確認該位元組(它們確認了包括9216在內的所有資料),因此這個位元組被持續重傳。

堅持狀態與重傳超時之間乙個不同的特點就是 tcp從不放棄傳送視窗探查。這些探查每隔60秒傳送一次,這個過程將持續到或者視窗被開啟,或者應用程序使用的連線被終止。

總結

產生原因:

首先,接收端傳送乙個視窗大小為0的ack報文;傳送端收到該訊號後,等待接收方傳送視窗大小大於0的ack.

然後,接收端傳送視窗大小大於0的報文,但是該報文丟失,因為tcp並不對ack報文進行確認,這就造成了

接收方等待接收資料,而傳送方仍然等待視窗大於0的ack,產生死鎖。

tcp四種定時器

定時器在tcp可靠傳輸的過程中起著舉足輕重的作用。tcp在建立連線之後可能 保活keep alive定時器是可選的 會 啟動四個定時器。tcp使用四種定時器 timer,也稱為 計時器 重傳計時器 retransmission timer 堅持計時器 persistent timer 保活計時器 k...

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 重傳計時器 重傳定時器 為了控制...