简述

     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

     

MPTCP 源码分析(七) 拥塞控制的更多相关文章

  1. MPTCP 源码分析(五) 接收端窗口值

    简述:      在TCP协议中影响数据发送的三个因素分别为:发送端窗口值.接收端窗口值和拥塞窗口值. 本文主要分析MPTCP中各个子路径对接收端窗口值rcv_wnd的处理.   接收端窗口值的初始化 ...

  2. ABP源码分析七:Setting 以及 Mail

    本文主要说明Setting的实现以及Mail这个功能模块如何使用Setting. 首先区分一下ABP中的Setting和Configuration. Setting一般用于需要通过外部配置文件(或数据 ...

  3. vuex 源码分析(七) module和namespaced 详解

    当项目非常大时,如果所有的状态都集中放到一个对象中,store 对象就有可能变得相当臃肿. 为了解决这个问题,Vuex允许我们将 store 分割成模块(module).每个模块拥有自己的 state ...

  4. Vue.js 源码分析(七) 基础篇 侦听器 watch属性详解

    先来看看官网的介绍: 官网介绍的很好理解了,也就是监听一个数据的变化,当该数据变化时执行我们的watch方法,watch选项是一个对象,键为需要观察的数据名,值为一个表达式(函数),还可以是一个对象, ...

  5. MPTCP 源码分析(一) MPTCP的三次握手

    简述:      MPTCP依然按照正常的TCP进行三次握手,只是在握手过程中增加了MPTCP特有的信息.   建立过程      三次握手过程如下图所示: 左边客户端发送的第一个SYN包携带有客户端 ...

  6. Heritrix源码分析(七) Heritrix总体介绍(转)

    本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/642794         本博客已迁移到本人独立博客: http://www.yun ...

  7. phpcms 源码分析七: 模板引擎实现

    这次是逆雪寒对模板引擎实现的分析: 1 /* 函数 template函数是在global.func.php 里面定义的. 在前面的phpcms 的首页 index.php 里就见到了. 用法: inc ...

  8. MPTCP 源码分析(六) 数据重发

    简述      TCP使用定时器函数tcp_retransmit_timer进行数据重发,MPTCP需要重发数据的时候, 不仅仅在原路径发送数据,而且会在另外一条子路径进行重发.这样考虑的原因是: 考 ...

  9. MPTCP 源码分析(四) 发送和接收数据

    简述:      MPTCP在发送数据方面和TCP的区别是可以从多条路径中选择一条 路径来发送数据.MPTCP在接收数据方面与TCP的区别是子路径对无序包 进行重排后,MPTCP的mpcb需要多所有子 ...

随机推荐

  1. python gui tkinter用法杂记

    1.treeview遍历 iids = tree.selection() t = tree.get_children() for i in t: print(tree.item(i,'values') ...

  2. k8s的DamonSet使用

    Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本.DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本. 1.Daemo ...

  3. python的算法:二分法查找(2)--bisect模块

    Python 有一个 bisect 模块,用于维护有序列表.bisect 模块实现了一个算法用于插入元素到有序列表.在一些情况下,这比反复排序列表或构造一个大的列表再排序的效率更高.Bisect 是二 ...

  4. .NET Core Runtime ARM32 builds now available

    原文地址:传送门 .NET Core Runtime ARM32 builds now available The .NET Core team is now producing ARM32 buil ...

  5. 使用vscode开发调试.net core应用程序并部署到Linux跨平台

    使用VS Code开发 调试.NET Core RC2应用程序,由于.NET Core 目前还处于预览版. 本文使用微软提供的示例进行开发及调试. https://github.com/aspnet/ ...

  6. (4)python 字典

    创建字典 phonebook = {'} 以 value :key  键值对的格式.冒号前是键,冒号后时值 ,组合在一起是一项.多个项放在一个花括号内. 函数dict()用来把其他项创建成一个字段 & ...

  7. Codeforces 702A Maximum Increase(dp)

    题目链接:http://codeforces.com/problemset/problem/702/A 题意: 给你N个数,a[0], a[1], a[2], ....., a[n-1],让你找出最长 ...

  8. 基于 Python + OpenCV 进行人脸识别,视频追踪代码全注释

    先来普及一下概念, 计算机对人脸是如何识别的呢? 或者说图像是如何识别的.主要是获取单张图片的特征值记录了特征值以后,如果下一张图片来了以后两张图片特征值进行对比,如果相似度很高那么计算机就认定这两个 ...

  9. SD 一轮集训 day1 carcar

    可以发现每条边只能选一次或者两次,并且最后每个点的度数(∑邻接边选的次数和)都是偶数(代表有欧拉回路). 然后根据题意列一个 n 行 m+1 列的01矩阵,每一行代表一个异或方程组(每个点的度数是偶数 ...

  10. Oracle RAC 环境下的 v$log v$logfile

    通常情况下,在Oracle RAC 环境中,v$视图可查询到你所连接实例的相关信息,而gv$视图则包含所有实例的信息.然而在RAC环境中,当我们查询v$log视图时说按照常理的话,v$log视图应当看 ...