Posted on 2009-04-20 11:34
Prayer 閱讀(4603)
評論(0) 編輯 收藏 引用 所屬分類:
SOCKET
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)