TCP/IP之TCP協議:流量控制(滑動窗口協議)

分類:IT技術 時間:2016-10-16

原文出處: onelight1997   

一、流量控制(滑動窗口協議)

1、流量控制是管理兩端的流量,以免會產生發送過塊導致收端溢出,或者因收端處理太快而浪費時間的狀態。用的是:滑動窗口,以字節為單位

2、窗口有3種動作:展開(右邊向右),合攏(左邊向右),收縮(右邊向左)這三種動作受接收端的控制。

合攏:表示已經收到相應字節的確認了

展開:表示允許緩存發送更多的字節

收縮(非常不希望出現的,某些實現是禁止的):表示本來可以發送的,現在不能發送;但是如果收縮的是那些已經發出的,就會有問題;為了避免,收端會等待到緩存中有更多緩存空間時才進行通信。

發端窗口的大小取決於收端的窗口大小rwnd(TCP報文的窗口大小字段)和擁塞窗口大小cwnd(見擁塞控制)

發端窗口大小 = min{ rwnd , cwnd };

3、關閉窗口:窗口縮回有個例外,就是發送rwnd=0表示暫時不願意接收數據。這種情況下,發端不是把窗口收縮,二是停止發送數據。(為了比避免死鎖,會用一些探測報定時發送試探,見定時器一節)

4、問題:某些時候,由於發端或收端的數據很慢,會引起大量的1字節數據痛惜,浪費很多資源。

(1)、發端的進程產生數據很慢時候,時不時的來個1字節數據,那麽TCP就會1字節1字節的發送,效率很低。

解決方法(Nagle算法):

a、將第一塊數據發出去

b、然後等到發送緩存有足夠多的數據(最大報文段長度),或者等到收端確認的ACK時再發送數據。

c、重復b的過程

(2)、收端進程由於消耗數據很慢,所以可能會有這麽一種情況,收端會發送其窗口大小為1的信息,然後有是1字節的傳輸

解決辦法(2種)

a、Clark方法:在接收緩存的一半變空,或者有足夠空間放最大報文長度之前,宣告接收窗口大小為0

b、推遲確認:在對收到的報文段確認之前等待到足夠的接收緩存,或者等待到一個時間段(現在一般定義500ms)

二、滑動窗口機制

(1).窗口機制

滑動窗口協議的基本原理就是在任意時刻,發送方都維持了一個連續的允許發送的幀的序號,稱為發送窗口;同時,接收方也維持了一個連續的允許接收的幀的序號,稱為接收窗口。發送窗口和接收窗口的序號的上下界不一定要一樣,甚至大小也可以不同。不同的滑動窗口協議窗口大小一般不同。發送方窗口內的序列號代表了那些已經被發送,但是還沒有被確認的幀,或者是那些可以被發送的幀。下面舉一個例子(假設發送窗口尺寸為2,接收窗口尺寸為1):


分析:①初始態,發送方沒有幀發出,發送窗口前後沿相重合。接收方0號窗口打開,等待接收0號幀;②發送方打開0號窗口,表示已發出0幀但尚確認返回信息。此時接收窗口狀態不變;③發送方打開0、1號窗口,表示0、1號幀均在等待確認之列。至此,發送方打開的窗口數已達規定限度,在未收到新的確認返回幀之前,發送方將暫停發送新的數據幀。接收窗口此時狀態仍未變;④接收方已收到0號幀,0號窗口關閉,1號窗口打開,表示準備接收1號幀。此時發送窗口狀態不變;⑤發送方收到接收方發來的0號幀確認返回信息,關閉0號窗口,表示從重發表中刪除0號幀。此時接收窗口狀態仍不變;⑥發送方繼續發送2號幀,2號窗口打開,表示2號幀也納入待確認之列。至此,發送方打開的窗口又已達規定限度,在未收到新的確認返回幀之前,發送方將暫停發送新的數據幀,此時接收窗口狀態仍不變;⑦接收方已收到1號幀,1號窗口關閉,2號窗口打開,表示準備接收2號幀。此時發送窗口狀態不變;⑧發送方收到接收方發來的1號幀收畢的確認信息,關閉1號窗口,表示從重發表中刪除1號幀。此時接收窗口狀態仍不變。

若從滑動窗口的觀點來統一看待1比特滑動窗口、後退n及選擇重傳三種協議,它們的差別僅在於各自窗口尺寸的大小不同而已。1比特滑動窗口協議:發送窗口=1,接收窗口=1;後退n協議:發窗口>1,接收窗口>1;選擇重傳協議:發送窗口>1,接收窗口>1。

(2).1比特滑動窗口協議

