對於每個tcp連線,tcp一般要管理4個不同的定時器:重傳定時器、堅持定時器、保活定時器、2msl定時器。
重傳定時器
每傳送乙個報文段就會啟動重傳定時器,如果在定時器時間到後還沒收到對該報文段的確認,就重傳該報文段,並將重傳定時器復位,重新計算;如果在規定時間內收到了對該報文段的確認,則撤銷該報文段的重傳定時器。
堅持定時器
主要是為了應付零視窗大小通知可能導致的死鎖問題。如果接收端在向傳送端傳送了零視窗報文段後不久,接收端的接收快取又有了一些儲存空間,於是接收端向傳送端傳送了乙個非零視窗大小的報文段,然而這個報文段在傳送過程中丟失了,傳送端沒有收到該報文段,就一直等待接收端傳送非零視窗的報文通知,而接收端並不知道報文段丟失了,而是覺得已經告訴傳送端了,就會一直等待傳送端傳送資料,如果沒有任何措施的話,這話死鎖的局面會一直延續下去。
為了解決這個問題,tcp為每乙個連線設有乙個堅持定時器(也叫持續計數器)。只要tcp連線的一方收到對方的零視窗通知,就啟動堅持定時器。若堅持定時器設定的時間到期,就傳送乙個零視窗控測報文段(該報文段只有乙個位元組的資料,它有乙個序號,但該序號永遠不需要確認,因此該序號可以持續重傳),之後會出現以下三種情況:
1、對方在收到探測報文段後,在對該報文段的確認中給出現在的視窗值,如果視窗值仍未零,則收到這個報文段的一方將堅持定時器的值加倍並重啟。堅持計數器最大只能增加到約60秒,在此之後,每次收到零視窗通知,堅持計數器的值就定位60秒。
2、對方在收到探測報文段後,在對該報文段的確認中給出現在的視窗值,如果視窗不為零,那麼死鎖的僵局就被打破了。
3、該探測報文發出後,會同時啟動重傳定時器,如果重傳定時器的時間到期,還沒有收到接收到發來的響應,則超時重傳探測報文。
保活定時器
保活定時器是為了應對兩個tcp連線間出現長時間的沒有資料傳輸的情況。如果客戶已與伺服器建立了tcp連線,但後來客戶端主機突然故障,則伺服器就不能再收到客戶端發來的資料了,而伺服器肯定不能這樣永久地等下去,保活定時器就是用來解決這個問題的。伺服器每收到一次客戶端的資料,就重新設定保活定時器,通常為2小時,如果2小時沒有收到客戶端的資料,服務端就傳送乙個探測報文,以後每隔75秒傳送一次,如果連續傳送10次探測報文段後仍沒有收到客戶端的響應,伺服器就認為客戶端出現了故障,就可以終止這個連線。
2msl定時器
time_wait狀態也稱為2msl等待狀態。每個具體tcp實現必須選擇乙個報文段最大生存時間(msl)。它是任何報文段被丟棄前在網路內的最長時間(預設為2分鐘,實現中常設定為30秒,1分鐘或2分鐘)。正如前文所提2msl狀態,2msl定時器在tcp終止的四次握手中的第四次握手開始啟動,此時傳送fin方處於last_ack狀態,而傳送ack方處於time_wait狀態,為了確保它傳送的最後乙個ack可以順利的到達伺服器,2msl定時器啟動,直至到達預定的時間才復位結束,雙方進入closed狀態。如果主動關閉方在被動關閉方的time_wait狀態不等待一段時間就直接釋放連線並進入 closed 狀態,那麼主動關閉方無法收到來自被動關閉方重發的 fin+ack 報文段,也就不會再傳送一次確認ack 報文段,因此被動關閉方就無法正常進入closed狀態。
TCP協議中的四大定時器
介紹一下tcp連線中的4個定時器 重傳定時器 堅持定時器 保活定時器 2msl定時器,他們存在於每乙個連線中。重傳定時器是用來計算tcp報文段的超時重傳時間的,每傳送乙個報文段就會啟動重傳定時器,如果在定時器時間到後還沒收到對該報文段的確認,就重傳該報文段,並將重傳定時器復位,重新計算 如果在規定時...
TCP四個定時器 之 TCP堅持定時器
tcp通過讓接收方指明希望從傳送方接收的資料位元組數 即視窗大小 來進行流量控制。如果視窗大小為 0會發生什麼情況呢?這將有效地阻止傳送方傳送資料,直到視窗變為非0為止。tcp不對ack報文段進行確認,tcp只確認那些包含有資料的ack報文段。如果乙個確認丟失了,則雙方就有可能因為等待對方而使連線終...
TCP中的定時器
在傳送syn報文段建立一條新連線時啟動。如果在75秒內沒有收到響應,連線建立將中止。在tcp傳送某個資料段時設定。如果該定時器超時而對端的確認還未到達,tcp將重傳該資料段。重傳定時器的值 即tcp等待對端確認的時間 是動態計算的,與rtt的估計值密切相關,且還取決於該報文段已被重傳的次數。在tcp...