网络拥塞控制
TCP依靠重傳機(jī)制保證了數(shù)據(jù)的可靠性傳輸,同時為了避免數(shù)據(jù)發(fā)送過快而超過對方的接受能力,TCP采用了流量控制機(jī)制,(具體可以參考滑動窗口法)。但是TCP的控制機(jī)制里面只考慮到了接收端的接受能力,而忽略了一個很重要的方面,那就是沒有考慮到網(wǎng)絡(luò)自己的傳輸能力,從而造成了整個網(wǎng)絡(luò)崩潰的發(fā)生。
???????????????????????????????? 圖1.當(dāng)負(fù)載超過Cliff之后,吞吐量就急劇下降,延遲相應(yīng)急劇上升。Cliff點(diǎn)也就是網(wǎng)絡(luò)的最大負(fù)載,一旦超過網(wǎng)絡(luò)的整體性能就大打折扣
與上面介紹的TCP的流控比較下就可以發(fā)現(xiàn),流控主要是考慮接收端,不要發(fā)送過快,超過對方的接收能力,而擁塞控制則是要考慮到整個網(wǎng)絡(luò)環(huán)境,使其負(fù)載不能超過網(wǎng)絡(luò)的最大承受能力。顯然擁塞發(fā)生的原因是因?yàn)椤靶枨蟆贝笥诹恕肮┙o”,網(wǎng)絡(luò)中的有限資源被多用戶共享使用,網(wǎng)絡(luò)本身無法根據(jù)資源的利用情況來限制某些用戶,并且隨著目前互聯(lián)網(wǎng)的發(fā)展,上網(wǎng)的用戶和應(yīng)用的數(shù)量也隨之增長,這樣,如果不采取某種措施來協(xié)調(diào)資源的使用,那么擁塞的發(fā)生就是必然的。
擁塞控制是一件比較困難的事情:
目前互聯(lián)網(wǎng)采用的是報文交換(packet-switched)網(wǎng)絡(luò),文交換網(wǎng)絡(luò)使得整個網(wǎng)絡(luò)變?yōu)榉植际降?#xff0c;在網(wǎng)絡(luò)中間沒有連接的概念,造成了每個節(jié)點(diǎn)所獲得的信息不是很完整,而不完整的信息要完成比較好的擁塞控制,那是非常困難的。并且互聯(lián)網(wǎng)上各處的網(wǎng)絡(luò)性能有很大的差異,因此控制算法還必須要有很好的適應(yīng)性才行。
用塞控制算法歷史:
1)TCP的擁塞控制由“慢啟動(Slow start)”和“擁塞避免(Congestion avoidance)”組成。
2)又針對性的加入了“快速重傳(Fast retransmit)”、“快速恢復(fù)(Fast Recovery)”算法。
3)又出現(xiàn)了選擇性應(yīng)答( selective acknowledgement,SACK)算法等。
慢啟動:最初的TCP在連接建立成功后會向網(wǎng)絡(luò)中發(fā)送大量的數(shù)據(jù)包,這樣很容易導(dǎo)致網(wǎng)絡(luò)中路由器緩存空間耗盡,從而發(fā)生擁塞。因此新建立的連接不能夠一開始就大量發(fā)送數(shù)據(jù)包,而只能根據(jù)網(wǎng)絡(luò)情況逐步增加每次發(fā)送的數(shù)據(jù)量,以避免上述現(xiàn)象的發(fā)生。具體來說,當(dāng)新建連接時,cwnd初始化為1個最大報文段(MSS)大小,發(fā)送端開始按照擁塞窗口大小發(fā)送數(shù)據(jù),每當(dāng)有一個報文段被確認(rèn),cwnd就增加1個MSS大小。這樣cwnd的值就隨著網(wǎng)絡(luò)往返時間(Round Trip Time,RTT)呈指數(shù)級增長,事實(shí)上,慢啟動的速度一點(diǎn)也不慢,只是它的起點(diǎn)比較低一點(diǎn)而已。我們可以簡單計(jì)算下:
開始 ---> cwnd = 1經(jīng)過1個RTT后 ---> cwnd = 2*1 = 2經(jīng)過2個RTT后 ---> cwnd = 2*2= 4經(jīng)過3個RTT后 ---> cwnd = 4*2 = 8 ? 如果帶寬為W,那么經(jīng)過RTT*log2W時間就可以占滿帶寬。?
?擁塞避免:從慢啟動可以看到,cwnd可以很快的增長上來,從而最大程度利用網(wǎng)絡(luò)帶寬資源,但是cwnd不能一直這樣無限增長下去,一定需要某個限制。TCP使用了一個叫慢啟動門限(ssthresh)的變量,當(dāng)cwnd超過該值后,慢啟動過程結(jié)束,進(jìn)入擁塞避免階段。對于大多數(shù)TCP實(shí)現(xiàn)來說,ssthresh的值是65536(同樣以字節(jié)計(jì)算)。擁塞避免的主要思想是加法增大,也就是cwnd的值不再指數(shù)級往上升,開始加法增加。此時當(dāng)窗口中所有的報文段都被確認(rèn)時,cwnd的大小加1,cwnd的值就隨著RTT開始線性增加,這樣就可以避免增長過快導(dǎo)致網(wǎng)絡(luò)擁塞,慢慢的增加調(diào)整到網(wǎng)絡(luò)的最佳值。
上面討論的兩個機(jī)制都是沒有檢測到擁塞的情況下的行為,那么當(dāng)發(fā)現(xiàn)擁塞了cwnd又該怎樣去調(diào)整呢?
首先來看TCP是如何確定網(wǎng)絡(luò)進(jìn)入了擁塞狀態(tài)的,TCP認(rèn)為網(wǎng)絡(luò)擁塞的主要依據(jù)是它重傳了一個報文段。上面提到過,TCP對每一個報文段都有一個定時器,稱為重傳定時器(RTO),當(dāng)RTO超時且還沒有得到數(shù)據(jù)確認(rèn),那么TCP就會對該報文段進(jìn)行重傳,當(dāng)發(fā)生超時時,那么出現(xiàn)擁塞的可能性就很大,某個報文段可能在網(wǎng)絡(luò)中某處丟失,并且后續(xù)的報文段也沒有了消息,在這種情況下,TCP反應(yīng)比較“強(qiáng)烈”:
1.把ssthresh降低為cwnd值的一半2.把cwnd重新設(shè)置為13.重新進(jìn)入慢啟動過程。快速重傳機(jī)制:
其實(shí)TCP還有一種情況會進(jìn)行重傳:那就是收到3個相同的ACK。TCP在收到亂序到達(dá)包時就會立即發(fā)送ACK,TCP利用3個相同的ACK來判定數(shù)據(jù)包的丟失(相同的ACK證明對方?jīng)]收到你后續(xù)發(fā)過去的包,所以對方重復(fù)發(fā)送ack),此時進(jìn)行快速重傳,快速重傳做的事情有:
1.把ssthresh設(shè)置為cwnd的一半2.把cwnd再設(shè)置為ssthresh的值(具體實(shí)現(xiàn)有些為ssthresh+3)3.重新進(jìn)入擁塞避免階段。后來的“快速恢復(fù)”算法是在上述的“快速重傳”算法后添加的,當(dāng)收到3個重復(fù)ACK時,TCP最后進(jìn)入的不是擁塞避免階段,而是快速恢復(fù)階段。快速重傳和快速恢復(fù)算法一般同時使用。
1.當(dāng)收到3個重復(fù)ACK時,把ssthresh設(shè)置為cwnd的一半,把cwnd設(shè)置為ssthresh的值加3,然后重傳丟失的報文段,加3的原因是因?yàn)槭盏?個重復(fù)的ACK,表明有3個“老”的數(shù)據(jù)包離開了網(wǎng)絡(luò)。 2.再收到重復(fù)的ACK時,擁塞窗口增加1。3.當(dāng)收到新的數(shù)據(jù)包的ACK時,把cwnd設(shè)置為第一步中的ssthresh的值。原因是因?yàn)樵揂CK確認(rèn)了新的數(shù)據(jù),說明從重復(fù)ACK時的數(shù)據(jù)都已收到,該恢復(fù)過程已經(jīng)結(jié)束,可以回到恢復(fù)之前的狀態(tài)了,也即再次進(jìn)入擁塞避免狀態(tài)。參考:http://www.cnblogs.com/fll/category/136411.html
轉(zhuǎn)載于:https://www.cnblogs.com/menghuizuotian/p/3757911.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
- 上一篇: 图文详解远程部署ASP.NET MVC
- 下一篇: Js时间刷新