TCP的拥塞控制--慢启动,拥塞避免,快重传,快速恢复
擁塞現(xiàn)象是指到達(dá)通信子網(wǎng)中某一部分的分組數(shù)量過多,使得該部分網(wǎng)絡(luò)來不及處理,以致引起這部分乃至整個(gè)網(wǎng)絡(luò)性能下降的現(xiàn)象,嚴(yán)重時(shí)甚至?xí)?dǎo)致網(wǎng)絡(luò)通信業(yè)務(wù)陷入停頓,即出現(xiàn)死鎖現(xiàn)象。這種現(xiàn)象跟公路網(wǎng)中經(jīng)常所見的交通擁擠一樣,當(dāng)節(jié)假日公路網(wǎng)中車輛大量增加時(shí),各種走向的車流相互干擾,使每輛車到達(dá)目的地的時(shí)間都相對(duì)增加(即延遲增加),甚至有時(shí)在某段公路上車輛因堵塞而無法開動(dòng)(即發(fā)生局部死鎖)。 — 摘自百度百科
端到端TCP擁塞控制的本質(zhì)思想是通過調(diào)整發(fā)送端的發(fā)送速率來控制網(wǎng)絡(luò)的負(fù)荷量。具體地說,TCP不斷地通過加大發(fā)送的速率來對(duì)當(dāng)前網(wǎng)絡(luò)的實(shí)際承載能力進(jìn)行探測(cè),根據(jù)超時(shí)或者丟包等現(xiàn)象判斷當(dāng)前網(wǎng)絡(luò)是否已經(jīng)"超負(fù)荷“,然后迅速減小向網(wǎng)絡(luò)中發(fā)送信息的速率,并在新的起點(diǎn)上繼續(xù)對(duì)網(wǎng)絡(luò)進(jìn)行試探。從而達(dá)到控制網(wǎng)絡(luò)請(qǐng)求的目的,避免出現(xiàn)大規(guī)模的擁塞以致導(dǎo)致網(wǎng)絡(luò)不可用
早期的TCP協(xié)議只有基于窗口的流量控制(flow control)機(jī)制而沒有考慮到可能由于網(wǎng)絡(luò)自己的傳輸能力不足,而導(dǎo)致整個(gè)網(wǎng)絡(luò)發(fā)生崩潰(影響網(wǎng)絡(luò)的因素實(shí)在太多了,傳輸過程中有很多不可預(yù)見的問題)。
1988年V.Jacobson在論文中提出了由“慢啟動(dòng)(Slow Start)”和“擁塞避免(Congestion Avoidance)”組成的TCP的網(wǎng)絡(luò)擁塞控制。在20多年的發(fā)展過程中,后人在此算法基礎(chǔ)上又進(jìn)行了多次的改進(jìn)和優(yōu)化
與擁塞控制相關(guān)的有四個(gè)比較重要的版本:TCP Tahoe、TCP Reno、TCP NewReno和TCP SACK。
TCP Tahoe是早期的TCP版本,它包括了3個(gè)最基本的算法-“慢啟動(dòng)”、“擁塞避免”和“快速重傳(Fast Retransmit)”。TCP Reno則在TCP Tahoe基礎(chǔ)上增加了“快速恢復(fù)(Fast Recovery)”算法,針對(duì)快速重傳作出特殊處理,避免了網(wǎng)絡(luò)擁塞不嚴(yán)重時(shí)采用“慢啟動(dòng)”算法而導(dǎo)致過度減小發(fā)送窗口大小的問題。
TCP NewReno的主要改進(jìn)在于一個(gè)窗口內(nèi)多個(gè)報(bào)文段丟失的問題。這樣可以避免TCP Reno中的多次重傳超時(shí)。另外,TCP NewReno算法在快速恢復(fù)中引入了部分確認(rèn)(Partial ACK)。它在快速恢復(fù)階段到達(dá)并且確認(rèn)新數(shù)據(jù),但它只確認(rèn)進(jìn)入快速重傳之前發(fā)送的一部分?jǐn)?shù)據(jù)。
TCP SACK(Selective Acknowledgement)也是對(duì)TCP Reno的改進(jìn),當(dāng)檢測(cè)到擁塞后,不必重傳從數(shù)據(jù)丟失到檢測(cè)到丟失這段時(shí)間發(fā)送端發(fā)送的所有報(bào)文段,而是對(duì)這些報(bào)文段進(jìn)行有選擇的確認(rèn)和重傳,避免不必要的重傳。
基于丟包/超時(shí)的擁塞控制
這種算法就是在發(fā)送方維護(hù)一個(gè)擁塞窗口(cwnd),大小等于發(fā)送窗口,如果發(fā)送方?jīng)]有在規(guī)定的時(shí)間間隔內(nèi)收到接收方的應(yīng)答,則就可以認(rèn)為出現(xiàn)了網(wǎng)絡(luò)擁塞。
Slow Start 慢開始算法
所謂慢啟動(dòng),也就是在建立好連接的時(shí)候,先從較低的發(fā)送速率開始,一點(diǎn)點(diǎn)提速,試探一下網(wǎng)絡(luò)的承受能力,由于一開始的速率較低,所以提升速度可以快一點(diǎn)
慢啟動(dòng)算法:
(1) 連接建立后先初始化擁塞窗口cwnd,其大小為1MSS( Maximum Segment Size 最大報(bào)文段長(zhǎng)度)
(2) 客戶端收到服務(wù)端的ack后.就會(huì)將cwnd大小*2, 呈指數(shù)上升
(3) 當(dāng)cwnd 達(dá)到慢開始門限 (ssthresh, slow start threshold)時(shí),停止慢開始算法,進(jìn)入“擁塞避免算法”
Congestion Avoidance 擁塞避免算法
擁塞避免算法思路是將增長(zhǎng)速率變?yōu)榫€性增長(zhǎng),也就是每經(jīng)過一個(gè)往返RTT時(shí)間就把發(fā)送方的cwnd加1
過了慢開始門限后,擁塞避免算法可以避免窗口增長(zhǎng)速度過快導(dǎo)致窗口擁塞,采用緩慢增加的方式調(diào)整到網(wǎng)絡(luò)的最佳值。
簡(jiǎn)單來說:
- 當(dāng)cwnd < ssthresh ,使用慢開始算法;
- 當(dāng)cwnd = ssthresh,可以使用慢開始算法,也可以使用擁塞算法;
- 當(dāng)cwnd > ssthresh,使用擁塞算法;
通過上述兩個(gè)算法可以使得網(wǎng)絡(luò)傳輸速率一直增大,直到出現(xiàn)超時(shí),這時(shí)候需要將cwnd重新調(diào)整到1 MSS開始,使用慢開始算法,同時(shí)將慢開始門限ssthresh調(diào)整為cwnd超時(shí)點(diǎn)的一半 ,然后繼續(xù)執(zhí)行慢開始、擁塞避免算法。
Fast retransmit 快重傳算法 和 Fast Recovery 快速恢復(fù)算法
TCP擁塞控制默認(rèn)認(rèn)為網(wǎng)絡(luò)丟包是由于網(wǎng)絡(luò)擁塞導(dǎo)致的,所以一般的TCP擁塞控制算法以丟包來判斷網(wǎng)絡(luò)是否進(jìn)入擁塞狀態(tài)。對(duì)于丟包有兩種判定方式,一種是超時(shí)重傳RTO[Retransmission Timeout],另一個(gè)是收到三個(gè)重復(fù)確認(rèn)ACK(因?yàn)門CP一旦超時(shí)就會(huì)重新發(fā)送數(shù)據(jù)包)。
重傳定時(shí)器 :
判斷報(bào)文段丟失的依據(jù),發(fā)送端發(fā)送一個(gè)報(bào)文段同時(shí)啟動(dòng)重傳定時(shí)器,如果重傳定時(shí)器超時(shí),但發(fā)送端還沒有收到接收端的ACK,就判斷該報(bào)文段丟失,重傳丟失報(bào)文段并重新啟動(dòng)重傳定時(shí)器。
TCP采用動(dòng)態(tài)重傳超時(shí)估計(jì),即以往返時(shí)間RTT為基礎(chǔ)來確定重傳超時(shí)時(shí)間。其中最常用的是設(shè)置重傳超時(shí)時(shí)間為往返時(shí)間RTT的兩倍,即重傳超時(shí)時(shí)間= 2* RTT
Tahoe算法的不足之處在于,收到3個(gè)重復(fù)ACK或在超時(shí)的情況下,Tahoe設(shè)置cwnd為1,然后進(jìn)入慢啟動(dòng)階段,大大降低了網(wǎng)絡(luò)的利用率。
而Reno算法針對(duì)上述問題進(jìn)行了改進(jìn):
1)對(duì)于收到連續(xù)3個(gè)重復(fù)的ACK確認(rèn),算法不經(jīng)過慢啟動(dòng)階段,而直接進(jìn)入擁塞避免階段;
2)增加了快速重傳和快速恢復(fù)機(jī)制
所謂的快速重傳就是說如果發(fā)送方接收到3個(gè)以上的重復(fù)ACK,TCP就認(rèn)為發(fā)生了網(wǎng)絡(luò)擁塞(有報(bào)文丟失),需要重傳。此時(shí)不需要等到重傳定時(shí)器超時(shí),所以稱之為快速重傳,而在快速重傳后沒有使用慢啟動(dòng)算法,而是直接進(jìn)入擁塞避免算法(將慢開始門限值(ssthresh)和cwnd 調(diào)整為此時(shí)cwnd的一半),所以這又叫做快速恢復(fù)算法。
其他擁塞控制算法
除了上述基于超時(shí)/丟包的擁塞控制,TCP還有很多不同維度的擁塞控制算法
比如:
基于丟包的擁塞控制:將丟包視為出現(xiàn)擁塞,采取緩慢探測(cè)的方式,逐漸增大擁塞窗口,當(dāng)出現(xiàn)丟包時(shí),將擁塞窗口減小,如Reno、Cubic等。
基于時(shí)延的擁塞控制:將時(shí)延增加視為出現(xiàn)擁塞,延時(shí)增加時(shí)增大擁塞窗口,延時(shí)減小時(shí)減小擁塞窗口,如Vegas、FastTCP等。
基于鏈路容量的擁塞控制:實(shí)時(shí)測(cè)量網(wǎng)絡(luò)帶寬和時(shí)延,認(rèn)為網(wǎng)絡(luò)上報(bào)文總量大于帶寬時(shí)延乘積時(shí)出現(xiàn)了擁塞,如BBR。
基于學(xué)習(xí)的擁塞控制:沒有特定的擁塞信號(hào),而是借助評(píng)價(jià)函數(shù),基于訓(xùn)練數(shù)據(jù),使用機(jī)器學(xué)習(xí)的方法形成一個(gè)控制策略,如Remy。
總結(jié)
以上是生活随笔為你收集整理的TCP的拥塞控制--慢启动,拥塞避免,快重传,快速恢复的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QUIC学习笔记之 如何做到0RTT加密
- 下一篇: QUIC报文格式详解