流量控制
所謂流量控制就是讓發(fā)送發(fā)送速率不要過快齐苛,以至于淹沒接收方疲牵,讓接收方來得及接收击吱。
如果能控制發(fā)送方的發(fā)送速率,就可以達到流量控制的目的们镜。
如何控制發(fā)送方速率
為了提高信道的利用率TCP協(xié)議不使用停等協(xié)議币叹,而是使用連續(xù)滑動窗口協(xié)議润歉,該協(xié)議允許發(fā)送方在停止并等待確認前可以連續(xù)發(fā)送多個分組模狭。允許發(fā)送的分組的數(shù)量即是窗口值。
如果控制了發(fā)送方的窗口大小踩衩,即控制發(fā)送方的發(fā)送速率嚼鹉,達到流量控制的目的。
滑動窗口協(xié)議
在這個圖中,我們將字節(jié)從 1至11進行標號驱富。
接收方通告的窗口稱為提出的窗口(offered window),它覆蓋了從第 4字節(jié)到第 9字節(jié)的區(qū)域,表明接收方已經(jīng)確認了包括第 3字節(jié)在內(nèi)的數(shù)據(jù),且通告窗口大小為 6锚赤。
當接收方確認數(shù)據(jù)后,這個滑動窗口不時地向右移動。窗口兩個邊沿的相對運動增加或減少了窗口的大小褐鸥。
流量控制過程
TCP的發(fā)送窗口的大小受TCP數(shù)據(jù)報中窗口大小的影響线脚,TCP數(shù)據(jù)報中的窗口大小是接收端通知發(fā)送端其還可以接收多少數(shù)據(jù),所以發(fā)送窗口根據(jù)接收的的窗口大小的值動態(tài)變化叫榕。
窗口改變動作有:
窗口左邊沿向右邊沿靠近為窗口合攏浑侥。這種現(xiàn)象發(fā)生在數(shù)據(jù)被發(fā)送和確認時。
窗口右邊沿向右移動時將允許發(fā)送更多的數(shù)據(jù),我們稱之為窗口張開晰绎。這種現(xiàn)象發(fā)生在另一端的接收進程讀取已經(jīng)確認的數(shù)據(jù)并釋放了 T C P的接收緩存時寓落。
右邊沿向左移動時,我們稱之為窗口收縮。 Host Requirements RFC強烈建議不要使
用這種方式荞下。但 T C P必須能夠在某一端產(chǎn)生這種情況時進行處理伶选。
考慮一種特殊的情況,就是接收方若沒有緩存足夠使用尖昏,就會發(fā)送零窗口大小的報文仰税,此時發(fā)送放將發(fā)送窗口設(shè)置為0,停止發(fā)送數(shù)據(jù)抽诉。之后接收方有足夠的緩存陨簇,發(fā)送了非零窗口大小的報文,但是這個報文在中途丟失的掸鹅,那么發(fā)送方的發(fā)送窗口就一直為零導(dǎo)致死鎖塞帐。
解決這個問題拦赠,TCP為每一個連接設(shè)置一個持續(xù)計時器(persistence timer)。只要TCP的一方收到對方的零窗口通知葵姥,就啟動該計時器荷鼠,周期性的發(fā)送一個零窗口探測報文段。對方就在確認這個報文的時候給出現(xiàn)在的窗口大欣菩摇(注意:TCP規(guī)定允乐,即使設(shè)置為零窗口,也必須接收以下幾種報文段:零窗口探測報文段削咆、確認報文段和攜帶緊急數(shù)據(jù)的報文段)牍疏。