什麼是流量控制?流量控制的目的?算法
若是發送者發送數據過快,接收者來不及接收,那麼就會有分組丟失。爲了不分組丟失,控制發送者的發送速度,使得接收者來得及接收,這就是流量控制。流量控制根本目的是防止分組丟失,它是構成TCP可靠性的一方面。緩存
如何實現流量控制?markdown
由滑動窗口協議(連續ARQ協議)實現。滑動窗口協議既保證了分組無差錯、有序接收,也實現了流量控制。主要的方式就是接收方返回的 ACK 中會包含本身的接收窗口的大小,而且利用大小來控制發送方的數據發送。網絡
流量控制引起的死鎖?怎麼避免死鎖的發生?spa
當發送者收到了一個窗口爲0的應答,發送者便中止發送,等待接收者的下一個應答。可是若是這個窗口不爲0的應答在傳輸過程丟失,發送者一直等待下去,而接收者覺得發送者已經收到該應答,等待接收新數據,這樣雙方就相互等待,從而產生死鎖。
爲了不流量控制引起的死鎖,TCP使用了持續計時器。每當發送者收到一個零窗口的應答後就啓動該計時器。時間一到便主動發送報文詢問接收者的窗口大小。若接收者仍然返回零窗口,則重置該計時器繼續等待;若窗口不爲0,則表示應答報文丟失了,此時重置發送窗口後開始發送,這樣就避免了死鎖的產生。code
擁塞控制:擁塞控制是做用於網絡的,它是防止過多的數據注入到網絡中,避免出現網絡負載過大的狀況;經常使用的方法就是:( 1 )慢開始、擁塞避免( 2 )快重傳、快恢復。orm
流量控制:流量控制是做用於接收者的,它是控制發送者的發送速度從而使接收者來得及接收,防止分組丟失的。隊列
咱們在開始假定:一、數據是單方向傳遞,另外一個窗口只發送確認;二、接收方的緩存足夠大,所以發送方的大小的大小由網絡的擁塞程度來決定。ip
(一)慢開始算法:路由
發送方維持一個叫作擁塞窗口cwnd(congestion window)的狀態變量。擁塞窗口的大小取決於網絡的擁塞程度,而且動態地在變化。發送方讓本身的發送窗口等於擁塞窗口,另外考慮到接受方的接收能力,發送窗口可能小於擁塞窗口。
慢開始算法的思路就是,不要一開始就發送大量的數據,先探測一下網絡的擁塞程度,也就是說由小到大逐漸增長擁塞窗口的大小。
這裏用報文段的個數做爲擁塞窗口的大小舉例說明慢開始算法,實際的擁塞窗口大小是以字節爲單位的。以下圖:
從上圖能夠看到,一個傳輸輪次所經歷的時間其實就是往返時間RTT,並且沒通過一個傳輸輪次(transmission round),擁塞窗口cwnd就加倍。
爲了防止cwnd增加過大引發網絡擁塞,還需設置一個慢開始門限ssthresh狀態變量。ssthresh的用法以下:當cwnd<ssthresh時,使用慢開始算法。
當cwnd>ssthresh時,改用擁塞避免算法。
當cwnd=ssthresh時,慢開始與擁塞避免算法任意
注意,這裏的「慢」並非指cwnd的增加速率慢,而是指在TCP開始發送報文段時先設置cwnd=1,而後逐漸增大,這固然比按照大的cwnd一會兒把許多報文段忽然注入到網絡中要「慢得多」。
(二)擁塞避免算法:
擁塞避免算法讓擁塞窗口緩慢增加,即每通過一個往返時間RTT就把發送方的擁塞窗口cwnd加1,而不是加倍。這樣擁塞窗口按線性規律緩慢增加。
不管是在慢開始階段仍是在擁塞避免階段,只要發送方判斷網絡出現擁塞(其根據就是沒有按時收到確認,雖然沒有收到確承認能是其餘緣由的分組丟失,可是由於沒法斷定,因此都當作擁塞來處理),就把慢開始門限ssthresh設置爲出現擁塞時的發送窗口大小的一半(但不能小於2)。而後把擁塞窗口cwnd從新設置爲1,執行慢開始算法。這樣作的目的就是要迅速減小主機發送到網絡中的分組數,使得發生擁塞的路由器有足夠時間把隊列中積壓的分組處理完畢。
整個擁塞控制的流程以下圖:
(1)擁塞窗口cwnd初始化爲1個報文段,慢開始門限初始值爲16
(2)執行慢開始算法,指數規律增加到第4輪,即cwnd=16=ssthresh,改成執行擁塞避免算法,擁塞窗口按線性規律增加
(3)假定cwnd=24時,網絡出現超時(擁塞),則更新後的ssthresh=12,cwnd從新設置爲1,並執行慢開始算法。當cwnd=12=ssthresh時,改成執行擁塞避免算法
關於 乘法減少(Multiplicative Decrease)和加法增大(Additive Increase):
「乘法減少」指的是不管是在慢開始階段仍是在擁塞避免階段,只要發送方判斷網絡出現擁塞,就把慢開始門限ssthresh設置爲出現擁塞時的發送窗口大小的一半,並執行慢開始算法,因此當網絡頻繁出現擁塞時,ssthresh降低的很快,以大大減小注入到網絡中的分組數。「加法增大」是指執行擁塞避免算法後,使擁塞窗口緩慢增大,以防止過早出現擁塞。常合起來成爲AIMD算法。
注意:「擁塞避免」並不是徹底可以避免了阻塞,而是使網絡比較不容易出現擁塞。
(三)快重傳算法:
快重傳要求接收方在收到一個失序的報文段後就當即發出重複確認(爲的是使發送方及早知道有報文段沒有到達對方,可提升網絡吞吐量約20%)而不要等到本身發送數據時捎帶確認。快重傳算法規定,發送方只要一連收到三個重複確認就應當當即重傳對方還沒有收到的報文段,而沒必要繼續等待設置的重傳計時器時間到期。以下圖:
(四)快恢復算法:
快重傳配合使用的還有快恢復算法,有如下兩個要點:
當發送方連續收到三個重複確認時,就執行「乘法減少」算法,把ssthresh門限減半(爲了預防網絡發生擁塞)。可是接下去並不執行慢開始算法
考慮到若是網絡出現擁塞的話就不會收到好幾個重複的確認,因此發送方如今認爲網絡可能沒有出現擁塞。因此此時不執行慢開始算法,而是將cwnd設置爲ssthresh減半後的值,而後執行擁塞避免算法,使cwnd緩慢增大。以下圖:TCP Reno版本是目前使用最普遍的版本。
注意:在採用快恢復算法時,慢開始算法只是在TCP鏈接創建時和網絡出現超時時才使用