TCP的擁塞控制機(jī)制主要是以下四種機(jī)制:
慢啟動(dòng)(慢開(kāi)始)
擁塞避免
快速重傳
快速恢復(fù)
(1)慢啟動(dòng)(慢開(kāi)始)
在開(kāi)始發(fā)送的時(shí)候設(shè)置cwnd = 1(cwnd指的是擁塞窗口)
思路:開(kāi)始的時(shí)候不要發(fā)送大量數(shù)據(jù),而是先測(cè)試一下網(wǎng)絡(luò)的擁塞程度,由小到大增加擁塞窗口的大小。
為了防止cwnd增長(zhǎng)過(guò)大引起網(wǎng)絡(luò)擁塞,設(shè)置一個(gè)慢開(kāi)始門(mén)限(ssthresh 狀態(tài)變量)當(dāng)cnwd < ssthresh,使用慢開(kāi)始算法當(dāng)cnwd = ssthresh,既可使用慢開(kāi)始算法,也可以使用擁塞避免算法當(dāng)cnwd > ssthresh,使用擁塞避免算法
(2)擁塞避免
擁塞避免未必能夠完全避免擁塞,是說(shuō)在擁塞避免階段將擁塞窗口控制為按線性增長(zhǎng),使網(wǎng)絡(luò)不容易出現(xiàn)阻塞。
思路: 讓擁塞窗口cwnd緩慢的增大,即每經(jīng)過(guò)一個(gè)返回時(shí)間RTT就把發(fā)送方的擁塞控制窗口加一
無(wú)論是在慢開(kāi)始階段還是在擁塞避免階段,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞,就把慢開(kāi)始門(mén)限設(shè)置為出現(xiàn)擁塞時(shí)的發(fā)送窗口大小的一半。然后把擁塞窗口設(shè)置為1,執(zhí)行慢開(kāi)始算法。如圖所示:
其中,判斷網(wǎng)絡(luò)出現(xiàn)擁塞的根據(jù)就是沒(méi)有收到確認(rèn),雖然沒(méi)有收到確認(rèn)可能是其他原因的分組丟失,但是因?yàn)闊o(wú)法判定,所以都當(dāng)做擁塞來(lái)處理。
(3)快速重傳
快重傳要求接收方在收到一個(gè)失序的報(bào)文段后就立即發(fā)出重復(fù)確認(rèn)(為的是使發(fā)送方及早知道有報(bào)文段沒(méi)有到達(dá)對(duì)方)。發(fā)送方只要連續(xù)收到三個(gè)重復(fù)確認(rèn)就立即重傳對(duì)方尚未收到的報(bào)文段,而不必繼續(xù)等待設(shè)置的重傳計(jì)時(shí)器時(shí)間到期。
由于不需要等待設(shè)置的重傳計(jì)時(shí)器到期,能盡早重傳未被確認(rèn)的報(bào)文段,能提高整個(gè)網(wǎng)絡(luò)的吞吐量
(4)快速恢復(fù)
當(dāng)發(fā)送方連續(xù)收到三個(gè)重復(fù)確認(rèn)時(shí),就執(zhí)行“乘法減小”算法,把ssthresh門(mén)限減半。但是接下去并不執(zhí)行慢開(kāi)始算法。
考慮到如果網(wǎng)絡(luò)出現(xiàn)擁塞的話就不會(huì)收到好幾個(gè)重復(fù)的確認(rèn),所以發(fā)送方現(xiàn)在認(rèn)為網(wǎng)絡(luò)可能沒(méi)有出現(xiàn)擁塞。所以此時(shí)不執(zhí)行慢開(kāi)始算法,而是將cwnd設(shè)置為ssthresh的大小,然后執(zhí)行擁塞避免算法。