TCP——擁塞控制

注意,注意,注意:
1、這是我2018找實習、找工作的總結,是在網上結合很多別人總結文章自己再東拼西湊的,如有錯誤請大家指出,我再去找資料補充。
2、很多內容來自別人博主,十分感謝,當時摘抄實在太匆忙,有的忘了出處,如有冒犯,侵刪。
3、祝各位很閒也有錢。

一般原理

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

    作用:擁塞控制就是爲了防止過多的數據注入到網絡中,這樣可以使網絡中的路由器或者鏈路不至於過載。擁塞控制要做的都有一個前提:就是網絡能夠承受現有的網絡負荷。
對比流量控制:擁塞控制是一個全局的過程,涉及到所有的主機、路由器、以及降低網絡相關的所有因素。流量控制往往指點對點通信量的控制。是端對端的問題。

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

    擁塞控制算法:

  • 慢啓動+擁塞避免
  • 慢啓動+快重傳+快恢復

一、慢啓動+擁塞避免

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

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

    擁塞避免:爲了防止cwnd增加過快而導致網絡擁塞,所以需要設置一個慢開始門限ssthresh狀態變量(我也不知道這個到底是什麼,就認爲他是一個擁塞控制的標識),它的用法:
     - 當cwnd < ssthresh,使用慢啓動算法,
     - 當cwnd > ssthresh,使用擁塞控制算法,停用慢啓動算法。
     - 當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按照線性的速度進行增長。
在這裏插入圖片描述

如何檢測擁塞?
    首先來看TCP是如何確定網絡進入了擁塞狀態的,TCP認爲網絡擁塞的主要依據是它重傳了一個報文段。上面提到過,TCP對每一個報文段都有一個定時器,稱爲重傳定時器(RTO),當RTO超時且還沒有得到數據確認,那麼TCP就會對該報文段進行重傳,當發生超時時,那麼出現擁塞的可能性就很大,某個報文段可能在網絡中某處丟失,並且後續的報文段也沒有了消息,在這種情況下,TCP反應比較“強烈”:
    1.把ssthresh降低爲cwnd值的一半
    2.把cwnd重新設置爲1
    3.重新進入慢啓動過程。
    從整體上來講,TCP擁塞控制窗口變化的原則是AIMD原則,即加法增大、乘法減小。可以看出TCP的該原則可以較好地保證流之間的公平性,因爲一旦出現丟包,那麼立即減半退避,可以給其他新建的流留有足夠的空間,從而保證整個的公平性。

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

二、慢啓動+快重傳+快恢復

快重傳(Fast Retransmit)
    1、要求接收方每收到一個失序的報文段後就立即發出重複確認而不是等待自己發送數據時才捎帶確認
    2、發送方只要一連收到三個重複確認就立即重傳對方尚未收到的報文段,而不必等待設置的重傳計時器到期
在這裏插入圖片描述

    有的快重傳實現把開始時的擁塞窗口cwnd設置爲ssthresh+3*MSS的字節數值,原因是認爲收到三個重複確認後,表明網絡中已經有三個分組離開了,證明現在網絡中並沒有堆積分組,因此適當增大擁塞窗口

快恢復(Fast Recovery)

    當發送方連續收到三個重複確認時,就執行“乘法減小”算法,把慢開始門限ssthresh減半,爲了預防網絡擁塞
    將擁塞窗口cwnd值設置爲慢開始門限ssthresh減半後的數值,然後開始執行擁塞避免算法
在這裏插入圖片描述
TCP Tahoe版本與TCP Reno版本的區別:Reno版本在快重傳之後採用快恢復算法而不是採用慢開始算法

總結

    1、採用快恢復算法時,慢開始算法只是在TCP建立連接和網絡出現超時時才使用
    2、接收方根據自己的接收能力設定了接收窗口rwnd,將此窗口值寫入TCP首部傳送給對方。結合擁塞控制,發送方的發送窗口一定不能大於接收方給出的接收窗口且一定不能大於自己的擁塞窗口
    3、發送方的發送窗口的上限值 = Min[rwnd, cwnd]

補充:隨機早期檢測RED

    以上的擁塞避免算法並沒有和網絡層聯繫起來,實際上網絡層的策略對擁塞避免算法影響最大的就是路由器的丟棄策略。在簡單的情況下路由器通常按照先進先出的策略處理到來的分組。當路由器的緩存裝不下分組的時候就丟棄到來的分組,這叫做尾部丟棄策略。這樣就會導致分組丟失,發送方認爲網絡產生擁塞。更爲嚴重的是網絡中存在很多的TCP連接,這些連接中的報文段通常是複用路由路徑。若發生路由器的尾部丟棄,可能影響到很多條TCP連接,結果就是這許多的TCP連接在同一時間進入慢開始狀態。這在術語中稱爲全局同步。全局同步會使得網絡的通信量突然下降很多,而在網絡恢復正常之後,其通信量又突然增大很多。
    爲避免發生網路中的全局同步現象,路由器採用隨機早期檢測(RED:randomearly detection)。該算法要點如下:
    使路由器的隊列維持兩個參數,即隊列長隊最小門限min和最大門限max,每當一個分組到達的時候,RED就計算平均隊列長度。然後分情況對待到來的分組:
  ①平均隊列長度小於最小門限——把新到達的分組放入隊列排隊。
  ②平均隊列長度在最小門限與最大門限之間——則按照某一概率將分組丟棄。
  ③平均隊列長度大於最大門限——丟棄新到達的分組。
    RED不是等到已經發生擁塞後才把所有隊列尾部的分組全部丟棄,而是在檢測到網絡擁塞的早期徵兆時(即路由器的平均隊列長度超過一定門限值時),以概率p隨機丟棄分組,讓擁塞控制只在個別的TCP連接上執行,因而避免全局性的擁塞控制。
    RED的關鍵就是選擇三個參數最小門限、最大門限、丟棄概率和計算平均隊列長度。最小門線必須足夠大,以保證路由器的輸出鏈路有較高的利用率。而最大門限和最小門限只差也應該足夠大,是的在一個TCP往返時間RTT中隊列的正常增長仍在最大門限之內。經驗證明:使最大門限等於最小門限的二倍是合適的。
在這裏插入圖片描述
    平均隊列長度採用加權平均的方法計算平均隊列長度,這和往返時間(RTT)的計算策略是一樣的。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章