介紹
在某段時(shí)間內(nèi),若對(duì)網(wǎng)絡(luò)中某一資源的需求超過(guò)了該資源所能提供的可用部分,網(wǎng)絡(luò)性能就要變壞,這種情況就叫做擁塞。
可以通過(guò)擁塞控制方法來(lái)進(jìn)行控制,控制的是發(fā)送窗口的大小,也就是一次性可以發(fā)送多少字節(jié),如果趨向于擁塞,就少發(fā)送,如果不發(fā)生擁塞,就多發(fā)送。
擁塞的危害:
若出現(xiàn)擁塞而不進(jìn)行控制,整個(gè)網(wǎng)絡(luò)的吞吐量將隨輸入負(fù)荷的增大而下降

擁塞控制
準(zhǔn)備條件
原理:
根本原理是當(dāng)擁塞發(fā)生時(shí)就將發(fā)送窗口減小,當(dāng)沒(méi)有發(fā)生擁塞時(shí)就將發(fā)送窗口增大,而是否發(fā)生擁塞是通過(guò)是否發(fā)送超時(shí)重傳決定的。
假定條件:
- 數(shù)據(jù)是單方向傳送,而另一個(gè)方向只傳送確認(rèn)。
- 接收方總是有足夠大的緩存空間,因而發(fā)送方發(fā)送窗口的大小由網(wǎng)絡(luò)的擁塞程度來(lái)決定的,避免接收方所決定的發(fā)送窗口干擾。
- 以最大報(bào)文段MSS的個(gè)數(shù)為討論問(wèn)題的單位,而不是以字節(jié)為單位
概念:
-
cwnd為擁塞窗口: 也就是此時(shí)的發(fā)送窗口
- 在慢開(kāi)始算法時(shí)呈指數(shù)增長(zhǎng)
- 擁塞避免算法時(shí)+1線性增長(zhǎng)
-
慢開(kāi)始門限ssthresh:
- cwnd>ssthresh時(shí),進(jìn)行慢開(kāi)始算法
- cwnd<ssthresh時(shí),開(kāi)始擁塞避免算法
- cwnd==ssthresh時(shí),都可以
-
swnd發(fā)送窗口:
- 在這個(gè)場(chǎng)景中就固定=cwnd
算法認(rèn)識(shí)
慢開(kāi)始算法(slow-start)

說(shuō)明:
- 可以看到慢開(kāi)始門限設(shè)置為16,cwnd在到達(dá)16前需要指數(shù)增長(zhǎng)
- 當(dāng)傳輸輪次為0時(shí),起始位置為1
- cwnd = 2^(n-1),n為傳輸輪次
擁塞避免算法

說(shuō)明:
- 思路:讓擁塞窗口 cwnd 緩慢地增大,避免快速出現(xiàn)擁塞。
- 每經(jīng)過(guò)一個(gè)傳輸輪次,擁塞窗口 cwnd = cwnd + 1。
快重傳
有個(gè)別報(bào)文段在網(wǎng)絡(luò)中丟失,但是實(shí)際上網(wǎng)絡(luò)并未發(fā)生擁塞,此時(shí)的發(fā)送方超時(shí)重傳會(huì)導(dǎo)致網(wǎng)絡(luò)誤以為發(fā)生了擁塞并啟動(dòng)擁塞控制算法,這樣就降低了發(fā)送效率。因此需要采用快重傳。
原理: 快重傳算法的根本原理就是讓發(fā)送方盡早知道發(fā)生了個(gè)別報(bào)文段的丟失,而不需要啟動(dòng)超時(shí)重傳機(jī)制
作用: 提高了傳輸效率,快重傳可以使整個(gè)網(wǎng)絡(luò)的吞吐量提高約20%

說(shuō)明:
- 要求接收方不要等待自己發(fā)送數(shù)據(jù)時(shí)才進(jìn)行捎帶確認(rèn),而是要立即發(fā)送確認(rèn)
- 即使受到了失序的報(bào)文段也要立即發(fā)出對(duì)已收到的報(bào)文段的重復(fù)確認(rèn)
- 發(fā)送方一旦受到3個(gè)連續(xù)的重復(fù)確認(rèn),就將相應(yīng)的報(bào)文段立即重傳
- 這樣就不需要等到超時(shí)機(jī)制觸發(fā)后進(jìn)行重傳
- 也就不會(huì)進(jìn)行擁塞控制了
快恢復(fù)
在快重傳后如何進(jìn)行擁塞窗口的控制呢?
發(fā)送方一旦受到3個(gè)重復(fù)確認(rèn)報(bào)文,就知道現(xiàn)在只是丟失了個(gè)別的報(bào)文段,而不是發(fā)生了擁塞,所以就啟動(dòng)快恢復(fù)算法。
算法過(guò)程:
- 發(fā)送方將慢開(kāi)始門限ssthresh值和擁塞窗口cwnd值調(diào)整為當(dāng)前窗口的一半
- 并開(kāi)始執(zhí)行擁塞避免算法
擁塞控制的過(guò)程
擁塞控制有兩種,一種是超時(shí)重傳后進(jìn)入到慢開(kāi)始階段,一種是收到3個(gè)重復(fù)確認(rèn)報(bào)文后開(kāi)始的快恢復(fù)階段。
超時(shí)重傳

快恢復(fù)的控制

過(guò)程說(shuō)明:
1、首先進(jìn)行慢開(kāi)始算法,cwnd指數(shù)增長(zhǎng)
2、一直增長(zhǎng)到cwnd>=ssthreesh,也就是達(dá)到了慢開(kāi)始門限閾值,開(kāi)始進(jìn)行擁塞避免算法
3、擁塞避免算法是cwnd+1
4、當(dāng)發(fā)生超時(shí)重傳時(shí),cwnd=1,ssthresh = cwnd/2 = 12
5、此時(shí)繼續(xù)進(jìn)行慢開(kāi)始算法,指數(shù)增長(zhǎng)
6、cwnd達(dá)到12后開(kāi)始擁塞避免算法,cwnd = cwnd+1
7、當(dāng)cwnd = 16時(shí),收到3個(gè)重復(fù)確認(rèn),此時(shí)就需要進(jìn)行快重傳
8、快重傳就是ssthresh = cwnd/2 = 16/2 = 8,而cwnd = ssthresh
9、在這個(gè)基礎(chǔ)上繼續(xù)開(kāi)始快恢復(fù)。這里的快恢復(fù)直接就開(kāi)始了擁塞避免算法