目錄
一、認識擁塞控制
1、什么叫做擁塞?
2、擁塞的特點
3、流量控制 VS 擁塞控制
二、TCP如何防止擁塞?
1、慢開始
2、擁塞避免
3、3重復確認 和 快重傳算法
4、快恢復算法
5、總結
三、主動隊列管理AQM
1、技術背景
2、AQM思
想和實現策略
一、認識擁塞控制
1、什么叫做擁塞?
需求超過可供資源,即不夠用
例如車太多,路不夠寬,即擁塞
資源不夠,我增加資源量不就行了嗎?
不行。
例如:
一,增加節點緩存
可處理機處理速度跟不上 導致 排隊
排隊久了 導致 數據重傳
重傳 導致更多數據發到網絡
更加擁堵
二、增加處理機處理速度
處理機快了,他沒問題了,不代表其他地方沒問題
依舊可能擁塞
好,你可能會疑惑,單個優化解決不了問題
那我tm全部都提高不就行了嗎?
我速度加快,緩存加大,傳輸加快,你變快,我變大,統統加快加大
豈不妙哉?
謬也。
這樣是能夠容許更大的流量
可是,容量總是有限的,并不能無窮無盡
同時,更大的容量將會導致更大擁塞,造成更大的損失
所以,不能從根本上消除擁塞
因此,只能盡量避免擁塞
同時,擁塞會趨于惡化
例如路由器沒有足夠緩存,就會丟棄分組
于是發送方重傳
導致更多的數據進入網絡交通中
更堵
2、擁塞的特點
擁塞的控制是困難的,改進某個局部,
可能會對其他局部帶來影響
因此,擁塞控制需要全盤考慮
這是十分復雜的
常注意的幾個點:
1、分組的分組是擁塞表現,而不是原因
2、擁塞控制機制本身往往導致了網絡擁塞的發生
3、開環控制:設計初期,考慮全局,一旦運行,力求不擁塞
4、閉環控制:不求消除擁塞,而是動態調節,力求避免擁塞(其實就是自主反饋調節機制)
閉環控制方式對擁塞的措施:
1、檢測網絡,以便知道何時、何地發生擁塞
2、把擁塞信息傳到不擁塞,可以處理的地方
3、根據反饋,調節系統運行,消除擁塞
要動態檢測網絡是否擁塞,以及時反饋,總得有個標準
一些常見的擁塞標注:
丟失分組數、超時重傳的分組數、平均分組時延等
這不重要,指標很多,略微分析即可
3、流量控制 VS 擁塞控制
擁塞控制是全局性的問題
是某一個地方除了問題,影響了全局的運行
因此屬于全局性的協調
涉及所有人
流量控制僅僅是TCP鏈接雙方的問題
是端對端之間出了問題
僅僅設計這倆貨
二、TCP如何防止擁塞?
有四種機制:慢開始、擁塞避免、快重傳、快恢復
將上述四種機制加以合適的方法進行搭配使用
即可達到消除擁塞,修正系統,通暢運行的妙用!
在講解機制之前,需要了解的相關知識:
首先,發送方維持一個擁塞窗口cwnd,擁塞窗口取決于擁塞程度
其次,使發送窗口==擁塞窗口cwnd
一般來說,只要沒有擁塞,就盡量增大擁塞窗口,以發送更多數據
相反,擁堵則減少
發送方如何得知到底發生擁塞了沒有?
如何判斷?
一般網絡擁塞,就會導致路由器來不及處理
從而丟掉分組
可是,現代通信的傳輸質量很高
分組丟失的概率遠小于1%
于是,只要發送的超時計時器超過時間
就可以判斷網絡發生了擁塞
因此,對發送方來說:網絡擁塞的標志是:重傳超時
1、慢開始
從小到大逐漸增加發送窗口
那么一開始設置多大呢?
SMSS:發送方最大報文段。單位,字節
慢開始階段的初始cwnd設置規則
SMSS(字節) | 初始cwnd值(單位:SMSS) |
---|---|
SMSS > 2190 | 2 SMSS |
1095 < SMSS ≤ 2190 | 3 SMSS |
SMSS ≤ 1095 | 4 SMSS |
擁塞窗口的單位實際上是字節數
慢開始規定:
每收到一個新的報文段,擁塞窗口最多增加1個SMSS大小(重傳不算)
因此,每一次擁塞窗口增加的字節數一定小于等于SMSS
慢開始的機制,使得一開始并不發送很多的數據
而是逐步增加,稱為慢開始
為了防止cwnd增加過大,該機制還設置了慢開始門限ssthresh
即發送窗口最大容量
只要慢開始的擁塞窗口大于ssthresh慢開始門限,則啟動擁塞避免機制
2、擁塞避免
機制:每經過一個RTT時間,擁塞窗口增加1
慢開始則是每經過一個RTT時間,確認多少,增加多少
擁塞避免并非消除擁塞,只是減緩擁塞窗口增長速度,使網絡不容易擁塞
當慢開始擁塞窗口大于門限,啟動擁塞避免
讓擁塞窗口增加的慢一點
而當擁塞避免運行到一定程度,擁塞窗口大到一定程度后
發送方開始出現重傳超時
于是,判斷網絡擁塞
怎么辦?
調整門限、擁塞窗口cwnd設為1、執行慢開始算法
調整多少?
門限減一半,ssthresh /= 2
因此,如上述,慢開始和擁塞避免兩種機制反復交替運行
就可以達到減少擁塞發生的情況
快重傳、快恢復:啊????那我呢???
事實上,僅僅靠慢開始和擁塞控制并不能真正的減少擁塞
還有新的問題,還有高手
3、3重復確認 和 快重傳算法
如圖:
當時傳送到M3時,分組丟失;但是事實上并沒有發生擁塞
僅僅只是意外丟了一個分組M3
此時如果發送方遲遲收不到確認,就會導致超時重傳
于是,判定網絡阻塞,執行慢開始算法,導致降低傳輸效率
此時,
對于接收方,每收到一個數據分組
不論該數據分組是否是有序到達,接收方必須即時回發確認分組
于是,在超時重傳時間內,
發送方就會收到多個對同一個報文的確定報文
于是,當發送方收到3個對同一個報文的確認報文時
就認為現在并未出現網絡擁塞,
而是僅僅少接收一個報文段M3
因此,啟動快重傳算法:立即進行重傳M3
同時,不啟動慢開始,而是啟動快恢復算法
4、快恢復算法
什么是快恢復算法?
即:
調整門限:ssthresh /= 2
設置擁塞窗口,cwnd ?= ssthresh
執行完快恢復算法后,
開始執行擁塞避免算法
5、總結
慢開始:初始擁塞窗口很小,逐漸快速增大擁塞窗口
擁塞避免:當慢開始cwnd超過門限,啟動擁塞避免,直到發生超時重傳
超時重傳發生,認為擁塞:
于是調整門限 = 當前超時cwnd / 2,cwnd設置為1
啟動慢開始
特殊情況:
當發送方收到3個同樣的ACK確定報文
啟動快重傳算法,迅速對丟失數據重傳
發送方判斷并未發生網絡擁塞
于是不啟動慢開始,啟動快恢復:
調整門限ssthresh = cwnd / 2
cwnd = ssthresh
執行流程圖:(必須理解!重點!!!)
擁塞窗口的增大減小,合起來稱為AIMD算法
發送方的發送窗口 = min(接收方接收窗口, 發送方擁塞窗口)
三、主動隊列管理AQM
1、技術背景
網絡層對TCP擁塞控制影響最大的就是路由器的分組丟棄策略。
路由器按照先進先出的順序進入緩存隊列,如果后來的分組超過了隊列長度
將會丟棄后續的分組,該策略叫做尾部丟棄
而路由器的丟棄往往會導致一連串的分組被丟棄
這就導致發送方判定網絡擁塞,進入慢開始
同時,TCP的鏈接是復用網絡層中的IP數據報的
因此,一個路由器的尾部丟棄可能會同時影響多個TCP鏈接
于是,這就導致許多TCP鏈接同時進入慢開始狀態
從而使得整個網絡的速度一同降低
這個現象就叫做:全局同步
為了避免全局同步問題,需要對路由器的分組丟棄策略進行調整
由是,提出了主動隊列管理
2、AQM思
想和實現策略
導致全局同步問題的主要是分組集中被丟棄,導致多個TCP受到影響
這樣太被動
因此,要逐步的丟棄,在出現擁塞征兆的初期,就逐步的進行部分丟棄
從而減少堆砌的壓力,其實也就是一種預警措施
那么,該什么時候丟棄分組?
為路由器維持兩個參數:隊列最大門限 和 隊列最小門限
于是:每有一個分組抵達,計算一次平均隊列長度
如果平均隊列長度 < 最小門限,加入緩存隊列
如果平均隊列長度 > 最大門限,丟棄分組
如果平均隊列長度在最大和最小之間,按概率P進行丟棄
但是目前概率P并沒有明確的標準
?