数据中心内的负载均衡-MPTCP

简介:

1. 为什么用MPTCP做负载均衡?

(1)充分利用网络资源

以手机为例,手机包含两种上网方式,蜂窝移动数据网络(2G,3G,4G)和WIFI网络。我们希望在有WIFI的时候尽量使用WIFI,这样可以节省成本,没有WIFI的时候自动切换到蜂窝移动网络,避免断连。同样在PC端,我们希望有线网卡和无线网卡可以同时上网,提高网速。但是使用TCP协议是无法实现上述功能的。

(2)提供可靠传输

MPTCP在协议栈中,位于TCP之上,利用建立TCP子流进行数据传输。TCP是面向连接的4层协议,它可以提供可靠传输,并且拥有拥塞控制机制。但是TCP的单路径传输的协议,即便网络上存在多条路径资源,也无法利用这些路径资源。因为TCP是通过四元组:{源IP,目的IP,源端口,目的端口} 唯一的确定一个连接,当四元组中的任一项发生变化时,会导致连接中断。因为应用程序使用TCP协议只能和单个四元组绑定,无法同时使用多个IP。使用MPTCP正好可以解决这个问题。

数据中心存在大量的路径资源,使用MPTCP可以更加充分地利用带宽资源,且提供可靠传输。数据中心最常使用的负载均衡算法为ECMP,通过根据数据流的五元组哈希,将这些数据均匀随机的分散到权重相等的路径上。这种随机选路负载均衡第一个问题是会产生哈希碰撞。如图一所示,红色路径与蓝色路径产生了碰撞。另一个问题是,用这种最优权重(如最短路径)的方法选出的路径,无法判断路径是否存在拥塞,很可能将流量继续发送到一个已经拥塞的链路上。而使用MPTCP进行数据中心的负载均衡,在利用多路径的同时,还可以对流量进行拥塞控制,避免产生拥塞,动态的将数据更多的发送到负载低的链路上。有效的提高负载均衡性能。

f548f4bb88313ad71b8ca00ceb9646f8ac1284dd

图1. 随机哈希选路易产生哈希碰撞

2.MPTCP(Multipath TCP)协议介绍

简单的说MPTCP是TCP的一个演进协议,MPTCP可以使TCP同时使用多条路径进行通信。MPTCP在协议栈上的位置如图2所示。MPTCP在2013年被正式定为标准,详细内容可参考RFC 6824 https://tools.ietf.org/html/rfc6824。

9eee3e8289ae8b199da10d4c4e029de1d98e8125

图2. MPTCP在协议栈中的位置

MPTCP在设计上的挑战

(1)对应用层透明,MPTCP对于原本基于TCP的应用应该是完全透明的,即不需要应用做出任何改变,也不需要重新编译,即可像原来一样正常工作。应用程序并不知道在4层工作的其实是MPTCP。

(2)对网络中间件透明,网络上存在很多中间件,例如防火墙,NAT,这些设备往往是特制的硬件设备,即便使用MPTCP协议,应允许数据顺利的通过这些中间件设备而不需要对中间件设备做任何改变。

MPTCP会话建立过程

MPTCP会话通过建立多个子流来实现同时使用多条路径传输数据,MPTCP子流的建立类似于TCP建立连接的过程。这些子流类似于正常的TCP连接,通过三次握手建立连接,四次挥手关闭连接。但这些子流都是绑定到一个已有的MPTCP会话上的。发送端的数据可以选择任意的子流进行传输。

例如:我们可以同时利用手机的WIFI和4G使用两个IP来和WEB服务器建立MPTCP会话。但若WEB服务器只有1个IP地址,还可以建立MPTCP会话么?其实是可以的,WEB服务器可以使用不同的端口分别和手机的WIFI,4G建立连接。

建立MPTCP会话的过程:假设我手机选择用4G开启建立连接,过程如图3所示,

1.手机会发送一个SYN数据包给WEB服务器,这个数据包和TCP建立连接时发送的一样,只不过增加了TCP选项MP_CAPABLE字段,表明手机端支持MPTCP协议,以及一个key(用于将来继续添加子流时进行验证)。

2.服务器端回应SYN+ACK数据包同样包含TCP选项MP_CAPABLE字段,以及一个key。

3.手机再次回应ACK,此时建立了连接。

1ae3c277e70e578c1be5a48d0f1f80472dd530f8

图3. MPTCP建立连接

此时4G和WEB服务器建立了连接,手机和WEB服务器可以通过这个路径传输数据,那么如何添加WIFI和WEB服务器的路径呢?要想增加WIFI和WEB服务器的路径,首先要用WIFI和WEB服务器实现完整的建立连接过程,才可以使用WIFI与WEB服务器通信,如图4所示。这次连接和第一个4G与WEB服务器建立的连接是有区别的。

(1)此时的SYN数据包中携带的TCP选项是MP_JOIN,并且向WEB服务器提供足够的信息,说明其要加入的MPTCP会话,并确认它是安全的。其中token是前面4G与WEB服务器建立连接的key的哈希。rand是一个随机数,HMAC是rand的哈希。

(2)与第一次建立连接不同的是,这次要进行4此握手。目的是保证连接安全。

f541898a4a05531851842b39447596bc298d45db

图4. MPTCP添加子流

实际上,子流在MPTCP会话期间是可以动态的增加或删除的,而且不会影响应用数据的传输。比如手机没有了WIFI信号,那么数据可以继续使用4G进行传输,而不会造成应用中断。

MPTCP多个子流乱序问题

