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