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

简述:

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

时间: 2024-08-30 11:07:50

MPTCP 源码分析(一) MPTCP的三次握手的相关文章

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

简述: 在TCP协议中影响数据发送的三个因素分别为:发送端窗口值.接收端窗口值和拥塞窗口值. 本文主要分析MPTCP中各个子路径对接收端窗口值rcv_wnd的处理. 接收端窗口值的初始化 根据<MPTCP 源码分析(二) 建立子路径>中描述服务端在发送完SYN/ACK并接收到ACK的时候建立新的sock. 在内核实现中,针对连接请求分为两个步骤处理: SYN队列处理:当服务端收到SYN的时候,此连接请求request_sock将被存放于listening socket的SYN队列,服务端发送S

JUC源码分析-集合篇(三)ConcurrentLinkedQueue

JUC源码分析-集合篇(三)ConcurrentLinkedQueue 在并发编程中,有时候需要使用线程安全的队列.如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法.使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现.非阻塞的实现方 式则可以使用循环 CAS 的方式来实现.本节让我们一起来研究一下 Doug Lea 是如何使用非阻塞的方式来实现线程安全队列 ConcurrentLinkedQueue 的,相信从大师

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

一.前言 在分析了AbstractQueuedSynchronier源码后,接着分析ReentrantLock源码,其实在AbstractQueuedSynchronizer的分析中,已经提到过ReentrantLock,ReentrantLock表示下面具体分析ReentrantLock源码. 二.ReentrantLock数据结构 ReentrantLock的底层是借助AbstractQueuedSynchronizer实现,所以其数据结构依附于AbstractQueuedSynchroni

Opencv2.4.9源码分析——Cascade Classification(三)

前两篇文章分别介绍了级联分类器的原理和源码解析,下面我们给出一个具体的应用实例. 下面我们以车牌识别为例,具体讲解OpenCV的级联分类器的用法.在这里我们只对蓝底白字的普通车牌进行识别判断,对于其他车牌不在考虑范围内.而且车牌是正面照,略微倾斜可以,倾斜程度太大也是不在识别范围内的. 我们通过不同渠道共收集了1545幅符合要求的带有车牌图像的照片(很遗憾,我只能得到这么多车牌照片,如果能再多一些就更好了!),通过ACDSee软件手工把车牌图像从照片中剪切出来,并统一保存为jpg格式.为便于后续

MPTCP 源码分析(二) 建立子路径

简述 MPTCP在进行三次握手之后,客户端和服务端会进行地址信息的交换,让对方知道彼此未用的地址信息. 当客户端知道服务端的地址后就可以建立其他子路径.三次握手和建立子路径的过程如图1: 图1 关于Token.随机数R.以及HMAC(Hash-based Message Authentication Code)的详细解释可以阅读参考文献[1]. MPTCP的内核实现: 这里我们主要关注建立子路径过程中,master sock对slave sock的影响.当客户端发送第一个SYN准备建立子路径的时

数据库中间件 Sharding-JDBC 源码分析 —— SQL 解析(三)之查询SQL

关注微信公众号:[芋艿的后端小屋]有福利: RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表 RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址 您对于源码的疑问每条留言都将得到认真回复.甚至不知道如何读源码也可以请教噢. 新的源码解析文章实时收到通知.每周更新一篇左右. 认真的源码交流微信群. 如果代码排版翻车了,请点击原文链接:http://www.yunai.me/Sharding-JDBC/sql-pa

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

简述: 支持MPTCP的链路中存在多条子路径,因此在发送数据的时候需要选择最优路径来进行操作. MPTCP利用内核通知链对MPTCP中各子路径进行增加路径.删除路径.修改路径优先级的操作.MPTCP根据 相应的策略进行路径选择. 路径选择的代码实现 路径选择的关键在于从多个子路径中选择其中一个进行数据的发送.此过程通过下面的函数实现: "net/mptcp/mptcp_sched.c" line 114 of 496 114 static struct sock *get_availa

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

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

nova api源码分析(一)

说明: 源码版本:H版 参考文档:http://www.choudan.net/2013/12/09/OpenStack-WSGI-APP%E5%AD%A6%E4%B9%A0.html 一.前奏 nova api本身作为一个WSGI服务器,对外提供HTTP请求服务,对内调用nova的其他模块响应相应的HTTP请求.分为两大部分,一是创建该服务器时加载的app,这个用来处理请求:一是服务器本身的启动与运行. 目录结构如下: 首先,nova api是作为一个WSGI服务,肯定要查看它的启动过程,查看