人人IT網

人人IT網

當前位置: 主頁 > 編程語言 > C >

TCP的計數器

時間:2016-12-01 19:41來源:Internet 作者:Internet 點擊:
            为了能夠順利的進行TCP的操作,大多數的TCP實現至少要使用4個計時器,見下圖。   重傳計數器 为了重傳丟失的報文段,TCP應用了一個重傳計時器(在整個連接期間)來處理重傳

     

      为了能夠順利的進行TCP的操作,大多數的TCP實現至少要使用4個計時器,見下圖。

 

重傳計數器

为了重傳丟失的報文段,TCP應用了一個重傳計時器(在整個連接期間)來處理重傳超時(RTO),也就是對報文段的確認的等待時間。我們可以以为重傳計時器定義一下規則:

  • 當TCP發送了位於發送隊列最前端的報文段後,就启動這個計時器。
  • 當這個計時器超時後,TCP重傳位於發送隊列最前端的報文段,並重启這個計時器。
  • 當一個(或多個)報文段被累計確認後,這個(或這些)報文段被消除出隊列。
  • 如果隊列为空,TCP停止這個計時器,否則TCP重启計時器

 

往返時間(RTT)

     要計算重傳的超時期限(RTO),我們首先要計算往返時間(round trip time,RTT),但是計算TCP中的RTT是個复雜的過程,我們將通過一些例子逐步了解它。

 

測量RTT

         我們需要找出從發送出去一個報文段到對它的確認需要多少時間。這就是測量RTT。我們應當記住,報文段和他的確認之間並非一對一的關系,好幾個報文段有可能會被一起確認。一個報文段的測量RTT是指這個報文段到達終點並被確認需要的時間,雖然這個確認可能還包括對其他報文段的確認。請注意,在TCP中,任何時刻只能有一個正在運行的RTT測量。也就是說,如果RTT測量開始了,那麼在這次的RTT測量結束之前,不能再開始其他測量。我們使用記法RTT(m)表示測量RTT。

 

平滑RTT

      測量RTT很可能每次往返都有變化。在目前的因特網中,RTT測量值的起伏非常大,以至於單詞測量值無法被用於重傳超時的目的。絕大多數實現使用的是一種平滑RTT,記为RTT(s),它是對RTT(m)和前一個RTT(s)的加權平均,如下表示:

α的取值與實現有關,但通常为1/8.換言之,新的RTT(s)是由7/8的舊RTT(s)和1/8的當前RTT(m)相加而成。

 

RTT的偏差

        大多數的實現不僅使用了RTT(s),還要計算RTT的偏差,稱为RTT(d).它是根據RTT(s)和RTT(m)並使用下面公式計算得到的:

β的取值與實現有關,但通常为1/4.

 

重傳超時(RTO)

       RTO的數值基於平滑的往返時間和它的偏差值。絕大多數實現使用下面的公式計算RTO:

換言之 ,就是用但錢的RTT(s)值,加上當前的RTT(d)值(通常是個較小的數)的四倍。

 

 

下圖所示为一個連接的一部分。圖中畫出了連接建立階段和部分數據傳送階段。

1、當SYN報文段發送後,沒有RTT(m)、RTT(s)或RTT(d)的值。RTO值設为6.0秒,下面给出此時這些變量的值为:

 

2、當SYN+ACK報文段到達時,測量出RTT(m)等於1.5秒,下面给出的這些變量的值:

RTT(m)=1.5

RTT(s)=1.5

RTT(d)=1.5/2-0.75

RTO=1.5+4*0.75=4.5

 

3、當第一個報文段被發送後,新的RTT測量就開始了,請注意,在發送發發送ACk報文段時不能開启下一次RTT的測量過程,因为ACK報文段不消耗序號,也沒有超時。在發送第二個數據報文段時也沒有測量RTT,因为已經有一個RTT測量正在進行之中。最後一個ACK報文段的到達用來計算RTT(m)的下一個數值。雖然最後一個ACK報文段確認了兩個數據報文段(累積的),但它的到達完成的是對第一個數據報文段的RTT(m)的計算。現在這些變量的值如下:

RTT(m)=2.5

RTT(s) =7/8 X 1.5 + 1/8 X 2.5=1.625

RTT(d) = 3/4 X(0.75) x | 1.625-2.5| = 0.78

RTO=1.625+4X0.78=4.74

 

