TCP已经比18岁的我还要老了,快要跟不上这个时代网络设备的发展。现在手持设备都已经标配wifi和3g网络接口,数据中心也早就包含多条冗余线路,充分发挥其中潜在的能力是MPTCP的使命。MPTCP作为TCP近5年来最重要的演进,值得我们keep an eye on it。
为什么需要MPTCP
MPTCP的全称是Multipath TCP,是TCP的演进。顾名思义,它是一种可以跑在多条路径上的TCP。
我们知道20年来没啥大变化的TCP是单通道的,两个主机建立TCP连接之后就不会再额外的建立连接。但是移动设备和数据中心等新事物的出现,让情况变的不太一样了。一个手机不仅有wifi的无线接口,还有3g接口;一个数据中心多台设备之间有多条可达路径。MPTCP的出现就是为了解决新形势下多路网络和单路TCP的不匹配问题。
用两个例子来说明MPTCP能达到的效果。

假设Alice有个智能手机,如果只用普通TCP的话,她每次跟Bob视频只能使用3g或者只能使用wifi,这样会导致两个问题:
-
如果Alice在家用wifi上网,但当她走出家门,wifi信号变弱的时候,不能无缝切到3g,一定会导致视频中断,需要重连。
-
如果Alice买了无限流量套餐,但是却不能让wifi和3g两个通道一起为Alice在视频的时候提供更清晰的图像和声音的体验。

用MPTCP就比较爽了,视频数据既可以走3g通道,也可以走wifi通道,两条腿走路,总是比一条腿来得靠谱和高效。
另外一个例子是数据中心。

因为TCP连接是随机的,图中红色链路和细黑色链路不幸在一个节点撞上了,在相撞的节点大家平分流量,导致每条链路的传输速率都只能为最大值的一半,效率减半。
如果是MPTCP就不一样了,一旦发现在某个节点相撞了,MPTCP会在同一个链接下立马新起一条路径,也就是粗黑色路径,逐渐将细黑色的流量转移到粗黑色上来,从而保证了红色链路和黑色链路的传输速度能达到最大速率。
在论文An overview of Multipath TCP中针对这两种情况都有研究,简单来说,在网络切换时性能保障和提升带宽方面效果显著。


事实上MPTCP也是经过实战检验的,苹果在iOS7的时候就为Siri实现了MPTCP,据苹果数据统计,使用了MPTCP的Siri,在95%的情况下要快20%以上,而且网络失败导致Siri不可用的概率降低了5倍之多。在亚马逊的AWS中,MPTCP也带来了非常不错的效果。
MPTCP协议
因为TCP在现有网络结构中几乎无处不在,MPTCP想要流行起来,必须要完美兼容TCP。MPTCP的设计者做了很多努力来保证MPTCP和TCP的兼容性。
兼容性
MPTCP的兼容性考虑主要基于两个方面,一个是应用程序的兼容性,另外一个是现有网络结构的兼容性。我们先来看看MPTCP在协议栈中的位置。

仔细分析上图可以看出MPTCP针对兼容性所给出的解决方案。
-
应用程序是基于socket开发的,应用程序对于socket之下使用普通TCP还是MPTCP是没有感知的。也就是说应用程序啥都不用改,只要升级了网络底层,就能利用MPTCP带来的诸多好处。
-
MPTCP可以有很多subflow,他们都是普通的TCP连接。对于网络传输链路中的诸多中间件,比如路由器、防火墙、NAT等,他们需要处理的依然只是TCP连接,从而保证了对现有网络结构的兼容性。这一点非常重要,因为如果需要升级中间件才能支持MPTCP的话,可以说协议在设计之初就已经失败了。
MPTCP Options
因为MPTCP协议需要兼容TCP协议,因此MPTCP的协议格式是和TCP协议一样的,MPTCP主要在TCP的Options字段作了扩展。
MPTCP现在已经是IETF标准了,其详细细节可见RFC 6824。
TCP协议的格式如下:

MPTCP在Options字段下作了一些扩展,具体扩展了哪些Options字段呢?

通过这些字段,MPTCP协议解决了数据包在多条网络路径上传输的诸多问题,他们包括但不限于:
-
同一连接下网络路径加入和删除
-
多网络路径数据传输序列号不连续的问题
-
多网络路径数据传输的拥塞控制策略
这里协议的具体细节我们不详细论述,里面的点非常非常多,毕竟MPTCP也是花了将近5年的时间才渐渐成型的,有兴趣的可以查看参考文献。
这也从侧面说明了,一个牛逼的协议在设计之初考虑可扩展性是多么的重要!
iOS 11的MPTCP实现
苹果在iOS 11中的MPTCP总共实现了两个subflow,每个网络接口都是一个单独的subflow。如下图所示,非常直观。

如何使用MPTCP
服务端支持
MPTCP已经在linux内核中实现了,写本文的时候最新的MPTCP的版本为v0.92,有兴趣的请参考MultiPath TCP - Linux Kernel implementation。只要部署了带MPTCP的linux版本,即可在服务端支持MPTCP。
iOS客户端
iOS 11新增了NSURLSessionMultipathServiceType
枚举,定义了是否使用multipath tcp,以及创建subflow和在不同subflow之间切换的策略。他们分别是:
NSURLSessionMultipathServiceTypeNone
- 不使用multipath tcp。
NSURLSessionMultipathServiceTypeHandover
- 只有当主链路不能用的时候,才会使用第二条链路,这种模式可靠性高。
NSURLSessionMultipathServiceTypeInteractive
- 当主链路不够用的时候,比如丢包、延时很长等情况,就会启用第二条链路,这种模式延时低。
NSURLSessionMultipathServiceTypeAggregate
- 为了更大的带宽,多条链路可以一起使用,当前仅限开发测试使用
上面已经提到MPTCP为了保证兼容性付出了很大的努力,客户端在使用时要做的事情非常少,只需要配个参数就可以了。
For The Better Future
我们手握着牛逼的设备,却在很多场景下没能发挥出他们真正的实力,为了更好的体验,真心希望MPTCP能早点普及开来。
参考文献
您还可以通过搜索微信公众号 rookie2geek,关注 疯魔程序员 ,阅读更多更有料的技术文章。

网友评论