什么是TCP MULTIPATH,TCP中的MULTIPATH如何工作
每天,我们在网上阅读某些或者其他技术资料,我们认为在未来几天中将会是一股繁荣的景象。
在大多数情况下,我们偶然发现的东西只会是已经存在的东西的修改版本,或者说是已经存在的东西的重新设计版本。
但是最近几天,我偶然发现了网络领域的一项重大改进,这无疑将成为当今通信系统设计方式的一次重大飞跃。
在深入探讨技术之前,我们将从基础知识入手,以便即使是非技术读者也可以理解所提出技术的重要性。
我不应该说是提议,因为一些处于技术前沿的主要参与者已经实施了它,有些甚至在新发布的大量销售的软件版本中甚至将其作为功能提供了。
我们将在本文的后面部分中讨论有关谁实施此操作的更多信息。
要了解这项技术,我们需要了解在通过Internet进行通信时所发生情况的一些基本知识。
我们将从网络上的多宿主和多地址开始。
什么是多宿主?
通常,计算机设备或者任何通信设备都连接到一个单一的网络。
但是,如今,我们一次将我们的计算设备连接到多个网络。
多归属的一个很好的例子是同时连接到移动网络(通过GPRS或者3G连接)和本地WiFi网络的平板电脑或者多媒体电话。
多宿主的更好示例是连接到两个Internet服务提供商的服务器/网络路由器。
这些路由器和服务器通常会从多个Internet服务提供商那里购买多个网络连接链接,以实现多宿主功能。
拥有多宿主服务器或者路由器的主要优点是,即使一个网络链路发生故障(或者说某个ISP发生故障),服务器/路由器仍将通过另一ISP保持连接。
综上所述,主要是为了实现网络中更好的冗余而进行了多归属。
请不要忘记多宿主会增加成本,因为我们将不得不支付多个ISP来维护冗余链路。
现在,正如我所告诉的,多宿主技术主要是为了实现更好的冗余而设计的(这意味着,如果一个链路由于某种原因而中断,则另一条链路可以用于到达目标目的地)。
但是我们永远不能同时使用两个链接进行通信。
迄今为止,网络世界面临的主要障碍是,我们无法同时使用这两个网络链接(多宿主)进行一个TCP连接。
这意味着即使我必须与yahoo进行通信,即使我有两个网络连接,也必须使用它们之一进行通信。
而且我必须使用该连接直到该TCP会话结束。
如果我们从逻辑上考虑,那只会浪费网络资源。
如果我能够同时使用两个连接并在单个TCP会话中与yahoo进行通信,则可以实现更好的连接性和吞吐量。
我们可能会想一下,对于一个TCP连接一次使用多个链接或者一起说多个路径的目的是什么。
原因是我们在使用互联网方面已经走了很长一段路。
今天我们拥有的用例与设计这些通信协议时所用的用例有很大不同。
- 我们通过互联网进行视频通话和会议
- 我们使用互联网拨调用
- 我们将互联网用于GPS等定位服务
上述所有用例都需要一致且更好的网络吞吐量和连接性。
特别是语音数据比其他数据需要更多的吞吐量和连接性。
让我们看看正常的TCP连接发生时会发生什么。
我们知道一个事实,与UDP不同,TCP需要在任何数据传输发生之前建立连接。
但是,通过一系列完整的动作,有几件事在建立连接,跟踪传输的数据,错误检测以及在接收器端对数据重新排序方面起着主要作用。
数据被分解成较小的块,然后一一发送。
每个发送的数据包都附有一个序列号。
起始序列号是随机选择的,并为每个发送的数据包增加一个。
接收方通过在顺序号的帮助下组装接收到的每个数据包来重建原始数据。
通过服务器和客户端之间交换的一系列3条消息来建立正常的单路径TCP连接。
它被称为“三向握手”,其名称来自交换的三种消息类型。
我建议阅读以下有关TCP三向握手的文章,以了解如何建立正常的TCP连接。
阅读:TCP三种方式的握手说明
简而言之,下面说明建立普通TCP连接所涉及的步骤。
步骤1:要发起连接的机器会发送SYN请求以及发起请求及其开始序列号。
步骤2:接收方机器使用SYN-ACK消息回复SYN消息。
该消息包含其开始序列号和对收到的SYN消息的确认。
步骤3:在收到SYN-ACK消息后,发起方将发送最终ACK,其中包含对SYN-ACK消息的确认,并且认为已建立连接。
现在,让我们看看单路径TCP的设计局限性(当前的协议,我们都在使用。
在阅读本文时,我们也会使用它。
)
- TCP仅使用一个单一路径来建立连接,并且该单一路径将用于整个TCP会话(直到完成数据传输和连接目的)
- 想象一下这样一种情况:建立连接,建立连接的路径很拥挤(不要忘记其他用户也使用相同的网络带宽,所有用户必须拥有相等的带宽份额)。因此,如果我们使用的是连接并且另外3个用户也使用相同的路径,则每个用户将仅拥有总可用带宽的33%。即使我们有另一个可用连接也是这种情况(如前所述,单路径TCP将永远不会使用其他可用连接/链接)
- 如果源和目标之间的路由器设备启用了某种QoS,则拥塞情况将变得更糟。 QoS代表服务质量,它只不过是一种用于为一组特定协议提供更高优先级的方法。
有没有一种方法可以在单个连接中使用两个可用的连接链接使用多个路径?
该问题的答案是“是”。
这两个连接可以一起用于一个连接(我不能说可以使用,因为其中一些已经开始使用此连接了。
)
可用于实现此目的的技术称为MPTCP或者多路径TCP。
同时使用两个连接有很大的好处。
就最终用户而言,其中的两个主要好处在以下要点中概述。
- MPTCP(多路径TCP)将增加带宽
这将增加带宽,因为在单个连接中使用了具有两个单独路径的两个连接链接。
由于拥塞,如果一条路径仅提供其带宽的一小部分,则也可以利用另一条路径。
因此,MPTCP连接的总带宽将是两个路径/链接使用的组合带宽
- MPTCP(多路径TCP)提供更好的冗余
多路径TCP提供了更好的连接冗余,因为即使一个链接断开,连接也不会受到影响。
一个示例用例假设我们正在在线观看视频,并且我们正在通过WiFi连接。
即使我们走出WiFi连接范围,视频流也不会受到影响,因为它会自动停止通过WiFi连接发送数据,并且现在仅应使用蜂窝网络。
最终用户绝不能感觉到某种形式的连接丢失。
所提议技术的技术细节在理论上很容易描述。
但是,在现实世界中正确实现这一点非常困难。
启动任何协议的主要困难在于,它不应该破坏已经存在的协议,并且应该能够与已经部署的基础架构轻松配合。
在设计多路径TCP时要考虑的一些主要因素如下。
- 它应该与已经存在的互联网体系结构一起使用。并且不应要求对通信路径之间的路由器进行任何形式的修改
- 不必修改计算机应用程序
- 诸如NAT设备之类的中间盒永远都不应破坏多路径tcp连接(不要忘记NAT设备旨在修改流经它们的通信数据包这一事实)
- 它应该向后兼容。意味着如果由于某种原因而无法建立成功的多路径tcp连接,则必须始终退回到正常的TCP连接。
谁首先提出了使用多路径TCP连接来克服TCP局限性的想法?
这个想法最初是由克里斯蒂安·惠特玛(Christian Huitema)在1990年代初期提出的。
然而,由于设计这样的协议所涉及的挑战,花了相当长的时间才能将想法付诸实践。
他是Microsoft工程团队的一员。
他的参与主要是在网络领域。
我们可以从下面的链接中找到他的履历
克里斯蒂安·惠特玛
多路径TCP在第4层实现。
第4层是Trasport层,位于应用程序和网络层之间。
在传输层下面是网络层,数据链路层和物理层。
由于多路径TCP是在传输层中实现的,因此不需要对通信路径之间的路由设备进行重大更改,因为这些路由设备主要使用网络层数据(但是,如果设备根据未知标志过滤细分)。
现在,让我们了解上面显示的多路径TCP握手中描述的一系列步骤。
有两台机器用于说明多路径tcp握手。
机器1和机器2.
这两个机器分别具有两个接口。
MA1 =机器1上的第一个接口
MA2 =机器1上的第二个接口
MB1 =机器2上的第一个接口
MB2 =机器2上的第二个接口
步骤1:步骤1正在向目的地发送SYN请求。
这与正常的TCP SYN请求非常相似,但是它包含一个另外的标志,该标志提及服务器使用多路径TCP的功能。
这个另外的标志是MP_CAPABLE(如上图所示)
步骤2:步骤2是SYN ACK答复,其中还包含MP_CAPABLE标志集。
现在请注意以下事实:如果机器2答复不带MP_CAPABLE标志的SYN ACK,则意味着机器2不支持多路径TCP。
步骤3:此步骤是来自计算机1的最终ACK答复,也设置了MP_CAPABLE标志。
请注意,所有这三个消息都包含一个用于验证消息的密钥(机器1在SYN期间发送其密钥,机器2在SYN ACK期间发送其密钥,机器1在ACK期间将两个密钥作为最终消息发回)这一事实
现在已设置了初始TCP连接,两台机器都相互告知对方使用多路径TCP的能力。
上面建立的连接是从机器1上的接口1到机器2上的接口1的。
因此,为了完成多路径连接,我们仍然需要从第二接口建立另一个连接(第二路径)。
步骤1:根据多路径TCP,将进行的第二个连接称为子流。
机器1向第一SYN发送带有令牌的令牌,该令牌是根据在第一连接中交换的密钥创建的。
该令牌用于验证子流会话。
在SYN请求上也设置了MP_JOIN的标志。
此标志有助于将该连接加入到已创建的连接中
步骤2:机器2收到带有MP_JOIN标志的SYN后,将以SYN ACK(也将包含一个MP_JOIN标志集)作为响应。
此消息还包含MAC和地址ID
步骤3:在收到SYN ACK时,计算机1将以ACK消息进行回复,该消息还包含一个MP_JOIN标志集(这也包含MAC)
步骤4:最终消息是来自计算机2的ACK消息,该消息确认它已收到来自计算机1的MAC和ACK消息。
来自计算机2的最终ACK建立了较低连接。
TCP Multi PATH的一些很棒的功能
- 如果一个接口同时具有ipv4和ipv6,则将创建两个单独的子流。一个用于ipv4,另一个用于ipv6
- 如果我们有2个以上的连接接口,则建立两个以上的路径
- 在一定的超时间隔后,不起作用的路径将被丢弃
- 如果其中一个路径发生故障,则使用另一个可用的工作路径来通知接收者特定路径已发生故障,而不是等待超时完成
哪些设备和操作系统已经部署了多路径TCP?
如果连接双方都支持该功能,则最新版本的Linux内核支持Multi Path tcp。
可从下面的链接中找到针对Linux的多路径tcp的最新实现。
多路径TCP v0.87
同样,最新上市的重磅市场苹果移动操作系统iOS 7是第一个推动广泛使用多路径TCP的操作系统。
因此,那些将其iOS设备更新到最新版本的人,有意或者无意中都使用了这项技术。