一.tcp的四種定時器
tcp使用四種定時器(timer,也稱為「計時器」):
重傳計時器:retransmission timer
堅持計時器:persistent timer
保活計時器:keeplive timer
時間等待計時器:time_wait timer。
(1)重傳計時器:
重傳定時器:為了控制丟失的報文段或丟棄的報文段,也就是對報文段確認的等待時間。當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就傳送乙個報文段,直到視窗重新開啟為止;
(3)保活計時器:keeplive timer
每當伺服器收到客戶的資訊,就將keeplive timer復位,超時通常設定2小時,若伺服器超過2小時還沒有收到來自客戶的資訊,就傳送探測報文段,若傳送了10個探測報文段(沒75秒傳送乙個)還沒收到響應,則終止連線。
(4)時間等待計時器:time_wait timer
在連線終止期使用,當tcp關閉連線時,並不認為這個連線就真正關閉了,在時間等待期間,連線還處於一種中間過度狀態。這樣就可以時重複的fin報文段在到達終點後被丟棄,這個計時器的值通常設定為一格報文段壽命期望值的兩倍。
參考文獻:《tcp/ip協議族》 forouzan著,謝希仁譯;
二.tcp的4個定時器
對每個連線,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丟失。三.解讀tcp四種定時器
tcp 是提供可靠的傳輸層,它使用的方法之一就是確認從另一端收到的資料。但是資料和確認都可能會丟失。tcp 通過在傳送時設定乙個定時器來解決這個問題。如果當定時器溢位時還沒收到確認,它就會重傳該資料。關鍵在於超時和重傳策略,即怎樣決定超時的時間間隔和如何確定重傳的頻率。
對於每個連線,tcp 管理著四個不同的定時器:重傳定時器、堅持定時器、保活定時器 以及 2msl 定時器。
重傳定時器
為了防止丟失資料報文段或確認報文段,當 tcp 傳送報文段時,啟動了特定報文段的重傳計時器,若在計時器超時之前收到對報文段的確認,則撤銷計時器。若收到特定報文段的確認之前計時器已經超時,則重傳該報文,並把計時器復位。這裡最重要的是超時的時間計算,有關該時間的請查閱具體的演算法,這裡不再進行記錄。
堅持定時器
堅持定時器主要是解決零視窗大小通知可能導致的死鎖問題。剛開始接收端向傳送端傳送了乙個零視窗報文段。在不久之後,如果接收端的快取區有一定的空間可以接收資料,此時接收端就會向傳送端傳送了乙個非零視窗大小的報文段(即視窗更新),但是這個非零視窗大小的報文段在傳輸過程中丟失,導致傳送端無法接收到該非零視窗大小的報文段。因此,傳送端就會一直處於等待非零視窗大小的報文端通知,由於接收端已經傳送了非零視窗大小的報文段,而且並不知道該報文段在傳輸過程中丟失,則接收端會一直處於等待接收資料狀態,如果沒有任何措施的話,這個死鎖的局面會一直延續下去。
為了解決上面這個問題,tcp 為每乙個連線設有乙個堅持定時器(也叫持續計數器)。當傳送端收到零視窗的確認時,就啟動堅持計時器,當堅持計時器截止期到時,傳送端就傳送乙個特殊的報文段,叫探測報文段,這個報文段只有乙個位元組的資料。探測報文段有序號,但序號永遠不需要確認,甚至在計算對其他部分資料的確認時這個序號也被忽略。探測報文段提醒接收端,確認已丟失,必須重傳。
堅持計時器的截止期設定為重傳時間的值,但若沒有收到來自接收端的響應,則傳送另乙個探測報文段,並將堅持計時器的值加倍和並復位,傳送端繼續傳送探測報文段,將堅持計時器的值加倍和復位,直到這個值增大到閾值為止(通常為 60 秒)。在此之後,傳送端每隔 60s 就傳送乙個報文段,直到視窗重新開啟為止。
堅持定時器的原理:當 tcp 伺服器收到了客戶端的 0 滑動視窗報文時,啟動乙個定時器來計時,並在定時器溢位的時向客戶端查詢視窗是否已經增大,如果得到非零的視窗就重新開始傳送資料,如果得到零視窗就再開乙個新的定時器準備下一次查詢。
保活定時器
保活定時器是為了應對 tcp 連線雙方出現長時間的沒有資料傳輸的情況。如果客戶端與伺服器建立了 tcp 連線之後,客戶端由於某種原因導致主機故障,則伺服器就不能收到來自客戶端的資料,而伺服器不可能一直處於等待狀態,保活定時器就是用來解決這個問題的。伺服器每收到一次客戶端的資料,就重新設定保活定時器,通常為 2 小時,如果 2 小時沒有收到客戶端的資料,服務端就傳送乙個探測報文,以後每隔75秒傳送一次,如果連續傳送10次探測報文段後仍沒有收到客戶端的響應,伺服器就認為客戶端出現了故障,就可以終止這個連線。
2msl 定時器
2msl 定時器主要是解決以下兩種情況:
time_wait 確保有足夠的時間讓對端收到了ack,如果被動關閉的那方沒有收到 ack,就會觸發被動端重發 fin。因為最後一次確認應答 ack 報文段很有可能丟失,因而使被動關閉方處於在list_ack 狀態的,此時被動關閉方會重發這個 fin+ack 報文段,在這等待的 2msl 時間內主動關閉方重新收到這個被動關閉方重發的 fin+ack 報文段,因此,主動關閉方會重新傳送確認應答資訊,從而重新啟動 2msl 計時器,直到通訊雙方都進入 closed 狀態。如果主動關閉方在 time_wait 狀態不等待一段時間就直接釋放連線並進入 closed 狀態,那麼主動關閉方無法收到來自被動關閉方重發的 fin+ack 報文段,也就不會再傳送一次確認 ack 報文段,因此被動關閉方就無法正常進入closed 狀態。
有足夠的時間讓這個連線不會跟後面的連線混在一起。防止已失效的請求連線出現在本連線中。在連線處於 2msl 等待時,任何遲到的報文段將被丟棄,因為處於 2msl等待的、由該插口(插口是ip和埠對的意思,socket)定義的連線在這段時間內將不能被再用,這樣就可以使下乙個新的連線中不會出現這種舊的連線之前延遲的報文段。
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在建立連線後會啟動四個定時器 重傳計時器 retransmission timer 堅持計時器 persistent timer 保活計時器 keeplive timer 2msl定時器 time wait timer 1 重傳計時器 tcp的傳送方沒有在規定的時間內收到確認就要重傳已傳送的報...