TCP協議的流量控制和擁塞控制

流量控制與擁塞控制可是TCP協議的兩大特點,這兩者是有一定關聯的。
流量控制就是讓發送方的發生速率不要太快,要讓接收方來的及接收,不然會找出數據溢出丟失。流量控制是利用滑動窗口機制實現的。

1.流量控制——滑動窗口

TCP採用大小可變的滑動窗口進行流量控制,窗口大小的單位是字節。
發送窗口在連接建立時由雙方商定。但在通信的過程中,接收端可根據自己的資源情況,隨時動態地調整對方的發送窗口上限值(可增大或減小)。
爲什麼要設置窗口?
我們可以把窗口理解爲緩衝區(但是有些窗口和緩衝區又不太一樣)。
如果沒有這些“窗口”,那麼TCP沒發送一段數據後都必須等到接收端確認後才能發送下一段數據(否則會出現接收端數據來不及處理,數據丟失的情況),這樣做的話TCP傳輸的效率實在是太低了。
解決的辦法就是在發送端等待確認的時候繼續發送數據,假設發送到第X個數據段是收到接收端的確認信息,如果X在可接受的範圍內那麼這樣做也是可接受的。這就是窗口(緩衝區)引入的緣由。
1.1 窗口
(1)接收端窗口 rwnd     
接收端緩衝區大小。接收端將此窗口值放在 TCP 報文的首部中的窗口字段,傳送給發送端。
(2) 擁塞窗口 cwnd (congestion window)    
發送端緩衝區大小
(3)發送窗口swnd
             發送窗口的上限值 = Min [rwnd, cwnd]
當 rwnd < cwnd 時,是接收端的接收能力限制發送窗口的最大值。
當 cwnd < rwnd 時,則是網絡的擁塞限制發送窗口的最大值。 
1.2 滑動窗口
發送端已發送了 400 字節的數據,但只收到對前 200 字節數據的確認,同時窗口大小不變。還可發送 300 字節。
 


 
發送端收到了對方對前 400 字節數據的確認,但對方通知發送端必須把窗口減小到 400 字節。現在發送端最多還可發送 400 字節的數據。
下面是另一個例子說明利用滑動窗口機制進行流量控制:

  設A向B發送數據。在連接建立時,B告訴了A:“我的接收窗口是 rwnd = 400 ”(這裏的 rwnd 表示 receiver window) 。因此,發送方的發送窗口不能超過接收方給出的接收窗口的數值。請注意,TCP的窗口單位是字節,不是報文段。TCP連接建立時的窗口協商過程在圖中沒有顯示出來。再設每一個報文段爲100字節長,而數據報文段序號的初始值設爲1。大寫ACK表示首部中的確認位ACK,小寫ack表示確認字段的值ack。

    從圖中可以看出,B進行了三次流量控制。第一次把窗口減少到 rwnd = 300 ,第二次又減到了 rwnd = 100 ,最後減到 rwnd = 0 ,即不允許發送方再發送數據了。這種使發送方暫停發送的狀態將持續到主機B重新發出一個新的窗口值爲止。B向A發送的三個報文段都設置了 ACK = 1 ,只有在ACK=1時確認號字段纔有意義。

    TCP爲每一個連接設有一個持續計時器(persistence timer)。只要TCP連接的一方收到對方的零窗口通知,就啓動持續計時器。若持續計時器設置的時間到期,就發送一個零窗口控測報文段(攜1字節的數據),那麼收到這個報文段的一方就重新設置持續計時器。