当我们使用MPTCP建立多条子流传输数据时,每条子流选择的路由路径可能不同,那么路径延迟也会不同。虽然发送端按序发送数据,但接收端接收到的数据可能产生乱序。既然TCP协议可以使用TCP报文头中的序号,将数据包排序,那么MPTCP是不是同样也可以利用数据包中的序号进行排序?这样是行不通的,因为每条路径上的中间件(防火墙等)可能只有一半的数据经过,它会发现这些包的TCP序号存在间隙,中间盒可能会丢掉这些无序的数据,让TCP重传中间这些空缺的数据。

MPTCP通过增加每个子流的包序列号来解决这个问题。这个时候每个数据包有2个序列号,一个是在TCP包头中的序列号,为子流的序列号;另一个是DSN(data sequence number)为所有传输数据的序列号,用于将各个子流的数据重排。那么使用MPTCP收包,首先使用子流序列号,将各个子流接收到的数据包进行重组,然后使用DSN对各个子流报文重组。

MPTCP拥塞控制

TCP的拥塞控制机制可以根据网络链路情况动态的调整发送速率,我们不再赘述TCP拥塞控制的具体过程。那么MPTCP建立多条TCP子流传输数据,和TCP的拥塞机制有了些许差别。

(1)MPTCP的拥塞控制要保证公平性,即使用MPTCP和使用TCP占用的带宽应该是相同的。

(2)使用MPTCP的性能至少要和传统的TCP相持平,或者更好。

(3)使用MPTCP应能提供有效的负载均衡,减少数据在拥塞链路上传输。

MPTCP的每条子流的拥塞控制机制(慢启动,拥塞避免,快重传)与TCP是相同的。收到ACK时,增加拥塞窗口。发生丢包时,减少拥塞窗口的一半。不同的是子流拥塞窗口的调节方式,MPTCP中每个子流都有单独的拥塞窗口,子流可以根据各自链路状况动态的调节拥塞窗口,但要限制在整个MPTCP会话的窗口总量范围内。子流拥塞窗口的调节方式如下所示:

子流发生丢包时,减少拥塞窗口的一半。

afa15dc888b172ed9baf1100d7685d363bd01c13

MPTCP性能

图5为An overview of Multipath TCP文章中利用亚马逊EC2数据中心的40台机器内对使用MPTCP做负载均衡进行的测试,实验对比了使用传统TCP,2个子流的MPTCP和4个子流的MPTCP的性能。可以看出使用MPTCP确实在一定程度上提高了吞吐量。

4cbd6482812e11445eef25eb07dd2f5899158758

图5. 利用亚马逊EC2数据中心内的40台机器,对数据流使用TCP以及MPTCP不同子流的吞吐量测试

3.总结

在之前的文章中,曾介绍过数据中心内使用ECMP算法进行负载均衡,通过对数据包五元组哈希为流选择路径,实现负载均衡。但使用ECMP存在诸多缺陷:

(1)过于简单,没有拥塞控制机制,因此在网络存在拥塞的情况下,使用ECMP可能会加剧路径的拥塞。

(2)在非对称网络架构下,ECMP的负载均衡效果并不好。

(3)ECMP这种基于流的负载均衡,不适合在数据中心这种老鼠流、大象流并存的环境中。

本文介绍了使用MPTCP协议做负载均衡,通过建立多条TCP子流的方式使用多条路径传输数据。MPTCP可以提供有效的拥塞控制机制,而且切割数据流为多个子流解决,避免大象流这种流量大的数据流在一条链路上传输。其实,我们还可以对每条子流使用ECMP算法,利用哈希随机选择路径,提高负载均衡效果。

不过MPTCP也不是一个完美的负载均衡方案,MPTCP存在以下几个缺点:

(1)无法进行全局路径感知

如图6所示的网络拓扑中,L0到L1的流,若只根据L0下一跳的链路状态进行负载均衡,那么很可能在S2-L1这段链路上发生拥塞。

14d788fc771c50f6878daec215f3f6ba8d7d37b2

图6. 网络拓扑示例

(2)部署困难

要想使用MPTCP协议,需要在更改通信双方的协议栈,增加MPTCP协议,这为扩大MPTCP的使用范围带来的困难。


原文发布时间为:2018-09-12

本文作者:SDNLAB君

本文来自云栖社区合作伙伴“SDNLAB”,了解相关信息可以关注“SDNLAB”。

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
负载均衡 网络虚拟化 C++
|
2月前
|
负载均衡 调度 数据中心
双活中心负载均衡
双活中心负载均衡
36 1
|
2月前
|
负载均衡 安全 算法
负载均衡SLB产品优势
负载均衡SLB产品优势
27 0
|
8月前
|
负载均衡 应用服务中间件 Shell
负载均衡和高可用
负载均衡和高可用
65 0
|
10月前
|
存储 缓存 负载均衡
负载均衡与高可用(一)
负载均衡与高可用
143 0
|
10月前
|
负载均衡 关系型数据库 MySQL
|
弹性计算 负载均衡 云计算
SLB 负载均衡01-负载均衡的产生及发展视频| 学习笔记
快速学习 SLB 负载均衡01-负载均衡的产生及发展视频。
185 0
SLB 负载均衡01-负载均衡的产生及发展视频| 学习笔记
|
负载均衡 监控 网络协议
全球负载均衡 | 学习笔记
快速学习全球负载均衡
118 0
|
负载均衡 算法 Dubbo
第02篇:分布式负载均衡
什么叫`负载均衡`, 所谓负载。先可以理解为当流量请求到某一个微服务应用, 则这么微服务应用就承受了负载。 `什么叫均衡`如下图,浏览器发送了3次请求,后台有2个节点的微服务应用。但是每次都请求在某一台。而另外一台一直空闲没有流量。这种情况就是不均衡的。
102 0

热门文章

最新文章