TCP擁塞
TCP擁塞控制機制
端到端的擁塞控制機制
- 路由器不向主機有關擁塞的反饋信息
- 路由器的負擔較輕
- 符合網絡核心簡單的TCP/IP架構原則
- 端系統根據自身得到的信息,判斷是否發生擁塞,從而采取動作
擁塞控制的幾個問題
- 如何檢測擁塞
- 輕微擁塞
- 擁塞
- 控制策略
- 在擁塞發送時如何動作,降低速率
- 輕微擁塞,如何降低
- 擁塞時,如何降低
- 在擁塞緩解時如何動作,增加速率
- 在擁塞發送時如何動作,降低速率
TCP擁塞感知
發送端如何探測到擁塞
- 某個段超時了(丟失事件 ):擁塞
- 超時時間到,某個段的確認沒有來
- 原因1:網絡擁塞(某個路由器緩沖區沒空間了,被丟棄)概率大
- 原因2:出錯被丟棄了(各級錯誤,沒有通過校驗,被丟棄)概率小
- 一旦超時,就認為擁塞了,有一定誤判,但是總體控制方向是對的
- 有關某個段的3次重復ACK:輕微擁塞
- 段的第1個ack,正常,確認綠段,期待紅段
- 段的第2個重復ack,意味著紅段的后一段收到了,藍段亂序到達
- 段的第2、3、4個ack重復,意味著紅段的后第2、3、4個段收到了 ,橙段亂序到達,同時紅段丟失的可能性很大(后面3個段都到了, 紅段都沒到)
- 網絡這時還能夠進行一定程度的傳輸,擁塞但情況要比上面好
TCP速率控制方法
如何控制發送端發送的速率
- 維持一個擁塞窗口的值(主要手段) :CongWin (表示發送方往網絡中的注入字節數)
- 發送端限制 已發送但是未確認 的數據量(的上限): LastByteSent - LastByteAcked ≤ CongWin
- 從而粗略地控制發送方的往網絡中注入的速率
- CongWin是動態的,是感知到的網絡擁塞程度的函數
- 超時或者3個重復ack,CongWin下降
- 超時時:CongWin降為1MSS,進入SS階段然后再倍增到 CongWin(原) / 2(每個RTT),從而進入CA階段
- 3個重復ack :CongWin降為CongWin/2,CA階段
- 否則(正常收到Ack,沒有發送以上情況):CongWin躍躍欲試上升(這是為了滿足“在不發生擁塞的情況下提高吞吐率”的目的)
- 超時或者3個重復ack,CongWin下降
TCP擁塞控制和流量控制的聯合動作
聯合控制的方法
- 發送端控制發送但是未確認的量同時也不能超過接收窗口,滿足流量控制要求
- SendWin = min { CongWin , RecvWin }
- 同時滿足 擁塞控制和流量控制要求
TCP慢啟動
- 連接剛建立, CongWin = 1 MSS
- 如: MSS = 1460bytes & RTT = 200 msec
- 初始速率 = 58.4kbps
- 可用帶寬可能 >> MSS/RTT
- 應該盡快加速,到達希望的速率
- 當連接開始時,指數性增加發送速率,直到發生丟失的事件
- 啟動初值很低
- 但是速度很快
- 當連接開始時,指數性增 加(每個RTT)發送速率 直到發生丟失事件
- 每一個RTT, CongWin加倍
- 每收到一個ACK時, CongWin加1(相當于每個RTT,CongWin加倍)
- 慢啟動階段:只要不超時或 3個重復ack,一個RTT, CongWin加倍
- 總結:
- 初始速率很慢,但是加速卻是指數性的
- 指數增加,SS時間很短,長期來看可以忽略
AIMD
- 乘性減: 丟失事件后將CongWin降為1(ss階段通常可忽略,故相當于直接減少到 CongWin/2 ),將CongWin/2作為閾值,進入慢啟動階段(倍增直到 CongWin/2)
- 加性增: 當 CongWin >閾值時,一個 RTT 如沒有發生丟失事件,將 CongWin 加1MSS : 探測(也就是主鍵添加,探測是否到達閾值)
改進
- Q:什么時候應該將指數性增長變成線性?
- A:在超時之前,當CongWin變成上次發生超時的窗口的一半
實現:
- 變量:Threshold
- 出現丟失(超時或者3個ACK),Threshold設置成CongWin的1/2
總結:TCP擁塞控制
- 當CongWin<Threshold, 發送端處于慢啟動階段( slow-start), 窗口指數性增長.
- 當CongWin > Threshold, 發送端處于擁塞避免階段 (congestion-avoidance), 窗口線性增長.
- 當收到三個重復的ACKs (triple duplicate ACK), Threshold設置成 CongWin/2, CongWin=Threshold+3.
- 當超時事件發生時timeout, Threshold=CongWin/2 CongWin=1 MSS,進入SS階段
TCP發送端擁塞控制
事件 | 狀態 | TCP發送端行為 | 解釋 |
---|---|---|---|
以前沒有收到ACK的data,被ACKed | 慢啟動(SS) | CongWin = CongWin + MSS,If (CongWin > Threshold),狀態變成“CA” | 每一個RTT CongWin 加倍 |
以前沒有收到ACK的data,被ACKed 擁塞避免(CA) | CongWin = CongWin+MSS * (MSS/CongWin) | 線性增加, 每一個RTT對CongWin 加一個1 MSS | |
通過收到3個重復的ACK,發現丟失的事件 | SS or CA | Threshold = CongWin/2, CongWin = Threshold+3, 狀態變成“CA” | 快速重傳, 實現乘性的減,CongWin 沒有變成1MSS. |
超時 | SS or CA | Threshold = CongWin/2,CongWin = 1 MSS,狀態變成“SS” | 進入slow start |
重復的ACK | SS or CA | 對被ACKed 的segment, 增加重復ACK的計數 | CongWin and Threshold不變 |
TCP擁塞控制FSM
TCP吞吐量
TCP的平均吞吐量是多少,使用窗口window尺寸W和RTT來 描述?
(忽略慢啟動階段,假設發送端總有數據傳輸)
- W:發生丟失事件時的窗口尺寸(單位:字節)
- 平均窗口尺寸(#in-flight字節):3/4W
- 平均吞吐量:一個RTT時間吞吐3/4W, avg TCP thruput = 3/4 * (W/RTT) bytes/sec
由下圖所示,w/2→w所需要的時間是2RTT
因此 T = (w/2 + w) / (2*RTT) = 3w/4RTT
TCP 公平性
公平性目標: 如果 K個TCP會話分享一個鏈路帶寬為R的 瓶頸,每一個會話的有效帶寬為 R/K
2個競爭的TCP會話:
公平性和 UDP
- 多媒體應用通常不是用 TCP
- 應用發送的數據速率希望 不受擁塞控制的節制
- 使用UDP:
- 音視頻應用泵出數據的速率是恒定的, 忽略數據的丟失
也就是UDP會搶占TCP的資源
- 音視頻應用泵出數據的速率是恒定的, 忽略數據的丟失
公平性和并行TCP連接
- 2個主機間可以打開多個并行的TCP連接
- 例如: 帶寬為R的鏈路支持了 9個連接;
- 如果新的應用要求建1個TCP連接,獲得帶寬R/10
- 如果新的應用要求建11個TCP連接,獲得帶寬R/2