擁塞控制所要做的都有一個前提就是網絡能夠承受現有的網絡負荷。
擁塞控制是一個全局性的過程涉及到所有的主機、所有的路由器以及與降低網絡傳輸性能有關的所有因素。
流量控制往往指在給定的發送端和接收端之間的點對點通信量的控制。
流量控制所要做的就是抑制發送端發送數據的速率以便使接收端來得及接收。
擁塞控制的一般原理
擁塞控制是很難設計的因爲它是一個動態的而不是靜態的問題。
當前網絡正朝着高速化的方向發展這很容易出現緩存不夠大而造成分組的丟失。但分組的丟失是網絡發生擁塞的徵兆而不是原因。
在許多情況下甚至正是擁塞控制本身成爲引起網絡性能惡化甚至發生死鎖的原因。這點應特別引起重視。
開環控制和閉環控制
開環控制方法就是在設計網絡時事先將有關發生擁塞的因素考慮周到力求網絡在工作時不產生擁塞。
閉環控制是基於反饋環路的概念。屬於閉環控制的有以下幾種措施
監測網絡系統以便檢測到擁塞在何時、何處發生。
將擁塞發生的信息傳送到可採取行動的地方。
調整網絡系統的運行以解決出現的問題。
幾種擁塞控制方法
1. 慢開始和擁塞避免
發送方維持一個叫做擁塞窗口 cwnd (congestion window)的狀態變量。擁塞窗口的大小取決於網絡的擁塞程度並且動態地在變化。發送方讓自己的發送窗口等於擁塞窗口。如再考慮到接收方的接收能力則發送窗口還可能小於擁塞窗口。
發送方控制擁塞窗口的原則是隻要網絡沒有出現擁塞擁塞窗口就再增大一些以便把更多的分組發送出去。但只要網絡出現擁塞擁塞窗口就減小一些以減少注入到網絡中的分組數。
慢開始算法的原理
在主機剛剛開始發送報文段時可先設置擁塞窗口 cwnd = 1即設置爲一個最大報文段 MSS 的數值。
在每收到一個對新的報文段的確認後將擁塞窗口加 1即增加一個 MSS 的數值。
用這樣的方法逐步增大發送端的擁塞窗口 cwnd可以使分組注入到網絡的速率更加合理
發送方每收到一個對新報文段的確認 重傳的不算在內就使 cwnd 加 1
傳輸輪次
使用慢開始算法後每經過一個傳輸輪次擁塞窗口 cwnd 就加倍。
一個傳輸輪次所經歷的時間其實就是往返時間 RTT。
“傳輸輪次”更加強調把擁塞窗口 cwnd 所允許發送的報文段都連續發送出去並收到了對已發送的最後一個字節的確認。
例如擁塞窗口 cwnd = 4這時的往返時間 RTT 就是發送方連續發送 4 個報文段並收到這 4 個報文段的確認總共經歷的時間。
設置慢開始門限狀態變量ssthresh
慢開始門限 ssthresh 的用法如下
當 cwnd < ssthresh 時使用慢開始算法。
當 cwnd > ssthresh 時停止使用慢開始算法而改用擁塞避免算法。
當 cwnd = ssthresh 時既可使用慢開始算法也可使用擁塞避免算法。
擁塞避免算法的思路是讓擁塞窗口 cwnd 緩慢地增大即每經過一個往返時間 RTT 就把發送方的擁塞窗口 cwnd 加 1而不是加倍使擁塞窗口 cwnd 按線性規律緩慢增長。
當網絡出現擁塞時
無論在慢開始階段還是在擁塞避免階段只要發送方判斷網絡出現擁塞其根據就是沒有按時收到確認就要把慢開始門限 ssthresh 設置爲出現擁塞時的發送方窗口值的一半但不能小於2。 然後把擁塞窗口 cwnd 重新設置爲 1執行慢開始算法。 這樣做的目的就是要迅速減少主機發送到網絡中的分組數使得發生擁塞的路由器有足夠時間把隊列中積壓的分組處理完畢。
“乘法減小“是指不論在慢開始階段還是擁塞避免階段只要出現一次超時即出現一次網絡擁塞就把慢開始門限值 ssthresh 設置爲當前的擁塞窗口值乘以 0.5。 當網絡頻繁出現擁塞時ssthresh 值就下降得很快以大大減少注入到網絡中的分組數。
“加法增大”是指執行擁塞避免算法後在收到對所有報文段的確認後即經過一個往返時間就把擁塞窗口 cwnd增加一個 MSS 大小使擁塞窗口緩慢增大以防止網絡過早出現擁塞。
“擁塞避免”並非指完全能夠避免了擁塞。利用以上的措施要完全避免網絡擁塞還是不可能的。 “擁塞避免”是說在擁塞避免階段把擁塞窗口控制爲按線性規律增長使網絡比較不容易出現擁塞。
快重傳和快恢復
快重傳算法首先要求接收方每收到一個失序的報文段後就立即發出重複確認。這樣做可以讓發送方及早知道有報文段沒有到達接收方。 發送方只要一連收到三個重複確認就應當立即重傳對方尚未收到的報文段。 不難看出快重傳並非取消重傳計時器而是在某些情況下可更早地重傳丟失的報文段。
快恢復算法
(1) 當發送端收到連續三個重複的確認時就執行“乘法減小”算法把慢開始門限 ssthresh 減半。但接下去不執行慢開始算法。
(2)由於發送方現在認爲網絡很可能沒有發生擁塞因此現在不執行慢開始算法即擁塞窗口 cwnd 現在不設置爲 1而是設置爲慢開始門限 ssthresh 減半後的數值然後開始執行擁塞避免算法“加法增大”使擁塞窗口緩慢地線性增大。
發送窗口的上限值
發送方的發送窗口的上限值應當取爲接收方窗口 rwnd 和擁塞窗口 cwnd 這兩個變量中較小的一個即應按以下公式確定 發送窗口的上限值
Min [rwnd, cwnd]
當 rwnd < cwnd 時是接收方的接收能力限制發送窗口的最大值。
當 cwnd < rwnd 時則是網絡的擁塞限制發送窗口的最大值。
隨機早期檢測 RED
使路由器的隊列維持兩個參數即隊列長度最小門限 THmin 和最大門限 THmax。 RED 對每一個到達的數據報都先計算平均隊列長度 LAV。 若平均隊列長度小於最小門限 THmin則將新到達的數據報放入隊列進行排隊。 若平均隊列長度超過最大門限 THmax則將新到達的數據報丟棄。 若平均隊列長度在最小門限 THmin 和最大門限THmax 之間則按照某一概率 p 將新到達的數據報丟棄。
丟棄概率 p 與 THmin 和 Thmax 的關係
當 LAV < Thmin 時丟棄概率 p = 0。
當 LAV >Thmax 時丟棄概率 p = 1。
當 THmin < LAV < THmax時 0 <p < 1 。
例如按線性規律變化從 0 變到 pmax。
平均隊列長度=1-x*舊的L av + x*當前的隊列長度的樣本
x越小越好
p=ptmp/(1-cnt*ptmp)
cnt是一個常數
ptmp=pmax*(lav-Tmin)/(Tmax-Tmin)