TCP協議的流量控制、擁塞控制和差錯控制

流量控制:
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)

擁塞控制:
1、如果網絡上的負載(發送到網絡上的分組數)大於網絡上的容量(網絡同時能處理的分組數),就可能引起擁塞,判斷網絡擁塞的兩個因素:延時和吞吐量。擁塞控制機制是:開環(預防)和閉環(消除)(見網絡原理相關書籍,略)
tcp處理擁塞的三種策略:慢啓動(指數增大),擁塞避免(加法增大),擁塞檢測(除2減少,或叫做乘法減少)

2、慢啓動:指數增大
/* ssthresh是慢開始門限,slow start threshold表示一個上限,一般的實現爲65535B */
cwnd = 1;(1表示一個MSS報文段,不是一個字節)
while ( cwnd < ssthresh )
if( 發出的報文段確認 )
cwd *= 2;

3、擁塞避免:加法增大
當到達ssthresh之後,就是加法階段了,每收到一個確認,cwd += 1;

4、擁塞檢測:乘法減少(除2減少)
當報文需要重傳時,說明擁塞可能發生了,由於重傳有2種情況,所以也分兩種處理
(1)、由於超時重傳,這是擁塞的可能性比較大,如下做強反映調整
a、 ssthresh /= 2;
b、 cwnd = 1;
重新慢啓動過程
(2)、由於收到3個重複的ACK的重傳,採取弱反映:
a、ssthresh /= 2;
b、cwnd = ssthresh;
c、開始擁塞避免過程

差錯控制:
1、TCP必須保證數據:按序,沒有差錯,沒有部分丟失,沒有重複的交給應用層。方法就是:校驗和,確認,超時重傳

2、校驗和:和UDP的做法一樣,也要僞首部,和UDP不同的是這個功能在TCP中是必須的

3、確認:ACK的確認機制(下面是一些原則)
a、ACK報文不需要確認,也不消耗序號
b、當一端發送數據時,儘量包含捎帶確認。
c、收端推遲發送ACK報文段,如果僅有一個未確認的按序報文段;延遲到500ms,或者有第二個報文段接收時(轉d),或者有數據要發送時(轉b)
d、任何時候,不能有兩個(以上)未確認的報文段(就是說如果收端有兩個未確認的按序報文段,就馬上發送ACK報文段進行確認)
e、當收到一個序號比期望序號還大的報文段時,馬上發送ACK,讓發端進行快重傳
f、收到重複的報文段,就立即發送確認(解決ACK丟失問題)
g、丟失的報文段到達,發送確認,表示已經收到了丟失的報文

4、確認類型
累計確認:收端忽略掉所有失序報文,告知發端他期待下一個收到的序號,叫做肯定累計ACK。肯定是說:丟棄的,丟失的,重複的都不報告。
選擇確認(SACK):在某些新TCP實現裏面實現了這個東西,報告失序和重複的數據,作僞TCP首部選項字段的一部分。

5、重傳(兩種情況) : 重傳定時器時間到,或者 發端收到重複的三個ACK(快重傳)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章