1. 程式人生 > >(TCP/IP的特性二)流量控制&阻塞控制

(TCP/IP的特性二)流量控制&阻塞控制

TCP流量控制之滑動視窗協議:

    TCP協議中,傳送方和接收方均維護了一份視窗,視窗的大小就是TCP可以傳送的資料幀數,在傳送端,只有在傳送視窗內的資料才允許被髮送到接收端,而在接收端,也只有落到接收視窗的資料才允許被接收。這樣通過不斷滑動視窗實現資料的不斷髮送,也通過控制視窗的大小實現了流量控制。

    滑動視窗的大小是由接收方資料緩衝區大小決定的,在連線建立時接收端便會將這些資訊傳送給傳送端,然後傳送端據此設定自己的滑動視窗大小。當然隨著鏈路網路環境等變化,滑動視窗也是會變化的,以達到最優傳輸效率。


由上圖我們可以總結滑動視窗的處理機制:

①視窗大小為6,最初在視窗內的為1/2/3/4/5/6六段資料報,此時TCP將六段資料報傳送至接收端

②1,2,3三段資料報接收到了ack返回,4,5,6暫未收到ack,此時TCP認為1,2,3已被處理完成,則視窗向右滑動三格

③此時7/8/9三段資料報進入滑動視窗範圍,則TCP可將7,8,9傳送至接收端

④待4,5,6的ack報文收到,視窗將繼續向右滑動,TCP根據此滑動視窗機制保證了資料不斷髮送至接收端,同時又充分考慮了接收端的接收效率,不至於導致不必要的網路堵塞


TCP阻塞控制之阻塞視窗:

    滑動視窗機制用於區域網傳輸是可以的,但是在廣域網中可能存在網路堵塞問題,由於在傳送端、接收端中間的網路情況是未知的,我們還需要確定傳輸雙方之間網路的最大吞吐能力,因此TCP維護了一個阻塞視窗。阻塞視窗的實現運用了多種演算法,在連線建立初期,使用慢啟動方法進行控制:

①慢啟動初始阻塞視窗為1,每次經歷過一個傳輸輪次(將當前整個視窗中所有資料報都傳輸完畢,接收到ACK,稱為一個傳輸輪次)視窗大小翻倍,因此在慢啟動初期,視窗大小將呈指數級增長

②TCP給慢啟動設定了一個閾值,稱為慢啟動門限(初始值為16),分為三種情況,當視窗大小小於門限時,採用慢啟動方法,當視窗大小大於門限時採用擁塞避免演算法(每經過一個傳輸輪次視窗大小+1),當視窗大小等於門限時, 可採用慢啟動演算法也可採用擁塞避免演算法

通過以上兩種演算法,tcp逐漸找到了最適合當前網路傳輸環境的阻塞視窗大小,避免了瞬間大量資料湧入網路導致網路堵塞。我們平時下載的時候,也可以看到下載速度是逐漸增加直到峰值的,便是運用了這兩種演算法。

異常情況之定時器超時:

當網路傳輸視窗逐步趨於穩定,傳輸過程中忽然出現了資料超時,即傳送的資料超時仍未收到ACK資訊,此時說明網路環境有變,需要重新設定阻塞視窗,TCP將會採用加速遞減機制:

①將阻塞視窗門限值設定為當前視窗大小一半,滑動視窗大小設定為1

②執行慢啟動機制重新找到合適的視窗大小

異常情況之報文失序返回重複ACK:

當網路丟包導致報文失序時,TCP將會採用快重傳&快恢復策略,快重傳機制要求接收方每收到一個失序的TCP資料報就立刻發出重複ack確認,而不要等到自己傳送資料時才傳送確認(TCP在普通情況下,為了減少網路傳輸資源消耗,ack報文一般隨著下一次的返回報文一塊傳送而不是單獨返回ack),而接收方在連續收到3個重複ack後將立即重傳未被確認的報文段。

而收到3個重複ACK時,將執行“乘法減小”演算法,將慢啟動門限減半,但接下去不執行慢啟動演算法,不將阻塞視窗設定為1,,而是設定為當前慢啟動門限大小(即原來的一半),然後執行擁塞避免演算法,使阻塞視窗線性增大


總結來說,TCP/IP協議中的滑動視窗主要是根據傳送、接收雙方的資料緩衝區處理能力設定了一個限制,而阻塞視窗是根據傳送、接收雙方之間的網路情況設定的閾值限制,並利用多種演算法使得能快速找到最適合當前網路情況的阻塞視窗大小。通過兩種機制,實現了TCP的流量控制、阻塞控制