TCP/IP拥塞控制复习
...
什么是擁塞
我們都知道計(jì)算機(jī)網(wǎng)絡(luò)中的資源是有限的。某段時(shí)間內(nèi)網(wǎng)絡(luò)中對(duì)資源的需求超過(guò)了網(wǎng)絡(luò)中的可用部分,而導(dǎo)致網(wǎng)絡(luò)性能下降的情況就是擁塞。
通俗點(diǎn)說(shuō)就是發(fā)送的數(shù)據(jù)包太多網(wǎng)絡(luò)中的設(shè)備處理不過(guò)來(lái),而導(dǎo)致網(wǎng)絡(luò)性能下降的情況。
TCP為什么要進(jìn)行擁塞控制
網(wǎng)絡(luò)中的路由器會(huì)有一個(gè)數(shù)據(jù)包處理隊(duì)列,當(dāng)路由器接收到的數(shù)據(jù)包太多而一下子處理不過(guò)來(lái)時(shí),就會(huì)導(dǎo)致數(shù)據(jù)包處理隊(duì)列過(guò)長(zhǎng)。此時(shí),路由器就會(huì)無(wú)條件的丟棄新接收到的數(shù)據(jù)封包。
這就會(huì)導(dǎo)致上層的TCP協(xié)議以為數(shù)據(jù)包在網(wǎng)絡(luò)中丟失,進(jìn)而重傳這些數(shù)據(jù)包,而路由器又會(huì)丟棄這些重傳的數(shù)據(jù)包,如此以往,就會(huì)導(dǎo)致網(wǎng)絡(luò)性能急劇下降,引起網(wǎng)絡(luò)癱瘓。
因此,TCP需要控制數(shù)據(jù)包發(fā)送的數(shù)量來(lái)避免網(wǎng)絡(luò)性能的下降。
擁塞控制與流量控制的區(qū)別
引用書(shū)上的答案:
擁塞控制就是防止過(guò)多的數(shù)據(jù)注入到網(wǎng)絡(luò)中,這樣可以防止網(wǎng)絡(luò)中的路由器或鏈路不致過(guò)載。擁塞控制所要做的都有一個(gè)前提,就是網(wǎng)絡(luò)能夠承受現(xiàn)有的網(wǎng)絡(luò)負(fù)荷。擁塞控制是一個(gè)全局性的過(guò)程,涉及到所有的主機(jī)、所有的路由器,以及與降低網(wǎng)絡(luò)傳輸性能有關(guān)的所有因素。
流量控制往往指點(diǎn)對(duì)點(diǎn)通信量的控制,是個(gè)端到端的問(wèn)題。流量控制所要做的就是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率,以便使接收端來(lái)得及接收。
擁塞控制的方法
慢開(kāi)始
擁塞窗口
擁塞窗口(cwnd)是指發(fā)送方維護(hù)的一個(gè)根據(jù)網(wǎng)絡(luò)狀況動(dòng)態(tài)變化的窗口。一般來(lái)說(shuō),發(fā)送方會(huì)讓自己的發(fā)送窗口等于擁塞窗口的大小。
如果考慮到流量控制的話(huà),發(fā)送窗口也有可能小于擁塞窗口的大小。
傳輸輪次
一個(gè)傳輸輪次是指發(fā)送方把自己的發(fā)送窗口內(nèi)的數(shù)據(jù)全部發(fā)送出去并收到對(duì)最后一個(gè)字節(jié)的確認(rèn)。
例如,A將自己的發(fā)送窗口內(nèi)的數(shù)據(jù)全部連續(xù)發(fā)送給了B,而B(niǎo)收到這些數(shù)據(jù)后向A發(fā)送了對(duì)這些數(shù)據(jù)的確認(rèn),A收到這個(gè)確認(rèn)后,一個(gè)傳輸輪次就算是完成了。
慢開(kāi)始算法
慢開(kāi)始算法中的主要方法就是有小到大逐漸增大發(fā)送窗口。
那么,具體是怎么增大的呢?
簡(jiǎn)單來(lái)說(shuō)就是每個(gè)傳輸輪次后將cwnd大小加倍。
舉個(gè)例子:
首先,發(fā)送方設(shè)置cwnd=1(為方便理解,這里用報(bào)文段的個(gè)數(shù)作為窗口大小的單位),在收到接收方發(fā)來(lái)的確認(rèn)后(也就是下個(gè)傳輸輪次),設(shè)置cwnd=2,然后將發(fā)送窗口的數(shù)據(jù)發(fā)送出去。在一次收到接收方發(fā)來(lái)的確認(rèn)后,發(fā)送方設(shè)置cwnd=4,再講發(fā)送窗口中的數(shù)據(jù)發(fā)送出去。然后再重復(fù)上面的過(guò)程。
這里就應(yīng)該清楚,慢開(kāi)始算法中的慢不是說(shuō)cwnd增長(zhǎng)的慢,而是相對(duì)一下子發(fā)送大量數(shù)據(jù)而言,這種一次先發(fā)送少量的數(shù)據(jù)包的方式要慢許多。
當(dāng)然,cwnd的大小肯定不可能一直以這種指數(shù)的方式增長(zhǎng)下去,要不然很快就會(huì)增長(zhǎng)到引起網(wǎng)絡(luò)癱瘓的程度了。
所以,經(jīng)過(guò)一定時(shí)間或條件,我們就要換成擁塞避免算法來(lái)發(fā)送數(shù)據(jù)。
擁塞避免
慢開(kāi)始門(mén)限 ssthresh
像上面所說(shuō),不能任由慢開(kāi)始算法中的cwnd任意增長(zhǎng),所以我們引入一個(gè)慢開(kāi)始門(mén)限(ssthresh)的閾值來(lái)控制cwnd的增長(zhǎng)。
具體作用如下:
cwnd < ssthresh ,使用慢開(kāi)始算法
cwnd = ssthresh , 使用慢開(kāi)始算法或擁塞避免算法都可以
cwnd > ssthresh , 使用擁塞避免算法呢
還有一個(gè)問(wèn)題就是這個(gè)ssthresh是怎么設(shè)置的呢?
TCP/IP中規(guī)定無(wú)論是在慢開(kāi)始階段還是在擁塞避免階段,只要發(fā)現(xiàn)網(wǎng)絡(luò)中出現(xiàn)擁塞(沒(méi)有按時(shí)收到確認(rèn)),就要把ssthresh設(shè)置為此時(shí)發(fā)送窗口的一半大小(不能小于2)。
擁塞避免過(guò)程
擁塞避免算法也是逐漸的增大cwnd的大小,只是采用的是線(xiàn)性增長(zhǎng)而不是像慢開(kāi)始算法那樣的指數(shù)增長(zhǎng)。
具體來(lái)說(shuō)就是每個(gè)傳輸輪次后將cwnd的大小加一(加法增大),如果發(fā)現(xiàn)出現(xiàn)網(wǎng)絡(luò)擁塞的話(huà)就按照上面的方法重新設(shè)置ssthresh的大小(乘法減小)并從cwnd=1開(kāi)始重新執(zhí)行慢開(kāi)始算法。
如下面的圖片所示:
(圖片來(lái)源于網(wǎng)絡(luò))
快重傳
前面復(fù)習(xí)到過(guò),TCP的可靠傳輸?shù)脑砭褪?strong>超時(shí)重傳機(jī)制。配合上面的慢開(kāi)始和擁塞避免使用就是發(fā)送發(fā)發(fā)送完數(shù)據(jù)后設(shè)置一個(gè)定時(shí)器,如果在定時(shí)器時(shí)間內(nèi)沒(méi)有收到對(duì)接收方發(fā)來(lái)的確認(rèn)的話(huà)就去執(zhí)行上述的乘法減小過(guò)程并重新開(kāi)始慢開(kāi)始算法。
而快重傳則是允許發(fā)送方再連續(xù)收到3個(gè)重復(fù)的確認(rèn)后就可以開(kāi)始執(zhí)行乘法減小過(guò)程而不必再等待所設(shè)置的重傳計(jì)時(shí)器到時(shí)。
這就需要接收方?jīng)]收到一個(gè)失序的報(bào)文段就立即發(fā)出重復(fù)確認(rèn)以讓發(fā)送發(fā)及早知道有報(bào)文段丟失,而不是等待自己發(fā)送數(shù)據(jù)的時(shí)候進(jìn)行捎帶確認(rèn)。
快恢復(fù)
快恢復(fù)算法是與快重傳算法配合使用的一個(gè)算法。
使用了快恢復(fù)算法后與原來(lái)不同的一點(diǎn)是當(dāng)發(fā)現(xiàn)網(wǎng)絡(luò)出現(xiàn)擁塞并執(zhí)行了乘法減小過(guò)程后,并不是設(shè)置cwnd=1并重新開(kāi)始執(zhí)行慢開(kāi)始算法,而是讓cwnd=乘法減小后的ssthresh并開(kāi)始執(zhí)行擁塞避免算法。
因?yàn)榇藭r(shí)發(fā)送發(fā)能連續(xù)接收到三個(gè)重復(fù)的確認(rèn)就可以認(rèn)為此時(shí)網(wǎng)絡(luò)很可能沒(méi)有發(fā)生擁塞。
使用了快重傳和快恢復(fù)的擁塞避免過(guò)程如下:
(圖片來(lái)源于網(wǎng)絡(luò))
TCP的發(fā)送窗口到底是多大
發(fā)送窗口的上限值 = Min{rwnd, cwnd}
rwnd:接收方接收窗口
cwnd:發(fā)送方擁塞窗口
總結(jié)
以上是生活随笔為你收集整理的TCP/IP拥塞控制复习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2015 ICL, Finals, Di
- 下一篇: 由IP和掩码计算广播地址