Posted on 2009-04-20 11:34
Prayer 閱讀(4626)
評論(0) 編輯 收藏 引用 所屬分類:
SOCKET
1、流量控制是管理兩端的流量,以免會產(chǎn)生發(fā)送過塊導(dǎo)致收端溢出,或者因收端處理太快而浪費時間的狀態(tài)。用的是:滑動窗口,以字節(jié)為單位
2、窗口有3種動作:展開(右邊向右),合攏(左邊向右),收縮(右邊向左)這三種動作受接收端的控制。
合攏:表示已經(jīng)收到相應(yīng)字節(jié)的確認了
展開:表示允許緩存發(fā)送更多的字節(jié)
收縮(非常不希望出現(xiàn)的,某些實現(xiàn)是禁止的):表示本來可以發(fā)送的,現(xiàn)在不能發(fā)送;但是如果收縮的是那些已經(jīng)發(fā)出的,就會有問題;為了避免,收端會等待到緩存中有更多緩存空間時才進行通信。
發(fā)端窗口的大小取決于收端的窗口大小rwnd(TCP報文的窗口大小字段)和擁塞窗口大小cwnd(見擁塞控制)
發(fā)端窗口大小 = min{ rwnd , cwnd };
3、關(guān)閉窗口:窗口縮回有個例外,就是發(fā)送rwnd=0表示暫時不愿意接收數(shù)據(jù)。這種情況下,發(fā)端不是把窗口收縮,二是停止發(fā)送數(shù)據(jù)。(為了比避免死鎖,會用一些探測報定時發(fā)送試探,見定時器一節(jié))
4、問題:某些時候,由于發(fā)端或收端的數(shù)據(jù)很慢,會引起大量的1字節(jié)數(shù)據(jù)痛惜,浪費很多資源。
(1)、發(fā)端的進程產(chǎn)生數(shù)據(jù)很慢時候,時不時的來個1字節(jié)數(shù)據(jù),那么TCP就會1字節(jié)1字節(jié)的發(fā)送,效率很低。
解決方法(Nagle算法):
a、將第一塊數(shù)據(jù)發(fā)出去
b、然后等到發(fā)送緩存有足夠多的數(shù)據(jù)(最大報文段長度),或者等到收端確認的ACK時再發(fā)送數(shù)據(jù)。
c、重復(fù)b的過程
(2)、收端進程由于消耗數(shù)據(jù)很慢,所以可能會有這么一種情況,收端會發(fā)送其窗口大小為1的信息,然后有是1字節(jié)的傳輸
解決辦法(2種)
a、Clark方法:在接收緩存的一半變空,或者有足夠空間放最大報文長度之前,宣告接收窗口大小為0
b、推遲確認:在對收到的報文段確認之前等待到足夠的接收緩存,或者等待到一個時間段(現(xiàn)在一般定義500ms)