作者简介:井丽南,中科院声学所国家网络新媒体工程技术中心
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进行数据中心的负载均衡,在利用多路径的同时,还可以对流量进行拥塞控制,避免产生拥塞,动态的将数据更多的发送到负载低的链路上。有效的提高负载均衡性能。
图1. 随机哈希选路易产生哈希碰撞
2.MPTCP(Multipath TCP)协议介绍
简单的说MPTCP是TCP的一个演进协议,MPTCP可以使TCP同时使用多条路径进行通信。MPTCP在协议栈上的位置如图2所示。MPTCP在2013年被正式定为标准,详细内容可参考RFC 6824 https://tools.ietf.org/html/rfc6824。
图2. MPTCP在协议栈中的位置
MPTCP在设计上的挑战
(1)对应用层透明,MPTCP对于原本基于TCP的应用应该是完全透明的,即不需要应用做出任何改变,也不需要重新编译,即可像原来一样正常工作。应用程序并不知道在4层工作的其实是MPTCP。
(2)对网络中间件透明,网络上存在很多中间件,例如防火墙,NAT,这些设备往往是特制的硬件设备,即便使用MPTCP协议,应允许数据顺利的通过这些中间件设备而不需要对中间件设备做任何改变。
MPTCP会话建立过程
MPTCP会话通过建立多个子流来实现同时使用多条路径传输数据,MPTCP子流的建立类似于TCP建立连接的过程。这些子流类似于正常的TCP连接,通过三次握手建立连接,四次挥手关闭连接。但这些子流都是绑定到一个已有的MPTCP会话上的。发送端的数据可以选择任意的子流进行传输。
建立MPTCP会话的过程:假设我手机选择用4G开启建立连接,过程如图3所示,
1.手机会发送一个SYN数据包给WEB服务器,这个数据包和TCP建立连接时发送的一样,只不过增加了TCP选项MP_CAPABLE字段,表明手机端支持MPTCP协议,以及一个key(用于将来继续添加子流时进行验证)。
2.服务器端回应SYN+ACK数据包同样包含TCP选项MP_CAPABLE字段,以及一个key。
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会话,并确认它是安全的。其中token是前面4G与WEB服务器建立连接的key的哈希。rand是一个随机数,HMAC是rand的哈希。
(2)与第一次建立连接不同的是,这次要进行4此握手。目的是保证连接安全。
图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会话的窗口总量范围内。子流拥塞窗口的调节方式如下所示:
子流发生丢包时,减少拥塞窗口的一半。
MPTCP性能
图5为An overview of Multipath TCP文章中利用亚马逊EC2数据中心的40台机器内对使用MPTCP做负载均衡进行的测试,实验对比了使用传统TCP,2个子流的MPTCP和4个子流的MPTCP的性能。可以看出使用MPTCP确实在一定程度上提高了吞吐量。
图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这段链路上发生拥塞。
图6. 网络拓扑示例
(2)部署困难
要想使用MPTCP协议,需要在更改通信双方的协议栈,增加MPTCP协议,这为扩大MPTCP的使用范围带来的困难。
参考文献:
[1]. Ford A, Raiciu C, Handley M, et al. Tcp extensions for multipath operation with multiple addresses, January 2013[J]. RFC6824.
[2]. Bonaventure O, Handley M, Raiciu C. An overview of Multipath TCP[J]. ; login:, 2012, 37(5): 17.
[3]. Raiciu C, Barre S, Pluntke C, et al. Improving datacenter performance and robustness with multipath TCP[C]//ACM SIGCOMM Computer Communication Review. ACM, 2011, 41(4): 266-277.
【投稿】
欢迎SDN、NFV、边缘计算、SD-WAN、5G 网络切片等网络方向的观点类、新闻类、技术类稿件。
投稿邮箱:pub@sdnlab.com
咨询:2427151142 昵称 白白
详情请参考:
为了给各位小哥哥,小姐姐们带来更好的阅读感受,现在发起SDNLAB文章选题征集,如果大家对什么话题感兴趣,可以文末踊跃发言。期待各位的参与!