...算法
咱們都知道計算機網絡中的資源是有限的。某段時間內網絡中對資源的需求超過了網絡中的可用部分,而致使網絡性能降低的狀況就是擁塞。網絡
通俗點說就是發送的數據包太多網絡中的設備處理不過來,而致使網絡性能降低的狀況。性能
網絡中的路由器會有一個數據包處理隊列,當路由器接收到的數據包太多而一會兒處理不過來時,就會致使數據包處理隊列過長。此時,路由器就會無條件的丟棄新接收到的數據封包。spa
這就會致使上層的TCP協議覺得數據包在網絡中丟失,進而重傳這些數據包,而路由器又會丟棄這些重傳的數據包,如此以往,就會致使網絡性能急劇降低,引發網絡癱瘓。計算機網絡
所以,TCP須要控制數據包發送的數量來避免網絡性能的降低。blog
引用書上的答案:隊列
擁塞控制就是防止過多的數據注入到網絡中,這樣能夠防止網絡中的路由器或鏈路不致過載。擁塞控制所要作的都有一個前提,就是網絡可以承受現有的網絡負荷。擁塞控制是一個全局性的過程,涉及到全部的主機、全部的路由器,以及與下降網絡傳輸性能有關的全部因素。圖片
流量控制每每指點對點通訊量的控制,是個端到端的問題。流量控制所要作的就是抑制發送端發送數據的速率,以便使接收端來得及接收。資源
擁塞窗口(cwnd)是指發送方維護的一個根據網絡情況動態變化的窗口。通常來講,發送方會讓本身的發送窗口等於擁塞窗口的大小。路由
若是考慮到流量控制的話,發送窗口也有可能小於擁塞窗口的大小。
一個傳輸輪次是指發送方把本身的發送窗口內的數據所有發送出去並收到對最後一個字節的確認。
例如,A將本身的發送窗口內的數據所有連續發送給了B,而B收到這些數據後向A發送了對這些數據的確認,A收到這個確認後,一個傳輸輪次就算是完成了。
慢開始算法中的主要方法就是有小到大逐漸增大發送窗口。
那麼,具體是怎麼增大的呢?
簡單來講就是每一個傳輸輪次後將cwnd大小加倍。
舉個例子:
首先,發送方設置cwnd=1(爲方便理解,這裏用報文段的個數做爲窗口大小的單位),在收到接收方發來的確認後(也就是下個傳輸輪次),設置cwnd=2,而後將發送窗口的數據發送出去。在一次收到接收方發來的確認後,發送方設置cwnd=4,再講發送窗口中的數據發送出去。而後再重複上面的過程。
這裏就應該清楚,慢開始算法中的慢不是說cwnd增加的慢,而是相對一會兒發送大量數據而言,這種一次先發送少許的數據包的方式要慢許多。
固然,cwnd的大小確定不可能一直以這種指數的方式增加下去,要否則很快就會增加到引發網絡癱瘓的程度了。
因此,通過必定時間或條件,咱們就要換成擁塞避免算法來發送數據。
像上面所說,不能任由慢開始算法中的cwnd任意增加,因此咱們引入一個慢開始門限(ssthresh)的閾值來控制cwnd的增加。
具體做用以下:
cwnd < ssthresh ,使用慢開始算法
cwnd = ssthresh , 使用慢開始算法或擁塞避免算法均可以
cwnd > ssthresh , 使用擁塞避免算法呢
還有一個問題就是這個ssthresh是怎麼設置的呢?
TCP/IP中規定不管是在慢開始階段仍是在擁塞避免階段,只要發現網絡中出現擁塞(沒有按時收到確認),就要把ssthresh設置爲此時發送窗口的一半大小(不能小於2)。
擁塞避免算法也是逐漸的增大cwnd的大小,只是採用的是線性增加而不是像慢開始算法那樣的指數增加。
具體來講就是每一個傳輸輪次後將cwnd的大小加一(加法增大),若是發現出現網絡擁塞的話就按照上面的方法從新設置ssthresh的大小(乘法減少)並從cwnd=1開始從新執行慢開始算法。
以下面的圖片所示:
(圖片來源於網絡)
前面複習到過,TCP的可靠傳輸的原理就是超時重傳機制。配合上面的慢開始和擁塞避免使用就是發送發發送完數據後設置一個定時器,若是在定時器時間內沒有收到對接收方發來的確認的話就去執行上述的乘法減少過程並從新開始慢開始算法。
而快重傳則是容許發送方再連續收到3個重複的確認後就能夠開始執行乘法減少過程而沒必要再等待所設置的重傳計時器到時。
這就須要接收方沒收到一個失序的報文段就當即發出重複確認以讓發送發及早知道有報文段丟失,而不是等待本身發送數據的時候進行捎帶確認。
快恢復算法是與快重傳算法配合使用的一個算法。
使用了快恢復算法後與原來不一樣的一點是當發現網絡出現擁塞並執行了乘法減少過程後,並非設置cwnd=1並從新開始執行慢開始算法,而是讓cwnd=乘法減少後的ssthresh並開始執行擁塞避免算法。
由於此時發送發能連續接收到三個重複的確認就能夠認爲此時網絡極可能沒有發生擁塞。
使用了快重傳和快恢復的擁塞避免過程以下:
(圖片來源於網絡)
發送窗口的上限值 = Min{rwnd, cwnd}
rwnd:接收方接收窗口cwnd:發送方擁塞窗口