通訊網路/TCP 和 UDP 協議/擁塞控制
介紹
當源傳送的資料包數量超過目標所能處理的數量時,就會發生擁塞。當發生擁塞時,效能會下降。擁塞發生在目標端緩衝區填滿時。資料包通常在轉發到其上層之前,臨時儲存在源和目標的緩衝區中。
什麼是擁塞?
假設我們正在觀察目標。如果源傳送的資料包數量超過目標緩衝區所能處理的數量,就會發生擁塞。當發生擁塞時,目標對到達的資料包只有兩個選擇,丟棄或保留。如果目標丟棄新到達的資料包並保留舊資料包,則這種機制被稱為“Y”模型。如果目標丟棄舊資料包並用新資料包填充它們,則這種機制被稱為“牛奶”模型。在這兩種情況下,資料包都會被丟棄。檢測擁塞的兩種常見方法是超時和重複確認。
擁塞控制
擁塞控制可用於計算傳送方可以在網路上傳送給接收方的資料量。確定資料量並不容易,因為頻寬會隨著時間推移而變化,連線也會斷開和重新連線。基於這些因素,傳送方應該能夠調整流量。TCP 擁塞控制演算法用於檢測和控制擁塞。以下是我們將要討論的擁塞演算法。
- 加性增長/乘性減小。
- 慢啟動
- 擁塞避免
- 快速重傳
- 快速恢復
加性增長/乘性減小
此演算法用於網路的傳送方。擁塞視窗 SSIZE 是傳送方在收到 ACK 之前可以傳送到網路中的資料量。通告視窗 RSIZE 是接收方可以接收的網路上的資料量。TCP 源根據網路上的擁塞程度設定擁塞視窗。這是透過在擁塞增加時減小擁塞視窗,在擁塞減少時增大擁塞視窗來實現的。這種機制通常被稱為加性增長/乘性減小。
源根據資料包丟失來確定擁塞。資料包丟失是在發生超時時確定的。源等待直到超時時間才能收到確認。在正常情況下,資料包不會丟失,因此源假設發生超時時就發生了擁塞。每當發生超時時,源都會將 SSIZE 設定為先前值的二分之一。這種機制被稱為乘性減小。如果超時持續發生,視窗大小將一直減小,直到大小變為 1。這是因為擁塞視窗的最小值為 1。當傳送方確定沒有發生擁塞時,它會將擁塞視窗增加 1。這種增加是在每次傳送方成功收到 ACK 後發生的,如下所示。 File:Congestion1.jpg
慢啟動
加性增長/乘性減小方法的主要缺點是,傳送方在檢測到擁塞時將擁塞視窗減小一半,而對於每個成功收到的 ACK 只增加 1。如果視窗大小很大,或者擁塞視窗大小從 1 開始增加,那麼我們將浪費許多擁塞視窗。慢啟動演算法用於解決這個每次只增加 1 的問題。SSIZE 是傳送方在收到 ACK 之前可以傳送到網路中的資料量。RSIZE 是接收方可以接收的網路上的資料量。SSTHOLD 是用於控制網路上資料流量的慢啟動閾值。當 SSIZE 小於閾值 SSTHOLD 時,使用慢啟動演算法。在開始時,傳送方不知道要傳送多少資料。它必須找到要傳送多少資料。最初,SSIZE 必須小於或等於 2*SMSS 位元組,並且不能超過 2 個段。隨著資料包的傳送,SSIZE 會呈指數增長,直到 SSIZE 大於 SSTHOLD 或檢測到擁塞。
當傳送方檢測到擁塞時,它會將擁塞視窗減小到先前值的一半。同樣,慢啟動演算法用於增加擁塞視窗。
擁塞避免
SIZE 是傳送方在收到 ACK 之前可以傳送到網路中的資料量。RSIZE 是接收方可以接收的網路上的資料量。SSTHOLD 是用於控制網路上資料流量的慢啟動閾值。當 SSIZE 大於閾值 SSTHOLD 時,使用擁塞避免演算法。隨著資料包的傳送,SSIZE 每往返時間增加一個完整的段。這將持續進行,直到檢測到擁塞。
快速重傳
以上三種演算法都使用超時來檢測擁塞。這裡的缺點是傳送方需要等待超時發生。為了提高擁塞檢測,傳送方使用重複 ACK。每次資料包到達接收方時,接收方都會向傳送方傳送 ACK。當資料包以亂序到達接收方時,TCP 無法立即確認資料包中包含的資料,因為先前的資料包尚未到達。接收方傳送上次傳送的相同 ACK,導致重複 ACK。這在下圖中進行了說明。
從傳送方的角度來看,重複 ACK 可能來自許多網路問題。傳送方不能假設傳送的資料包丟失了,重複 ACK 可能是由段重排序、ACK 複製或段複製觸發的。因此,傳送方等待 3 個重複 ACK 來確定資料包丟失。TCP 會在未等待重傳計時器到期的情況下,重新傳輸看起來丟失的段。
快速恢復
快速恢復演算法控制新資料的傳輸,直到收到非重複 ACK。不執行慢啟動的原因是,收到重複 ACK 不僅表明一個段已丟失,而且還表明段很可能離開了網路。快速重傳和快速恢復演算法通常一起實現,如下所示。1. 當收到第三個重複 ACK 時,將 STHOLD 設定為不超過 STHOLD = max (FlightSize / 2, 2*SMSS),其中 FlightSize 是網路中未完成資料的量。2. 重新傳輸丟失的段並將 SSIZE 設定為 STHOLD 加上 3*SMSS。這會人為地“膨脹”擁塞視窗,以反映已離開網路且接收方已緩衝的段數量(三個)。3. 對於收到的每個額外的重複 ACK,將 SSIZE 增加 SMSS。這會人為地膨脹擁塞視窗,以反映已離開網路的額外段。4. 傳輸一個段,如果新的 SSIZE 值和接收方通告的視窗允許。5. 當下一個 ACK 到達並確認了新資料時,將 SSIZE 設定為 STHOLD(在步驟 1 中設定的值)。這被稱為“壓縮”視窗。此 ACK 應該是由步驟 1 中的重新傳輸引發的確認,在重新傳輸後一個 RTT(儘管它可能在接收方存在大量亂序資料包傳輸的情況下更早到達)。此外,此 ACK 應該確認在丟失的段和收到第三個重複 ACK 之間傳送的所有中間段,如果這些段沒有丟失。
常見問題解答
是什麼導致了這種擁塞?當源傳送的資料包數量超過目標所能處理的數量時,就會發生擁塞。當發生擁塞時,效能會下降。擁塞發生在目標端緩衝區填滿時。資料包通常在轉發到其上層之前,臨時儲存在源和目標的緩衝區中。假設我們正在觀察目標。如果源傳送的資料包數量超過目標緩衝區所能處理的數量,就會發生擁塞。
發生擁塞時會發生什麼?當發生擁塞時,目標對到達的資料包只有兩個選擇,丟棄或保留。如果目標丟棄新到達的資料包並保留舊資料包,則這種機制被稱為“Y”模型。如果目標丟棄舊資料包並用新資料包填充它們,則這種機制被稱為“牛奶”模型。在這兩種情況下,資料包都會被丟棄
如何檢測擁塞?檢測擁塞的兩種常見方法是超時和重複確認。