當發送窗口和接收窗口的大小固定為1時,滑動窗口協議退化為停等協議(stop-and-wait)。該協議規定發送方每發送一幀後就要停下來,等待接收方已正確接收的確認(acknowledgement)返回後才能繼續發送下一幀。由於接收方需要判斷接收到的幀是新發的幀還是重新發送的幀,因此發送方要為每一個幀加一個序號。由於停等協議規定只有一幀完全發送成功後才能發送新的幀,因而只用一比特來編號就夠了。其發送方和接收方運行的流程圖如圖所示。

(3).後退n協議

由於停等協議要為每一個幀進行確認後才繼續發送下一幀,大大降低了信道利用率,因此又提出了後退n協議。後退n協議中,發送方在發完一個數據幀後,不停下來等待應答幀,而是連續發送若幹個數據幀,即使在連續發送過程中收到了接收方發來的應答幀,也可以繼續發送。且發送方在每發送完一個數據幀時都要設置超時定時器。只要在所設置的超時時間內仍收到確認幀,就要重發相應的數據幀。如:當發送方發送了N個幀後,若發現該N幀的前一個幀在計時器超時後仍未返回其確認信息,則該幀被判為出錯或丟失,此時發送方就不得不重新發送出錯幀及其後的N幀。

從這裏不難看出,後退n協議一方面因連續發送數據幀而提高了效率,但另一方面,在重傳時又必須把原來已正確傳送過的數據幀進行重傳(僅因這些數據幀之前有一個數據幀出了錯),這種做法又使傳送效率降低。由此可見,若傳輸信道的傳輸質量很差因而誤碼率較大時,連續測協議不一定優於停止等待協議。此協議中的發送窗口的大小為k,接收窗口仍是1。

(4).選擇重傳協議

在後退n協議中,接收方若發現錯誤幀就不再接收後續的幀,即使是正確到達的幀,這顯然是一種浪費。另一種效率更高的策略是當接收方發現某幀出錯後,其後繼續送來的正確的幀雖然不能立即遞交給接收方的高層,但接收方仍可收下來,存放在一個緩沖區中,同時要求發送方重新傳送出錯的那一幀。一旦收到重新傳來的幀後,就可以原已存於緩沖區中的其余幀一並按正確的順序遞交高層。這種方法稱為選擇重發(SELECTICE REPEAT),其工作過程如圖所示。顯然,選擇重發減少了浪費,但要求接收方有足夠大的緩沖區空間。

三、TCP滑動窗口(Sliding Window)

滑動窗口協議可以用圖四來形象表示。

點擊看大圖

圖中我們已經將字節進行了1到11的編號。由接收者通告的窗口稱為提議窗口(offered window),它覆蓋了第4到第9個字節,意味著接收方已經確認了第3字節之前(包括第3字節)的數據,並且通告窗口的大小是6。窗口大小與確認的順序號(acknowledged sequence number)有關。發送者計算它的可用窗口(usable window),用以度量它可以立即發送多少數據。

隨著接收者對收到數據的確認,滑動窗口隨時向右移動。窗口兩端的相關運動增加或減少著窗口大小。我們使用3個術語來描述窗口邊緣(edge)的左右運動。

1.當窗口左邊緣靠近右邊緣時稱窗口閉合(window closes)。窗口閉合發生在數據已經發送並被確認的情況下。

2.當窗口右邊緣向右移動時稱窗口打開(window opens)。窗口打開發生在另一端的接收進程讀取已確認數據的時候,它釋放了TCP接收緩沖區的空間。

3.當窗口右邊緣向左移動時稱窗口收縮(window shrinks)。Host Requirement RFC強烈不鼓勵這種做法,但TCP必須能夠在一端發生這種情況時進行處理。

圖五表示了這三個術語。由於窗口的左邊緣是受從連接另一端收到的確認號來控制的,因此它不會向左移動。如果收到一個ACK要求將左邊緣向左移動,那麽它是一個重復的(duplicate)的確認,並被丟棄。

如果窗口左邊緣重合了右邊緣,就稱它為零窗口(zero window)。它將停止發送者傳輸任何數據。

示例

圖六顯示了圖一數據傳輸中TCP滑動窗口的動態變化

以此圖為例,我們可以總結幾個要點:

1.發送者不必傳送滿窗口大小的數據。

2.收到接收者對數據的確認後,窗口向右滑動。這是由於窗口大小與確認順序號相關。

3.從段7到段8的變化,可以看出窗口可以減小,但窗口右邊緣不能向左移動。

4.接收者不必等待窗口被填滿才發送確認。在許多實現中,接收者每收到兩個段發送一個確認。

1 收藏 評論
Tags:

文章來源:


ads
ads

相關文章
ads

相關文章

ad