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能达到的效果。

tcp -- mobiledevice

假设Alice有个智能手机,如果只用普通TCP的话,她每次跟Bob视频只能使用3g或者只能使用wifi,这样会导致两个问题:

如果Alice在家用wifi上网,但当她走出家门,wifi信号变弱的时候,不能无缝切到3g,一定会导致视频中断,需要重连。

如果Alice买了无限流量套餐,但是却不能让wifi和3g两个通道一起为Alice在视频的时候提供更清晰的图像和声音的体验。

mptcp -- mobiledevice

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

另外一个例子是数据中心。

mptcp -- datacenter

因为TCP连接是随机的,图中红色链路和细黑色链路不幸在一个节点撞上了,在相撞的节点大家平分流量,导致每条链路的传输速率都只能为最大值的一半,效率减半。

如果是MPTCP就不一样了,一旦发现在某个节点相撞了,MPTCP会在同一个链接下立马新起一条路径,也就是粗黑色路径,逐渐将细黑色的流量转移到粗黑色上来,从而保证了红色链路和黑色链路的传输速度能达到最大速率。

在论文An overview of Multipath TCP中针对这两种情况都有研究,简单来说,在网络切换时性能保障和提升带宽方面效果显著。

MPTCP vs application handover

MPTCP increase throughtput

事实上MPTCP也是经过实战检验的,苹果在iOS7的时候就为Siri实现了MPTCP,据苹果数据统计,使用了MPTCP的Siri,在95%的情况下要快20%以上,而且网络失败导致Siri不可用的概率降低了5倍之多。在亚马逊的AWS中,MPTCP也带来了非常不错的效果。

MPTCP协议

因为TCP在现有网络结构中几乎无处不在,MPTCP想要流行起来,必须要完美兼容TCP。MPTCP的设计者做了很多努力来保证MPTCP和TCP的兼容性。

兼容性

MPTCP的兼容性考虑主要基于两个方面,一个是应用程序的兼容性,另外一个是现有网络结构的兼容性。我们先来看看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协议的格式如下:

TCP协议格式

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

mptcp options

通过这些字段,MPTCP协议解决了数据包在多条网络路径上传输的诸多问题,他们包括但不限于:

同一连接下网络路径加入和删除

多网络路径数据传输序列号不连续的问题

多网络路径数据传输的拥塞控制策略

这里协议的具体细节我们不详细论述,里面的点非常非常多,毕竟MPTCP也是花了将近5年的时间才渐渐成型的,有兴趣的可以查看参考文献。

这也从侧面说明了,一个牛逼的协议在设计之初考虑可扩展性是多么的重要!

iOS 11的MPTCP实现

苹果在iOS 11中的MPTCP总共实现了两个subflow,每个网络接口都是一个单独的subflow。如下图所示,非常直观。

mptcp在iOS11中的实现

如何使用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,关注 疯魔程序员 ,更有料的技术文章。

微信一键关注

linux内核实现mptcp,让MPTCP来拯救你的破手机相关推荐

  1. 几MB的小软件!拯救我们的破手机!

    希望这次可以过审,单纯分享个好用的APP而已! 推荐一款比较好用的手机清理工具---->雪豹速清. 当然,清浊app也是不错的,此次分享只能说是给大家多一个选择吧.清浊app体积小巧,垃圾清理功 ...

  2. linux内核mptcp,安装 MPTCP 内核 -- 基于 CentOS 定制系统

    安装 MPTCP 内核 -- 基于 CentOS 定制系统 一, 说明 本文针对定制 CentOS 系统进行安装. 原生的 Ubuntu 和 CentOS 可能有更简单的安装方式, 但本文的安装方式依 ...

  3. mptcp linux 升级,Ubuntu下配置MPTCP

    本周调研了一下多径TCP(MPTCP),几经周折终于从小白到将MPTCP协议配置到Linux系统中,并成功地通过MPTCP协议访问了支持MPTCP协议的检测网站. 本文主要介绍 实验环境 无线网卡驱动 ...

  4. surface linux内核,Surface系列电脑Linux拯救指南

    Surface系列电脑运行Linux操作系统的小毛病: 微软出的Surface pro和Surface Book系列电脑运行Linux系统,都会出现很多问题. 个人情况:Surface pro3,安装 ...

  5. Linux 内核观测技术BPF

    BPF简介 BPF,全称是Berkeley Packet Filter(伯克利数据包过滤器)的缩写.其诞生于1992年,最初的目的是提升网络包过滤工具的性能.后面,随着这个工具重新实现BPF的内核补丁 ...

  6. Linux阅码场 - Linux内核月报(2020年08月)

    关于Linux内核月报 Linux阅码场 Linux阅码场内核月报栏目,是汇总当月Linux内核社区最重要的一线开发动态,方便读者们更容易跟踪Linux内核的最前沿发展动向. 限于篇幅,只会对最新技术 ...

  7. Linux 内核,30 年C 语言将升级至 C11

    Linux 内核,30 年C 语言将升级至 C11 还在使用 89 年版 C 语言的 Linux 内核,现在终于要做出改变了.今天,Linux 开源社区宣布,未来会把内核 C 语言版本升级到 C11, ...

  8. linux内核开机显示企鹅logo,批改linux内核kernel开机logo(小企鹅)

    修改linux内核kernel开机logo(小企鹅) 修改linux内核kernel的开机图片(原为小企鹅图片). 转载请注明出处:http://blog.csdn.net/wang_zheng_ka ...

  9. linux内核内存管理(zone_dma zone_normal zone_highmem)

    Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数 ...

最新文章

  1. javascript 变量监听器
  2. oracle connect by用法
  3. LYNC显示用户位置的相关配置
  4. MySQL函数/数据库函数
  5. $Android自定义控件在不同状态下的属性
  6. Spring注释事务失效及解决办法
  7. python opencv把32位的灰度图变成8位的灰度图_python简单换脸程序
  8. 基于Python+Django的失物招领平台系统设计
  9. matlab2016一条命令设置坐标轴标签旋转角度、字体大小和字体!
  10. 最终,我决定将代码迁出x86架构!
  11. 搞笑--亚阳影视官方的keyword里写“破解版”
  12. Spring Boot + Vue 开发的物流管理系统,附源码
  13. iOS应用安全-专栏总目录(持续更新) 丨蓄力计划
  14. CSS3的癫疯展示——3D立方体动画(你要的全景视图来了)
  15. 免费在线格式转换网站
  16. 深度学习主机环境配置: Ubuntu16.04+Nvidia GTX 1080/980ti+CUDA8.0
  17. 谈谈BPM工作流引擎
  18. java毕业设计_基于web的医院信息管理系统
  19. 淘宝客API示例演示
  20. Java使用华软通信能力平台实现短信发送

热门文章

  1. mysql 审计插件_MySQL审计插件使用
  2. 服务器冷硬盘,浪潮SR整机柜冷存储方案助力BAT轻松实现海量存储
  3. VC6下miniblink应用开发简单实例
  4. Option Tracing: Beyond Correctness Analysis in Knowledge Tracing
  5. Vr算php吗,vr原理介绍
  6. clickhouse简单使用及优化
  7. localStorage setItem getItem
  8. 使用localStorage存储数据每次调用setItem()它都会添加或覆盖现有值
  9. Java html解析器之Jsoup
  10. wps永久关闭wpscenter