多路径TCP(MPTCP)

前言:tcp连接时,一直以来都是只能绑定一个ip地址,但是随着多网卡主机越来越多,从一个主机到另一个主机往往都会有多条链路可以到达,这种情况下,如何充分利用这多条链路进行并行的传输或者作为链路备份,就变得十分有意义,本篇就简单介绍其中一种多路径传输的方法—多路径TCP。

一. 多路径传输的背景

我们来看另一个常见的场景:用户的手机一般都有4G和WIFI两种网络接入方式,当用户进行下载数据时,如果接入了WIFI了就会优先使用WIFI,但是如果中间WIFI链路断了,那么只能提示下载失败,并不会切换到4G中接着下载。同时,对于已经存在的多条链路,并没有充分使用以提高带宽。

以上就是其中的一个重要的应用场景,解下来我们重点说明一下其中的一种实现方法—MPTCP。

二. 实施多路径传输的关键点

  1. 多路径流量的调度和拥塞控制。

    多路径的流量调度是指对于存在的多个子路径,如何分配流量到各个子路径,以达到尽可能提高带宽的目的。但另一方面,又需要对各个子路径进行统一的拥塞控制,当一条链路上的流量发送拥塞时,把流量导到另一条链路上去。

  2. 路径发送失败后的重传。

    既然依然是可靠通信,那么就会涉及到失败后的重传问题。重传的时候自然就要找到对应的序列号,然而,在多路径传输时,本来序列号连续的包可能被调度到不同的链路中发送,导致出现一个问题:在每个链路中发送的包的序列号不是连续的,在网络传输中可能会被网络安全设备拦截下来。所以需要解决重传时的序列号的问题。

  3. 建立和管理子路径。

    对于传输时的多路径,需要对路径进行管理,以便能够知晓链路情况,在链路被移除的时候,通知对端不再使用这条链路。在链路添加的时候,使能对应的链路。

三. 多路径TCP

在第一节中我们提到了多路径传输,从实现的层次来说,可以分为网络层实现,传输层实现,应用层实现。首先说这个应用层实现,这个实施起来代价最高,因为需要改动现有的应用程序。而在网络层实现在面对流量控制等问题时时又困难重重,只有在传输层可以借助天然的TCP的可靠性机制,进行改造。

3.1 多路径TCP的体系结构

多路径tcp的功能和过程如下:

  1. 初始化一个连接
  2. 使能一个新的子流
  3. 数据序列号的映射
  4. 可靠性和重传
  5. 拥塞控制
  6. 链路管理
  7. 快速关闭
  8. 回落功能

3.1.1 初始化一个连接

初始化时,是通过SYN,SYN/ACK,ACK报文交互后完成的,在这些报文的tcp选项中,带有这一端使能的标志---MP_CAPABLE。同时也会传递一个生成的64位的key值来标示这条连接,在后面有新的子流添加到这条连接时,就会用来进行鉴权(确切说是以这个key生成的token)。

3.1.2 使能一条新的子流

在初始化一个连接以后,在有新的子流需要添加时,是在SYN,ACK报文的tcp选项中的MP_JOIN子段标示的,带有要加入哪个连接。

3.1.3 链路管理

当有新的地址需要添加到连接或者要删除连接中的一条子流时,通过地址通告的方式,传递到对端。

3.1.4 可靠性与重传

在说到重传的时候,就得先说到序列号的问题,为了保持每个子流中的序列号是连续的,给每个子流都分配了独立的序列号,同时,保持一个全局的连接级别的序列号。当某一条流中数据发送失败后,根据其映射后的序列号找到连接级别的序列号,就找到了发送失败的包,进而,可以把这个包重新调度到别的子流中再进行发送。

3.1.5 拥塞控制

拥塞控制不能单纯的着眼于某一条流的拥塞控制,必须全局考虑,因为如果每一条都单独考虑自己的拥塞情况,在瓶颈时,就会导致对于普通的tcp而言,流量分配不公平。对于拥塞算法,具体的可以参考rfc 6356。这个文档提供了一种对于多流的拥塞控制的方法。

3.1.6 快速关闭

因为一条tcp通过发送RST报文,只能关闭一条子流,所以,为了能够快速的关闭所有的连接,使用快速关闭控制报文可以达到这个目的。

posted @ 2017-08-27 17:15  AISEED  阅读(11360)  评论(1编辑  收藏  举报