MPTCP是一个全新的古老协议,从效果上看,它对标准TCP的扩展主要体现在两方面:
似乎人们对多路径切换更感兴趣,几乎所有MPTCP的资料上都会介绍MPTCP在Wi-Fi和3G之间的透明切换能力,但有趣的是,定义MPTCP的RFC6182中(详见Section 2. Goals1)并没有提到这一点,路径备份似乎是一个附加的功能。
从本质(而不是从表面)上看,MPTCP是一个支持流量调度的资源分配协议。MPTCP将同一连接的每条路径上的数据流抽象成subflow,将所有的subflow路径上的带宽看作一个资源池,在该资源池中进行动态流量调度。
池化带宽资源,是分组交换网统计复用的极致体现。引用一段MPTCP网站blog的原话:
Since the early days of computer networks, statistical multiplexing, failure resilience and load balancing have played a key role in enabling networks to carry a growing amount of traffic. However, many of the techniques that are used today were designed under the assumption that they needed to have a local impact. Many of these designs missed the opportunity of considering the problem of pooling all the available resources as an end-to-end problem. 2
对此,先来个感官上的认识。
两条连接A和B,两条100Mbps的路径供它们使用,先看标准TCP的带宽分配情况:
但如果部署了MPTCP,在带宽资源分配上将更具弹性:
面对池化的带宽资源,MPTCP的核心任务就是资源分配和流量调度,目标就是最大化资源利用率。
互联网协议必须遵守公平原则,作为需要长期与标准TCP混部的MPTCP,TCP友好性必须是其一个内在特征,MPTCP必须在保证不损害标准TCP的前提下,最大化带宽资源利用率。这个任务最终由MPTCP Congestion Control负责。
为了理解这一切背后的动力学,先看MPTCP Congestion Control的三大目标:
下文将基于MPTCP Coupled Congestion Control算法介绍。
将所有可用subflow path视为一整体,统一实施AIMD。设一条MPTCP连接的subflow set为 R R R, w r w_r wr为subflow r r r的cwnd,则:
w t o t a l = Σ r ∈ R w r w_{total}=\Sigma_{r\in R}w_r wtotal=Σr∈Rwr
因此,最朴素的MPTCP AIMD算法显而易见,对于所有subflow:
丢包包括拥塞丢包和随机丢包,一条subflow subpath丢包率高表现为buffer过小或线路噪声大,无论如何均会导致该subpath的cwnd过小,天然满足了MPTCP的目标3。
总体来讲,目标3只需要利用为拥塞subflow计算一个较小的cwnd即可满足,这是对反馈环的利用。The way to achieve resource pooling is to effectively “couple” the congestion control loops for the different subflows.
但以上算法存在以下问题:
为避免高丢包率subflow被饿死,MD行为需要修正,不再MD等量cwnd,改为MD与该subflow cwnd等比例的cwnd:
公平性的保证稍微复杂些,需要额外的约束。
将MPTCP的目标1和目标2的约束写成数学形式:
解法如下:
用数学表述即:
求解 α \alpha α即可。
下面将用两种方法推导出 α \alpha α的值,首先采用MPTCP论文里的方法3,然后介绍我自己的方法。
按照Design, implementation and evaluation of congestion control for multipath TCP这篇论文中的简化模型推导,如下:
设 p r p_r pr为subflow path r r r的丢包率,按照数据包守恒,AI和MD速率需要相互抵消:
( w r R T T r ( 1 − p r ) ) α w t o t a l = ( w r R T T r p r ) w r 2 (\dfrac{w_r}{RTT_r}(1-p_r))\dfrac{\alpha}{w_{total}}=(\dfrac{w_r}{RTT_r}p_r)\dfrac{w_r}{2} (RTTrwr(1−pr))wtotalα=(RTTrwrpr)2wr
对于 p r p_r pr非常小情况,可以近似为:
α w t o t a l ≈ p r w r 2 \dfrac{\alpha}{w_{total}}\approx p_r\dfrac{w_r}{2} wtotalα≈pr2wr
对于标准TCP,设丢包率为 p p p,通过类似的守恒律:
( 1 − p ) 1 w r T C P = p w r T C P 2 ≈ 1 w r T C P (1-p)\dfrac{1}{w_r^{TCP}}=p\dfrac{w_r^{TCP}}{2}\approx \dfrac{1}{w_r^{TCP}} (1−p)wrTCP1=p2wrTCP≈wrTCP1
因此:
p = 2 w r T C P 2 p=\dfrac{2}{w_r^{ {TCP}^2}} p=wrTCP22
对于特定subflow path的标准TCP,上式就是丢包率 p p p和 w r T C P w_r^{TCP} wrTCP的关系,将 p p p代入 p r p_r pr得到:
w r T C P 2 = w t o t a l w r α w_r^{ {TCP}^2}=\dfrac{w_{total}w_r}{\alpha} wrTCP2=αwtotalwr
将 w r T C P w_r^{TCP} wrTCP的表达式代入目标约束1:
( Σ r ∈ R w r R T T r ) 2 ≥ w t o t a l α max r ∈ R w r R T T r 2 (\Sigma_{r\in R}\dfrac{w_r}{RTT_r})^2\geq\dfrac{w_{total}}{\alpha}\max_{r\in R}{\dfrac{w_r}{RTT_r^2}} (Σr∈RRTTrwr)2≥αwtotalmaxr∈RRTTr2wr
解出 α \alpha α:
α = max { w r R T T r 2 } ( Σ r ∈ R w r R T T r ) 2 \alpha=\dfrac{\max\{\dfrac{w_r}{RTT_r^2}\}}{(\Sigma_{r\in R}\dfrac{w_r}{RTT_r})^2} α=(Σr∈RRTTrwr)2max{ RTTr2wr}
以上就是MPTCP Coupled Congestion Control算法的介绍以及AIMD系数的推导过程。
下面是我理解的另一个视角来推导AI系数 α \alpha α。
根据目标1约束,设吞吐率为 T T T,最佳subflow path的吞吐为,:
T b e s t = max r ∈ R { w r R T T r } T_{best}=\max_{r\in R}\{\dfrac{w_r}{RTT_r}\} Tbest=maxr∈R{ RTTrwr}
如果让该MPTCP flow所有subflow均从该path通过,则其吞吐为:
T t o t a l = w t o t a l R T T b e s t T_{total}=\dfrac{w_{total}}{RTT_{best}} Ttotal=RTTbestwtotal
同时,最佳subflow path在MPTCP中的吞吐率实际占比为:
P b e s t = T b e s t Σ r ∈ R w r R T T r P_{best}=\dfrac{T_{best}}{\Sigma_{r\in R}\dfrac{w_r}{RTT_r}} Pbest=Σr∈RRTTrwrTbest
若以最佳subflow作为标准吞吐,平均分给所有的subflow,那么每一个subflow将分得:
T a v g = T t o t a l × P b e s t = w t o t a l max r ∈ R w r R T T r 2 T_{avg}=T_{total}\times P_{best}=w_{total}\max_{r\in R}\dfrac{w_r}{RTT_r^2} Tavg=Ttotal×Pbest=wtotalmaxr∈RRTTr2wr
现在问,总吞吐 Σ r ∈ R w r R T T r \Sigma_{r\in R}\dfrac{w_r}{RTT_r} Σr∈RRTTrwr如何分割才能获得 T a v g T_{avg} Tavg:
α ′ × Σ r ∈ R w r R T T r = T a v g = w t o t a l max r ∈ R w r R T T r 2 \alpha'\times \Sigma_{r\in R}\dfrac{w_r}{RTT_r}=T_{avg}=w_{total}\max_{r\in R}\dfrac{w_r}{RTT_r^2} α′×Σr∈RRTTrwr=Tavg=wtotalmaxr∈RRTTr2wr
解出 α ′ \alpha' α′:
α ′ = max { w r R T T r 2 } ( Σ r ∈ R w r R T T r ) 2 \alpha'=\dfrac{\max\{\dfrac{w_r}{RTT_r^2}\}}{(\Sigma_{r\in R}\dfrac{w_r}{RTT_r})^2} α′=(Σr∈RRTTrwr)2max{ RTTr2wr}
由于吞吐率和cwnd是同步变化的,AI系数 α \alpha α可取 α ′ \alpha' α′:
α = α ′ \alpha=\alpha' α=α′
和论文里的推导方法殊途同归,并且不再假设稳定平衡态AI,MD速率守恒。
以上只是MPTCP基本的Coupled Congestion Control算法,这只是多种CCA中的一种,还有很多诸如OLIA,BALIA,wVegas算法可供参考和研究,但目标不会改变。理解了MPTCP的3个目标,所有这些算法也就都成了细节,同时下面的问题也将不再是问题:
最后,无论多么优秀的算法,最终都是要落实到CPU cycles,这个时候算法的效能就成了首先要考虑的了,然而通过上述论证中看到的诸多 max { . . . } \max\{...\} max{ ...}, min { . . . } \min\{...\} min{ ...}, Σ \Sigma Σ算符就可以看到隐含的 O ( n ) O(n) O(n)时间复杂度,特别是在subflow数量特别多的时候,问题将会更加严重。如何优化它们将会是一件非常有意思的事情,只是它们不是本文的重点,后面有时间会接着谈。对于本文而言,也到了要结束的时候了。
有几个关于MPTCP有点儿意思的话题,在文末点一下,不深究:
参考:
浙江温州皮鞋湿,下雨进水不会胖。
https://datatracker.ietf.org/doc/html/rfc6182 ↩︎
http://blog.multipath-tcp.org/blog/html/2018/12/03/the_multipath_tcp_foundations.html ↩︎
https://www.usenix.org/legacy/events/nsdi11/tech/full_papers/Wischik.pdf ↩︎