TCP的擁塞控制
一、前言:什么是擁塞?什么是擁塞控制?
-
擁塞:隨著網(wǎng)絡(luò)中的主機(jī)增加其發(fā)送速率并使網(wǎng)絡(luò)變得十分擁擠,此時(shí)會(huì)經(jīng)常發(fā)生丟包現(xiàn)象,導(dǎo)致網(wǎng)絡(luò)的傳輸效率急劇降低。分組的超時(shí)重傳通常被作為網(wǎng)絡(luò)擁塞的標(biāo)志。
-
如果不對(duì)網(wǎng)絡(luò)擁塞進(jìn)行控制,整個(gè)網(wǎng)絡(luò)的吞吐量將隨著輸入負(fù)荷的增大而下降,降低網(wǎng)絡(luò)的傳輸效率,如下圖:
二、TCP的4種擁塞控制算法(慢開始
、擁塞避免
、快重傳
、快恢復(fù)
)
- 為了便于討論做一下假設(shè)
- 數(shù)據(jù)是單方向傳送的,另一個(gè)方向只傳輸確認(rèn)
- 接收方的總是有足夠大的緩沖區(qū),因此發(fā)送方的
發(fā)送窗口
僅由網(wǎng)絡(luò)的擁塞程度決定,事實(shí)上發(fā)送窗口
的大小由擁塞窗口
和接收方的接收窗口
大小共同控制,也即發(fā)送窗口 = min[接收窗口, 擁塞窗口]; - 以最大報(bào)文段MSS的個(gè)數(shù)作為討論單位,而不是以字節(jié)為單位
- 發(fā)送方維護(hù)一個(gè)叫做
擁塞窗口cwnd
(congestion window)的狀態(tài)變量,其值取決于網(wǎng)絡(luò)的擁塞狀況,動(dòng)態(tài)變化-
擁塞窗戶
的維護(hù)原則:只要網(wǎng)絡(luò)沒有出現(xiàn)擁塞,cwnd
就增大一些;但只要網(wǎng)絡(luò)出現(xiàn)擁塞,擁塞窗口
就減小一些 - 以分組發(fā)生超時(shí)重傳作為發(fā)生網(wǎng)絡(luò)擁塞的依據(jù)
-
- TCP還維護(hù)一個(gè)
慢開始門限ssthresh
狀態(tài)變量- 當(dāng)cwnd < ssthresh時(shí),使用慢開始算法
- 當(dāng)cwnd > ssthresh時(shí),使用擁塞避免算法
- 當(dāng)cwnd = ssthresh時(shí),既可以使用慢開始算法,也可以使用擁塞避免算法
- 當(dāng)發(fā)生數(shù)據(jù)正常丟包,但又不是
網(wǎng)絡(luò)擁塞
時(shí),使用快重傳算法和快恢復(fù)算法- 如何判斷是發(fā)生了正常丟包而不是網(wǎng)絡(luò)擁塞呢?
- 當(dāng)發(fā)送方連續(xù)接收到3次重復(fù)確認(rèn)時(shí),說明這網(wǎng)絡(luò)不擁塞,只是正常丟包了
① 慢啟動(dòng)(慢開始)
- 傳輸輪次:指把發(fā)送窗口內(nèi)可以發(fā)送的數(shù)據(jù)全部發(fā)送并接收到最后一個(gè)TCP報(bào)文的確認(rèn)報(bào)文這樣一個(gè)來回
- 通常在一條TCP連接開始時(shí),
cwnd
被設(shè)置為1個(gè)MSS(最大報(bào)文段),也即cwnd=1
- 該階段,每當(dāng)TCP發(fā)送方將
發(fā)送窗口
的數(shù)據(jù)發(fā)送完,并順利接收到所有的確認(rèn)后,就會(huì)將擁塞窗口大小翻倍,也即慢啟動(dòng)階段,cwnd
以指數(shù)形式增長(zhǎng),如上圖所示;注意這里忽略了接收窗口的影響,上文也提到了。 - 擁塞窗口會(huì)一直增長(zhǎng)直到到達(dá)
慢開始門限ssthresh
,開始執(zhí)行擁塞避免
算法
② 擁塞避免
- 該階段的擁塞窗口變?yōu)?mark>線性增長(zhǎng),每次
cwnd+1
,也即每次增加一個(gè)MSS
- 隨著擁塞窗口的增加,發(fā)送速率不斷提高,當(dāng)TCP遇到分組超時(shí)重傳時(shí),即認(rèn)為發(fā)生了網(wǎng)絡(luò)擁塞
- 此時(shí)將更新
ssthresh
的值為當(dāng)前擁塞窗口的一半,上圖中是更新為24的一半即12 - 更新
cwnd
的值為1 - 然后繼續(xù)執(zhí)行
慢啟動(dòng)
—擁塞避免
,如上圖所示
- 此時(shí)將更新
- 如果TCP發(fā)送方接收到連續(xù)的3個(gè)重復(fù)確認(rèn),則認(rèn)為是正常的網(wǎng)絡(luò)包丟失,而不是網(wǎng)絡(luò)擁塞造成的(這正是快重傳算法的功勞)
- 重傳丟失的分組
- 執(zhí)行
快恢復(fù)
算法
③ 快重傳
- 所謂的快重傳算法,就是讓發(fā)送方盡快重傳,而不是等待超時(shí)重傳計(jì)時(shí)器超時(shí)再重傳
- 要求接收方不要等待自己發(fā)送數(shù)據(jù)時(shí)才捎帶確認(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)文段立即重傳,而不是等待該報(bào)文的重傳計(jì)時(shí)器超時(shí)再重傳
- 如下圖所示:
④ 快恢復(fù)
- 如果發(fā)送方收到了3個(gè)重復(fù)確認(rèn),就執(zhí)行
快恢復(fù)
算法- 將
慢開始門限sstresh
和擁塞窗口cwnd
都設(shè)置為當(dāng)前擁塞窗口的一半,然后執(zhí)行擁塞避免算法
- 將
三、一個(gè)糅合了4種擁塞控制算法的例子
- 最初
cwnd=1
,ssthresh=16
,執(zhí)行慢開始
算法,cwnd
大小指數(shù)增長(zhǎng) -
cwnd
到達(dá)慢開始門限ssthresh
后,轉(zhuǎn)而執(zhí)行擁塞避免
算法,cwnd
線性加一增長(zhǎng) - 隨著發(fā)送速率的增加,若發(fā)生超時(shí)重傳,則將
慢開始門限ssthresh
減小為當(dāng)前擁塞窗口的一半、再將擁塞窗口cwnd
設(shè)置為1,然后執(zhí)行慢開始-
–擁塞避免
,重復(fù)1、2 - 若發(fā)送方收到3個(gè)重復(fù)確認(rèn),則表示分組丟失,發(fā)送方立刻重傳相應(yīng)分組;然后執(zhí)行
快恢復(fù)
算法 - 將
慢開始門限ssthresh
和擁塞窗口cwnd
重新設(shè)置為當(dāng)前擁塞窗口的一半,然后執(zhí)行擁塞避免算法
這是學(xué)習(xí)湖科大計(jì)網(wǎng)時(shí)我做的學(xué)習(xí)筆記,老師講的太好了,建議去看原版,B站就有!?。?mark hidden color="red">文章來源:http://www.zghlxwxcb.cn/news/detail-787360.html
如果本文對(duì)您有用,可以點(diǎn)贊、收藏本文哦,下次用到時(shí)就好找多了
如果能關(guān)注作者就太好了,作者將持續(xù)學(xué)習(xí),持續(xù)輸出,持續(xù)分享!謝謝鼓勵(lì)!文章來源地址http://www.zghlxwxcb.cn/news/detail-787360.html
到了這里,關(guān)于TCP的擁塞控制算法:慢啟動(dòng)、擁塞避免、快重傳、快恢復(fù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!