簡(jiǎn)介
** 擁塞 ** :即對(duì)資源的需求超過(guò)了可用的資源柱锹。當(dāng)網(wǎng)絡(luò)中資源供應(yīng)不足丰包,導(dǎo)致出現(xiàn)資源競(jìng)爭(zhēng)時(shí),就會(huì)出現(xiàn)擁塞現(xiàn)象匹层,擁塞會(huì)降低網(wǎng)絡(luò)性能和吞吐量锌蓄。
** 擁塞控制 ** :通過(guò)控制數(shù)據(jù)注入到網(wǎng)絡(luò)中的速率來(lái)盡可能避免網(wǎng)絡(luò)出現(xiàn)擁塞,從而使網(wǎng)絡(luò)中的路由器或鏈路不致過(guò)載您访。前提:網(wǎng)絡(luò)能夠承受現(xiàn)有的網(wǎng)絡(luò)負(fù)荷剪决。擁塞控制是一個(gè)全局性的過(guò)程,涉及到所有的主機(jī)享言、路由器渗鬼,以及與降低網(wǎng)絡(luò)傳輸性能有關(guān)的其他因素譬胎。
** 流量控制 ** :流量控制所要做的就是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率,以便使接收端來(lái)得及接收偏化。是一個(gè)端到端的控制過(guò)程镐侯。
** 擁塞控制代價(jià) ** :擁塞控制需要獲得網(wǎng)絡(luò)內(nèi)部流量分布的信息。因此在實(shí)施擁塞控制之前韵卤,需要在結(jié)點(diǎn)之間交換信息和各種命令,以便選擇控制的策略和實(shí)施控制,這樣就產(chǎn)生了額外的開(kāi)銷邓尤。擁塞控制還需要將一些資源分配給各個(gè)用戶單獨(dú)使用汞扎,使得網(wǎng)絡(luò)資源不能更好地實(shí)現(xiàn)共享。
控制算法
發(fā)送方控制擁塞窗口的 ** 原則 ** 是:只要網(wǎng)絡(luò)沒(méi)有出現(xiàn)擁塞景鼠,擁塞窗口就再增大一些痹扇,以便把更多的分組發(fā)送出去。但只要網(wǎng)絡(luò)出現(xiàn)擁塞浓恶,擁塞窗口就減小一些结笨,以減少注入到網(wǎng)絡(luò)中的分組數(shù)。
慢開(kāi)始
在 TCP 連接開(kāi)始傳輸數(shù)據(jù)時(shí)伐憾,先將擁塞窗口 cwnd 設(shè)為 1 個(gè) MSS(最大報(bào)文段)赫模,每當(dāng)收到一個(gè)報(bào)文段的確認(rèn)瀑罗,就將 cwnd+1,因此筛谚,每經(jīng)過(guò)一個(gè)傳輸輪次 RTT停忿,cwnd 的大小就加倍,直至 cwnd 大小達(dá)到預(yù)設(shè)的慢開(kāi)始門(mén)限值 ssthresh吮铭。
一個(gè)傳輸輪次所需時(shí)間為一個(gè)往返時(shí)間 RTT,但 ** 傳輸輪次強(qiáng)調(diào)的是將一個(gè) cwnd 窗口中所允許發(fā)送的報(bào)文段全都發(fā)送出去并且都接收到對(duì)應(yīng)于最后一個(gè)報(bào)文段的確認(rèn)報(bào)文 ** 掠拳。
慢開(kāi)始中的“慢”并非指?jìng)鬏斔俾屎苈饺猓钦f(shuō)開(kāi)始的時(shí)候?qū)?cwnd 設(shè)為 1柏肪,使得發(fā)送方最開(kāi)始只能發(fā)送一個(gè)報(bào)文段(目的在于試探當(dāng)前網(wǎng)絡(luò)的擁塞狀況),然后再 ** 指數(shù)增長(zhǎng) ** cwnd 的大小聂使。
** 慢開(kāi)始門(mén)限值 ssthresh ** :因?yàn)槁_(kāi)始算法以指數(shù)型式增長(zhǎng)谬俄,所以為了防止后期因?yàn)閏wnd 窗口增長(zhǎng)過(guò)快而導(dǎo)致網(wǎng)絡(luò)出現(xiàn)擁塞,需要設(shè)置一個(gè)慢開(kāi)始的門(mén)限值宿礁,當(dāng) cwnd 增長(zhǎng)至門(mén)限值大小時(shí)梆靖,停止采用慢開(kāi)始算法而改用擁塞避免算法笔诵。
? 當(dāng) cwnd < ssthresh 時(shí),使用慢開(kāi)始算法测僵;
? 當(dāng) cwnd > ssthresh 時(shí)谢翎,停止使用慢開(kāi)始算法而改用擁塞避免算法;
? 當(dāng) cwnd = ssthresh 時(shí)榨婆,既可使用慢開(kāi)始算法褒侧,也可使用擁塞控制避免算法。
擁塞避免
讓擁塞窗口以 ** 線性增長(zhǎng) ** 的方式緩慢增大统诺,從而減少注入到網(wǎng)絡(luò)中的數(shù)據(jù)疑俭,以盡量避免網(wǎng)絡(luò)擁塞。具體而言啄寡,每經(jīng)過(guò)一個(gè)傳輸輪次才將發(fā)送方的 cwnd+1香璃,而非每接收到一個(gè)確認(rèn)報(bào)文就加 1葡秒,這樣的話嵌溢,每經(jīng)過(guò)一個(gè)傳輸輪次,擁塞窗口才增長(zhǎng)了 1 個(gè) MSS学少,而非加倍秧骑,cwnd 呈線性增長(zhǎng)而非指數(shù)增長(zhǎng)乎折,由此可知,擁塞避免算法的 cwnd 增長(zhǎng)速率比慢開(kāi)始算法慢很多骂澄。
“擁塞避免”并非指完全能夠避免了擁塞坟冲。利用以上的措施要完全避免網(wǎng)絡(luò)擁塞還是不可能的×彰ǎ“擁塞避免”是說(shuō)在擁塞避免階段將擁塞窗口控制為按線性規(guī)律增長(zhǎng)私痹,使網(wǎng)絡(luò)比較不容易出現(xiàn)擁塞。
** 注意 ** :無(wú)論在慢開(kāi)始階段還是在擁塞避免階段雹锣,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞(根據(jù)就是沒(méi)有收到確認(rèn))蕊爵,就要把慢開(kāi)始門(mén)限 ssthresh 設(shè)置為出現(xiàn)擁塞時(shí)的發(fā)送方窗口值的一半(但不能小于 2)。然后把擁塞窗口 cwnd 重新設(shè)置為 1醋旦,執(zhí)行慢開(kāi)始算法会放。這樣做的目的就是要迅速減少主機(jī)發(fā)送到網(wǎng)絡(luò)中的分組數(shù),使得發(fā)生擁塞的路由器有足夠時(shí)間把隊(duì)列中積壓的分組處理完畢捂人。
快重傳
快重傳算法首先要求接收方每收到一個(gè)失序的報(bào)文段后就 ** 立即 ** 發(fā)出重復(fù)確認(rèn)(為的是使發(fā)送方及早知道有報(bào)文段沒(méi)有到達(dá)對(duì)方)而不要等到自己發(fā)送數(shù)據(jù)時(shí)才進(jìn)行捎帶確認(rèn)滥搭〉肪ǎ快重傳算法還規(guī)定栽惶,發(fā)送方只要一連收到 ** 三個(gè)重復(fù)確認(rèn) ** 就應(yīng)當(dāng)立即重傳對(duì)方尚未收到的報(bào)文段,而不必繼續(xù)等待設(shè)置的重傳計(jì)時(shí)器到期冕象。由于發(fā)送方盡早重傳未被確認(rèn)的報(bào)文段酣衷,因此采用快重傳后可以使整個(gè)網(wǎng)絡(luò)吞吐量提高。
快恢復(fù)
當(dāng)發(fā)送方連續(xù)收到三個(gè)重復(fù)確認(rèn)席爽,就執(zhí)行“乘法減小”算法只锻,把慢開(kāi)始門(mén)限 ssthresh ** 減半 ** 紫谷。這是為了預(yù)防網(wǎng)絡(luò)發(fā)生擁塞捐寥。由于發(fā)送方現(xiàn)在認(rèn)為網(wǎng)絡(luò)很可能沒(méi)有發(fā)生擁塞握恳,因此與慢開(kāi)始不同之處在于現(xiàn)在 ** 不執(zhí)行慢開(kāi)始算法 ** (即擁塞窗口 cwnd 現(xiàn)在不設(shè)置為 1)捺僻,而是把 cwnd 值設(shè)置為慢開(kāi)始門(mén)限 ssthresh 減半后的數(shù)值匕坯,然后開(kāi)始執(zhí)行 ** 擁塞避免算法 ** (“加法增大”),使擁塞窗口緩慢地線性增大锹雏。
基于上述四個(gè)算法的擁塞避免流程:
TCP 連接建立后术奖,將發(fā)送方 cwnd 設(shè)為 1(MSS)腰耙,并設(shè)置慢開(kāi)始門(mén)限值 ssthresh铲球,執(zhí)行慢開(kāi)始算法指數(shù)增長(zhǎng) cwnd稼病。當(dāng) cwnd 達(dá)到 ssthresh 時(shí)改用擁塞避免算法線性增長(zhǎng) cwnd然走。如果在數(shù)據(jù)傳輸過(guò)程中出現(xiàn)超時(shí)還未收到確認(rèn)報(bào)文的情況,意味著有可能出現(xiàn)網(wǎng)絡(luò)擁塞晨仑,將ssthresh 設(shè)為該時(shí)刻的 cwnd 的一半洪己,cwnd 設(shè)為 1竟贯,重新執(zhí)行慢開(kāi)始算法。如果在數(shù)據(jù)傳輸過(guò)程中接收方收到失序的報(bào)文段拱镐,就采用快重傳算法立即發(fā)送重復(fù)的確認(rèn)報(bào)文沃琅,發(fā)送方接收到 3 個(gè)相同的確認(rèn)報(bào)文后,意味著有報(bào)文丟失益眉,就采用快恢復(fù)算法將 ssthresh 和 cwnd 均設(shè)為出現(xiàn)擁塞時(shí)的cwnd的一半呜叫,重新執(zhí)行擁塞避免算法。轉(zhuǎn)換圖如下:(圖片來(lái)源:TCP的流量控制和擁塞控制)
總結(jié)
在采用快恢復(fù)算法時(shí),慢開(kāi)始算法只是在 TCP 連接建立時(shí)和網(wǎng)絡(luò)出現(xiàn)超時(shí)時(shí)才使用娱颊。采用這樣的擁塞控制方法使得 TCP 的性能有明顯的改進(jìn)箱硕。
接收方根據(jù)自己的接收能力設(shè)定了接收窗口 rwnd,并把這個(gè)窗口值寫(xiě)入 TCP 首部中的窗口字段栓拜,傳送給發(fā)送方幕与,接收窗口又稱為 ** 通知窗口 ** 镇防。因此啦鸣,從接收方對(duì)發(fā)送方的流量控制的角度考慮,發(fā)送方的發(fā)送窗口一定不能超過(guò)對(duì)方給出的接收窗口 rwnd 来氧。所以 ** 發(fā)送方窗口的上限值 = Min [ rwnd诫给, cwnd ] :**
? 當(dāng)rwnd < cwnd 時(shí),是接收方的接收能力限制發(fā)送方窗口的最大值啦扬;
? 當(dāng)cwnd < rwnd 時(shí)中狂,則是網(wǎng)絡(luò)的擁塞限制發(fā)送方窗口的最大值。