简述:
     支持MPTCP的链路中存在多条子路径,因此在发送数据的时候需要选择最优路径来进行操作。
MPTCP利用内核通知链对MPTCP中各子路径进行增加路径、删除路径、修改路径优先级的操作。MPTCP根据
相应的策略进行路径选择。
 
路径选择的代码实现
     路径选择的关键在于从多个子路径中选择其中一个进行数据的发送。此过程通过下面的函数实现:
  1. "net/mptcp/mptcp_sched.c" line of
  2. static struct sock *get_available_subflow(struct sock *meta_sk,
  3. struct sk_buff *skb,
  4. bool zero_wnd_test)
  5. {
  6. struct mptcp_cb *mpcb = tcp_sk(meta_sk)->mpcb; //MPTCP内核实现的三个组成部分之一:Multi-path control bock(mpcb)
  7. struct sock *sk, *bestsk = NULL, *lowpriosk = NULL, *backupsk = NULL;
  8. u32 min_time_to_peer = 0xffffffff, lowprio_min_time_to_peer = 0xffffffff;
  9. int cnt_backups = ;
  10.  
  11. /* if there is only one subflow, bypass the scheduling function */
  12. if (mpcb->cnt_subflows == ) {
  13. bestsk = (struct sock *)mpcb->connection_list;
  14. if (!mptcp_is_available(bestsk, skb, zero_wnd_test))
  15. bestsk = NULL;
  16. return bestsk;
  17. }
  18.  
  19. /* Answer data_fin on same subflow!!! */
  20. if (meta_sk->sk_shutdown & RCV_SHUTDOWN &&
  21. skb && mptcp_is_data_fin(skb)) {
  22. mptcp_for_each_sk(mpcb, sk) {
  23. if (tcp_sk(sk)->mptcp->path_index == mpcb->dfin_path_index &&
  24. mptcp_is_available(sk, skb, zero_wnd_test))
  25. return sk;
  26. }
  27. }
第124行的代码是处理只有一个子路径的特殊情况。第132行是对关闭操作进行了处理,在
收包过程中对接收关闭包的子路径进行记录,然后回包的时候使用相同的子路径。
  1. "net/mptcp/mptcp_input.c" line of
  2. /* Record it, because we want to send our data_fin on the same path */
  3. if (tp->mptcp->map_data_fin) {
  4. mpcb->dfin_path_index = tp->mptcp->path_index;
  5. mpcb->dfin_combined = !!(sk->sk_shutdown & RCV_SHUTDOWN);
  6. }
第876行是对子路径关闭的处理,关于data_fin可以参考https://tools.ietf.org/html/rfc6824#section-3.3.3。
 
下面的代码遍历mpcb下管理的sk,选择最合适的sk。
  1. "net/mptcp/mptcp_sched.c" line of
  2. /* First, find the best subflow */
  3. mptcp_for_each_sk(mpcb, sk) {
  4. struct tcp_sock *tp = tcp_sk(sk);
  5.  
  6. if (tp->mptcp->rcv_low_prio || tp->mptcp->low_prio)
  7. cnt_backups++;
  8.  
  9. if ((tp->mptcp->rcv_low_prio || tp->mptcp->low_prio) &&
  10. tp->srtt < lowprio_min_time_to_peer) {
  11. if (!mptcp_is_available(sk, skb, zero_wnd_test))
  12. continue;
  13.  
  14. if (mptcp_dont_reinject_skb(tp, skb)) {
  15. backupsk = sk;
  16. continue;
  17. }
  18.  
  19. lowprio_min_time_to_peer = tp->srtt;
  20. lowpriosk = sk;
  21. } else if (!(tp->mptcp->rcv_low_prio || tp->mptcp->low_prio) &&
  22. tp->srtt < min_time_to_peer) {
  23. if (!mptcp_is_available(sk, skb, zero_wnd_test))
  24. continue;
  25.  
  26. if (mptcp_dont_reinject_skb(tp, skb)) {
  27. backupsk = sk;
  28. continue;
  29. }
  30.  
  31. min_time_to_peer = tp->srtt;
  32. bestsk = sk;
  33. }
  34. }
从上面的代码可以看出,选择sk的依据有5条:
1. “tp->mptcp->rcv_low_prio ” which stands for priority level in the remote machine.
2.  "tp->mptcp->low_prio" which stands for priority level in the local machine.
3.   whether the skb has already been enqueued into this subsocket
4.   "tp->srtt" stands for smoothed round trip time.
5.   mptcp_is_available() check the congestion of this subflow.
 
  1. "net/mptcp/mptcp_sched.c" line of
  2. if (mpcb->cnt_established == cnt_backups && lowpriosk) {
  3. sk = lowpriosk;
  4. } else if (bestsk) {
  5. sk = bestsk;
  6. } else if (backupsk) {
  7. /* It has been sent on all subflows once - let's give it a
  8. 181 * chance again by restarting its pathmask.
  9. 182 */
  10. if (skb)
  11. TCP_SKB_CB(skb)->path_mask = ;
  12. sk = backupsk;
  13. }
  14.  
  15. return sk;
  16. }