Karn算法

       假定有一個報文段在重傳計時器超時前未被確認,因而重傳。當發送TCP收到對這個報文段的確認時,它無法知道這個確認是對原來報文段的確認,還是對重傳報文段的確認,因为新的RTT值要根據報文段發送的時間來計算。但是如果原始的報文段丟失了而確認是對重傳的報文段確認,則當前的RTT的計算就必須從重傳的報文段發送的時間算起。這種模糊性被Karn解决了。Karn的算法很簡單。在計算新的RTT時,不需要考慮重傳報文段的往返時間。除非你發送了一個報文段並且在沒有被重傳的條件下收到了確認,否則不要更新RTT的值。TCP在計算新的RTO時不考慮重傳報文段的RTT。

 

指數退避

       如果發生了重傳,那麼RTO的指數是什麼?大多數的TCP使用指數退避的策略。每一次重傳,RTO的數值就加倍。因此,如果報文段重傳一次,這個值就是兩倍的RTO。如果它被重傳了兩次,這個值就編程了四倍的RTO一次類推。

       下圖所示为前面例子的延續,這次出現了重傳,因而用到了Karn算法。

       

       圖中的第一個報文段發送出去,但丟失了。經過4.74秒後,RTO計時器到期。這個報文段被重傳,而計時器被設置为9.48秒,原來的RTO值的兩倍。這次在計時器超時之前收到了ACK。我們繼續等待,直至我們發送一個新的報文段,並收到了對它的確認,然後才能重新計算RTO(Karn算法)。

 

 

持續計時器

       为了處理零窗口值的通道,TCP需要另一個計時器。如果接收TCP宣布窗口为零,那麼發送TCP就會停止發送報文段,直至收到TCP發送來一個宣布窗口大小非零的確認。但是這個ACK報文段可能丟失。應當記住,在TCP中的確認報文段既不需要確認,也不需要重傳。如果確認報文段丟失了,接收TCP仍然認为這個確認已經完成了任務,並等待着發送TCP下面的報文段。對於僅包含有一個確認的報文段是沒有重傳計時器的。發送TCP由於沒有收到確認,就等待對方發送一個確認來通知窗口的大小。這兩個TCP都在永遠等待着對方(死锁)。

         为了糾正這個死锁問題,TCP为每個連接使用一個持續計時器(persistence timer)。當發送TCP接收窗口值为零的確認時,就启動一個持續計時器。當持續計時器超時後,發送一個TCP特殊的報文段,稱为探測報文段。這個報文段只有1個字節的新數據。它有序號,但它的需要永遠不需要確認,甚至在計算剩餘數據的序號時,這個序號也被忽略。探測報文段促使接收TCP重傳一個確認。

        持續計時器的時間長度被設置为重傳時間的值。但是若沒有收到從接收方發送來的響應,則需要發送另一個探測報文段,並將其持續計時器的值加倍,且該計時器复位。發送方繼續發送探測報文段,不斷地將持續計時器的值加倍和复位,直到這個值達到一個門限(通常是60秒)为止。在這以後,發送端每個60秒就發送一個探測報文段,直到窗口重新打開。

 

 

 

保活計時器

       某些實現中要使用報貨計時器(keepalive timer)來防止兩個TCP之間的連接長時間空閑。假定一個客戶端打開了到服務器的一條連接,傳送過一些數據,然後就變的靜默了。也許是因为這個客戶處了什麼故障。在這種情況下,這個連接將永遠處於打開狀態。

       为了解决這個問題,絕大多數的實現都是给服務器設置了一個保活計時器。每當服務器收到客戶的信息,就把該計時器复位。超時通常設置为2個小時。若服務器過了兩個小時還沒有收到客戶端的任何消息,它就發送一個探測報文段。若聯系發送了10個探測報文段(每隔75秒一個)沒有收到響應,它就假定客戶出了故障,並終止這個連接。

 

TIME-WAIT計時器

        TIME-WAIT(2msl)計時器是在連接終止期間使用的。参考TCP狀態轉換圖

 

 


From:ITEYE
頂一下
(0)
0%
踩一下
(0)
0%
------分隔線----------------------------
發表評論
請自覺遵守互聯網相關的政策法規,嚴禁發布色情、暴力、反動的言論。
評價:
表情:
驗證碼:點擊我更換圖片
欄目列表
推薦內容