MPTCP 源碼分析(七) 擁塞控制

簡述算法

     MPTCP的擁塞控制對TCP的擁塞控制的線性增長階段進行了修改,而慢啓動,快速重傳、
快速恢復都沒有改變。每條子路徑擁有本身的cwnd,MPTCP的擁塞算法主要關心cwnd的改變。
 
擁塞算法設計原則
  1. MPTCP的Throughput 要達到MPTCP中全部子路徑中最好的一條路徑
  2. MPTCP應該和普通TCP同樣從共享資源中得到相同資源
  3. 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
相關文章
相關標籤/搜索