大家好,欢迎来到IT知识分享网。
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可以将数据流量分散到不同的网络路径上,从而提高整体的带宽利用率。
- 提高传输速度:通过利用多个路径进行并行传输,MPTCP可以提供更高的传输速度,特别是在高延迟或高丢包率的网络环境下。
- 增强可靠性:MPTCP可以在一个或多个路径发生故障时继续传输数据,从而提高传输的可靠性和鲁棒性。
MPTCP在许多场景下都有应用,例如移动通信、数据中心、无线网络等。它为多路径传输提供了一种灵活且高效的解决方案,能够充分利用现有网络基础设施,提供更好的性能和可靠性。
二、MPTCP的实现模型
三、MPTCP的架构体系
主要组成
进一步细分
四、MPTCP的拓展功能有什么
四、拥塞控制怎么解决
方法
算法
常见的
采用的
- 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中一种特定的模式,其中所有的子流共享相同的拥塞窗口和流量控制窗口。这意味着它们之间共享拥塞控制和流量控制信息,并通过协调和调整拥塞窗口来实现公平的资源分配和负载均衡。完全耦合模式可以提供更好的公平性和整体性能,但也可能在某些情况下导致复杂性和延迟增加。
五、数据包乱序到达怎么解决
方法
算法
实现
开源代码
调试 Kashif-Nadeem / ns-3-mptcp
TMPDIR=${TMPDIR:-/tmp}
TMPFILE=mktemp -t $(basename ${2}).XXXXXX
ME=$(basename 0 ) e c h o ” 0) echo ” 0)echo“ME $(basename ${2}) to ${1}”
${TMPFILE}.tex
调试mkheirkhah/mptcp
下代码
运行
学代码
自己标了一点mptcp.cc文件的注释
/* –– Mode:C++; c-file-style:“gnu”; indent-tabs-mode:nil; –– /
/
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2 as
- published by the Free Software Foundation;
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Author: Morteza Kheirkhah m.kheirkhah@sussex.ac.uk
*/
using namespace ns3;
NS_LOG_COMPONENT_DEFINE(“MpTcpBulkSendExample”);
}
可视化
ns3可视化工具
实测
NetAnim
其他
调试multipath-ns3.13
有bug,不维护
调试lip6-mptcp/ns3mptcp
看不懂
调试汇总
学习[附件7]
mpTopology.cc
是一个在 802.11ad WiGig 和 WiFi 环境中的 NS-3 仿真项目
代码中包含两个子流,分别在 Wi-Fi 和 60GHz 802.11ad 上工作
涉及了拥塞控制算法和数据包重排序算法
拥塞控制算法
拥塞控制算法通过设置lSocket->SetCongestionCtrlAlgo来选择,默认是使用了Uncoupled_TCPs,即不同的子流(subflow)之间相互独立进行拥塞控制。这意味着每个子流都维护自己的拥塞窗口和拥塞控制算法状态,并独立地进行拥塞控制,而不考虑其他子流的拥塞状况。耦合的拥塞控制算法(Coupled Congestion Control)则是指多个子流共享一个拥塞控制状态,它们共同决定拥塞窗口大小和拥塞控制策略。耦合的拥塞控制算法可以更好地利用网络资源,但也需要更复杂的协调和控制。
数据包重排序算法
IPv4 地址
命令行参数
模拟的参数和变量
网络堆栈和 TCP 协议栈
网络堆栈是一个软件模块,用于处理网络通信的各个层级。 它负责处理网络协议、数据包的传输和路由、错误检测和校正等功能。网络堆栈通常由多个协议栈组成,其中最常见的是 TCP/IP 协议栈。 TCP 协议栈是网络堆栈中的一个重要组成部分,负责处理传输控制协议(TCP)相关的功能。 TCP 是一种可靠的、面向连接的协议,用于在网络上可靠地传输数据。TCP 协议栈实现了 TCP 协议的各种功能,包括连接建立、数据分段和重组、流量控制、拥塞控制等。 将网络堆栈和 TCP 协议栈安装到节点中的目的是为了使节点能够进行网络通信。 通过在节点上安装网络堆栈和 TCP 协议栈,节点可以与其他网络上的节点进行通信,发送和接收数据。这对于构建和实现各种网络应用和服务是必要的。 在计算机网络中,节点可以是计算机、服务器、路由器或其他网络设备。通过安装网络堆栈和 TCP 协议栈,这些节点能够参与网络通信,并遵循 TCP/IP 协议栈的规范进行数据传输。
MpInternetStackHelper
InternetStackHelper
MpTcpL4Protoco
MpTcpL4Protocol 是 MPTCP(Multi-Path TCP)协议的传输层实现。在 ns-3(Network Simulator 3)中,MpTcpL4Protocol 是一个类,用于模拟 MPTCP 协议在传输层的行为。
MpTcpL4Protocol 类继承自 ns3::TcpL4Protocol 类,它实现了 MPTCP 协议的核心功能,包括多路径连接的建立、维护和数据传输等。MpTcpL4Protocol 提供了一种在 ns-3 中模拟 MPTCP 的方式,使得用户可以在仿真环境中研究、分析和评估 MPTCP 协议的性能和特性。
使用 MpTcpL4Protocol,可以在 ns-3 中创建 MPTCP 连接,并模拟多个路径上的数据传输。它支持路径选择、子流管理、拥塞控制等关键机制,以满足 MPTCP 在真实网络中的行为。同时,MpTcpL4Protocol 还提供了配置参数和函数接口,使用户可以自定义和控制 MPTCP 连接的行为。
需要注意的是,MpTcpL4Protocol 是 ns-3 中的一个模拟实现,并非真实的 MPTCP 协议栈。它提供了一种方便的方式来研究和评估 MPTCP 在不同网络环境下的性能和特性,但在实际部署和生产网络中使用时,需要使用真实的 MPTCP 协议栈。
向量 ipv4Ints
Ipv4InterfaceContainer 类型的向量 ipv4Ints,并使用 PointToPointHelper 创建了一些点对点链路,并为每个链路分配了 IP 地址
SetCongestionCtrlAlgo
创建了一个应用程序容器,并将应用程序添加到容器中,然后启动和停止应用程序。连接到服务器,并设置连接的回调、数据发送的回调、关闭连接的回调等。
SetPacketReorderAlgo函数
Eifel
辅助函数
定义了一些辅助函数,如连接成功、连接失败、写入数据直到缓冲区满等函数。
StartFlow
connectionSucceeded
connectionFailed
HandlePeerClose
HandlePeerError
CloseConnection
variateDelay
header.cc
代码中包含了以下类和函数:
MpTcpHeader:MPTCP 头部类,继承自 TcpHeader。它实现了 MPTCP 头部的序列化、反序列化和打印等功能。
TcpOptions:TCP 选项基类,用于定义 TCP 头部中的选项。
OptMultipathCapable:MPTCP 多路径能力选项,表示发送端支持 MPTCP 的多路径能力。
OptJoinConnection:MPTCP 连接加入选项,表示接收端请求加入 MPTCP 连接。
OptAddAddress:MPTCP 添加地址选项,表示添加一个新的地址到 MPTCP 连接。
OptRemoveAddress:MPTCP 移除地址选项,表示从 MPTCP 连接中移除一个地址。
OptDataSeqMapping:MPTCP 数据序列映射选项,用于映射数据序列号和子流序列号。
OptTimesTamp:MPTCP 时间戳选项,用于传输时间戳信息。
OptDSACK:MPTCP D-SACK 选项,表示重复选择确认。
这些类和函数实现了 MPTCP 头部的相关功能,包括选项的添加、序列化、反序列化和打印等。这些功能可以用于在 ns-3 中模拟和分析 MPTCP 协议的行为和性能。
mp-tcp-l4-protocol.cc
MpTcpL4Protocol 的实现文件。它包含了一些头文件和命名空间的声明,以及 MpTcpL4Protocol 类的成员函数的实现。
在这个文件中,实现了 MpTcpL4Protocol 类的构造函数、析构函数、接收数据包的方法 Receive()、发送数据包的方法 SendPacket(),以及一些其他的辅助函数。
MpTcpL4Protocol 类是 ns-3 中用于实现 MPTCP 的传输层协议的类。它继承自 TcpL4Protocol 类,并重写了其中的一些方法,以支持 MPTCP 头部和选项的解析、生成和处理。
这个文件中还包含了一些辅助的类和函数的实现。它们用于处理数据包的路由、封装和解封装等操作,以及一些日志输出和错误处理的逻辑。
整个文件的目的是实现 MpTcpL4Protocol 类,为 MPTCP 提供传输层协议的功能和接口。这些功能和接口可以被其他的 ns-3 模块和应用程序使用,以实现 MPTCP 的模拟和分析。
mp-tcp-typedefs.cc
DSNMapping类用于表示数据序列号映射。它有一个默认构造函数和一个带参数的构造函数,还有一个析构函数。该类包含了一些成员变量和方法,用于存储和处理数据映射信息。
DataBuffer类用于表示数据缓冲区。它有两个构造函数和一个析构函数。该类包含了一些成员变量和方法,用于对数据进行读取和写入操作。
MpTcpStateMachine类用于表示MP-TCP协议的状态机。它有一个构造函数和一个析构函数。该类包含了一些成员变量和方法,用于状态转换和事件处理。
MpTcpSubFlow类用于表示MP-TCP的子流。它有一个默认构造函数和一个带参数的构造函数,还有一个析构函数。该类包含了一些成员变量和方法,用于控制子流的行为和状态。
mp-tcp-socket-base.cc
定义了一个名为MpTcpSocketBase的命名空间,其中包含了一些类的定义和实现。
MpTcpSocketBase类继承自TcpSocketBase类,它是一个基于MP-TCP协议的Socket类。它有一个默认构造函数和一个带参数的构造函数,还有一个析构函数。该类包含了一些成员变量和方法,用于控制MP-TCP连接的行为和状态。
GetMaxSubFlowNumber()
函数用于获取子流的最大数量。
SetMaxSubFlowNumber()
函数用于设置子流的最大数量。
GetMinSubFlowNumber()
函数用于获取子流的最小数量。
SetMinSubFlowNumber()
函数用于设置子流的最小数量。
SetLossThreshold()
函数用于设置丢包阈值。
SetPacketReorderAlgo()
函数用于设置包重新排序算法。
SetNode()
函数用于设置节点。
GetNode()
函数用于获取节点。
SetMpTcp()
函数用于设置MP-TCP协议。
getL3MTU()
函数用于获取层3的MTU。
getBandwidth()
函数用于获取带宽。
Listen()
函数用于开始监听连接。
Connect()
函数用于发起连接。
Copy()
函数用于复制一个新的MpTcpSocketBase对象。
~MpTcpSocketBase()
函数是类的析构函数。
StartTracing()
函数用于开始跟踪指定名称的跟踪源
CwndTracer()
函数用于跟踪拥塞窗口的变化
printEvent()
函数用于打印事件名称
printAction()
函数用于打印动作名称
printState()
函数用于打印状态名称
用于实现快速重传和快速恢复功能。
DupAck()
函数用于处理重复的ACK报文。当连续收到三个相同的ACK报文时,触发快速重传和快速恢复操作。
Bind()
函数用于分配一个endPoint给该socket。
Binding()
函数用于绑定socket和本地地址。
SendBufferedData()
函数用于发送缓冲区中的数据。
FillBuffer()
函数用于向发送缓冲区中填充数据。 函数首先输出一些日志信息,然后调用发送缓冲区的Add函数将数据添加到发送缓冲区中,并返回添加的字节数量
Retransmit()
SetReTxTimeout()
ProcessAction
ProcessAction
getAckedSegment
NewACK
ProcessEvent
SendEmptyPacket
SendAcknowledge
allocateSendingBuffer
函数用于分配发送缓冲区的内存空间。根据指定的大小,创建一个大小为size的DataBuffer对象。
allocateRecvingBuffer
函数用于分配接收缓冲区的内存空间。根据指定的大小,创建一个大小为size的DataBuffer对象。
SetunOrdBufMaxSize
函数用于设置无序缓冲区的最大大小。将参数size赋值给成员变量unOrdMaxSize。
Recv
ForwardUp
函数用于处理从底层传输层收到的数据包。首先获取数据包的源地址和目的地址,然后查找对应的子流。接下来,从数据包中解析出MP_TCP头部信息,并调用ProcessHeaderOptions函数处理头部中的选项。最后,根据处理后的动作调用ProcessAction函数处理数据包。
InitiateSubflows
函数用于初始化子流。遍历本地地址和远程地址,对于每对地址,生成一个SYN报文并发送。报文中包含JOIN选项,指定远程地址的token和本地地址的ID。最后,通过调用m_mptcp->SendPacket函数发送报文。
ReadUnOrderedData
函数用于处理无序数据。遍历未排序数据列表unOrdered,对于每个数据段,如果其数据序号小于等于nextRxSequence并且子流序号等于当前子流的接收序号,则将数据添加到接收缓冲区中,并更新相关的序号和最高确认号。然后发送累积确认,并通知数据接收。最后从unOrdered中删除已处理的数据段。
ProcessOption
函数用于处理MP_TCP头部中的选项。当前只处理DSACK选项,当收到DSACK选项时,遍历每个子流的未确认数据列表mapDSN,对于每个数据段,检查其数据序号是否在DSACK选项的范围内。如果是,则认为该数据段已经被确认,将其从mapDSN中删除,并增加相应的确认计数。
OpenCWND
SetCongestionCtrlAlgo
用于设置拥塞控制算法,参数ccalgo是一个枚举类型CongestionCtrl_t,用于表示具体的拥塞控制算法。该函数通过将参数赋值给成员变量m_algoCC来设置拥塞控制算法。函数使用了宏NS_LOG_FUNCTION_NOARGS来记录函数调用,但没有接受任何参数。
SetDataDistribAlgo
用于设置数据分发算法,参数ddalgo是一个枚举类型DataDistribAlgo_t,用于表示具体的数据分发算法。该函数通过将参数赋值给成员变量m_distribAlgo来设置数据分发算法。函数同样使用了宏NS_LOG_FUNCTION_NOARGS来记录函数调用,但没有接受任何参数。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/120528.html



