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