網(wǎng)絡傳輸過程中垢夹,某段時間如果網(wǎng)絡中某一資源的需求超過了該資源所能提供的可用部分僵井,網(wǎng)絡性能就會變壞华蜒,這種情況就叫做網(wǎng)絡擁塞
為解決這個問題宾茂,TCP中使用了四種擁塞控制算法
- 慢開始
- 擁塞避免
- 快重傳
- 快恢復
1. 慢開始
發(fā)送方會維持一個擁塞窗口cwnd的狀態(tài)變量,擁塞窗口的大小取決于擁塞程度难捌,并且會在收發(fā)包過程中動態(tài)的進行變化攀隔。發(fā)送方會讓本端的發(fā)送窗口等于擁塞窗口皂贩。
慢開始的核心思想:指數(shù)級由小到大逐漸增加擁塞窗口大小,如果網(wǎng)絡出現(xiàn)阻塞昆汹,擁塞窗口就減小明刷。
判斷出現(xiàn)網(wǎng)絡擁塞的依據(jù):沒有按時收到應當?shù)竭_的確認報文(即發(fā)生重傳)。
維護一個慢開始門限ssthresh狀態(tài)變量:
- 當cwnd < ssthresh 時满粗,使用慢開始算法辈末。
- 當cwnd > ssthresh 時,停止使用慢開始算法而改用擁塞避免算法映皆。
- 當cwnd = ssthresh 時挤聘,既可以使用慢開始算法,也可以使用擁塞避免算法捅彻。
假設發(fā)送方擁塞窗口cwnd的值為1组去,發(fā)送窗口swnd等于擁塞窗口cwnd,那么目前發(fā)送方只能發(fā)送一個報文段步淹,cwnd為幾就能發(fā)送幾個報文段从隆,接收方收到報文段后發(fā)送回復確認,發(fā)送方收到確認報文缭裆,會將擁塞窗口的值乘2键闺,變?yōu)?。
發(fā)送方此時一次就能發(fā)送兩個報文段澈驼,接收方收到報文段后返回兩次確認報文段辛燥,發(fā)送方收到之后擁塞窗口再乘2,cwnd=4缝其。知道發(fā)送方發(fā)送16個報文段都按時收到確認報文挎塌,擁塞窗口變?yōu)?2,但是這一次沒有按時收到確認報文内边,即有報文需要重傳勃蜘,表示網(wǎng)絡發(fā)生了擁塞,這時候設定ssthresh為當前窗口cwnd的一半假残,即ssthresh = cwnd/2 = 16。重新開始慢開始炉擅。再一次cwnd=16的時候辉懒,開啟擁塞避免算法。
2. 擁塞避免算法
擁塞避免算法是讓擁塞窗口緩慢增長谍失,每經(jīng)過一個往返時間RTT就把發(fā)送方的擁塞窗口cwnd加1眶俩,而不是加倍,擁塞窗口按線性規(guī)律緩慢增長快鱼。
不論是在慢開始期間還是擁塞避免期間颠印,只要判斷網(wǎng)絡發(fā)生了擁塞ssthresh就設置為當前發(fā)送窗口大小的一半纲岭,然后重新開始執(zhí)行慢開始算法,這樣做的目的是迅速減少主機發(fā)送到網(wǎng)絡中的分組數(shù)线罕,使發(fā)生擁塞的路由器有足夠的時間把隊列中積壓的分組處理完畢止潮。
3. 快速重傳
快速重傳是對前兩個機制的補充,在1988年TCP擁塞控制算法初次提出的時候只有慢開始和擁塞避免钞楼,1990年又新加了兩個新的擁塞控制算法(即快重傳和快恢復)來改進TCP的性能喇闸。
快速重傳機制是什么呢?
考慮下面這種情況询件,在數(shù)據(jù)傳送過程中燃乍,網(wǎng)絡有可能不太穩(wěn)定,個別報文段在網(wǎng)絡中丟失了宛琅,但是實際上網(wǎng)絡并沒有發(fā)生擁塞刻蟹。這樣會導致發(fā)送方超時重傳,誤以為網(wǎng)絡上發(fā)生了擁塞嘿辟,由于有慢開始和擁塞避免機制舆瘪,發(fā)送方錯誤的啟動了慢開始算法,并且把擁塞窗口cwnd又設置為最小值1仓洼,因為降低了傳輸效率介陶。
為解決這個問題,快重傳要求接收方在收到一個失序的報文段后立即發(fā)出重復確認色建,為的是讓發(fā)送方知道有一個報文丟失了哺呜,快速重傳算法規(guī)定,發(fā)送方只要一連收到三個重復確認就應當立即重傳對方還沒有接收到的報文段箕戳,而不必繼續(xù)等待設置的重傳計時器時間到期某残。
4. 快恢復算法
快恢復算法適合快重傳算法配合使用的
(1)當發(fā)送方連續(xù)收到三個重復確認的時候,執(zhí)行“乘法減小”算法陵吸,將ssthresh門限減半(為了預防網(wǎng)絡發(fā)生擁塞)玻墅,但是接下來不執(zhí)行慢開始算法,因為如果網(wǎng)絡發(fā)生擁塞的話就不會收到好幾個重復的確認壮虫,所以發(fā)送方現(xiàn)在認為網(wǎng)絡可能沒有出現(xiàn)擁塞澳厢。
(2)此時不會執(zhí)行慢開始算法,而是將擁塞窗口cwnd設置為ssthresh減半后的值囚似,然后執(zhí)行擁塞避免算法剩拢,讓cwnd緩慢變大。