TCP系列14—重傳—4、Karn算法和TSOPT的RTTM


一、Karn算法

       在RTT采樣測量過程中,如果一個數據包初傳后,RTO超時重傳,接着收到這個數據包的ACK報文,那么這個ACK報文是對應初傳TCP報文還是對應重傳TCP報文呢?這個問題就是retransmission ambiguity problem。當沒有使用TSOPT選項,單純的ACK報文並不會指示對應初傳包還是重傳包,因此就會發生這個問題。

        Karn算法指出,當RTO超時重傳發生時候,我們不能依據這個TCP報文的ACK信息來更新RTT估計值。這是Karn算法的第一部分,如之前所說這個是RFC6298要求的。

        但是另一方面,如果我們在更新RTO時候只是簡單的忽視重傳報文信息,可能會丟失一些關於網絡狀況的信息。例如當網絡由於負載等原因導致時延變大的時候,降低發送速率更有助於改善網絡狀況,因此當進行RTO超時重傳時候需要進行指數回退。TCP在RTO上應用一個backoff factor,在每次重傳超時的時候,backoff factor進行倍增,直到收到一個對應未重傳報文(只進行了初傳沒有進行重傳)的ACK包的時候,backoff factor回退到1。這個過程就是Karn算法的第二部分。

二、TSOPT的RTTM

        我們在之前介紹TSOPT選項的時候就說過,TSOPT選項可以用來進行round-trip time measurement(RTTM)。因為TSval值通過反方向TCP報文中的TSecr字段回顯,那么根據當前時鍾和TSecr的差異就可以進行RTT測量。

        當TSopt選項使用的時候,每個接收到的TCP報文都會包含一個TSecr值,但是並不是每個TSecr值都可以用來進行RTT測量的更新。想想一個簡單的場景,A給B發送了一個數據包,B回復ACK后,A暫時沒有數據要傳輸,過了一段時間(如1000s)后,A又有新數據包進行傳輸,當這個新數據包到達B后,這個數據包中的TSecr和當前時鍾的差距因為中間存在沒有數據傳輸的空閑狀態而變得很大,因此不能用於進行RTT測量。為了解決這個問題,有個規則:在一個TCP報文中接收到的TSecr值可以用於進行RTT測量的前提條件是這個數據包TCP頭中的ack number確認了新的數據(即讓TCP發送窗的左邊向前滑行了)。

       當在一個回顯TSval值的TCP報文發送之前收到多個帶有TSopt選項的報文的時候,TCP必須選擇一個合適的TSval用來回復而忽視其他的值。下面分幾種情況來說明

1)、延遲 ACK

許多TCP對於到達時間間隔很短的TCP數據報文,經常會隔一個報文回復一個ACK,這種策略就叫做延遲ACK(delayed ACK),數據報文的發送端必須測量包括延遲ACK導致的額外時間的有效RTT,因此在延遲ACK使用的時候,接收端應該回顯最先接收到的而且還沒有回復ACK的報文的TSval值

2)、接收的系列號空間存在洞的時候

當發生數據包的丟失,接收端收到亂序報文的時候,會對亂序報文回復重復ACK以觸發快速重傳(后面介紹快速重傳)。丟失的數據包可能是網絡負載過重發生擁塞的一個指示,在這種場景下發送端的重傳行為應該更保守一些(即增大RTO,減緩重傳發送速率),因此把RTT估計過大一些可能更有助於改善網絡傳輸情況(后面擁塞控制會進一步介紹)。因此對於亂序報文的ACK確認包中的TSecr值應該是最近收到的觸發接收滑窗前移的報文的TSval值。這里觸發接收滑窗遷移的報文是指收到的數據報文的系列號正好是預期接收的連續系列號。當傳輸過程中發生數據包亂序的時候也會發生相同的場景。

3)、系列號空間的洞被填充的時候

當接收到的TCP報文填充了系列號空間的洞並推進了接收窗前移的時候,這個報文反映了網絡傳輸最新的狀況,在TSecr回顯的時候應該使用這個報文中的TSval。

協議中描述了一個可以覆蓋以上三種情況的算法,算法如下:

1)、每個TCP endpoint維護兩個32-bit的狀態變量。TS.Recent保存了一個時間戳,當向外發送數據包的時候,TSecr值就取自TS.Recent。另外還有一個Last.ACK.sent保存着上一個發出的數據包的ack number。一在非延遲ACK場景下,Last.ACK.sent反映了endpoint預期接收的數據包。

2)、如果新接收的數據包SEG同時滿足下面兩個條件SEG.TSval >= TS.Recent 和 SEG.SEQ <= Last.ACK.sent,那么就設置TS.Recent = SEG.TSval。否則忽略這個TSval值。

3)、當發送的數據包帶有TSopt選項的時候,設置TSecr字段為TS.Recent。

 

        另外我們之前說過RFC6298中標准方法計算RTO的時候是假設在一個RTT里面至少進行一個RTT采樣,在應用TSopt后,在一個RTT里面可以進行多個RTT采樣,如果仍然使用RFC6298中的計算方法就會導致,歷史值的影響減弱(尤其是鏈路傳輸性質是以幾個RTT的時間粒度變化的時候),RTO估計不准而造成無效重傳,因此需要對標准方法中的alpha和beta按照如下修正。

 ExpectedSamples = ceiling(FlightSize / (SMSS * 2))      

alpha' = alpha / ExpectedSamples      

beta' = beta / ExpectedSamples

其中FlightSize表示發送端已經發出的但是還沒有收到ACK的報文大小,SMSS表示發送端的MSS,其中的系數2用於修正延遲ACK。

 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM