网络:TCP停止等待、超时重传、滑动窗口、拥塞控制、快重传和快恢复
TCP超時與重傳機(jī)制?
?
TCP協(xié)議是一種面向連接的可靠的傳輸層協(xié)議,它保證了數(shù)據(jù)的可靠傳輸,對于一些出錯,超時丟包等問題TCP設(shè)計的超時與重傳機(jī)制。其基本原理:在發(fā)送一個數(shù)據(jù)之后,就開啟一個定時器,若是在這個時間內(nèi)沒有收到發(fā)送數(shù)據(jù)的ACK確認(rèn)報文,則對該報文進(jìn)行重傳,在達(dá)到一定次數(shù)還沒有成功時放棄并發(fā)送一個復(fù)位信號。?
這里比較重要的是重傳超時時間,怎樣設(shè)置這個定時器的時間(RTO),從而保證對網(wǎng)絡(luò)資源最小的浪費(fèi)。因為若RTO太小,可能有些報文只是遇到擁堵或網(wǎng)絡(luò)不好延遲較大而已,這樣就會造成不必要的重傳。太大的話,使發(fā)送端需要等待過長的時間才能發(fā)現(xiàn)數(shù)據(jù)丟失,影響網(wǎng)絡(luò)傳輸效率。?
由于不同的網(wǎng)絡(luò)情況不一樣,不可能設(shè)置一樣的RTO,實際中RTO是根據(jù)網(wǎng)絡(luò)中的RTT(傳輸往返時間)來自適應(yīng)調(diào)整的。具體關(guān)系參考相關(guān)算法。?
RTO根據(jù)RTT來調(diào)整
通過圖來了解重傳機(jī)制:?
從圖可以知道,發(fā)送方連續(xù)發(fā)送3個數(shù)據(jù)包,其中第二個丟失,沒有被接收到,因此不會返回對應(yīng)的ACK,每發(fā)送一個數(shù)據(jù)包,就啟動一個定時器,當(dāng)?shù)诙€包的定時器溢出了還沒有收到ack,這時就進(jìn)行重傳。
TCP慢啟動
慢啟動是TCP的一個擁塞控制機(jī)制,慢啟動算法的基本思想是當(dāng)TCP開始在一個網(wǎng)絡(luò)中傳輸數(shù)據(jù)或發(fā)現(xiàn)數(shù)據(jù)丟失并開始重發(fā)時,首先慢慢的對網(wǎng)路實際容量進(jìn)行試探,避免由于發(fā)送了過量的數(shù)據(jù)而導(dǎo)致阻塞。?
慢啟動為發(fā)送方的TCP增加了另一個窗口:擁塞窗口(congestion window),記為cwnd。當(dāng)與另一個網(wǎng)絡(luò)的主機(jī)建立TCP連接時,擁塞窗口被初始化為 1個報文段(即另一端通告的報文段大小)。每收到一個ACK,擁塞窗口就增加一個報文段(cwnd以字節(jié)為單位,但是慢啟動以報文段大小為單位進(jìn)行增加)。發(fā)送方取擁塞窗口與通告窗口中的最小值作為發(fā)送上限。
擁塞窗口是發(fā)送方使用的流量控制,而通告窗口則是接收方使用的流量控制。
發(fā)送方開始時發(fā)送一個報文段,然后等待 ACK。當(dāng)收到該ACK時,擁塞窗口從1增加為2,即可以發(fā)送兩個報文段。當(dāng)收到這兩個報文段的 A C K時,擁塞窗口就增加為4。這是一種指數(shù)增加的關(guān)系。
擁塞避免算法
網(wǎng)絡(luò)中擁塞的發(fā)生會導(dǎo)致數(shù)據(jù)分組丟失,需要盡量避免。在實際中,擁塞算法與慢啟動通常在一起實現(xiàn),其基本過程:?
1. 對一個給定的連接,初始化cwnd為1個報文段,ssthresh為65535個字節(jié)。?
2. TCP輸出例程的輸出不能超過cwnd和接收方通告窗口的大小。
擁塞避免是發(fā)送方使用的流量控制,而通告窗口則是接收方進(jìn)行的流量控制。前者是發(fā)送方感受到的網(wǎng)絡(luò)擁塞的估計,而后者則與接收方在該連接上的可用緩存大小有關(guān)。?
3. 當(dāng)擁塞發(fā)生時(超時或收到重復(fù)確認(rèn)(丟包)),ssthresh被設(shè)置為當(dāng)前窗口大小的一半(cwnd 和接收方通告窗口大小的最小值,最少為2個報文段)。此外,如果是超時引起了擁塞,則 cwnd被設(shè)置為1個報文段(這就是慢啟動)。?
4.當(dāng)新的數(shù)據(jù)被對方確認(rèn)時,就增加cwnd,但增加的方法依賴于是否正在進(jìn)行慢啟動或擁塞避免。
如果cwnd小于或等于ssthresh,則正在進(jìn)行慢啟動,否則正在進(jìn)行擁塞避免。
慢啟動一直持續(xù)到回到當(dāng)擁塞發(fā)生時所處位置的半數(shù)(ssthread)才停止(因為記錄了在步驟2 中制造麻煩的窗口大小的一半),然后轉(zhuǎn)為執(zhí)行擁塞避免。?
?慢啟動算法初始設(shè)置cwnd為1個報文段,此后每收到一個確認(rèn)就加 1。那樣,這會使窗口按指數(shù)方式增長:發(fā)送 1個報文段,然后是2個,接著是4個……。
?
?
?
在該圖中,假定當(dāng)cwnd為32個報文段時就會發(fā)生擁塞。于是設(shè)置 ssthresh為16個報文段,而cwnd為1個報文段。在時刻 0發(fā)送了一個報文段,并假定在時刻 1接收到它的ACK,此時cwnd增加為2。接著發(fā)送了2個報文段,并假定在時刻 2接收到它們的ACK,于是cwnd增加為4(對每個ACK增加1次)。這種指數(shù)增加算法一直進(jìn)行到在時刻3和4之間收到8個ACK后cwnd等于ssthresh時才停止指數(shù)增長,
從該時刻起,cwnd以線性方式增加,在每個往返時間內(nèi)最多增加 1個報文段。
再熟悉一次:
TCP超時重傳
原理是在發(fā)送某一個數(shù)據(jù)以后就開啟一個計時器,在一定時間內(nèi)如果沒有得到發(fā)送的數(shù)據(jù)報的ACK報文,那么就重新發(fā)送數(shù)據(jù),直到發(fā)送成功為止。?
影響超時重傳機(jī)制協(xié)議效率的一個關(guān)鍵參數(shù)是重傳超時時間(RTO,Retransmission TimeOut)。RTO的值被設(shè)置過大過小都會對協(xié)議造成不利影響。?
(1)RTO設(shè)長了,重發(fā)就慢,沒有效率,性能差。?
(2)RTO設(shè)短了,重發(fā)的就快,會增加網(wǎng)絡(luò)擁塞,導(dǎo)致更多的超時,更多的超時導(dǎo)致更多的重發(fā)。?
連接往返時間(RTT,Round Trip Time),指發(fā)送端從發(fā)送TCP包開始到接收它的立即響應(yīng)所消耗的時間。
TCP滑動窗口(接收方)
作用:(1)提供TCP的可靠性;(2)提供TCP的流控特性?
?
TCP的滑動窗口的可靠性也是建立在“確認(rèn)重傳”基礎(chǔ)上的。?
發(fā)送窗口只有收到對端對于本段發(fā)送窗口內(nèi)字節(jié)的ACK確認(rèn),才會移動發(fā)送窗口的左邊界。?
接收端可以根據(jù)自己的狀況通告窗口大小,從而控制發(fā)送端的接收,進(jìn)行流量控制。
停止等待ARQ協(xié)議(stop and wait)?
當(dāng)發(fā)送窗口和接收窗口都等于1時,就是停止等待協(xié)議。發(fā)送端給接收端發(fā)送數(shù)據(jù),等待接收端確認(rèn)回復(fù)ACk,并停止發(fā)送新的數(shù)據(jù)包,開啟計時器。數(shù)據(jù)包在計時器超時之前得到確認(rèn),那么計時器就會關(guān)閉,并發(fā)送下一個數(shù)據(jù)包。如果計時器超時,發(fā)送端就認(rèn)為數(shù)據(jù)包丟失或被破壞,需要重新發(fā)送之前的數(shù)據(jù)包,說明數(shù)據(jù)包在得到確認(rèn)之前,發(fā)送端需要存儲數(shù)據(jù)包的副本。?
停止等待協(xié)議是發(fā)出一個幀后得到確認(rèn)才發(fā)下一個,降低了信道的利用率。
?
TCP擁塞控制
擁塞控制是一個全局性的過程; 流量控制是點對點通信量的控制?
TCP擁塞控制4個核心算法:慢啟動(slow start)、擁塞避免(Congestion Avoidance)、快速重傳(fast retransmit)、快速回復(fù)(fast recovery)?
擁塞窗口(cwnd,congestion window),其大小取決于網(wǎng)絡(luò)的擁塞程度,并且動態(tài)地在變化。?
?
慢啟動算法的思路就是,不要一開始就發(fā)送大量的數(shù)據(jù),先探測一下網(wǎng)絡(luò)的擁塞程度,也就是說由小到大逐漸增加擁塞窗口的大小。
為了防止cwnd增長過大引起網(wǎng)絡(luò)擁塞,還需設(shè)置一個慢啟動門限ssthresh狀態(tài)變量。ssthresh的用法如下:?
?
當(dāng)cwnd < ssthresh時,使用慢啟動算法。?
當(dāng)cwnd > ssthresh時,改用擁塞避免算法。?
當(dāng)cwnd = ssthresh時,慢開始與擁塞避免算法任意。
?
擁塞避免算法讓擁塞窗口緩慢增長,即每經(jīng)過一個往返時間RTT就把發(fā)送發(fā)的擁塞窗口cwnd加1,而不是加倍。
無論是在慢啟動階段還是在擁塞避免階段,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞,就把慢啟動門限(ssthread)設(shè)置為出現(xiàn)擁塞時的發(fā)送窗口大小的一半。然后把擁塞窗口設(shè)置為1,再次執(zhí)行慢啟動算法。
無論是在慢啟動階段還是在擁塞避免階段,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞(其根據(jù)就是沒有收到確認(rèn),雖然沒有收到確認(rèn)可能是其他原因的分組丟失,但是因為無法判定,所以都當(dāng)做擁塞來處理),就把慢開始門限設(shè)置為出現(xiàn)擁塞時的發(fā)送窗口大小的一半。然后把擁塞窗口設(shè)置為1,執(zhí)行慢開始算法。如下圖:
如下圖:?
擁塞控制的具體過程如下:?
(1)TCP連接初始化,將擁塞窗口設(shè)置為1?
(2)執(zhí)行慢開始算法,cwnd按指數(shù)規(guī)律增長,直到cwnd=ssthresh時,開始執(zhí)行擁塞避免算法,cwnd按線性規(guī)律增長?
(3)當(dāng)網(wǎng)絡(luò)發(fā)生擁塞,把ssthresh值更新為當(dāng)前出現(xiàn)擁塞時的發(fā)送窗口大小的一半,cwnd重新設(shè)置為1,按照步驟(2)執(zhí)行
快重傳和快恢復(fù)
快速重傳(Fastretransmit)要求接收方在收到一個失序的報文段后就立即發(fā)出重復(fù)確認(rèn)(為的是使發(fā)送方及早知道有報文段沒有到達(dá)對方),而不要等到自己發(fā)送數(shù)據(jù)時捎帶確認(rèn)。?
快重傳算法規(guī)定,發(fā)送方只要一連收到3個重復(fù)確認(rèn)就應(yīng)當(dāng)立即重傳對方尚未收到的報文段,而不必繼續(xù)等待設(shè)置的重傳計數(shù)器時間到期。?
? ?
快速恢復(fù)(FastRecovery)?
(1)當(dāng)發(fā)送方連續(xù)收到三個重復(fù)確認(rèn),就執(zhí)行“乘法減小”算法,把慢開始門限ssthresh減半。這是為了預(yù)防網(wǎng)絡(luò)發(fā)生擁塞。請注意:接下去不執(zhí)行慢開始算法。?(超時才重新執(zhí)行慢開始算法)
(2)由于發(fā)送方現(xiàn)在認(rèn)為網(wǎng)絡(luò)很可能沒有發(fā)生擁塞,因此與慢開始不同之處是現(xiàn)在不執(zhí)行慢開始算法(即擁塞窗口cwnd現(xiàn)在不設(shè)置為1),把ssthresh設(shè)置為當(dāng)前擁塞窗口的一般大小。把cwnd值設(shè)置為ssthresh加3個數(shù)據(jù)段,然后開始執(zhí)行擁塞避免算法(“加法增大”),使擁塞窗口緩慢地線性增大。?
①當(dāng)發(fā)送方連續(xù)收到三個重復(fù)確認(rèn)時,就執(zhí)行“乘法減小”算法,把ssthresh門限減半。但是接下去并不執(zhí)行慢開始算法。
②考慮到如果網(wǎng)絡(luò)出現(xiàn)擁塞的話就不會收到好幾個重復(fù)的確認(rèn),所以發(fā)送方現(xiàn)在認(rèn)為網(wǎng)絡(luò)可能沒有出現(xiàn)擁塞。所以此時不執(zhí)行慢開始算法,而是將cwnd設(shè)置為ssthresh的大小,然后執(zhí)行擁塞避免算法。如下圖:
?
發(fā)送方窗口的上限值 = Min [ rwnd, cwnd ]
rwnd 通告窗口?
cwnd? 擁塞窗口
當(dāng)rwnd < cwnd 時,是接收方的接收能力限制發(fā)送方窗口的最大值。
當(dāng)cwnd < rwnd 時,則是網(wǎng)絡(luò)的擁塞限制發(fā)送方窗口的最大值。
?
?不管是多么復(fù)雜的協(xié)議原理,我想首先肯定要落實到協(xié)議的字段上面。對于TCP來說流量控制無非是就是在序號和窗口大小上面做文章。
因此我們先了解一下16位的窗口大小究竟有什么作用。
窗口分為通告窗口和擁塞窗口。
通告窗口是接受數(shù)據(jù)端使用的窗口大小,用來告知發(fā)送端接收端的緩存大小,以此可以控制發(fā)送端發(fā)送數(shù)據(jù)的大小,從而達(dá)到流量控制的目的。
那么對于數(shù)據(jù)的發(fā)送端就是擁塞窗口了,擁塞窗口不代表緩存,擁塞窗口指某一源端數(shù)據(jù)流在一個RTT內(nèi)可以最多發(fā)送的數(shù)據(jù)包數(shù)
一、滑動窗口
滑動窗口協(xié)議是傳輸層進(jìn)行流控的一種措施,
接收方通過通告發(fā)送方自己的窗口大小,從而控制發(fā)送方的發(fā)送速度,從而達(dá)到防止發(fā)送方發(fā)送速度過快而導(dǎo)致自己被淹沒的目的。
?
對ACK的再認(rèn)識,ack通常被理解為收到數(shù)據(jù)后給出的一個確認(rèn)ACK,ACK包含兩個非常重要的信息:
一是期望接收到的下一字節(jié)的序號n,該n代表接收方已經(jīng)接收到了前n-1字節(jié)數(shù)據(jù),此時如果接收方收到第n+1字節(jié)數(shù)據(jù)而不是第n字節(jié)數(shù)據(jù),接收方是不會發(fā)送序號為n+2的ACK的。
舉個例子,假如接收端收到1-1024字節(jié),它會發(fā)送一個確認(rèn)號為1025的ACK給發(fā)送端,但是接下來收到的是 2049-3072,它是不會發(fā)送確認(rèn)號為3072的ACK,而依舊發(fā)送1025的ACK。
?
二是當(dāng)前的窗口大小m,如此發(fā)送方在接收到ACK包含的這兩個數(shù)據(jù)后就可以計算出還可以發(fā)送多少字節(jié)的數(shù)據(jù)給對方,假定當(dāng)前發(fā)送方已發(fā)送到第x字節(jié),則可以發(fā)送的字節(jié)數(shù)就是y=m-(x-n).這就是滑動窗口控制流量的基本原理.
(其中x-n為還未回復(fù)確認(rèn)的數(shù)據(jù),)
滑動窗口協(xié)議如圖所示:
?
在這個圖中,我們將字節(jié)從1至11進(jìn)行標(biāo)號。接收方通告的窗口稱為提出的窗口,它覆蓋了從第4字節(jié)到第9字節(jié)的區(qū)域,表明接收方已經(jīng)確認(rèn)了包括第3字節(jié)在內(nèi)的數(shù)據(jù),且通告窗口大小為6。我們知道窗口大小是與確認(rèn)序號相對應(yīng)的。發(fā)送方計算它的可用窗口,該窗口表明多少數(shù)據(jù)可以立即被發(fā)送。當(dāng)接收方確認(rèn)數(shù)據(jù)后,這個滑動窗口不時地向右移動。窗口兩個邊沿的相對運(yùn)動增加或減少了窗口的大小。
我們使用三個術(shù)語來描述窗口左右邊沿的運(yùn)動:
·????????稱窗口左邊沿向右邊沿靠近為窗口合攏。這種現(xiàn)象發(fā)生在數(shù)據(jù)被發(fā)送和被確認(rèn)時。
·????????當(dāng)窗口右邊沿向右移動時將允許發(fā)送更多的數(shù)據(jù),我們稱之為窗口張開。這種現(xiàn)象發(fā)生在另一端的接收進(jìn)程讀取已經(jīng)確認(rèn)的數(shù)據(jù)并釋放了T C P的接收緩存時。
·????????當(dāng)右邊緣向左移動時,稱之為窗口收縮。
二、擁塞窗口
迄今為止,在本章所有的例子中,發(fā)送方一開始便向網(wǎng)絡(luò)發(fā)送多個報文段,直至達(dá)到接收方通告的窗口大小為止。當(dāng)發(fā)送方和接收方處 于同一個局域網(wǎng)時,這種方式是可以的。但是如果在發(fā)送方和接收方之間存在多個路由器和速率較慢的鏈路時,就有可能出現(xiàn)一些問題。一些中間路由器必須緩存分組,并有可能耗盡緩存,[Jacobson 1988]證明了這種連接方式是如何嚴(yán)重降低了TCP連接的吞吐量的。
現(xiàn)在,TCP需要支持一種被稱為“慢啟動(slow start)”的算法。該算法通過觀察到新分組進(jìn)入網(wǎng)絡(luò)的速率應(yīng)該與另一端返回確認(rèn)的速率相同而進(jìn)行工作。
慢啟動為發(fā)送方的TCP增加了另一個窗口:擁塞窗口(congestion window),記為cwnd。當(dāng)與另一個網(wǎng)絡(luò)的主機(jī)建立TCP連接時,擁塞窗口被初始化為1個報文段(即另一端通告的報文段大小)。每收到一個ACK, 擁塞窗口就增加一個報文段(cwnd以字節(jié)為單位,但是慢啟動以報文段大小為單位進(jìn)行增加)。發(fā)送方取擁塞窗口與通告窗口中的最小值作為發(fā)送上限。
擁塞窗口是發(fā)送方使用的流量控制,而通告窗口則是接收方使用的流量控制。
發(fā)送方開始時發(fā)送一個報文段,然后等待ACK。當(dāng)收到該ACK時,擁塞窗口從1增加為2,即可以發(fā)送兩個報文段。當(dāng)收到這兩個報文段的ACK時,擁塞窗口就增加為4。這是一種指數(shù)增加的關(guān)系。
擁塞控制:防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中,這樣可以使網(wǎng)絡(luò)中的路由器或鏈路不致過載。
擁塞控制所要做的都有一個前提:網(wǎng)絡(luò)能夠承受現(xiàn)有的網(wǎng)絡(luò)負(fù)荷。
擁塞控制是一個全局性的過程,涉及到所有的主機(jī)、路由器,以及與降低網(wǎng)絡(luò)傳輸性能有關(guān)的所有因素。
?
擁塞發(fā)生有超時和收到重復(fù)確認(rèn)兩種情況,
?
超時會啟用慢啟動和避免擁塞算法
?
?
無論是在慢開始階段還是在擁塞避免階段,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞(其根據(jù)就是沒有收到確認(rèn),雖然沒有收到確認(rèn)可能是其他原因的分組丟失,但是因為無法判定,所以都當(dāng)做擁塞來處理),就把慢開始門限設(shè)置為出現(xiàn)擁塞時的發(fā)送窗口大小的一半。然后把擁塞窗口設(shè)置為1,執(zhí)行慢開始算法。
重復(fù)確認(rèn)可以避免過長時間的等待,會啟用快速重傳和快速恢復(fù)
表明接收端有數(shù)據(jù)空缺(數(shù)據(jù)失序)
①當(dāng)發(fā)送方連續(xù)收到三個重復(fù)確認(rèn)時,就執(zhí)行“乘法減小”算法,把ssthresh門限減半。但是接下去并不執(zhí)行慢開始算法。
②考慮到如果網(wǎng)絡(luò)出現(xiàn)擁塞的話就不會收到好幾個重復(fù)的確認(rèn),所以發(fā)送方現(xiàn)在認(rèn)為網(wǎng)絡(luò)可能沒有出現(xiàn)擁塞。所以此時不執(zhí)行慢開始算法,而是把ssthresh設(shè)置為cwnd的一半,把cwnd設(shè)置為ssthresh的值加3,然后執(zhí)行擁塞避免算法。
TCP擁塞控制
首先了解幾個概念,為下面的敘述做鋪墊
-
擁塞窗口(cwnd):TCP擁塞控制中的主要參數(shù),表示發(fā)送端下一次最多可以發(fā)送的數(shù)據(jù)分包的個數(shù),是來自發(fā)送端的流量控制。
-
接收端窗口(rwnd):又稱通知窗口(Advertise Window),接受端目前每次所能接收的數(shù)據(jù)分組的最大個數(shù),是來自接收端的流量控制。
-
慢開始門限(ssthresh):當(dāng)擁塞窗口增長到慢開始門限時,啟動擁塞避免算法(后面會具體闡述)。
-
擁塞控制常用算法:慢開始、擁塞避免、快重傳、快恢復(fù)。
最初,發(fā)送方不知道接收方的容納能力,如果初次就發(fā)送較大量的數(shù)據(jù),極有可能造成整個網(wǎng)絡(luò)的癱瘓,TCP為了防止此類問題的出現(xiàn),在通信一開始就會通過一個叫慢開始的算法得到的數(shù)值,對發(fā)送數(shù)據(jù)量進(jìn)行控制。
慢開始:
由于需要考慮擁塞控制和流量控制兩個方面的內(nèi)容,發(fā)送端的發(fā)送窗口為min(cwnd,rwnd),但是rwnd是由對端確定的,網(wǎng)絡(luò)環(huán)境對其沒有影響,所以在考慮擁塞的時候我們一般不考慮rwnd的值,我們暫時只討論如何確定cwnd值的大小。
在執(zhí)行慢開始算法時,擁塞窗口 cwnd的初始值為 1,發(fā)送第一個報文段。當(dāng)發(fā)送端收到來自接收端的ACK之后,擁塞窗口開始以1、2、4這樣的指數(shù)形式增長。當(dāng)擁塞窗口cwnd 增長到慢開始門限值 ssthresh 時,就改為執(zhí)行擁塞避免算法,擁塞窗口按線性規(guī)律增長。
擁塞避免:
最初,擁塞窗口指數(shù)增長,可以很快進(jìn)行大數(shù)據(jù)的發(fā)送,最大限度的利用網(wǎng)絡(luò)寬帶資源。當(dāng)達(dá)到慢開始門限值,開始進(jìn)入擁塞避免階段,擁塞窗口開始加法增加。這樣就可以避免增長過快導(dǎo)致網(wǎng)絡(luò)擁塞,慢慢的增加調(diào)整到網(wǎng)絡(luò)的最佳值。
快重傳與快速恢復(fù)
上面都沒有遇到網(wǎng)絡(luò)擁塞,當(dāng)真正遇到網(wǎng)絡(luò)擁塞時,如何處理呢?
1)無論是在慢開始階段還是在擁塞避免階段,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞(其根據(jù)就是沒有收到確認(rèn),雖然沒有收到確認(rèn)可能是其他原因的分組丟失,但是因為無法判定,所以都當(dāng)做擁塞來處理),就把慢開始門限設(shè)置為出現(xiàn)擁塞時的發(fā)送窗口大小的一半。然后把擁塞窗口設(shè)置為1,執(zhí)行慢開始算法。
2)當(dāng)發(fā)送方連續(xù)收到三個重復(fù)的ACK之后,TCP會進(jìn)入快速重傳、快速恢復(fù)的階段。
?
為什么叫快速重傳呢?如果當(dāng)發(fā)送端接收到三個重復(fù)的確認(rèn)ACK時,則斷定分組丟失,立即重傳丟失的報文段,而不必等待重傳計時器超時,相比之下,前者速度更快。
快速恢復(fù)的主要步驟:
-
當(dāng)收到3個重復(fù)ACK時,把ssthresh設(shè)置為cwnd的一半,把cwnd設(shè)置為ssthresh的值加3,然后重傳丟失的報文段,然后執(zhí)行擁塞避免算法。。
-
再收到重復(fù)的ACK時,擁塞窗口增加1。
-
當(dāng)收到新的數(shù)據(jù)包的ACK時,把cwnd設(shè)置為第一步中的ssthresh的值。原因是因為該ACK確認(rèn)了新的數(shù)據(jù),說明從重復(fù)ACK時的數(shù)據(jù)都已收到,該恢復(fù)過程已經(jīng)結(jié)束,可以回到恢復(fù)之前的狀態(tài)了,也即再次進(jìn)入擁塞避免狀態(tài)。
?
當(dāng)TCP通信開始之后,網(wǎng)絡(luò)吞吐量會逐漸上升,但是隨著網(wǎng)絡(luò)擁堵的發(fā)生,吞吐量也會急速下降。于是會再次進(jìn)入吞吐量慢慢上升的過程。但是所謂TCP的吞吐量的特點就好像是在逐漸占領(lǐng)網(wǎng)絡(luò)寬帶的感覺。
總結(jié)
以上是生活随笔為你收集整理的网络:TCP停止等待、超时重传、滑动窗口、拥塞控制、快重传和快恢复的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络:TIME-WAIT
- 下一篇: 网络:TCP/UDP