[1] 《tcp/ip具體解釋 卷1:協議》
[2] 《tcp/ip協議族 第4版》
[3] 《計算機網路 第5版》
tcp流量控制的目的是限制傳送端的傳送速率,使得接收方可以及時接收。
tcp主要是通過滑動窗體
來實現流量控制的。實際上,傳送窗體的大小不僅受接收窗體rwnd的大小的限制,還受擁塞窗體cwnd窗體的限制,為了實現點到點的流量控制,本文如果擁塞窗體足夠大(即網路鏈路比較流暢),僅考慮傳送窗體swnd受接收窗體的限制。
窗體由左臂和右臂組成。左臂右移稱為
關閉,右臂左移稱為收縮,右臂右移稱為開啟。
傳送窗體和接收窗體的移動操作
接收窗體:當接收方收到傳送方的很多其它的位元組時(不包含反覆的報文段),接收窗體關閉。當接收快取中的位元組被接收程序pull時,接收窗體開啟,通常接收窗體不會傳送收縮操作。
傳送窗體:傳送窗體的關閉、收縮和開啟受接收方的控制。當乙個有效的確認時,傳送窗體關閉;當接收方通告傳送方同意的窗體大小能夠更大時,傳送窗體會開啟。當接收方通告傳送方同意的窗體大小更小時。傳送窗體就收縮,可是
tcp強烈不建議傳送窗體收縮
。注意:tcp窗體的單位是位元組。不是報文段。所以tcp窗體中,每一格相應1b。
利用滑動窗體進行流量控制過程
上圖中,在傳送端與接收端建立連線時,接收端告訴傳送端當前接收窗體rwnd=400。所以傳送端最多可以傳送400b,如果每個報文段為100b。
傳送端連續傳送4個報文段。各自是1-100,101-200,201-300,301-400,401-500。傳送後資料段101-200在路上丟失了,其它幾個報文都被接收了。並放入到接收快取中,接收方便向傳送方傳送1-200報文段的ack。並期望收到序號為201相應的報文段。同一時候設定接收窗體大小rwnd=300,傳送端便重傳序號201相應的報文段。當接收端收到該報文段後,並向傳送端傳送前500個報文的ack,並期望收到序號為501的報文段,並設定接收窗體rwnd=100。傳送端收到該ack報文段後,便向接收端傳送序號為501-600的報文段,接收端收到該報文段後,傳送ack報文段。並設定rwnd=0,意在通知傳送端不要臨時再傳送資料段。
糊塗窗體綜合症
當傳送應用程式產生資料的速度非常慢,或接收應用程式消耗資料的速度非常慢,或者兩者都有,都會使得傳送資料的報文段非常小,使得網路效率非常低,這個問題稱為
糊塗窗體綜合症sws(silly window syndrome)。
傳送方產生的症狀
假設傳送方應用程式產生資料的速度非常慢。比如一次僅僅產生1b,那麼就有可能產生糊塗窗體綜合症。解決辦法是防止傳送tcp一次僅僅傳送1b。必須讓傳送tcp等待。並把資料收集成較大的資料塊後再傳送。
傳送tcp須要等待多長時間再傳送呢?
假設等待時間過長。則會延遲整個過程。
假設等待時間過短,最後非常可能還是傳送乙個個小報文段。nagle提出了一種解決辦法,我們稱之為nagle演算法,過程例如以下:
1.傳送tcp把它從應用程式收到的第一塊資料傳送出去。哪怕僅僅有乙個位元組;
2.在傳送了第乙個報文段後。傳送tcp先把傳送應用程式興許到達的資料位元組快取起來。直到收到接收端發來的ack,或者已積累了
足夠的資料
。傳送tcp就能夠傳送這個報文段了。
注意:足夠的資料指的是資料達到0.5*mss(最大報文段長度的一半)或者傳送窗體大小的一半時。
接收方產生的症狀
假設接收端應用程式pull速度非常慢,比如一次僅僅消耗1b的資料。若tcp接收方的快取已滿,而應用程式一次僅僅能從接收快取中讀取1b,然後向傳送方傳送ack。並把窗體設定為1b(由於從接收快取中取出了1b),但傳送方的快取中有非常多資料。這樣傳送方有僅僅能一次傳送1b,接收方發回確認,仍然將窗體設定為1b,這樣進行下去。網路的效率非常低,此時能夠採取兩種解決方法:
方法1:採用clark解決方法。該方法是:接收端僅僅要有資料到達就向傳送端傳送零值窗體ack報文段。直到(1)快取中有足夠大的空間能夠放入1mss報文段,或者(2)至少有一半的快取空間空暇。僅僅要出現這兩種情況之中的乙個,接收端就向傳送端傳送非零值窗體ack報文。
方法2:推遲確認。當報文段到達時並不馬上傳送確認,接收方在對收到的報文段進行確認之前一直等待,直至接收快取有足夠的空間為止。
推遲傳送確認防止了傳送tcp滑動它的窗體。
推遲確認的另外乙個長處:降低了網路的通訊量;相應的缺點是:假設推遲的時間比較長,會使得傳送方以為傳送的報文丟失,而產生不必要的重傳。
總之。傳送方和接收方能夠配合解決該問題。整體的思想是:傳送方不傳送非常小的報文段的同一時候,接收方也不要在快取剛剛有了一點小空間就急慌忙這個非常小的窗體大小的資訊通知發件人。
TCP流量控制
一般來說,我們總是希望資料傳輸的更快一些,但如果傳送方把資料傳送的很快,而接收方來不及接收,這就可能造成資料的丟失。流量控制就是讓傳送方的傳送速率不要太快,讓接收方來得及接收。對於成塊資料流,tcp利用滑動視窗機制來實現流量的控制,對於互動資料流,tcp利用捎帶ack和nagle演算法來實現流量的控...
TCP流量控制
如果傳送端傳送的速度較快,接收端接收到資料後處理的速度較慢,而接收緩衝區的大小是固定的,就會丟失資料。tcp協議通過 滑動視窗 sliding window 機制解決這一問題。滑動視窗 傳送端發起連線,宣告最大段尺寸是1460,初始序號是0,視窗大小是4k,表示 我的接收緩衝區還有4k位元組空閒,你...
TCP流量控制
流量控制 一般來說,我們總是希望資料傳輸的更快一些,但如果傳送方把資料傳送的很快,而接收方來不及接收,這就可能造成資料的丟失。流量控制就是讓傳送方的傳送速率不要太快,讓接收方來得及接收。對於成塊資料流,tcp利用滑動視窗機制來實現流量的控制,對於互動資料流,tcp利用捎帶ack和nagle演算法 來...