1. 程式人生 > >TCP擁塞控制-慢啟動、擁塞避免、快重傳、快啟動

TCP擁塞控制-慢啟動、擁塞避免、快重傳、快啟動

計時 有一個 如果 即將 需求 不知道 算法 停用 連續

一般原理:發生擁塞控制的原因:資源(帶寬、交換節點的緩存、處理機)的需求>可用資源。

作用:擁塞控制就是為了防止過多的數據註入到網絡中,這樣可以使網絡中的路由器或者鏈路不至於過載。擁塞控制要做的都有一個前提:就是網絡能夠承受現有的網絡負荷。

對比流量控制:擁塞控制是一個全局的過程,涉及到所有的主機、路由器、以及降低網絡相關的所有因素。流量控制往往指點對點通信量的控制。是端對端的問題。

擁塞窗口

發送方為一個動態變化的窗口叫做擁塞窗口,擁塞窗口的大小取決於網絡的擁塞程度。發送方讓自己的發送窗口=擁塞窗口,但是發送窗口不是一直等於擁塞窗口的,在網絡情況好的時候,擁塞窗口不斷的增加,發送方的窗口自然也隨著增加,但是接受方的接受能力有限,在發送方的窗口達到某個大小時就不在發生變化了。

發送方如果知道網絡擁塞了呢?發送方發送一些報文段時,如果發送方沒有在時間間隔內收到接收方的確認報文段,則就可以人為網絡出現了擁塞。

慢啟動

主機開發發送數據報時,如果立即將大量的數據註入到網絡中,可能會出現網絡的擁塞。慢啟動算法就是在主機剛開始發送數據報的時候先探測一下網絡的狀況,如果網絡狀況良好,發送方每發送一次文段都能正確的接受確認報文段。那麽就從小到大的增加擁塞窗口的大小,即增加發送窗口的大小。

例子:開始發送方先設置cwnd(擁塞窗口)=1,發送第一個報文段M1,接收方接收到M1後,發送方接收到接收方的確認後,把cwnd增加到2,接著發送方發送M2、M3,發送方接收到接收方發送的確認後cwnd增加到4,慢啟動算法每經過一個傳輸輪次(認為發送方都成功接收接收方的確認),擁塞窗口cwnd就加倍。

擁塞避免

為了防止cwnd增加過快而導致網絡擁塞,所以需要設置一個慢開始門限ssthresh狀態變量(我也不知道這個到底是什麽,就認為他是一個擁塞控制的標識),它的用法:

  1. 當cwnd < ssthresh,使用慢啟動算法,
  2. 當cwnd > ssthresh,使用擁塞控制算法,停用慢啟動算法。
  3. 當cwnd = ssthresh,這兩個算法都可以。

擁塞避免的思路:是讓cwnd緩慢的增加而不是加倍的增長,每經歷過一次往返時間就使cwnd增加1,而不是加倍,這樣使cwnd緩慢的增長,比慢啟動要慢的多。

無論是慢啟動算法還是擁塞避免算法,只要判斷網絡出現擁塞,就要把慢啟動開始門限(ssthresh)設置為設置為發送窗口的一半(>=2),cwnd(擁塞窗口)設置為1,然後在使用慢啟動算法,這樣做的目的能迅速的減少主機向網絡中傳輸數據,使發生擁塞的路由器能夠把隊列中堆積的分組處理完畢。擁塞窗口是按照線性的規律增長,比慢啟動算法擁塞窗口增長塊的多。

實例:
1.TCP連接進行初始化的時候,cwnd=1,ssthresh=16。
2.在慢啟動算法開始時,cwnd的初始值是1,每次發送方收到一個ACK擁塞窗口就增加1,當ssthresh =cwnd時,就啟動擁塞控制算法,擁塞窗口按照規律增長,
3.當cwnd=24時,網絡出現超時,發送方收不到確認ACK,此時設置ssthresh=12,(二分之一cwnd),設置cwnd=1,然後開始慢啟動算法,當cwnd=ssthresh=12,慢啟動算法變為擁塞控制算法,cwnd按照線性的速度進行增長。

AIMD(加法增大乘法減小)

  1. 乘法減小:無論在慢啟動階段還是在擁塞控制階段,只要網絡出現超時,就是將cwnd置為1,ssthresh置為cwnd的一半,然後開始執行慢啟動算法(cwnd<ssthresh)。
  2. 加法增大:當網絡頻發出現超時情況時,ssthresh就下降的很快,為了減少註入到網絡中的分組數,而加法增大是指執行擁塞避免算法後,是擁塞窗口緩慢的增大,以防止網絡過早出現擁塞。
    這兩個結合起來就是AIMD算法,是使用最廣泛的算法。擁塞避免算法不能夠完全的避免網絡擁塞,通過控制擁塞窗口的大小只能使網絡不易出現擁塞。

快重傳

快重傳算法要求首先接收方收到一個失序的報文段後就立刻發出重復確認,而不要等待自己發送數據時才進行捎帶確認。接收方成功的接受了發送方發送來的M1、M2並且分別給發送了ACK,現在接收方沒有收到M3,而接收到了M4,顯然接收方不能確認M4,因為M4是失序的報文段。如果根據可靠性傳輸原理接收方什麽都不做,但是按照快速重傳算法,在收到M4、M5等報文段的時候,不斷重復的向發送方發送M2的ACK,如果接收方一連收到三個重復的ACK,那麽發送方不必等待重傳計時器到期,由於發送方盡早重傳未被確認的報文段。

快恢復

  1. 當發送發連續接收到三個確認時,就執行乘法減小算法,把慢啟動開始門限(ssthresh)減半,但是接下來並不執行慢開始算法。
  2. 此時不執行慢啟動算法,而是把cwnd設置為ssthresh的一半, 然後執行擁塞避免算法,使擁塞窗口緩慢增大。

技術分享圖片

TCP擁塞控制-慢啟動、擁塞避免、快重傳、快啟動