簡述
MPTCP的擁塞控制對TCP的擁塞控制的線性增加階段進行了修改,而慢啟動,快速重傳、
快速恢復都沒有改變。每條子路徑擁有自己的cwnd,MPTCP的擁塞演算法主要關心cwnd的改變。
擁塞演算法設計原則
- MPTCP的Throughput 要達到MPTCP中所有子路徑中最好的一條路徑
- MPTCP應該和普通TCP一樣從共享資源中獲得相同資源
- MPTCP中的流量將從擁塞的子路徑轉移到不擁塞的路徑。
演算法理解
MPTCP的各個子路徑執行著正常的TCP,因此直觀的我們可以在每條子路徑上執行自己的擁塞控制演算法,
但是這樣就違背了設計原則2,這樣的效果是MPTCP的吞吐量就會超過其他正常TCP。因此有以下的演算法:
其中a的取值參考[1]。這樣的話,MPTCP就把每次cwnd的增加分攤到各個不同的子路徑上,這樣MPTCP就和正常TCP有著相同的吞吐量。
但是這樣的演算法設計存在問題,不能有效的利用網路環境,我們應該根據設計原則3,將流量移動到擁塞情況最少的路徑上去。因此有以下
的演算法:
此演算法讓各個子路徑的擁塞視窗的變化聯絡起來,比如有兩條路徑,一條路徑上面擁塞導致導致丟包嚴重,那麼不斷的減少Wtotal/2,
這樣的話,就將流量從擁塞的路徑移動到不擁塞的路徑上。但是,這個演算法存在兩個問題:
1.如果擁塞的子路徑完全沒有流量,我們就無從得知這條子路徑上擁塞情況以後是不是會改善。
2.沒有考慮到RTT的的因素,比如對於一個智慧手機來說,3G網路和WIFI相比丟包率更低,而RTT更大。
但是因為3G的擁塞情況更好,因此流量大部分會通過3G網路。而3G網路的吞吐量可能小於WIFI的吞吐量。
因此提出MPTCP的擁塞控制演算法:
此演算法通過 min操作來遵守設計原則2,通過a來保證各個子路徑上都有適當的流量,從而達到
設計原則1和3。詳細的演算法描述可以參考[2]。
MPTCP的核心實現
MPTCP會在接收每一個ACK的時候,計算演算法中的a。呼叫情況如下:
tcp_ack()
=>tcp_ca_event()
=>cwnd_event()
=>mptcp_ccc_cwnd_event()
在tcp_ack函式中也會增加cwnd,呼叫情況如下:
tcp_ack()
=>tcp_cong_avoid()
=>cong_avoid()
=> mptcp_ccc_cong_avoid()
參考資料:
[1]M. Honda, Y. Nishida, L. Eggert, P. Sarolahti, and H. Tokuda. Multipath Congestion Control for Shared Bottleneck. In Proc. PFLDNeT workshop, May 2009
[2]Design, implementation and evaluation of congestion control for multipath TCP