简述:
MPTCP依然按照正常的TCP进行三次握手,只是在握手过程中增加了MPTCP特有的信息。
建立过程
三次握手过程如下图所示:
左边客户端发送的第一个SYN包携带有客户端自身的KEY,右边发送SYN/ACK的时候携带了自身的KEY,
而最后左边的客户端发送最后一个ACK的时候携带着双方的KEY。MPTCP中关于MP_CAPABLE的定义如下:
Subtype的定义如下:
MPTCP的内核实现 
MPTCP在客户端上发送SYN包的调用情况如下:
关键函数为mptcp_syn_options对MPTCP选项的填充,源码如下:
"net/mptcp/mptcp_output.c" line 843 of 1667
843 void mptcp_syn_options(struct sock *sk, struct tcp_out_options *opts,
844                unsigned *remaining)
845 {
846     struct tcp_sock *tp = tcp_sk(sk);
847
848     opts->options |= OPTION_MPTCP;
849     if (is_master_tp(tp)) {
850         opts->mptcp_options |= OPTION_MP_CAPABLE | OPTION_TYPE_SYN;
851         *remaining -= MPTCP_SUB_LEN_CAPABLE_SYN_ALIGN;
852         opts->mp_capable.sender_key = tp->mptcp_loc_key;
853         opts->dss_csum = !!sysctl_mptcp_checksum;
854     } else {
855         struct mptcp_cb *mpcb = tp->mpcb;
856
857         opts->mptcp_options |= OPTION_MP_JOIN | OPTION_TYPE_SYN;
858         *remaining -= MPTCP_SUB_LEN_JOIN_SYN_ALIGN;
859         opts->mp_join_syns.token = mpcb->mptcp_rem_token;
860         opts->mp_join_syns.low_prio  = tp->mptcp->low_prio;
861         opts->addr_id = tp->mptcp->loc_id;
862         opts->mp_join_syns.sender_nonce = tp->mptcp->mptcp_loc_nonce;
863     }
864 }
由于三次握手的肯定是master sock,在850行到853行对MPTCP选项进行了赋值。相应的
服务端发送SYN/ACK包时使用mptcp_synack_options函数对选项进行了赋值。而最后一个ACK包
则是调用函数mptcp_established_options操作。
结论:
1. MPTCP利用TCP的三次握手进行了KEY信息的交换。
参考文献:
1.RFC6824 https://tools.ietf.org/html/rfc6824#page-4

转载于:https://www.cnblogs.com/lxgeek/p/4329922.html

MPTCP 源码分析(一) MPTCP的三次握手相关推荐

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

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

  2. 【JUC】JDK1.8源码分析之ArrayBlockingQueue(三)

    一.前言 在完成Map下的并发集合后,现在来分析ArrayBlockingQueue,ArrayBlockingQueue可以用作一个阻塞型队列,支持多任务并发操作,有了之前看源码的积累,再看Arra ...

  3. 【Zookeeper】源码分析之持久化(三)之FileTxnSnapLog

    一.前言 前面分析了FileSnap,接着继续分析FileTxnSnapLog源码,其封装了TxnLog和SnapShot,其在持久化过程中是一个帮助类. 二.FileTxnSnapLog源码分析 2 ...

  4. Lucene 源码分析之倒排索引(三)

    上文找到了 collect(-) 方法,其形参就是匹配的文档 Id,根据代码上下文,其中 doc 是由 iterator.nextDoc() 获得的,那 DefaultBulkScorer.itera ...

  5. WinCE6.0学习之EBoot源码分析----startup.s(三)

    下面将详细叙述MMU的设置,也是本人花费时间最多的一部分内容,无论是2410.6410甚至是Cortex-A8核的ARM,MMU的设置基本都一样,所以移植时这部分可以直接搬过来,只需要更改全局内存映射 ...

  6. Webbench源码分析之多进程(三)

    概述:前面我们把参数输入,http协议以及socket客户端编程部分都说了,今天就把多进程这一块内容学习过程记录一下.同时今天学习的这一部分也是webbench的核心部分了. 知识点: 1,多进程的创 ...

  7. MPTCP 源码分析(三) 子路径选择

    简述: 支持MPTCP的链路中存在多条子路径,因此在发送数据的时候需要选择最优路径来进行操作. MPTCP利用内核通知链对MPTCP中各子路径进行增加路径.删除路径.修改路径优先级的操作.MPTCP根 ...

  8. ConcurrentHashMap的源码分析-put方法第三阶段

    如果对应的节点存在,判断这个节点的hash是不是等于MOVED(-1),说明当前节点是ForwardingNode节点,意味着有其他线程正在进行扩容,那么当前现在直接帮助它进行扩容,因此调用helpT ...

  9. Linux进程里运行新代码,linux调度器源码分析 - 新进程加入(三)

    中专门描述了copy_process()这个创建函数,而里面有一个函数专门用于进程调度的初始化,就是sched_fork(),其代码如下 int sched_fork(unsigned long cl ...

最新文章

  1. 解决IDEA中进行maven install报:系统资源不足的问题
  2. 做外贸如何获取同行的价格体系?转至【【Mr.Harris 原创】
  3. 二,八,十,十六进制之间转换的相应方法
  4. Help View修复
  5. [C++] - C++11 多线程 - Thread
  6. MySQL练习题和代码附录
  7. python3 获取文件目录_python3--os.path获取当前文件的绝对路径和所在目录
  8. MODBUS调试工具 C#源码 包含MODBUS主站调试工具和MODBUS从站调试工具
  9. windows操作系统与linux操作系统相比各有什么优缺点
  10. 大学,学会这样上网才有意义!
  11. C语言入门教程,C语言学习教程
  12. linux添加雅黑字体,linux安装微软雅黑等字体
  13. linux php 验证码不显示_怎么解决php linux验证码不显示的问题
  14. SVM-sklearn
  15. matlab 双均线,[转载]百年一人的双均线系统及双均线系统公式
  16. (四)Kotlin加密/解密之RSA算法和数字签名
  17. 苹果园助力爱奇艺各业务协同作战,视频平台的战争将走向何方?
  18. 计算机怎么打出钱的符号,人民币符号怎么打,教您电脑怎么打人民币符号
  19. WiFi开启热点冲突
  20. Shuffle failed with too many fetch failures and insufficient progress!

热门文章

  1. 年仅46岁,西交大人工智能学院首任院长、孙剑博士突发疾病去世
  2. c语言for求一个数得n次方,C语言中表示一个数的次方怎样表?
  3. 科诚Godex EZPi1200 打印机驱动
  4. Intel公司的CPU发展史简述
  5. 【面向计算机科学的数理逻辑 系统建模与推理 笔记】命题逻辑
  6. Win10将某个软件/快捷方式添加到开始菜单(磁贴)
  7. 进行图像相似度对比的几种办法
  8. (精简稳定版)win8系统下装win7系统
  9. java char数组转string数组_Java中char数组(字符数组)与字符串String类型的转换方法...
  10. 在python中二进制位取反运算如何进行_Python位运算符详解