MPTCP多路径传输协议的研究与实现
文章目录
- 研究
- 一、什么是MPTCP
- 二、MPTCP的实现模型
- 三、MPTCP的架构体系
- 四、MPTCP的拓展功能有什么
- 四、拥塞控制怎么解决
- 五、数据包乱序到达怎么解决
- 实现
-
- 开源代码
- 调试 Kashif-Nadeem / ns-3-mptcp
- 调试mkheirkhah/mptcp
- 调试multipath-ns3.13
- 调试lip6-mptcp/ns3mptcp
- 调试汇总
-
- 学习[附件7]
-
-
- mpTopology.cc
- header.cc
- mp-tcp-l4-protocol.cc
- mp-tcp-typedefs.cc
- mp-tcp-socket-base.cc
-
- GetMaxSubFlowNumber()
- SetMaxSubFlowNumber()
- GetMinSubFlowNumber()
- SetMinSubFlowNumber()
- SetLossThreshold()
- SetPacketReorderAlgo()
- SetNode()
- GetNode()
- SetMpTcp()
- getL3MTU()
- getBandwidth()
- Listen()
- Connect()
- Copy()
- ~MpTcpSocketBase()
- StartTracing()
- CwndTracer()
- printEvent()
- printAction()
- printState()
- DupAck()
- Bind()
- Binding()
- SendBufferedData()
- FillBuffer()
- Retransmit()
- SetReTxTimeout()
- ProcessAction
- ProcessAction
- getAckedSegment
- NewACK
- ProcessEvent
- SendEmptyPacket
- SendAcknowledge
- allocateSendingBuffer
- allocateRecvingBuffer
- SetunOrdBufMaxSize
- Recv
- ForwardUp
- InitiateSubflows
- ReadUnOrderedData
- ProcessOption
- OpenCWND
- SetCongestionCtrlAlgo
- SetDataDistribAlgo
-
研究
一、什么是MPTCP
MPTCP(Multipath TCP,多路径传输控制协议)是一种在传输层实现多路径传输的协议。传统的TCP(Transmission Control Protocol,传输控制协议)只能使用单一路径进行数据传输,而MPTCP扩展了TCP,允许同时利用多个网络路径进行数据传输。
MPTCP的关键思想是创建多个TCP子流(subflow),每个子流可以通过不同的网络路径传输数据。这些子流可以在不同的网络接口、不同的网络类型(如Wi-Fi和蜂窝网络)之间进行传输。MPTCP在多个子流之间进行动态的数据分割与重组,以实现负载均衡和提高传输速度。
MPTCP的优点包括:
- 增加带宽利用率:通过同时利用多个路径,MPTCP可以将数据流量分散到不同的网络路径上,从而提高整体的带宽利用率。
- 提高传输速度:通过利用多个路径进行并行传输,MPTCP可以提供更高的传输速度,特别是在高延迟或高丢包率的网络环境下。
- 增强可靠性:MPTCP可以在一个或多个路径发生故障时继续传输数据,从而提高传输的可靠性和鲁棒性。
MPTCP在许多场景下都有应用,例如移动通信、数据中心、无线网络等。它为多路径传输提供了一种灵活且高效的解决方案,能够充分利用现有网络基础设施,提供更好的性能和可靠性。
二、MPTCP的实现模型
MPTCP是一种扩展了传统TCP协议的协议,它允许在一个TCP连接中同时使用多个路径进行数据传输。
MPTCP的实现模型可以分为两种:基于内核的实现和基于用户空间的实现。
基于内核的实现:在基于内核的实现模型中,MPTCP的功能被集成到操作系统内核中。这种实现方式需要对操作系统内核进行修改,以支持MPTCP的功能和机制。常用的基于内核的MPTCP实现包括Linux内核中的MPTCP实现。
基于用户空间的实现:在基于用户空间的实现模型中,MPTCP的功能不依赖于操作系统内核的修改,而是通过在用户空间运行的进程来实现。这种实现方式不需要对操作系统进行修改,可以在支持TCP/IP协议栈的操作系统上运行。常用的基于用户空间的MPTCP实现包括Multipath TCP for FreeBSD(FreeBSD内核上的用户空间实现)和MPTCP Proxy(通过代理实现MPTCP的功能)。
不论是基于内核的实现还是基于用户空间的实现,MPTCP的目标是实现多路径的数据传输,提供更高的带宽利用率、更好的容错性和性能改进。具体的实现方式和部署方式取决于操作系统和网络环境的支持、应用需求和性能目标等因素。
三、MPTCP的架构体系
主要组成
MPTCP内核模块:MPTCP的内核模块是实现MPTCP功能的关键组件。该模块嵌入在操作系统的内核中,并负责处理MPTCP连接的建立、维护和数据传输。它与传统的TCP协议栈进行交互,通过在内核中实现MPTCP协议的各种机制,如子流的选择、重传控制等,来支持多路径的数据传输。
MPTCP管理模块:MPTCP管理模块负责管理和控制MPTCP连接的配置和状态。它提供了一组API和机制,使应用程序或其他系统组件可以配置和管理MPTCP连接的参数,如路径选择、子流的添加/删除、优先级控制等。
路径管理器:路径管理器负责监测和管理可用的网络路径。它可以通过各种方式(如Probing、RTT测量、拓扑信息等)来检测网络路径的可用性和质量,并根据策略选择最佳的路径进行数据传输。
子流管理器:子流管理器负责将数据流分割成多个子流,并将这些子流分配给不同的网络路径进行传输。它负责子流的创建、删除、调度和负载均衡等操作,以实现数据在多个路径间的负载均衡和容错性。
拥塞控制模块:拥塞控制模块负责监测网络拥塞状态,并根据拥塞情况调整传输速率。它基于拥塞控制算法(如TCP Reno、TCP Cubic等)来动态调整发送速率,并与传统TCP协议栈进行交互以实现拥塞控制。
MPTCP的架构体系在不同的实现中可能有所差异,但以上列出的组成部分基本上覆盖了MPTCP的关键功能和模块。这些组成部分共同协作,使得MPTCP能够在多个路径上实现同时传输数据,提供更高的带宽利用率、更好的容错性和性能改进。
进一步细分
应用层接口:MPTCP的应用层接口允许应用程序与MPTCP协议栈进行交互,设置MPTCP连接的参数和配置,以及获取MPTCP连接的状态信息。应用层接口可以提供给应用程序开发者使用,以便他们能够充分利用MPTCP的功能和优势。
MPTCP适配器:MPTCP适配器位于应用层和网络层之间,负责将应用层的数据流分割成多个子流,并将这些子流传递给网络层进行多路径传输。MPTCP适配器可以根据应用需求和网络环境的变化,动态地调整子流的数量和分配策略,以实现最佳的带宽利用和性能改进。
MPTCP协议栈:MPTCP协议栈由网络层的MPTCP模块和传输层的TCP协议栈组成。MPTCP协议栈负责处理MPTCP连接的建立和维护,以及在多个路径上的数据传输。它使用网络层的MPTCP模块来选择最佳的路径和管理子流,同时与传输层的TCP协议栈进行交互,实现拥塞控制和数据传输。
多路径管理:多路径管理模块位于网络层,负责监测可用的网络路径和管理这些路径。它可以通过路径探测、链路质量测量等技术来检测和识别可用的路径,并根据策略选择最佳的路径进行数据传输。
拥塞控制:拥塞控制模块位于传输层,负责根据网络拥塞情况调整发送速率和传输窗口大小。它可以基于拥塞控制算法(如TCP Reno、TCP Cubic等)来控制MPTCP的传输速率,以避免网络拥塞和提高性能。
四、MPTCP的拓展功能有什么
MPTCP(Multi-Path TCP)是对传统TCP协议的拓展,提供了多路径传输的功能。除了基本的多路径传输能力外,MPTCP还具有以下一些拓展功能:
带宽聚合:MPTCP可以同时利用多个网络路径进行数据传输,从而将多个路径的带宽进行聚合。通过同时使用多个路径,MPTCP可以充分利用网络资源,提供更高的总带宽。这对于需要大带宽传输的应用,如高清视频流、大文件传输等,具有重要意义。
容错性:MPTCP具有容错性,即当某个路径发生故障或中断时,MPTCP可以自动将数据流切换到其他正常的路径上,以保持数据的传输可靠性。这对于对数据传输的可靠性要求较高的应用,如实时通信、流媒体等,非常重要。
负载均衡:MPTCP可以通过动态地将数据流分配到不同的路径上,实现负载均衡。通过根据路径的质量、拥塞状态等因素进行动态调整,MPTCP可以将数据在多个路径之间均匀分配,以提高网络的整体性能和效率。
优化移动性:MPTCP还可以优化移动设备的网络连接,特别是在切换网络环境时。通过同时利用多个网络接口,MPTCP可以平滑地进行网络切换,提供更好的移动性支持,减少因网络切换而导致的连接中断和服务中断。
这些拓展功能使得MPTCP相对于传统TCP协议具有更高的带宽利用率、容错性和性能改进。因此,MPTCP在对可靠性、带宽和性能有较高要求的应用场景中具有广泛的应用潜力。
四、拥塞控制怎么解决
方法
拥塞控制是一种调节数据传输速率的机制,旨在保持网络的稳定性和公平性,防止网络拥塞。以下是常见的拥塞控制方法:
慢开始和拥塞避免:发送端在开始发送数据时,先以较慢的速率进行发送,然后逐渐增加发送速率,直到网络拥塞出现为止。一旦检测到拥塞(例如发生丢包),发送端将减少发送速率以避免加剧拥塞。
拥塞窗口调节:拥塞窗口用于控制在一个往返时间(RTT)内可以发送的数据量。在慢开始和拥塞避免阶段,发送方会根据网络状况动态调整拥塞窗口的大小,以控制发送速率。
快速重传和快速恢复:当接收端检测到丢失的数据包时,会立即发送重复确认(DupACK)给发送端。发送端在收到一定数量的重复确认后,会立即重传丢失的数据包,而不必等待超时。这样可以快速恢复数据传输,并减少拥塞窗口的减少。
队列管理:路由器和交换机等网络设备可以使用各种队列管理算法来控制流量的进出,防止拥塞的发生。常见的队列管理算法包括:FIFO(先进先出)、RED(随机早期检测)和WRED(加权随机早期检测)等。
ECN(拥塞通知):ECN是一种向发送端和接收端传递网络拥塞信息的机制。当网络设备检测到拥塞时,可以向发送端发送拥塞通知,以便发送端降低发送速率。
这些方法可以单独或组合使用,根据具体的网络环境和需求来实现拥塞控制。目标是在保持网络稳定性的同时,实现高效的数据传输和公平的资源利用。
算法
常见的
TCP Reno:TCP Reno是TCP协议中最常用的拥塞控制算法之一。它使用慢开始、拥塞避免和快速重传/快速恢复机制来控制发送速率,并通过监视丢包和延迟来判断网络拥塞情况。
TCP Cubic:TCP Cubic是一种改进的拥塞控制算法,它基于TCP Vegas算法,通过使用拟立方函数来调整拥塞窗口的增长速率。TCP Cubic在高带宽长距离网络中表现良好,并具有更好的公平性。
AIMD(加性增加,乘性减少):AIMD是一种基本的拥塞控制算法,通过加性增加和乘性减少的方式来调整发送速率。在拥塞发生时,发送速率会减半;在网络空闲时,发送速率会逐渐恢复。
CoDel(拥塞避免延迟):CoDel算法通过测量数据包的队列延迟来判断网络拥塞状况,并采取相应的措施来减少延迟。它可以防止“队列溢出”现象,提高网络的交互性能。
LEDBAT(低延迟、低带宽拥塞控制):LEDBAT是一种专为P2P和实时应用设计的拥塞控制算法。它通过减少发送速率来减小对网络的影响,以便为其他优先级较高的流量留出足够的带宽。
这些算法都是用于在TCP协议中实现拥塞控制的,每个算法都有其特定的优势和适用场景。选择适当的算法取决于网络环境、应用需求和性能目标。
采用的
- Uncoupled_TCPs(未耦合的TCPs):这个术语指的是在MPTCP中,每个子流(TCP连接)可以独立地进行拥塞控制和流量控制。每个子流有自己的拥塞窗口和流量控制窗口,它们之间没有共享信息或协调。这种方式被称为未耦合的TCPs,因为子流之间的拥塞控制和流量控制是独立进行的。
- TCPsLinked_Increases(链接增长):在MPTCP中,当多个子流共享同一拥塞点时,它们需要协调拥塞窗口的增长。TCPsLinked_Increases表示在这种情况下,子流之间链接增长的机制。当一个子流的拥塞窗口增大时,它会通知其他子流逐渐增加它们的拥塞窗口,以实现公平的带宽分配。
- RTT_Compensator(往返时延补偿器):往返时延(Round Trip Time,RTT)是MPTCP中一个重要的衡量指标,它表示数据从发送方到接收方并返回发送方所需要的时间。RTT_Compensator是用于补偿不同子流之间的RTT差异的机制。它可以根据不同子流的RTT,动态地调整发送和接收的时机,以确保各个子流的传输进程相对平衡。
- Fully_Coupled(完全耦合):完全耦合是MPTCP中一种特定的模式,其中所有的子流共享相同的拥塞窗口和流量控制窗口。这意味着它们之间共享拥塞控制和流量控制信息,并通过协调和调整拥塞窗口来实现公平的资源分配和负载均衡。完全耦合模式可以提供更好的公平性和整体性能,但也可能在某些情况下导致复杂性和延迟增加。
五、数据包乱序到达怎么解决
方法
序号重排:接收端可以维护一个接收缓冲区,将乱序到达的数据包按照其序号进行排序,然后按顺序处理。这种方法可以确保数据包按照正确的顺序处理,但可能引入一定的延迟。
缓存重排:接收端可以将乱序到达的数据包缓存起来,等待缺失的数据包到达后再进行处理。这种方法可以减少处理延迟,但需要额外的缓存空间。
选择性重传:发送端可以检测到缺失的数据包后,选择性地重传这些数据包,以确保接收端按照正确的顺序接收。这种方法可以减少网络传输量,但可能引入额外的延迟。
使用TCP/IP协议的保序性:TCP协议本身具有保序性,它会确保接收端按照发送端发送的顺序接收数据包。因此,通过使用TCP协议进行数据传输,可以自动解决数据包乱序的问题。
选择适当的方法取决于具体应用和需求。在某些情况下,可以结合使用上述方法来解决数据包乱序的问题,以提供更好的性能和可靠性。
算法
以下是几种常见的算法,用于解决数据包乱序到达的问题:
Selective Repeat(选择重传):发送端和接收端都维护一个滑动窗口,接收方可以选择性地接收和确认乱序到达的数据包,而不仅仅是按照顺序接收。发送端会重传未确认的数据包,直到接收方确认接收。这种算法可以处理乱序到达的数据包,并避免不必要的重传。
Go-Back-N(回退N个):发送端按照顺序发送数据包,并等待接收方的确认。如果接收方检测到乱序到达的数据包,它会丢弃这些数据包,并向发送端发送一个重传请求。发送端会回退到最早未确认的数据包,并重新发送。这种算法可以处理乱序到达的数据包,并在发生丢包时进行重传。
TCP SACK(选择性应答):接收端使用选择性应答选项,向发送端指示已经接收到的数据包范围,包括已经接收和乱序的数据包。发送端可以根据选择性应答信息进行重传,从而解决乱序到达的问题。
Delayed ACK(延迟确认):接收端可以延迟发送ACK确认,以等待乱序数据包的到达。这样可以减少发送的ACK数量,从而优化网络带宽利用率。
这些算法都是用于解决数据包乱序到达的问题,在实际应用中可以根据需求和网络环境选择适当的算法。
实现
开源代码
关于mptcp的研究论文很多,但是mptcp的仿真实现却很少
这是我找到感觉还不错的
[1]multipath-ns3.13
[2]mkheirkhah/mptcp
[3]lip6-mptcp/ns3mptcp
[4]JimmyNeverStop/CS740
[5]dzlab/mptcp-ns3
[6] Kashif-Nadeem / ns-3-mptcp
调试 Kashif-Nadeem / ns-3-mptcp
听说[1,2,4]都是从[5]这份代码里改的
[3]实在是看不懂
先调试的是[6]的代码,无他,太常见了
编译结果:
对ns3不熟,不知道怎么编译mptcp
听大佬说
这个涉及shell编程
一个sh文件的例子:
#!/usr/bin/env bash
TMPDIR=${TMPDIR:-/tmp}
TMPFILE=mktemp -t $(ba