背景

     随着技术的发展许多设备具有了多个网络接口,而TCP依然是一个单线路的协议,在TCP的通信过程中发端和收端都
不能随意变换地址。我们可以利用多个网络接口的这一特性来改善性能和有效冗余。例如:你的手机同时连接
WIFI信号和3G信号的时候,如果WIFI关掉,使用WIFI进行的TCP连接就会断开,而不能有效利用3G网络继续收发数据。
而Multipath TCP可以在一条TCP链接中包含多条路径,避免上述问题出现。
 
MPTCP简介
     MPTCP允许在一条TCP链路中建立多个子通道。当一条通道按照三次握手的方式建立起来后,可以按照三次握手的
方式建立其他的子通道,这些通道以三次握手建立连接和四次握手解除连接。这些通道都会绑定于MPTCP session,
发送端的数据可以选择其中一条通道进行传输。
 
MPTCP的设计遵守以下两个原则:
1.应用程序的兼容性,应用程序只要可以运行在TCP环境下,就可以在没有任何修改的情况下,运行于MPTCP环境。
2.网络的兼容性,MPTCP兼容其他协议。
 
MPTCP在协议栈中的位置如下所示:
 
 
 
建立连接过程 
 
  如上图所示:MPTCP的第一个子通道的建立遵守TCP的三次握手,唯一的区别是每次发送的
报文段需要添加MP_CAPABLE的的TCP选项和一个安全用途的key。而下图是建立其他的子通道:
 
  如上图所示:第二条子通道的建立依然遵守TCP的三次握手,而TCP选项换成了MP_JOIN。
而token是基于key的一个hash值,rand为一个随机数,而HMAC是基于rand的一个hash值。
 
数据的发送和接收
     MPTCP可以选择多条子通道中任意一条来发送数据。MPTCP如果使用传统的TCP的方式
来发送数据,将会出现一部分包在一条子通道,而另一部分包在另外一条子通道。这样的话,防火墙等
中间设备将会收到TCP的序号跳跃的包,因此将会发生丢包等异常情况。为了解决这个问题,MPTCP通过
增加DSN(data sequence number)来管理包的发送,DSN统计总的报文段序号,而每个子通道中的
序号始终是连续。
     MPTCP的接收包过程分为两个阶段:第一、每个子通道依据自身序号来重组报文段;第二、MPTCP
的控制模块依据DSN对所有子通道的报文段进行重组。
 
拥塞控制 
     MPTCP中拥塞控制的设计需遵守以下两个原则:
第一:MPTCP和传统TCP应该拥有相同的吞吐量,而不是MPTCP中每一条子通道和传统TCP具有相同的吞吐量。
第二:MPTCP在选择子通道的时候应该选择拥塞情况更好的子通道。
 
MPTCP的实现
MPTCP的实现主要分为三部分:
  1. master subsocket
  2. Multi-path control bock(mpcb)
  3. slave subsocket
 
master subsock是一个标准的sock结构体用于TCP通信。mpcb提供开启或关闭子通道、
选择发送数据的子通道以及重组报文段的功能。slave subsocket对应用程序并不可见,他们
都是被mpcb管理并用于发送数据。 
 
应用:
MPTCP的作用除了体现在移动设备领域,还可以用于数据中心。
比如EC2就会让两个终端间冗余有多条路径,论文《An overview of Multipath TCP》中对此进行了
实验,作者租借40台机器安装MPTCP的内核然后实验,其效果如下:
 
参考文献:
An overview of Multipath TCP - O. Bonaventure, M. Handley and C. Raiciu. USENIX login; , October 2012.
 

最新文章

  1. mysql 表被锁时,需要执行的命令
  2. centos 6 安装 gitlib
  3. Add Office 365 Azure Directory into Windows Azure
  4. Java Servlet与Web容器之间的关系
  5. WebService 实例
  6. Groovy学习笔记(一)
  7. 滤镜模糊效果,利用了文字阴影和透明。其实是抄的iSlider官网的
  8. Qt for Android 程序禁止屏幕旋转
  9. memcached构建集群分析之一
  10. 作品第一课----循环改变DIV颜色
  11. ORACLE WIN7安装过程截图
  12. QCA4002/QCA4004 为主流家电和消费电子产品推出低功耗Wi-Fi平台
  13. hdu4597 Play Game 区间DP
  14. Jenkins 集群搭建
  15. rtsp 流媒体服务器,播放器
  16. rman list 命令列举
  17. [Linux]Debian 9重启DNS重置问题
  18. Object.prototype.toString.call()
  19. 课程8:《Maven精品教程视频》--视频目录
  20. 剑指offer例题——链表中倒数第K个结点

热门文章

  1. python和shell对比
  2. Bzoj3093 [Fdu校赛2012] A Famous Game
  3. 关于SelectedValue的众多解决方案
  4. 多目录,多可执行文件的Makfile的编写
  5. msvc交叉编译:使用vcvarsall.bat设置命令行编译环境
  6. 新建Maven工程
  7. 在16aspx.com上下了一个.net程序,怎么修改它的默认登录名和密码?
  8. [POI2014]Little Bird
  9. php的一些语法
  10. 2,搭建一个java开发环境