TCP滑动窗口和拥塞控制机制
滑動(dòng)窗口協(xié)議
滑動(dòng)窗口協(xié)議(Sliding Window Protocol)屬于TCP協(xié)議的一種應(yīng)用,用于網(wǎng)絡(luò)數(shù)據(jù)傳輸時(shí)的流量控制,以避免擁塞的發(fā)生。該協(xié)議允許發(fā)送方在停止并等待確認(rèn)前發(fā)送多個(gè)數(shù)據(jù)分組。由于發(fā)送方不必每發(fā)一個(gè)分組就停下來(lái)等待確認(rèn),因此該協(xié)議可以加速數(shù)據(jù)的傳輸,提高網(wǎng)絡(luò)吞吐量。
TCP通過(guò)滑動(dòng)窗口來(lái)進(jìn)行流量控制。設(shè)想在發(fā)送端發(fā)送數(shù)據(jù)的速度很快而接收端接收速度卻很慢的情況下,為了保證數(shù)據(jù)不丟失,顯然需要進(jìn)行流量控制, 協(xié)調(diào)好通信雙方的工作節(jié)奏。所謂滑動(dòng)窗口,可以理解成接收端所能提供的緩沖區(qū)大小。TCP利用一個(gè)滑動(dòng)的窗口來(lái)告訴發(fā)送端對(duì)它所發(fā)送的數(shù)據(jù)能提供多大的緩沖區(qū)。由于窗口由16位bit所定義,所以接收端TCP 能最大提供65535個(gè)字節(jié)的緩沖。由此,可以利用窗口大小和第一個(gè)數(shù)據(jù)的序列號(hào)計(jì)算出最大可接收的數(shù)據(jù)序列號(hào)。?
滑動(dòng)窗口本質(zhì)上是描述接受方的TCP數(shù)據(jù)報(bào)緩沖區(qū)大小的數(shù)據(jù),發(fā)送方根據(jù)這個(gè)數(shù)據(jù)來(lái)計(jì)算自己最多能發(fā)送多長(zhǎng)的數(shù)據(jù)。如果發(fā)送方收到接受方的窗口大小為0的TCP數(shù)據(jù)報(bào),那么發(fā)送方將停止發(fā)送數(shù)據(jù),等到接受方發(fā)送窗口大小不為0的數(shù)據(jù)報(bào)的到來(lái)。?
? ? ? ?窗口合攏:當(dāng)窗口從左邊向右邊靠近的時(shí)候,這種現(xiàn)象發(fā)生在數(shù)據(jù)被發(fā)送和確認(rèn)的時(shí)候。 ??
? ? ? ?窗口張開(kāi):當(dāng)窗口的右邊沿向右邊移動(dòng)的時(shí)候,這種現(xiàn)象發(fā)生在接受端處理了數(shù)據(jù)以后。 ??
? ? ? ?窗口收縮:當(dāng)窗口的右邊沿向左邊移動(dòng)的時(shí)候,這種現(xiàn)象不常發(fā)生。 ??
? ? ? ?TCP就是用這個(gè)窗口,慢慢的從數(shù)據(jù)的左邊移動(dòng)到右邊,把處于窗口范圍內(nèi)的數(shù)據(jù)發(fā)送出去(但不用發(fā)送所有,只是處于窗口內(nèi)的數(shù)據(jù)可以發(fā)送。)。這就是窗口的意義。窗口的大小是可以通過(guò)socket來(lái)制定的,4096并不是最理想的窗口大小,而16384則可以使吞吐量大大的增加。
A————C————B
如上圖,A與B之間建立TCP連接,滑動(dòng)窗口實(shí)現(xiàn)有兩個(gè)作用:?
由于對(duì)稱性,只考慮A端發(fā)送窗口和B端接收窗口,有如下兩個(gè)作用?
1、B端來(lái)不及處理接收數(shù)據(jù)(控制不同速率主機(jī)間的同步),這時(shí),A通過(guò)B端通知的接收窗口而減緩數(shù)據(jù)的發(fā)送。??
2、B端來(lái)得及處理接收數(shù)據(jù),但是在A與B之間某處如C,使得AB之間的整體帶寬性能較差,此時(shí),A端根據(jù)擁塞處理策略(慢啟動(dòng),加倍遞減和緩慢增加)來(lái)更新窗口,以決定數(shù)據(jù)的發(fā)送。 ??
與固定大小的滑動(dòng)窗口協(xié)議相比,TCP采用可變大小的滑動(dòng)窗口協(xié)議是為了取得更好的性能。 ??
TCP是一個(gè)廣域網(wǎng)協(xié)議,而廣域網(wǎng)環(huán)境下的路由器和主機(jī),各自有著不同的性能和處理能力,在這種情況下,采用固定窗口大小的滑動(dòng)窗口協(xié)議會(huì)引起性能上的損失。TCP規(guī)定窗口的大小是由接收方通告的,通過(guò)采取慢啟動(dòng)和擁塞避免算法等機(jī)制來(lái)使帶寬和性能取得最佳。
1. “窗口”對(duì)應(yīng)的是一段可以被發(fā)送者發(fā)送的字節(jié)序列,其連續(xù)的范圍稱之為“窗口”;
2. “滑動(dòng)”則是指這段“允許發(fā)送的范圍”是可以隨著發(fā)送的過(guò)程而變化的,方式就是按順序“滑動(dòng)”。
TCP建立連接的初始,B會(huì)告訴A自己的接收窗口大小,比如為‘20’:字節(jié)31-50為發(fā)送窗口。
? ? ? ??
根據(jù)B給出窗口值,A構(gòu)造自己的窗口
A發(fā)送11個(gè)字節(jié)后,發(fā)送窗口位置不變,B接收到了亂序的數(shù)據(jù)分組:
? ? ? ?
A發(fā)了11個(gè)字節(jié)數(shù)據(jù)
只有當(dāng)A成功發(fā)送了數(shù)據(jù),即發(fā)送的數(shù)據(jù)得到了B的確認(rèn)之后,才會(huì)移動(dòng)滑動(dòng)窗口離開(kāi)已發(fā)送的數(shù)據(jù);同時(shí)B則確認(rèn)連續(xù)的數(shù)據(jù)分組,對(duì)于亂序的分組則先接收下來(lái),避免網(wǎng)絡(luò)重復(fù)傳遞:
? ? ? ??
A收到新的確認(rèn)號(hào),窗口向前滑動(dòng)
? ? ? ??
發(fā)送窗口內(nèi)的序號(hào)都屬于已發(fā)送但未被確認(rèn)
所謂流量控制,主要是接收方傳遞信息給發(fā)送方,使其不要發(fā)送數(shù)據(jù)太快,是一種端到端的控制。主要的方式就是返回的ACK中會(huì)包含自己的接收窗口的大小,并且利用大小來(lái)控制發(fā)送方的數(shù)據(jù)發(fā)送:
? ? ? ??
這里面涉及到一種情況,如果B已經(jīng)告訴A自己的緩沖區(qū)已滿,于是A停止發(fā)送數(shù)據(jù);等待一段時(shí)間后,B的緩沖區(qū)出現(xiàn)了富余,于是給A發(fā)送報(bào)文告訴A我的rwnd大小為400,但是這個(gè)報(bào)文不幸丟失了,于是就出現(xiàn)A等待B的通知||B等待A發(fā)送數(shù)據(jù)的死鎖狀態(tài)。為了處理這種問(wèn)題,TCP引入了持續(xù)計(jì)時(shí)器(Persistence timer),當(dāng)A收到對(duì)方的零窗口通知時(shí),就啟用該計(jì)時(shí)器,時(shí)間到則發(fā)送一個(gè)1字節(jié)的探測(cè)報(bào)文,對(duì)方會(huì)在此時(shí)回應(yīng)自身的接收窗口大小,如果結(jié)果仍未0,則重設(shè)持續(xù)計(jì)時(shí)器,繼續(xù)等待。
擁塞控制產(chǎn)生的原因
∑對(duì)資源的需求>可用資源
注意
單純的增加網(wǎng)絡(luò)資源無(wú)法解決問(wèn)題
例如:把結(jié)點(diǎn)的存儲(chǔ)空間擴(kuò)大,更換更高速率的鏈路,提高結(jié)點(diǎn)處理機(jī)的運(yùn)算速度,不僅不能解決問(wèn)題,而且可能使網(wǎng)絡(luò)性能更壞。
原因:網(wǎng)絡(luò)擁塞是許多因素引起的,單純的解決一個(gè)可能會(huì)使上述情況得到一些緩解,但是會(huì)把擁塞轉(zhuǎn)移到其他地方。
擴(kuò)大結(jié)點(diǎn)存儲(chǔ)空間——>由于輸出鏈路的容量和處理機(jī)的速度并未提高,增大排隊(duì)等待時(shí)間,超時(shí)重傳,浪費(fèi)資源。
更換更高速率的鏈路——>可能會(huì)緩解,,有可能造成各部分不匹配。
擁塞控制的作用
注意
擁塞控制與流量控制的區(qū)別
擁塞控制是防止過(guò)多的數(shù)據(jù)注入到網(wǎng)絡(luò)中,可以使網(wǎng)絡(luò)中的路由器或鏈路不致過(guò)載,是一個(gè)全局性的過(guò)程。
流量控制是點(diǎn)對(duì)點(diǎn)通信量的控制,是一個(gè)端到端的問(wèn)題,主要就是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率,以便接收端來(lái)得及接收。
擁塞的標(biāo)志
1.重傳計(jì)時(shí)器超時(shí)
2.接收到三個(gè)重復(fù)確認(rèn)
擁塞控制的機(jī)制
慢開(kāi)始與擁塞避免
慢開(kāi)始
1.慢開(kāi)始不是指cwnd的增長(zhǎng)速度慢(指數(shù)增長(zhǎng)),而是指TCP開(kāi)始發(fā)送設(shè)置cwnd=1。
2.思路:不要一開(kāi)始就發(fā)送大量的數(shù)據(jù),先探測(cè)一下網(wǎng)絡(luò)的擁塞程度,也就是說(shuō)由小到大逐漸增加擁塞窗口的大小。這里用報(bào)文段的個(gè)數(shù)的擁塞窗口大小舉例說(shuō)明慢開(kāi)始算法,實(shí)時(shí)擁塞窗口大小是以字節(jié)為單位的。如下圖:
3.為了防止cwnd增長(zhǎng)過(guò)大引起網(wǎng)絡(luò)擁塞,設(shè)置一個(gè)慢開(kāi)始門(mén)限(ssthresh狀態(tài)變量)
當(dāng)cnwd<ssthresh,使用慢開(kāi)始算法
當(dāng)cnwd=ssthresh,既可使用慢開(kāi)始算法,也可以使用擁塞避免算法
當(dāng)cnwd>ssthresh,使用擁塞避免算法
擁塞避免(按線性規(guī)律增長(zhǎng))
1.擁塞避免并非完全能夠避免擁塞,是說(shuō)在擁塞避免階段將擁塞窗口控制為按線性規(guī)律增長(zhǎng),使網(wǎng)絡(luò)比較不容易出現(xiàn)擁塞。
2.思路:讓擁塞窗口cwnd緩慢地增大,即每經(jīng)過(guò)一個(gè)往返時(shí)間RTT就把發(fā)送方的擁塞控制窗口加一。
無(wú)論是在慢開(kāi)始階段還是在擁塞避免階段,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞(其根據(jù)就是沒(méi)有收到確認(rèn),雖然沒(méi)有收到確認(rèn)可能是其他原因的分組丟失,但是因?yàn)闊o(wú)法判定,所以都當(dāng)做擁塞來(lái)處理),就把慢開(kāi)始門(mén)限設(shè)置為出現(xiàn)擁塞時(shí)的發(fā)送窗口大小的一半。然后把擁塞窗口設(shè)置為1,執(zhí)行慢開(kāi)始算法。
加法增大與乘法減小
乘法減小:無(wú)論是慢開(kāi)始階段還是擁塞避免,只要出現(xiàn)了網(wǎng)絡(luò)擁塞(超時(shí)),就把慢開(kāi)始門(mén)限值ssthresh減半
加法增大:執(zhí)行擁塞避免算法后,擁塞窗口線性緩慢增大,防止網(wǎng)絡(luò)過(guò)早出現(xiàn)擁塞
快重傳與快恢復(fù)
快重傳
1.快重傳要求接收方在收到一個(gè)失序的報(bào)文段后就立即發(fā)出重復(fù)確認(rèn)(為的是使發(fā)送方及早知道有報(bào)文段沒(méi)有到達(dá)對(duì)方)而不要等到自己發(fā)送數(shù)據(jù)時(shí)捎帶確認(rèn)。快重傳算法規(guī)定,發(fā)送方只要一連收到三個(gè)重復(fù)確認(rèn)就應(yīng)當(dāng)立即重傳對(duì)方尚未收到的報(bào)文段,而不必繼續(xù)等待設(shè)置的重傳計(jì)時(shí)器時(shí)間到期。
2.由于不需要等待設(shè)置的重傳計(jì)時(shí)器到期,能盡早重傳未被確認(rèn)的報(bào)文段,能提高整個(gè)網(wǎng)絡(luò)的吞吐量。
快恢復(fù)(與快重傳配合使用)
1.采用快恢復(fù)算法時(shí),慢開(kāi)始只在TCP連接建立時(shí)和網(wǎng)絡(luò)出現(xiàn)超時(shí)時(shí)才使用。
2.當(dāng)發(fā)送方連續(xù)收到三個(gè)重復(fù)確認(rèn)時(shí),就執(zhí)行“乘法減小”算法,把ssthresh門(mén)限減半。但是接下去并不執(zhí)行慢開(kāi)始算法。
3.考慮到如果網(wǎng)絡(luò)出現(xiàn)擁塞的話就不會(huì)收到好幾個(gè)重復(fù)的確認(rèn),所以發(fā)送方現(xiàn)在認(rèn)為網(wǎng)絡(luò)可能沒(méi)有出現(xiàn)擁塞。所以此時(shí)不執(zhí)行慢開(kāi)始算法,而是將cwnd設(shè)置為ssthresh的大小,然后執(zhí)行擁塞避免算法。
注意
發(fā)送方窗口的上限值=Min(接受窗口rwnd,擁塞窗口cwnd)
rwnd>cwnd 接收方的接收能力限制發(fā)送方窗口的最大值
rwnd<cwnd 網(wǎng)絡(luò)的擁塞限制發(fā)送方窗口的最大值
?
騰訊面試題
TCP的擁塞控制機(jī)制是什么?請(qǐng)簡(jiǎn)單說(shuō)說(shuō)。
答:我們知道TCP通過(guò)一個(gè)定時(shí)器(timer)采樣了RTT并計(jì)算RTO,但是,如果網(wǎng)絡(luò)上的延時(shí)突然增加,
那么,TCP對(duì)這個(gè)事做出的應(yīng)對(duì)只有重傳數(shù)據(jù),然而重傳會(huì)導(dǎo)致網(wǎng)絡(luò)的負(fù)擔(dān)更重,于是會(huì)導(dǎo)致更大的延遲以及更多的丟包,這就導(dǎo)致了惡性循環(huán),最終形成“網(wǎng)絡(luò)風(fēng)暴” —— TCP的擁塞控制機(jī)制就是用于應(yīng)對(duì)這種情況。
首先需要了解一個(gè)概念,為了在發(fā)送端調(diào)節(jié)所要發(fā)送的數(shù)據(jù)量,定義了一個(gè)“擁塞窗口”(Congestion Window),在發(fā)送數(shù)據(jù)時(shí),將擁塞窗口的大小與接收端ack的窗口大小做比較,取較小者作為發(fā)送數(shù)據(jù)量的上限。
擁塞控制主要是四個(gè)算法:
一.慢開(kāi)始:
意思是剛剛加入網(wǎng)絡(luò)的連接,一點(diǎn)一點(diǎn)地提速,不要一上來(lái)就把路占滿。
1.慢開(kāi)始不是指cwnd的增長(zhǎng)速度慢(指數(shù)增長(zhǎng)),而是指TCP開(kāi)始發(fā)送設(shè)置cwnd=1。
2.思路:不要一開(kāi)始就發(fā)送大量的數(shù)據(jù),先探測(cè)一下網(wǎng)絡(luò)的擁塞程度,也就是說(shuō)由小到大逐漸增加擁塞窗口的大小。
3.為了防止cwnd增長(zhǎng)過(guò)大引起網(wǎng)絡(luò)擁塞,設(shè)置一個(gè)慢開(kāi)始門(mén)限(ssthresh狀態(tài)變量)
當(dāng)cnwd<ssthresh,使用慢開(kāi)始算法
當(dāng)cnwd=ssthresh,既可使用慢開(kāi)始算法,也可以使用擁塞避免算法
當(dāng)cnwd>ssthresh,使用擁塞避免算法
二.擁塞避免:
當(dāng)擁塞窗口 cwnd 達(dá)到一個(gè)閾值時(shí),窗口大小不再呈指數(shù)上升,而是以線性上升,避免增長(zhǎng)過(guò)快導(dǎo)致網(wǎng)絡(luò)擁塞。
每當(dāng)收到一個(gè)ACK,發(fā)送方的cwnd = cwnd + 1/cwnd
每當(dāng)過(guò)了一個(gè)RTT,發(fā)送方的cwnd = cwnd + 1
擁塞發(fā)生:當(dāng)發(fā)生丟包進(jìn)行數(shù)據(jù)包重傳時(shí),表示網(wǎng)絡(luò)已經(jīng)擁塞。分兩種情況進(jìn)行處理:
等到RTO超時(shí),重傳數(shù)據(jù)包(沒(méi)有收到三個(gè)重復(fù)確認(rèn))
慢開(kāi)始門(mén)限sshthresh = cwnd /2
cwnd 重置為 1,執(zhí)行慢開(kāi)始算法
三.進(jìn)入慢啟動(dòng)過(guò)程
在收到三個(gè)重復(fù)確認(rèn)(duplicate ACK)時(shí)就開(kāi)啟重傳,而不用等到RTO超時(shí)
sshthresh = cwnd = cwnd /2
進(jìn)入快速恢復(fù)算法——Fast Recovery
四.快速恢復(fù):至少收到了三個(gè)重復(fù)確認(rèn)(duplicate ACK),說(shuō)明網(wǎng)絡(luò)也不那么糟糕,可以快速恢復(fù)。
cwnd = sshthresh + 3 * MSS (3的意思是確認(rèn)有3個(gè)數(shù)據(jù)包被收到了)
重傳duplicate ACK指定的數(shù)據(jù)包
如果再收到duplicate ACK,那么cwnd = cwnd +1
如果收到了新的Ack,那么,cwnd = sshthresh ,然后就進(jìn)入了擁塞避免的算法了。
RTT和RTO概念(參考:https://blog.csdn.net/yizhiniu_xuyw/article/details/109643610)
TCP作為一個(gè)面向連接的、可靠的傳輸協(xié)議,內(nèi)部實(shí)現(xiàn)了一個(gè)重傳計(jì)時(shí)器來(lái)保證數(shù)據(jù)能傳輸?shù)綄?duì)方。每發(fā)送一個(gè)數(shù)據(jù)包,就給這個(gè)數(shù)據(jù)設(shè)置一個(gè)重傳計(jì)時(shí)器。如果在計(jì)時(shí)器超時(shí)之前收到了針對(duì)這個(gè)數(shù)據(jù)包的ack,就取消這個(gè)計(jì)時(shí)器。如果沒(méi)有收到,則開(kāi)始發(fā)起重傳。計(jì)時(shí)器超時(shí)的時(shí)間被稱為RTO,這個(gè)時(shí)間的確定取決于RTT。
關(guān)于兩者詳細(xì)的解釋:
- RTT(Round Trip Time):一個(gè)連接的往返時(shí)間,即數(shù)據(jù)發(fā)送時(shí)刻到接收到確認(rèn)的時(shí)刻的差值;
- RTO(Retransmission Time Out):重傳超時(shí)時(shí)間,即從數(shù)據(jù)發(fā)送時(shí)刻算起,超過(guò)這個(gè)時(shí)間便執(zhí)行重傳。
總結(jié)
以上是生活随笔為你收集整理的TCP滑动窗口和拥塞控制机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: TCP三次握手详解及释放连接过程
- 下一篇: TCP中的RTT和RTO