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,它通过对数据流的五元组进行哈希处理,将数据均匀随机地分布到权重相等的路径上。这种随机路径选择负载均衡的第一个问题是会发生哈希冲突。如图1所示,红色路径与蓝色路径发生碰撞。另一个问题是用这种权重最优的方法选择的路径(比如最短路径)无法判断路径是否拥塞,很可能会继续向已经拥塞的链路发送流量。使用MPTCP进行数据中心负载均衡,在利用多路径的同时,还可以对流量进行拥塞控制,避免拥塞,动态地将更多的数据发送到负载低的链路上。有效提升负载均衡性能。图1.随机哈希选择产生哈希冲突2.MPTCP(MultipathTCP)协议介绍简单来说,MPTCP是TCP的一个演化协议。MPTCP可以使TCP同时使用多条路径进行通信。MPTCP在协议栈中的位置如图2所示,MPTCP于2013年正式确立为标准,详情可参考RFC6824https://tools.ietf.org/html/rfc6824。图2.MPTCP在协议栈中的位置MPTCP的设计挑战(1)对应用层透明。MPTCP对原来基于TCP的应用程序应该是完全透明的,即不需要对应用程序做任何改动,也不需要重新安装Compile,就可以正常工作了。应用程序不知道它实际上是工作在第4层的MPTCP。(2)对网络中间件透明。网络上有很多中间件,比如防火墙、NAT。这些设备通常是特殊的硬件设备。即使使用MPTCP协议,也应该允许数据通过这些中间件设备,而不需要中介对设备进行任何更改。MPTCP会话建立过程MPTCP会话建立多个子流,同时通过多条路径传输数据。MPTCP子流的建立与TCP连接的建立过程类似。这些子流程与普通的TCP连接类似,三次握手建立连接,四次握手关闭连接。但是这些子流绑定到现有的MPTCP会话。发送端的数据可以选择任意一个子流进行传输。例如:我们可以通过手机的WIFI和4G同时使用两个IP与WEB服务器建立MPTCP会话。但是如果WEB服务器只有一个IP地址,还能建立MPTCP会话吗?事实上,这是可能的。WEB服务器可以使用不同的端口与手机的WIFI和4G建立连接。建立MPTCP会话的过程:假设我的手机选择使用4G开启并建立连接。流程如图3所示。1.手机会向WEB服务器发送一个SYN包。这个包和TCP连接建立时发送的一样,只是增加了TCP选项MP_CAPABLE字段,表示移动端支持MPTCP协议,还有一个key(以后添加子流时验证)。2.服务器响应一个SYN+ACK数据包,其中还包含TCP选项MP_CAPABLE字段和一个密钥。3、手机再次响应ACK,此时连接建立。图3.MPTCP建立连接。此时4G和WEB服务器已经建立连接。手机和WEB服务器可以通过这个路径传输数据,那么如何添加WIFI和WEB服务器之间的路径呢?如果要增加WIFI和WEB服务器之间的路径,必须先用WIFI和WEB服务器完成建立连接的过程,然后才能用WIFI和WEB服务器通信,如图4所示。这个连接是不同于4G与WEB服务器建立的第一次连接。(1)此时SYN包中携带的TCP选项为MP_JOIN,向WEB服务器提供足够的信息来说明自己要加入的MPTCP会话,并确认是安全的。令牌是用于在4G和WEB服务器之间建立连接的密钥的散列。rand是一个随机数,HMAC是rand的哈希值。(2)与第一次建立连接的区别在于这次需要4次握手。目的是保持连接安全。图4.MPTCP添加子流实际上,子流可以在MPTCP会话期间动态添加或删除,而不会影响应用程序数据的传输。比如手机没有WIFI信号,那么数据可以继续使用4G传输,不会造成应用中断。MPTCP中多个子流的乱序问题当我们使用MPTCP建立多个子流传输数据时,每个子流选择的路由路径可能不同,路径延迟也会不同。尽管发送方按顺序发送数据,但接收方收到的数据可能是乱序的。既然TCP协议可以使用TCP头中的序号对数据包进行排序,那么MPTCP是不是也可以使用数据包中的序号进行排序呢?这样是行不通的,因为每条路径上的中间件(防火墙等)可能只有一半的数据通过,它会发现这些数据包的TCP序列号有空隙,中间件可能会丢失这些无序数据并使TCP重新加载。在中间传递这些间隙的数据。MPTCP通过增加每个子流的数据包序列号来解决这个问题。此时每个数据包都有2个序号,一个是TCP头中的序号,也就是子流的序号;另一个是DSN(datasequencenumber),它是所有传输数据的序号,用来链接各个子流的数据重排。然后使用MPTCP接收数据包,先使用子流序号重新组装每个子流接收到的数据包,然后使用DSN重新组装每个子流报文。MPTCP拥塞控制TCP的拥塞控制机制可以根据网络链路情况动态调整发送速率。TCP拥塞控制的具体过程我们不再赘述。然后MPTCP建立多个TCP子流来传输数据,这与TCP的拥塞机制略有不同。(1)MPTCP的拥塞控制要保证公平性,即MPTCP和TCP占用的带宽应该是一样的。(2)使用MPTCP的性能至少要等于或优于传统TCP。(3)使用MPTCP应该提供有效的负载平衡,减少拥塞链路上的数据传输。MPTCP的每个子流的拥塞控制机制(慢启动、拥塞避免、快速重传)与TCP相同。当收到ACK时,增加拥塞窗口。当发生丢包时,将拥塞窗口减半。区别在于子流拥塞窗口的调整方式。在MPTCP中,每个子流都有一个单独的拥塞窗口。子流可以根据各自的链路情况动态调整拥塞窗口,但必须限制在整个MPTCP会话的总窗口内。.子流拥塞窗口的调整方法为:当子流发生丢包时,拥塞窗口减半。MPTCP性能图5显示了在多路径TCP概述一文中使用AmazonEC2数据中心的40台机器对MPTCP进行负载均衡的测试。实验比较了传统TCP、2个子流的MPTCP和4个子流的MPTCP的使用。表现。可见使用MPTCP确实在一定程度上提高了吞吐量。图5.AmazonEC2数据中心使用40台机器,数据流使用TCP和MPTCP不同子流的吞吐量测试3.总结上一篇文章介绍了在数据中使用ECMP算法做负载均衡中心。通过对数据包的五元组进行哈希处理,为流量选择路径,实现负载均衡。但是使用ECMP也有很多缺陷:(1)过于简单,没有拥塞控制机制,所以在网络拥塞的情况下,使用ECMP可能会加剧路径拥塞。(2)非对称网络架构下,ECMP的负载均衡效果不好。(3)ECMP基于流量的负载均衡不适合数据中心老鼠流量和大象流量并存的环境。本文介绍使用MPTCP协议进行负载均衡,通过建立多个TCP子流,使用多条路径传输数据。MPTCP可以提供有效的拥塞控制机制,将数据流切割成多个子流,避免象流等大流量数据流在一条链路上传输。其实我们也可以对每个子流使用ECMP算法,利用hash随机选择路径,提高负载均衡效果。然而,MPTCP并不是一个完美的负载均衡解决方案。MPTCP有以下缺点:(1)不能进行全局路径感知。在图6所示的网络拓扑结构中,如果从L0到L1这一跳的链路状态被用于负载均衡,那么链路S2-L1可能会发生拥塞。图6网络拓扑示例(2)部署难点要使用MPTCP协议,需要改变通信双方的协议栈,增加MPTCP协议,这给扩展MPTCP的使用范围带来了困难。参考文献:[1].FordA、RaiciuC、HandleyM等人。具有多个地址的多路径操作的Tcp扩展,2013年1月[J]。RFC6824.[2]。BonaventureO,HandleyM,RaiciuC.多路径TCP概述[J]。;登录:,2012,37(5):17.[3].RaiciuC、BarreS、PluntkeC等人。使用多路径TCP[C]//ACMSIGCOMM计算机通信评论提高数据中心性能和稳健性。美国计算机学会,2011年,41(4):266-277。
