MPTCP流程分析
MPTCP(MultiPath TCP)是对常规TCP的一组扩展,提供多路径TCP服务,使传输连接能够同时跨多条路径运行。多路径TCP允许主机使用不同IP地址的不同路径来交换属于MPTCP连接的报文。对于网络层,每个MPTCP子流看起来就像一个普通的TCP流,因此不需要对应用程序进行任何更改。MPTCP管理这些子流的创建、删除和利用,以发送数据。在多路径TCP连接中管理的子流数量不是固定的,并且在多路径TCP连接的生存期内可能会有变动。
在MPTCP建立、管理、使用子流的过程中,会在客户端与服务端之间交换MPTCP特有控制信息。所有MPTCP的控制信息都使用TCP的可选报头字段发出。IANA(The Internet Assigned Numbers Authority)为MPTCP的每种控制信息分配了一个唯一的TCP选项号(“Kind”,长度为一个字节),而单个消息将由“Subtype”(长度为四位)确定,其值存储在IANA注册表中。与所有TCP选项一样,Length字段(长度为一个字节)以字节为单位指定。MPTCP控制信息格式如下:
一、初始化第一条流
与初始化普通TCP连接的信令相同,但是SYN、SYN/ACK和初始ACK(和数据)数据包会携带MP_CAPABLE选项。这个选项的长度是可变的,有多种用途。首先,验证远程主机是否支持MPTCP;其次,此选项允许主机交换一些信息,以验证附加子流的建立。第一条链接建立过程如下.
其中,MP_CAPABLE包含的内容如下
二、添加子流
一旦MPTCP连接通过MP_CAPABLE交换开始,就可以向该连接添加进一步的子流。在主流建立过程中,MP_CAPABLE握手中的密钥交换提供了在建立新的子流时可用于对端点进行身份验证的材料。一个新的子流作为正常的TCP SYN/ACK交换启动,但是需要在SYN/ACK和ACK数据包中携带MP_JOIN选项,它使用在初始MP_CAPABLE握手中交换的密钥材料。子流建立的过程如下图所示.
其中,MP_JOIN包含的内容如下:
三、数据包的发送
为了确保在随时可能出现或消失的子流上可靠、有序地传输数据,MPTCP使用64位数据序列号(DSN, Data Sequence Number),用于对通过MPTCP连接发送的所有数据包进行编号。每个子流都有自己的32位序列号空间,利用常规TCP序列号头,MPTCP选项将子流序列空间映射到数据序列空间。这样,在发生故障时,数据可以在不同的子流(映射到相同的DSN)上重新传输。
DSS (Data Sequence Signal)承载着数据序列映射。数据序列映射由子流序列号、数据序列号和该映射有效的长度组成。此选项还可以为接收到的DSN携带连接级确认(“数据ACK”)。
使用MPTCP,所有子流共享相同的接收缓冲区并发布相同的接收窗口。在MPTCP中有两个级别的确认。在每个子流上使用常规TCP确认来确认通过子流发送的段的接收,而不依赖于它们的DSN。此外,还有数据序列空间的连接级确认。这些确认跟踪字节流的进程并滑动接收窗口。
其中,DSS包含的信息如下:
四、关闭连接
1.关闭子流
当主机想要关闭现有的子流而不是整个连接时,它可以发起一个常规的TCP FIN/ACK。
2.关闭整个MPTCP链接
当客户端想要通知服务端它没有更多的数据要发送时,它将这个“Data FIN”作为DSS的一部分发出信号。它具有与常规TCP FIN相同的语义和行为,但在连接级别。一旦成功接收到MPTCP连接上的所有数据,该消息将在连接级别上通过data ACK进行确认。
参考链接
-
MPTCP源码解读
-
苹果MPTCP
-
MPTCP官网
-
小米8刷机MPTCP教程
-
MPTCP的RFC文档
-
Apple WWDC
-
MPTCP配置文章来源:https://www.toymoban.com/news/detail-788972.html
-
mptcp的Linux安装文章来源地址https://www.toymoban.com/news/detail-788972.html
到了这里,关于mptcp核心流程分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!