1.3 必須考慮傳輸速率

    可以用不同的機制來控制TCP報文段的發送時機。如: <1>. TCP維持一個變量,它等於最大報文段長度MSS。只要緩存中存放的數據達到MSS字節時,就組裝成一個TCP報文段發送出去。<2>. 由發送方的應用進程指明要求發送報文段,即TCP支持的推送( push )操作。<3>. 發送方的一個計時器期限到了,這時就把已有的緩存數據裝入報文段(但長度不能超過MSS)發送出去。

    Nagle算法:若發送應用進程把要發送的數據逐個字節地送到TCP的發送緩存,則發送方就把第一個數據字節先發送出去,把後面到達的數據字節都緩存起來。當發送方接收對第一個數據字符的確認後,再把發送緩存中的所有數據組裝成一個報文段再發送出去,同時繼續對隨後到達的數據進行緩存。只有在收到對前一個報文段的確認後才繼續發送下一個報文段。當數據到達較快而網絡速率較慢時,用這樣的方法可明顯地減少所用的網絡帶寬。Nagle算法還規定:當到達的數據已達到 發送窗口大小的一半或已達到報文段的最大長度時,就立即發送一個報文段。

    另,糊塗窗口綜合證: TCP接收方的緩存已滿,而交互式的應用進程一次只從接收緩存中讀取1字節(這樣就使接收緩存空間僅騰出1字節),然後向發送方發送確認,並把窗口設置爲1個字節(但發送的數據報爲40字節的的話)。接收,發送方又發來1個字節的數據(發送方的IP數據報是41字節)。接收方發回確認,仍然將窗口設置爲1個字節。這樣,網絡的效率很低。要解決這個問題,可讓接收方等待一段時間,使得或者接收緩存已有足夠空間容納一個最長的報文段,或者等到接收方緩存已有一半空閒的空間。只要出現這兩種情況,接收方就發回確認報文,並向發送方通知當前的窗口大小。此外,發送方也不要發送太小的報文段,而是把數據報積累成足夠大的報文段,或達到接收方緩存的空間的一半大小。

 
2. 擁塞控制
擁塞控制是防止傳輸數據的聯絡層網絡出擁塞時數據大量丟失的情況。
擁塞避免主要包含以下2個內容:
(1)慢開始,擁塞避免
(2)快重傳,快恢復

2.1 慢開始和擁塞避免
2.1.1 慢開始原理
(1)在主機剛剛開始發送報文段時可先將擁塞窗口 cwnd 設置爲一個最大報文段 MSS 的數值。
(2)在每收到一個對新的報文段的確認後,將擁塞窗口增加至多一個 MSS 的數值。
(3)用這樣的方法逐步增大發送端的擁塞窗口 cwnd,可以使分組注入到網絡的速率更加合理。
2.1.2 實例講解
 

注:圖中窗口的單位都是報文段
(1)當 TCP 連接進行初始化時:
發送窗口:swnd = 1 
慢開始閾值:ssthresh = 16
(2)發送端收到 ACK1 (確認 M0,期望收到 M1)後,將 cwnd 從 1 增大到 2,於是發送端可以接着發送 M1 和 M2 兩個報文段(指數增長)
(3)接收端發回 ACK2 和 ACK3。發送端每收到一個對新報文段的確認 ACK,就把發送端的擁塞窗口加 1。現在發送端的 cwnd 從 2 增大到 4,並可發送 M4 ~ M6共 4個報文段。(指數增長)
(4)當swnd >= ssthresh,swnd執行擁塞避免算法,swnd窗口按線性規律增長。 (加法增大)
(5)當發送 超時,此時swnd = 24 :
ssthresh = swnd/2 = 12;(乘法減小)
swnd = 1
(6)重複地2步。
2.2 快重傳和快恢復
2.2.1 快重傳
發送端只要一連收到三個重複的 ACK 即可斷定有分組丟失了,就應立即重傳丟失的報文段而不必繼續等待爲該報文段設置的重傳計時器的超時
2.2.2 快恢復
(1) 當發送端收到連續三個重複的 ACK 時,就重新設置慢開始門限 ssthresh。
(2) 與慢開始不同之處是 swnd 不是設置爲 1,而是設置爲 ssthresh + 3 * MSS。 
(3) 若收到的重複的 ACK 爲 n 個(n > 3),則將 cwnd 設置爲 ssthresh + n * MSS。
(4) 若發送窗口值還容許發送報文段,就按擁塞避免算法繼續發送報文段。
(5) 若收到了確認新的報文段的 ACK,就將 swnd 縮小到 ssthresh。
更多網絡知識:計算機網絡知識總結
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章