1. 程式人生 > >TCP之擁塞處理詳解

TCP之擁塞處理詳解

什麼是擁塞控制

   網路擁塞現象是指到達通訊網路中某一部分的分組數量過多,使得該部分網路來不及處理,以致引起這部分乃至整個網路效能下降的現象,嚴重時甚至會導致網路通訊業務陷入停頓,即出現死鎖現象。擁塞控制是處理網路擁塞現象的一種機制。

    擁塞控制是一種用來調整傳輸控制協議(TCP)連線上單次傳送的分組數量的演算法,通過增減單次傳送量逐步調整,使之逼近當前網路的承載量。如果單次傳送量為1,此協議就退化為停等協議。單次傳送量是以位元組來做單位的;但是如果假設TCP每次傳輸都是按照最大報文段(MSS)來發送資料的,那麼也可以把資料包個數當作單次傳送量的單位,所以有時我們說單次傳送量增加1也就是增加相當於1個最大報文段的位元組數。

擁塞控制的演算法

   擁塞控制假設分組的丟失都是由網路繁忙造成的。擁塞控制有三種動作,分別對應到源主機感受到的情況:

  1. 收到一條新確認。表明當前的單次傳送量小於網路的承載量。此時可以增加單次傳送量。若當前單次傳送量小於慢啟動閾值(ssthreash),則單次傳送量加倍(乘以2),即指數增長;否則單次傳送量加1,即線性增長。

  2. 收到三條對同一分組的確認,即三條重複的確認。說明網路有一點兒繁忙。此時單次傳送量減半,慢啟動閾值(ssthreash)約等於單次傳送量,進入線性增長階段。

  3. 對某一個分組的確認遲遲未到,即超時。說明網路比上一情況中的更加繁忙。此時慢啟動閾值=單次傳送量÷2,單次傳送量=1,進入慢啟動階段(指數增長階段)。

擁塞控制的四個階段

慢啟動

   慢啟動,是傳輸控制協議(TCP)使用的一種阻塞控制機制。慢啟動也叫做指數增長期。 慢啟動演算法通過觀察到新分組進入網路的速率應該與另一端返回確認的速率相同而進行工作。

   慢啟動為傳送方的TCP增加了另一個視窗:擁塞視窗(congestion window),記為cwnd。擁塞視窗是傳送方使用的流量控制,而通告視窗則是接收方使用的流量控制。演算法描述如下:

  1. 當與另一個網路的主機建立TCP連線時,擁塞視窗被初始化為1個報文段(即另一端通告的報文段大小)。

  2. 每收到一個ACK,擁塞視窗就翻倍(cwnd以位元組為單位,但是慢啟動以報文段大小為單位進行增加)。這是一種指數增長的關係。

  3. 傳送方取擁塞視窗與通告視窗中的最小值作為傳送上限。

擁塞避免

   慢啟動演算法是在一個連線上發起資料流的方法,其指數級增長很快就會使網路出現擁塞現象,因為某些點上可能達到了網際網路的容量,於是中間路由器開始丟棄分組。擁塞避免演算法是一種處理丟失分組的方法。有兩種分組丟失的指示:發生超時和接收到重複的確認。發生超時,指源主機在超時定時器溢位時沒有收到目的主機對某一分組的ACK;接收到重複確認,指在源主機的超時定時器溢位前,連續收到3個或3個以上收對某一分組的ACK。

   當發現超時或接收到3次重複確認時,則表示有丟包事件,此時網路已發生擁塞現象,要進行相應的擁塞控制。演算法描述如下:

  1. 將慢啟動閾值(ssthreash)設定為當前視窗的一半(cwnd 和通告視窗大小的最小值,但最小為2個報文)。

  2. 如果是超時引起的擁塞,則擁塞視窗(cwmd)被置為1,進入慢啟動過程。如果是重複確認引起的擁塞,則進入快速重傳和快速恢復過程。

  3. 進入慢啟動階段後,擁塞視窗會指數級增長,如果擁塞視窗大於慢啟動閾值(ssthreash),執行擁塞避免演算法。執行擁塞避免演算法時,由於慢啟動閾值(ssthreash)已經存在,擁塞視窗大小不再翻倍增長,而是線性增加。

   擁塞避免演算法和慢啟動演算法是兩個目的不同、獨立的演算法。但是當擁塞發生時,我們希望降低分組進入網路的傳輸速率,於是可以呼叫慢啟動來作到這一點。在實際中這兩個演算法通常在一起實現。1990年出現的TCPReno版本增加了 “快速重傳”演算法、”快速恢復”演算法,避免了當網路擁塞不夠嚴重時採用”慢啟動”演算法而造成過大地減小發送視窗尺寸的現象。

快速重傳

   目的主機在收到一個失序的報文段時,會立即產生一個ACK(重複的ACK),這個重複的ACK不應該被延遲,目的在於讓源主機知道目的主機收到了一個失序的報文段,並告訴源主機自己希望收到的序號。

   由於我們不知道一個重複的ACK是由一個丟失的報文段引起的,還是由於僅僅出現了幾個報文段的重新排序,因此我們等待少量重複的ACK到來。假如這只是一些報文段的重新排序,則在重新排序的報文段被處理併產生一個新的ACK之前,只可能產生1到2個重複的ACK。如果一連串收到3個或3個以上的重複ACK,就非常可能是一個報文段丟失了,進入快速重傳過程,描述如下:

  1. 將慢啟動閾值(ssthreash)設定為當前擁塞視窗(cwnd)的一半,設定擁塞視窗(cwnd)為慢啟動閾值(ssthreash)加上3倍的報文段大小。重傳丟失的資料報文段,而無需等待超時定時器溢位。

  2. 每次收到另一個重複的ACK時,cwnd增加一個報文段大小併發送1個分組(如果新的cwnd允許傳送)。收到另一個重複的ACK,說明網路中傳輸的一個分組到達了目的主機,網路中可再容納一個分組,故cwnd增加一個報文段大小併發送一個分組。

快速恢復

   丟失的分組通過快速重傳過程傳送完,並被目的主機接受後,目的主機就不再發送重複的ACK通知源主機發送丟失的分組了,而是傳送確認新資料的ACK通知源主機發送新的分組。這個ACK應該是在進行重傳後的一個往返時間內對重傳分組的確認,也應該是對丟失的分組和收到的第1個重複的ACK之間的所有中間報文段的確認。此時為了快速的恢復到較高的傳輸速度,就會進入快速恢復階段,演算法描述如下:

  1. 當確認新資料的ACK到達時,設定擁塞視窗(cwnd)為慢啟動閾值(ssthreash)(快速重傳時步驟1中設定的值),進入擁塞避免過程。

參考資料