TCP擁塞控制

2021-08-28 06:17:40 字數 2440 閱讀 4809

路由器因無法處理高速率到達的流量而被迫丟棄資料資訊的現象稱為擁塞。即使僅有一條通訊連線,也可能造成乙個甚至多個路由器擁塞,若不採取對策,網路效能將受到很大影響以致癱瘓(最壞情況下甚至形成擁塞崩潰)。為避免或在一定程度上緩解這種狀況,tcp規定通訊的每一方都要實行擁塞控制機制。

針對丟包現象,tcp採取的首要措施是重傳,包括超時重傳和快速重傳。但簡單的重傳有時候會帶來更糟糕的結果。假設當網路處於擁塞崩潰狀態時,共用一條網路傳輸路徑的多個tcp連線卻重傳更多的資料,反而會火上澆油,讓本就不堪重負的網路更加擁塞。

在tcp中,丟包被用作判斷擁塞發生與否的指標,用來衡量是否應該實施相應的響應措施來避免或至少減緩擁塞。其他擁塞探測方法,如時延測量和顯式擁塞通知(ecn)會使tcp能在丟包發生前檢測擁塞。

tcp的可變滑動視窗機制可以幫助減緩資料的傳送量,tcp頭部設定了通知視窗大小字段。此外基於網路傳輸能力的估計,tcp還在傳送端引入了乙個視窗控制變數,確保傳送視窗大小不超過接收端接收能力和網路傳輸能力,即tcp傳送端的傳送速率等於接收速率和傳輸速率中的較小者。

反映網路傳輸能力的變數稱為擁塞視窗(congestion window),簡記為cwnd。因此,傳送端的實際可用視窗值w就是接收端通知視窗awnd和擁塞視窗cwnd的較小者:

w = min(awnd, cwnd)

由於網路的變化,通知視窗awnd和擁塞視窗cwnd並不是固定的值,需要根據經驗設定並需動態調節。如何設定視窗大小這一問題研究出很多經典演算法,如慢啟動、快重傳、快恢復等。

當乙個新的tcp連線建立之初,還無法獲知可用的傳輸資源,所以cwnd的初始值也無法確定(有些系統的快取容量是預先設定的,這種情況下的cwnd值可以確定)。tcp通過與接收端交換乙個資料報就能獲得awnd的值,但cwnd不一樣,因為網路傳輸能力一直都在變化。顯然,獲得cwnd最佳值的唯一方法就是試探——以越來越快的速率不斷傳送資料,直到出現資料報丟失(或網路擁塞)為止。這時還應考慮立即以可用的最大速率傳送(受awnd的限制)或是慢速啟動傳送。由於多個tcp連線共享網路傳輸路徑,一開始就以全速啟動會影響其他連線的傳輸效能,所以通常會避免過快啟動,直至穩定傳輸後。

當乙個新的tcp連線建立或檢測到超時重傳(rto)導致丟包時,需要執行慢啟動(tcp傳送端長時間處於空閒狀態也可能觸發慢啟動)。慢啟動的目的是,使tcp在用擁塞避免探尋更多可用頻寬之前得到cwnd值,以及幫助tcp建立ack時鐘。

tcp以傳送一定數目的資料段開始慢啟動(在syn交換之後),稱為初始視窗(initial window,iw)。iw的值通常設為1smss(傳送方的最大段大小),也有一些實現根據smss的大小賦予不同初始值。

假設沒有出現丟包情況且每個資料報都有對應的ack,慢啟動演算法會以二進位制指數增加cwnd的值,即由1變2,由2變4,依此類推,在k輪w的值為2^k。這種二進位制指數增長看似很快,但與一開始就允許以最大可用速率(接收方通知視窗大小awnd)傳送相比仍顯緩慢,特別在一些bdp較大的高速網路中,傳統慢啟動演算法要達到鏈路飽和狀態耗時太長,此時需要調整慢啟動演算法以適應這種高速鏈路。

慢啟動闕值ssthresh和擁塞視窗大小cwnd的關係決定了是採用慢啟動還是擁塞控制。當cwnd<ssthresh,使用慢啟動演算法;當cwnd>ssthresh,使用擁塞避免演算法;兩者相等時任何一種都可以使用。慢啟動闕值不是固定的,它會記住上一次「最好的」操作視窗估計值,即記錄tcp最優視窗估計值的下界。

ssthresh = max(在外資料值/2, 2*smss)

新的實現中,公式變為:ssthresh = max(min(cwnd, awnd)/2, 2*smss)

在慢啟動階段,cwnd會快速增長以幫助tcp確定乙個慢啟動闕值(slow start threshold),即ssthresh。一旦達到闕值,為了更精細地確認網路傳輸能力上限,得到更多的傳輸資源而不致影響其他連線傳輸,將會啟動擁塞避免演算法。在擁塞避免階段,cwnd的增長值近似於成功傳輸的資料段大小,這種近似的隨時間線性增長的方式與慢啟動的指數增長相比緩慢許多。

擁塞避免演算法假設由位元錯誤導致丟包的概率很小(遠小於1%),因此有丟包發生就認為從傳送方到接收方的傳輸路徑中必然有某處出現了擁塞。

在擁塞避免階段,如果出現了丟包,假設丟包原因為超時,cwnd的值將被設為上乙個ssthresh(大多數情況下,超時仍是引發慢啟動的主要原因),重新進入慢開始過程。有的版本則直接將cwnd恢復為初始值,這對於有較大bdp的鏈路來說會使得頻寬利用率低下。

若收到重複ack的數量超過其闕值dupthresh(或其他表明需要快速重傳的訊號)時,將會執行快速重傳和快速恢復演算法。

在啟動快速恢復後,cwnd的值將設為ssthresh+3*smss,每接收乙個重複ack,cwnd值暫時增加1smss,當接收到乙個好的ack時,則將cwnd重設為ssthresh。

reno版本的tcp擁塞控制完整過程如下圖所示:

TCP擁塞控制

擁塞控制就是防止過多的資料注入到網路中,這樣可以使網路中的路由器或鏈路不致過載,擁塞控制要做的都有個前提,就是網路能夠承受現有的網路負荷。擁塞控制是個全域性性的過程。幾種擁塞控制方法 慢開始 擁塞避免 快重傳 快恢復 1.慢開始和擁塞避免 傳送方維持乙個叫做擁塞視窗的狀態變數,擁塞視窗取決於網路的擁...

TCP擁塞控制

計算機網路中的頻寬 交換結點中的快取和處理機等,都是網路的資源。在某段時間,若對網路中某一資源的需求超過了該資源所能提供的可用部分,網路的效能就會變壞。這種情況就叫做擁塞。擁塞控制就是防止過多的資料注入網路中,這樣可以使網路中的路由器或鏈路不致過載。擁塞控制是乙個全域性性的過程,和流量控制不同,流量...

TCP 擁塞控制

我們都知道 tcp 是傳輸層的協議,網路請求經過傳輸層到達網路層之後是通過 ip 包進行傳輸的。如果我們傳送方大量的 ip 包的時候,有可能我們的鏈路資源有限,那麼我們的 ip 包就有可能丟失或者被丟棄,這樣我們的請求就不是絕對安全的,那接下來我們就說一下,tcp是如何處理前面的情況的。一 什麼是網...