简述算法
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