tcp协议头窗口,滑动窗口,流控制,拥塞控制关系
參考文章?
TCP 的那些事兒(下)?
http://coolshell.cn/articles/11609.html?
tcp/ip詳解--擁塞控制 & 慢啟動 快恢復 擁塞避免
http://blog.csdn.net/kinger0/article/details/48206999?
TCP window Fullhttp://blog.csdn.net/abccheng/article/details/50503457?
tcp隊列優(yōu)化?
http://www.tuicool.com/articles/U7nmeiY?
名詞解釋?
MTU:maximum transmission unit,最大傳輸單元,由硬件規(guī)定,如以太網(wǎng)的MTU為1500字節(jié)。指的是ip層包括ip頭和data最大為1500字節(jié)。超過了則ip層要進行分片。一般針對udp協(xié)議,tcp不會發(fā)生。對于TCP協(xié)議而言,這個協(xié)議是面向連接的協(xié)議,對于TCP協(xié)議而言它非常在意數(shù)據(jù)包的到達順序以及是否傳輸中有錯誤發(fā)生。所以有些TCP應用對分片有要求---不能分片(DF)。
MMS:maximum segment size,最大分節(jié)大小,為TCP數(shù)據(jù)包每次傳輸?shù)淖畲髷?shù)據(jù)分段大小,一般由發(fā)送端向?qū)Χ薚CP通知對端在每個分節(jié)中能發(fā)送的最大TCP數(shù)據(jù)。MSS值為MTU值減去IPv4 Header(20 Byte)和TCP header(20 Byte)得到,實際情況可能還要減去TCP的可選項。
TTL:(Time To Live),表明是數(shù)據(jù)報在網(wǎng)絡中的壽命,由發(fā)出數(shù)據(jù)報的源點設置這個字段,其目的是防止無法交付的數(shù)據(jù)報無限制地在因特網(wǎng)中兜圈子,因而白白消耗網(wǎng)絡資源,每經(jīng)過一個路由器時,就把TTL值減1。當TTL值為0時,就丟棄這個數(shù)據(jù)報,工作在ip層。
RTO:(Retransmission TimeOut)即重傳超時時間。RTT:(Round Trip Time)由三部分組成:鏈路的傳播時間(propagation delay)、末端系統(tǒng)的處理時間、路由器緩存中的排隊和處理時間(queuing delay)。其中,前兩個部分的值對于一個TCP連接相對固定,路由器緩存中的排隊和處理時間會隨著整個網(wǎng)絡擁塞程度的變化而變化。所以RTT的變化在一定程度上反應了網(wǎng)絡的擁塞程度。cwnd:發(fā)送端窗口( congestion window )
rwnd:接收端窗口(receiver window)
流控制:端到端,接收端的應用層處理速度決定和網(wǎng)速無關,由接收端返回的rwnd控制
擁塞控制: 發(fā)送端主動控制控制cwnd,有慢啟動(從cwnd初始為1開始啟動,指數(shù)啟動),擁塞避免(到達ssthresh后,為了避免擁塞開始嘗試線性增長),快重傳(接收方每收到一個報文段都要回復一個當前最大連續(xù)位置的確認,發(fā)送方只要一連收到三個重復確認就知道接收方丟包了,快速重傳丟包的報文,并TCP馬上把擁塞窗口 cwnd 減小到1),快恢復(直接從ssthresh線性增長)。
發(fā)送方窗口的上限值 = Min [ rwnd, cwnd ]
當rwnd < cwnd 時,是接收方的接收能力限制發(fā)送方窗口的最大值。
當cwnd < rwnd 時,則是網(wǎng)絡的擁塞限制發(fā)送方窗口的最大值。?
流控制
作者:郭無心鏈接:https://www.zhihu.com/question/32255109/answer/68558623
來源:知乎
著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)。
1)TCP滑動窗口分為接受窗口,發(fā)送窗口
滑動窗口協(xié)議是傳輸層進行流控的一種措施,接收方通過通告發(fā)送方自己的窗口大小,從而控制發(fā)送方的發(fā)送速度,從而達到防止發(fā)送方發(fā)送速度過快而導致自己被淹沒的目的。
對ACK的再認識,ack通常被理解為收到數(shù)據(jù)后給出的一個確認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ā)送一個確認號為1025的ACK,但是接下來收到的是2049-3072,它是不會發(fā)送確認號為3072的ACK,而依舊發(fā)送1025的ACK。
二是當前的窗口大小m,如此發(fā)送方在接收到ACK包含的這兩個數(shù)據(jù)后就可以計算出還可以發(fā)送多少字節(jié)的數(shù)據(jù)給對方,假定當前發(fā)送方已發(fā)送到第x字節(jié),則可以發(fā)送的字節(jié)數(shù)就是y=m-(x-n).這就是滑動窗口控制流量的基本原理
重點:發(fā)送方根據(jù)收到ACK當中的期望收到的下一個字節(jié)的序號n以及窗口m,還有當前已經(jīng)發(fā)送的字節(jié)序號x,算出還可以發(fā)送的字節(jié)數(shù)。
發(fā)送端窗口的第一個字節(jié)序號一定是ACK中期望收到的下一個字節(jié)序號,比如下圖:
上圖52 53 54 55 字節(jié)都是可以新發(fā)送的字節(jié)序
接受端窗口的第一個字節(jié)序之前一定是已經(jīng)完全接收的,后面窗口里面的數(shù)據(jù)都是希望接受的,窗口后面的數(shù)據(jù)都是不希望接受的。
http://blog.chinaunix.net/uid-20778955-id-539945.htmlhttp://www.netis.com.cn/flows/2012/08/tcp-%E6%BB%91%E 5%8A%A8%E7%AA%97%E5%8F%A3%E7%9A%84%E7%AE%80%E4%BB%8B/
TCP的滑動窗口分為接收窗口和發(fā)送窗口
不分析這兩種窗口就討論是不妥當?shù)摹?br />
TCP的滑動窗口主要有兩個作用,一是提供TCP的可靠性,二是提供TCP的流控特性。同時滑動窗口機制還體現(xiàn)了TCP面向字節(jié)流的設計思路。TCP 段中窗口的相關字段。
TCP的Window是一個16bit位字段,它代表的是窗口的字節(jié)容量,也就是TCP的標準窗口最大為2^16-1=65535個字節(jié)。
另外在TCP的選項字段中還包含了一個TCP窗口擴大因子,option-kind為3,option-length為3個字節(jié),option-data取值范圍0-14。窗口擴大因子用來擴大TCP窗口,可把原來16bit的窗口,擴大為31bit。
滑動窗口基本原理
1)對于TCP會話的發(fā)送方,任何時候在其發(fā)送緩存內(nèi)的數(shù)據(jù)都可以分為4類,“已經(jīng)發(fā)送并得到對端ACK的”,“已經(jīng)發(fā)送但還未收到對端ACK的”,“未發(fā)送但對端允許發(fā)送的”,“未發(fā)送且對端不允許發(fā)送”。“已經(jīng)發(fā)送但還未收到對端ACK的”和“未發(fā)送但對端允許發(fā)送的”這兩部分數(shù)據(jù)稱之為發(fā)送窗口。
當收到接收方新的ACK對于發(fā)送窗口中后續(xù)字節(jié)的確認是,窗口滑動,滑動原理如下圖。
當收到ACK=36時窗口滑動。
2)對于TCP的接收方,在某一時刻在它的接收緩存內(nèi)存在3種。“已接收”,“未接收準備接收”,“未接收并未準備接收”(由于ACK直接由TCP協(xié)議棧回復,默認無應用延遲,不存在“已接收未回復ACK”)。其中“未接收準備接收”稱之為接收窗口。
發(fā)送窗口與接收窗口關系
TCP是雙工的協(xié)議,會話的雙方都可以同時接收、發(fā)送數(shù)據(jù)。TCP會話的雙方都各自維護一個“發(fā)送窗口”和一個“接收窗口”。其中各自的“接收窗口”大小取決于應用、系統(tǒng)、硬件的限制(TCP傳輸速率不能大于應用的數(shù)據(jù)處理速率)。各自的“發(fā)送窗口”則要求取決于對端通告的“接收窗口”,要求相同。
滑動窗口實現(xiàn)面向流的可靠性
1)最基本的傳輸可靠性來源于“確認重傳”機制。
2)TCP的滑動窗口的可靠性也是建立在“確認重傳”基礎上的。
3)發(fā)送窗口只有收到對端對于本段發(fā)送窗口內(nèi)字節(jié)的ACK確認,才會移動發(fā)送窗口的左邊界。
4)接收窗口只有在前面所有的段都確認的情況下才會移動左邊界。當在前面還有字節(jié)未接收但收到后面字節(jié)的情況下,窗口不會移動,并不對后續(xù)字節(jié)確認。以此確保對端會對這些數(shù)據(jù)重傳。
滑動窗口的流控特性
TCP的滑動窗口是動態(tài)的,我們可以想象成小學常見的一個數(shù)學題,一個水池,體積V,每小時進水量V1,出水量V2。當水池滿了就不允許再注入了,如果有個液壓系統(tǒng)控制水池大小,那么就可以控制水的注入速率和量。這樣的水池就類似TCP的窗口。應用根據(jù)自身的處理能力變化,通過本端TCP接收窗口大小控制來對對對端的發(fā)送窗口流量限制。
應用程序在需要(如內(nèi)存不足)時,通過API通知TCP協(xié)議棧縮小TCP的接收窗口。然后TCP協(xié)議棧在下個段發(fā)送時包含新的窗口大小通知給對端,對端按通知的窗口來改變發(fā)送窗口,以此達到減緩發(fā)送速率的目的。
?
擁塞控制?
1.? 擁塞:即對資源的需求超過了可用的資源。若網(wǎng)絡中許多資源同時供應不足,網(wǎng)絡的性能就要明顯變壞,整個網(wǎng)絡的吞吐量隨之負荷的增大而下降。
? ? 擁塞控制:防止過多的數(shù)據(jù)注入到網(wǎng)絡中,這樣可以使網(wǎng)絡中的路由器或鏈路不致過載。擁塞控制所要做的都有一個前提:網(wǎng)絡能夠承受現(xiàn)有的網(wǎng)絡負荷。擁塞控制是一個全局性的過程,涉及到所有的主機、路由器,以及與降低網(wǎng)絡傳輸性能有關的所有因素。
??? 流量控制:指點對點通信量的控制,是端到端正的問題。流量控制所要做的就是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率,以便使接收端來得及接收。
??? 擁塞控制代價:需要獲得網(wǎng)絡內(nèi)部流量分布的信息。在實施擁塞控制之前,還需要在結(jié)點之間交換信息和各種命令,以便選擇控制的策略和實施控制。這樣就產(chǎn)生了額外的開銷。擁塞控制還需要將一些資源分配給各個用戶單獨使用,使得網(wǎng)絡資源不能更好地實現(xiàn)共享。
2. 幾種擁塞控制方法
??? 慢開始( slow-start )、擁塞避免( congestion avoidance )、快重傳( fast retransmit )和快恢復( fast recovery )。
2.1 慢開始和擁塞避免
??? 發(fā)送方維持一個擁塞窗口 cwnd ( congestion window )的狀態(tài)變量。擁塞窗口的大小取決于網(wǎng)絡的擁塞程度,并且動態(tài)地在變化。發(fā)送方讓自己的發(fā)送窗口等于擁塞。
??? 發(fā)送方控制擁塞窗口的原則是:只要網(wǎng)絡沒有出現(xiàn)擁塞,擁塞窗口就再增大一些,以便把更多的分組發(fā)送出去。但只要網(wǎng)絡出現(xiàn)擁塞,擁塞窗口就減小一些,以減少注入到網(wǎng)絡中的分組數(shù)。
??? 慢開始算法:當主機開始發(fā)送數(shù)據(jù)時,如果立即所大量數(shù)據(jù)字節(jié)注入到網(wǎng)絡,那么就有可能引起網(wǎng)絡擁塞,因為現(xiàn)在并不清楚網(wǎng)絡的負荷情況。因此,較好的方法是先探測一下,即由小到大逐漸增大發(fā)送窗口,也就是說,由小到大逐漸增大擁塞窗口數(shù)值。通常在剛剛開始發(fā)送報文段時,先把擁塞窗口 cwnd 設置為一個最大報文段MSS的數(shù)值。而在每收到一個對新的報文段的確認后,把擁塞窗口增加至多一個MSS的數(shù)值。用這樣的方法逐步增大發(fā)送方的擁塞窗口 cwnd ,可以使分組注入到網(wǎng)絡的速率更加合理。
?
每經(jīng)過一個傳輸輪次,擁塞窗口 cwnd 就加倍。一個傳輸輪次所經(jīng)歷的時間其實就是往返時間RTT。不過“傳輸輪次”更加強調(diào):把擁塞窗口cwnd所允許發(fā)送的報文段都連續(xù)發(fā)送出去,并收到了對已發(fā)送的最后一個字節(jié)的確認。
另,慢開始的“慢”并不是指cwnd的增長速率慢,而是指在TCP開始發(fā)送報文段時先設置cwnd=1,使得發(fā)送方在開始時只發(fā)送一個報文段(目的是試探一下網(wǎng)絡的擁塞情況),然后再逐漸增大cwnd。
??? 為了防止擁塞窗口cwnd增長過大引起網(wǎng)絡擁塞,還需要設置一個慢開始門限ssthresh狀態(tài)變量(如何設置ssthresh)。慢開始門限ssthresh的用法如下:
??? 當 cwnd < ssthresh 時,使用上述的慢開始算法。
??? 當 cwnd > ssthresh 時,停止使用慢開始算法而改用擁塞避免算法。
??? 當 cwnd = ssthresh 時,既可使用慢開始算法,也可使用擁塞控制避免算法。
擁塞避免算法:讓擁塞窗口cwnd緩慢地增大,即每經(jīng)過一個往返時間RTT就把發(fā)送方的擁塞窗口cwnd加1,而不是加倍。這樣擁塞窗口cwnd按線性規(guī)律緩慢增長,比慢開始算法的擁塞窗口增長速率緩慢得多。
??? 無論在慢開始階段還是在擁塞避免階段,只要發(fā)送方判斷網(wǎng)絡出現(xiàn)擁塞(其根據(jù)就是沒有收到確認),就要把慢開始門限ssthresh設置為出現(xiàn)擁塞時的發(fā)送方窗口值的一半(但不能小于2)。然后把擁塞窗口cwnd重新設置為1,執(zhí)行慢開始算法。這樣做的目的就是要迅速減少主機發(fā)送到網(wǎng)絡中的分組數(shù),使得發(fā)生擁塞的路由器有足夠時間把隊列中積壓的分組處理完畢。
??? 如下圖,用具體數(shù)值說明了上述擁塞控制的過程。現(xiàn)在發(fā)送窗口的大小和擁塞窗口一樣大。
<1>. 當TCP連接進行初始化時,把擁塞窗口cwnd置為1。前面已說過,為了便于理解,圖中的窗口單位不使用字節(jié)而使用報文段的個數(shù)。慢開始門限的初始值設置為16個報文段,即 cwnd = 16 。
<2>. 在執(zhí)行慢開始算法時,擁塞窗口 cwnd 的初始值為1。以后發(fā)送方每收到一個對新報文段的確認ACK,就把擁塞窗口值另1,然后開始下一輪的傳輸(圖中橫坐標為傳輸輪次)。因此擁塞窗口cwnd隨著傳輸輪次按指數(shù)規(guī)律增長。當擁塞窗口cwnd增長到慢開始門限值ssthresh時(即當cwnd=16時),就改為執(zhí)行擁塞控制算法,擁塞窗口按線性規(guī)律增長。
<3>. 假定擁塞窗口的數(shù)值增長到24時,網(wǎng)絡出現(xiàn)超時(這很可能就是網(wǎng)絡發(fā)生擁塞了)。更新后的ssthresh值變?yōu)?2(即變?yōu)槌霈F(xiàn)超時時的擁塞窗口數(shù)值24的一半),擁塞窗口再重新設置為1,并執(zhí)行慢開始算法。當cwnd=ssthresh=12時改為執(zhí)行擁塞避免算法,擁塞窗口按線性規(guī)律增長,每經(jīng)過一個往返時間增加一個MSS的大小。
強調(diào):“擁塞避免”并非指完全能夠避免了擁塞。利用以上的措施要完全避免網(wǎng)絡擁塞還是不可能的。“擁塞避免”是說在擁塞避免階段將擁塞窗口控制為按線性規(guī)律增長,使網(wǎng)絡比較不容易出現(xiàn)擁塞。
?
2.2 快重傳和快恢復
2.2 快重傳和快恢復
??? 如果發(fā)送方設置的超時計時器時限已到但還沒有收到確認,那么很可能是網(wǎng)絡出現(xiàn)了擁塞,致使報文段在網(wǎng)絡中的某處被丟棄。這時,TCP馬上把擁塞窗口 cwnd 減小到1,并執(zhí)行慢開始算法,同時把慢開始門限值ssthresh減半。這是不使用快重傳的情況。
??? 快重傳算法首先要求接收方每收到一個失序的報文段后就立即發(fā)出重復確認(為的是使發(fā)送方及早知道有報文段沒有到達對方)而不要等到自己發(fā)送數(shù)據(jù)時才進行捎帶確認。
接收方收到了M1和M2后都分別發(fā)出了確認。現(xiàn)在假定接收方?jīng)]有收到M3但接著收到了M4。顯然,接收方不能確認M4,因為M4是收到的失序報文段。根據(jù)可靠傳輸原理,接收方可以什么都不做,也可以在適當時機發(fā)送一次對M2的確認。但按照快重傳算法的規(guī)定,接收方應及時發(fā)送對M2的重復確認,這樣做可以讓發(fā)送方及早知道報文段M3沒有到達接收方。發(fā)送方接著發(fā)送了M5和M6。接收方收到這兩個報文后,也還要再次發(fā)出對M2的重復確認。這樣,發(fā)送方共收到了接收方的四個對M2的確認,其中后三個都是重復確認。快重傳算法還規(guī)定,發(fā)送方只要一連收到三個重復確認就應當立即重傳對方尚未收到的報文段M3,而不必繼續(xù)等待M3設置的重傳計時器到期。由于發(fā)送方盡早重傳未被確認的報文段,因此采用快重傳后可以使整個網(wǎng)絡吞吐量提高約20%。
??? 與快重傳配合使用的還有快恢復算法,其過程有以下兩個要點:
??? <1>. 當發(fā)送方連續(xù)收到三個重復確認,就執(zhí)行“乘法減小”算法,把慢開始門限ssthresh減半。這是為了預防網(wǎng)絡發(fā)生擁塞。請注意:接下去不執(zhí)行慢開始算法。
??? <2>. 由于發(fā)送方現(xiàn)在認為網(wǎng)絡很可能沒有發(fā)生擁塞,因此與慢開始不同之處是現(xiàn)在不執(zhí)行慢開始算法(即擁塞窗口cwnd現(xiàn)在不設置為1),而是把cwnd值設置為慢開始門限ssthresh減半后的數(shù)值,然后開始執(zhí)行擁塞避免算法(“加法增大”),使擁塞窗口緩慢地線性增大。
??? 下圖給出了快重傳和快恢復的示意圖,并標明了“TCP Reno版本”。
??? 區(qū)別:新的 TCP Reno 版本在快重傳之后采用快恢復算法而不是采用慢開始算法。
?
?也有的快重傳實現(xiàn)是把開始時的擁塞窗口cwnd值再增大一點,即等于 ssthresh + 3 X MSS 。這樣做的理由是:既然發(fā)送方收到三個重復的確認,就表明有三個分組已經(jīng)離開了網(wǎng)絡。這三個分組不再消耗網(wǎng)絡 的資源而是停留在接收方的緩存中。可見現(xiàn)在網(wǎng)絡中并不是堆積了分組而是減少了三個分組。因此可以適當把擁塞窗口擴大了些。
??? 在采用快恢復算法時,慢開始算法只是在TCP連接建立時和網(wǎng)絡出現(xiàn)超時時才使用。
??? 采用這樣的擁塞控制方法使得TCP的性能有明顯的改進。
??? 接收方根據(jù)自己的接收能力設定了接收窗口rwnd,并把這個窗口值寫入TCP首部中的窗口字段,傳送給發(fā)送方。因此,接收窗口又稱為通知窗口。因此,從接收方對發(fā)送方的流量控制的角度考慮,發(fā)送方的發(fā)送窗口一定不能超過對方給出的接收窗口rwnd 。
??? 發(fā)送方窗口的上限值 = Min [ rwnd, cwnd ]
??? 當rwnd < cwnd 時,是接收方的接收能力限制發(fā)送方窗口的最大值。
??? 當cwnd < rwnd 時,則是網(wǎng)絡的擁塞限制發(fā)送方窗口的最大值。
?
posted on 2016-12-11 23:59 zlingh 閱讀(...) 評論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/zlingh/p/6161088.html
總結(jié)
以上是生活随笔為你收集整理的tcp协议头窗口,滑动窗口,流控制,拥塞控制关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: div中的内容水平垂直居中
- 下一篇: 备份MySQL数据库