1. 程式人生 > >【網路協議】TCP中的四大定時器

【網路協議】TCP中的四大定時器

    前言 

    對於每個TCP連線,TCP一般要管理4個不同的定時器:重傳定時器、堅持定時器、保活定時器、2MSL定時器。

    重傳定時器 

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

    堅持定時器 

    上篇文章中已經提到了,主要是為了應付零視窗大小通知可能導致的死鎖問題。如果接收端在向傳送端傳送了零視窗報文段後不久,接收端的接收快取又有了一些儲存空間,於是接收端向傳送端傳送了一個非零視窗大小的報文段,然而這個報文段在傳送過程中丟失了,傳送端沒有收到該報文段,就一直等待接收端傳送非零視窗的報文通知,而接收端並不知道報文段丟失了,而是覺得已經告訴傳送端了,就會一直等待發送端傳送資料,如果沒有任何措施的話,這話死鎖的局面會一直延續下去。

    為了解決這個問題,TCP為每一個連線設有一個堅持定時器(也叫持續計數器)。只要TCP連線的一方收到對方的零視窗通知,就啟動堅持定時器。若堅持定時器設定的時間到期,就傳送一個零視窗控測報文段(該報文段只有一個位元組的資料,它有一個序號,但該序號永遠不需要確認,因此該序號可以持續重傳),之後會出現以下三種情況:

    1、對方在收到探測報文段後,在對該報文段的確認中給出現在的視窗值,如果視窗值仍未零,則收到這個報文段的一方將堅持定時器的值加倍並重啟。堅持計數器最大隻能增加到約60秒,在此之後,每次收到零視窗通知,堅持計數器的值就定位60秒。

    2、對方在收到探測報文段後,在對該報文段的確認中給出現在的視窗值,如果視窗不為零,那麼死鎖的僵局就被打破了。

    3、該探測報文發出後,會同時啟動重傳定時器,如果重傳定時器的時間到期,還沒有收到接收到發來的響應,則超時重傳探測報文。

    保活定時器 

    保活定時器是為了應對兩個TCP連線間出現長時間的沒有資料傳輸的情況。如果客戶已與伺服器建立了TCP連線,但後來客戶端主機突然故障,則伺服器就不能再收到客戶端發來的資料了,而伺服器肯定不能這樣永久地等下去,保活定時器就是用來解決這個問題的。伺服器每收到一次客戶端的資料,就重新設定保活定時器,通常為2小時,如果2小時沒有收到客戶端的資料,服務端就傳送一個探測報文,以後每隔75秒傳送一次,如果連續傳送10次探測報文段後仍沒有收到客戶端的響應,伺服器就認為客戶端出現了故障,就可以終止這個連線。

    2MSL定時器 

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