第176行的情况说明所有的子路径都处于backup状态。而第178行则是存在bestsk。
 
总结:
1.控制路径选择的因素有下面四个:
此路径在对端机器的优先级
此路径在本地的优先级
此次发送的skb是否已经使用此路径发送过,不能在同一路径重复发送。
tp->srtt
 
2.调整 low_prio 和 rcv_low_prio 可以通过下面命令:
ip link set dev eth0 multipath backup
当通讯双方的一端被设置为backup后,可以通过MP_PRIO
通知对端。具体内容可以参考:https://tools.ietf.org/html/rfc6824#section-3.3.8
 
3.srtt的调整通过函数 tcp_ack_update_rtt 实现。

MPTCP 源码分析(三) 子路径选择的更多相关文章

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

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

  2. tomcat源码分析(三)一次http请求的旅行-从Socket说起

    p { margin-bottom: 0.25cm; line-height: 120% } tomcat源码分析(三)一次http请求的旅行 在http请求旅行之前,我们先来准备下我们所需要的工具. ...

  3. 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入

    使用react全家桶制作博客后台管理系统   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...

  4. Duilib源码分析(三)XML解析器—CMarkup

    上一节介绍了控件构造器CDialogBuilder,接下来将分析其XML解析器CMarkup: CMarkup:xml解析器,目前内置支持三种编码格式:UTF8.UNICODE.ASNI,默认为UTF ...

  5. Django搭建及源码分析(三)---+uWSGI+nginx

    每个框架或者应用都是为了解决某些问题才出现旦生的,没有一个事物是可以解决所有问题的.如果觉得某个框架或者应用使用很不方便,那么很有可能就是你没有将其使用到正确的地方,没有按开发者的设计初衷来使用它,当 ...

  6. Spring5深度源码分析(三)之AnnotationConfigApplicationContext启动原理分析

    代码地址:https://github.com/showkawa/spring-annotation/tree/master/src/main/java/com/brian AnnotationCon ...

  7. Vue.js 源码分析(三) 基础篇 模板渲染 el、emplate、render属性详解

    Vue有三个属性和模板有关,官网上是这样解释的: el ;提供一个在页面上已存在的 DOM 元素作为 Vue 实例的挂载目标 template ;一个字符串模板作为 Vue 实例的标识使用.模板将会 ...

  8. ABP源码分析三:ABP Module

    Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...

  9. ABP源码分析三十一:ABP.AutoMapper

    这个模块封装了Automapper,使其更易于使用. 下图描述了改模块涉及的所有类之间的关系. AutoMapAttribute,AutoMapFromAttribute和AutoMapToAttri ...

随机推荐

  1. 《Java编程思想》笔记 第一章 对象导论

    1.抽象过程 Q:什么是对象??? A:   1) 万物皆对象 --- 对象具有状态,行为和标识 2)程序是对象的集合,他们通过发送消息来告诉彼此要做的 3)通过创建包含现有对象的包的方式来创建新类型 ...

  2. Selenium2+python自动化22-发送各种类型附件邮件【转载】

    前言 最近一些小伙伴,在搞邮箱的事情,小编于是去折腾了一下!总结了一些干货,与大家分享一下!速来,抱大腿,我要开车了! 基本思路就是,使用MIMEMultipart来标示这个邮件是多个部分组成的,然后 ...

  3. ionic3 打包发布,以安卓说明

    1 添加图标 ionic cordova resources [<platform>] 官方https://ionicframework.com/docs/cli/cordova/reso ...

  4. selenium 定位

    一 . chrome的调试工具 1)在chrome界面,按F12快捷键,弹出chrome的调试工具 2)找出登录按钮的id和username.password的id  二.XPath工具 安装 为了提 ...

  5. centos6.5 安装vlc播放器【超简单】

    # cd /etc/yum.repos.d/ # wget http://pkgrepo.linuxtech.net/el6/release/linuxtech.repo //我试了3次才下载下来 # ...

  6. ACM-ICPC北京赛区(2017)网络赛2【后缀数组+Java//不会】

    #1579 : Reverse Suffix Array 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There is a strong data structure ...

  7. Gitlab运维

    安装Gitlab 新建 /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] name=gitlab-ce baseurl=http://mirrors.tuna.t ...

  8. [BZOJ5020][THUWC2017]在美妙的数学王国中畅游(LCT)

    5020: [THUWC 2017]在美妙的数学王国中畅游 Time Limit: 80 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 323  ...

  9. [BZOJ 3157] 国王奇遇记

    Link: BZOJ 3157 传送门 Solution: 题意:求解$\sum_{i=1}^n m^i \cdot {i^m}$ $O(m^2)$做法: 定义一个函数$f[i]$,$f[i]=\su ...

  10. 【树上莫队】bzoj3757 苹果树

    学习这位神犇的:http://blog.csdn.net/jiangyuze831/article/details/41476865 注意: ①排序时第一关键字是左端点所在块编号(块状树),第二关键字 ...