MPTCP多路径传输协议的研究与实现

这篇具有很好参考价值的文章主要介绍了MPTCP多路径传输协议的研究与实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MPTCP多路径传输协议的研究与实现


研究

一、什么是MPTCP

MPTCP(Multipath TCP,多路径传输控制协议)是一种在传输层实现多路径传输的协议。传统的TCP(Transmission Control Protocol,传输控制协议)只能使用单一路径进行数据传输,而MPTCP扩展了TCP,允许同时利用多个网络路径进行数据传输。
MPTCP的关键思想是创建多个TCP子流(subflow),每个子流可以通过不同的网络路径传输数据。这些子流可以在不同的网络接口、不同的网络类型(如Wi-Fi和蜂窝网络)之间进行传输。MPTCP在多个子流之间进行动态的数据分割与重组,以实现负载均衡和提高传输速度。
MPTCP的优点包括:

  1. 增加带宽利用率:通过同时利用多个路径,MPTCP可以将数据流量分散到不同的网络路径上,从而提高整体的带宽利用率。
  2. 提高传输速度:通过利用多个路径进行并行传输,MPTCP可以提供更高的传输速度,特别是在高延迟或高丢包率的网络环境下。
  3. 增强可靠性: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协议中实现拥塞控制的,每个算法都有其特定的优势和适用场景。选择适当的算法取决于网络环境、应用需求和性能目标。

采用的
  1. Uncoupled_TCPs(未耦合的TCPs):这个术语指的是在MPTCP中,每个子流(TCP连接)可以独立地进行拥塞控制和流量控制。每个子流有自己的拥塞窗口和流量控制窗口,它们之间没有共享信息或协调。这种方式被称为未耦合的TCPs,因为子流之间的拥塞控制和流量控制是独立进行的。
  2. TCPsLinked_Increases(链接增长):在MPTCP中,当多个子流共享同一拥塞点时,它们需要协调拥塞窗口的增长。TCPsLinked_Increases表示在这种情况下,子流之间链接增长的机制。当一个子流的拥塞窗口增大时,它会通知其他子流逐渐增加它们的拥塞窗口,以实现公平的带宽分配。
  3. RTT_Compensator(往返时延补偿器):往返时延(Round Trip Time,RTT)是MPTCP中一个重要的衡量指标,它表示数据从发送方到接收方并返回发送方所需要的时间。RTT_Compensator是用于补偿不同子流之间的RTT差异的机制。它可以根据不同子流的RTT,动态地调整发送和接收的时机,以确保各个子流的传输进程相对平衡。
  4. 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]的代码,无他,太常见了
编译结果:
mptcp,mptcp,c++,tcp,网络
对ns3不熟,不知道怎么编译mptcp
听大佬说
这个涉及shell编程
一个sh文件的例子:
#!/usr/bin/env bash

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}"

echo "
\documentclass{book}
\usepackage{pdfpages}
\begin{document}
\includepdf[width=KaTeX parse error: Expected '}', got 'EOF' at end of input: {1},fitpaper]{{2}}
\end{document}
" \

${TMPFILE}.tex

pdflatex -output-directory ${TMPDIR} ${TMPFILE}.tex >/dev/null 2>/dev/null
cp ${TMPFILE}.pdf ${2}
rm -f ${TMPFILE}{,.{tex,aux,log,pdf}}

调试mkheirkhah/mptcp

下代码

有教程,一个mptcp文件,比较简单
编译结果:

mptcp,mptcp,c++,tcp,网络
运行
mptcp,mptcp,c++,tcp,网络

学代码

自己标了一点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
    */

// Network topology
//
// n0 ----------- n1
// - Flow from n0 to n1 using MpTcpBulkSendApplication.

//网络拓扑
//
// n0 ----------- n1
// - 使用 MpTcpBulkSendApplication 从 n0 流到 n1。

#include
#include
#include “ns3/core-module.h”
#include “ns3/point-to-point-module.h”
#include “ns3/internet-module.h”
#include “ns3/applications-module.h”
#include “ns3/network-module.h”
#include “ns3/packet-sink.h”

using namespace ns3;

NS_LOG_COMPONENT_DEFINE(“MpTcpBulkSendExample”);

int
main(int argc, char *argv[])
{
LogComponentEnable(“MpTcpSocketBase”, LOG_INFO);
//启用"MpTcpSocketBase"组件的日志,日志级别为INFO级别。

Config::SetDefault(“ns3::Ipv4GlobalRouting::FlowEcmpRouting”, BooleanValue(true));
Config::SetDefault(“ns3::TcpSocket::SegmentSize”, UintegerValue(1400));
//设置默认的Ipv4全局路由选择算法为ECMP算法。
Config::SetDefault(“ns3::TcpSocket::DelAckCount”, UintegerValue(0));
//设置默认的TCP延迟确认计数为0。
Config::SetDefault(“ns3::DropTailQueue::Mode”, StringValue(“QUEUE_MODE_PACKETS”));
//设置默认的DropTail队列模式为PACKETS模式。
Config::SetDefault(“ns3::DropTailQueue::MaxPackets”, UintegerValue(100));
//设置默认的DropTail队列最大包数为100个。
Config::SetDefault(“ns3::TcpL4Protocol::SocketType”, TypeIdValue(MpTcpSocketBase::GetTypeId()));
//设置默认的TCP Socket类型为MpTcpSocketBase类型。
Config::SetDefault(“ns3::MpTcpSocketBase::MaxSubflows”, UintegerValue(8)); // Sink
//设置默认的MpTcp Socket最大子流数为8个。
//Config::SetDefault(“ns3::MpTcpSocketBase::CongestionControl”, StringValue(“RTT_Compensator”));
//Config::SetDefault(“ns3::MpTcpSocketBase::PathManagement”, StringValue(“NdiffPorts”));

NodeContainer nodes;
//创建节点容器,用于保存网络节点。
nodes.Create(2);
//创建2个节点。

PointToPointHelper pointToPoint;
//创建点对点网络助手。
pointToPoint.SetDeviceAttribute(“DataRate”, StringValue(“100Mbps”));
//设置点对点设备的数据速率为100Mbps。
pointToPoint.SetChannelAttribute(“Delay”, StringValue(“1ms”));
//设置点对点信道的延迟为1ms。

NetDeviceContainer devices;
//创建网络设备容器。
devices = pointToPoint.Install(nodes);
//将点对点设备安装到节点上。

InternetStackHelper internet;
//创建Internet协议栈助手。
internet.Install(nodes);
//将Internet协议栈安装到节点上。

Ipv4AddressHelper ipv4;
//创建IPv4地址帮助类。
ipv4.SetBase(“10.1.1.0”, “255.255.255.0”);
//设置IPv4地址的基础地址和掩码。
Ipv4InterfaceContainer i = ipv4.Assign(devices);
//为设备分配IPv4地址。

uint16_t port = 9;
//定义端口号为9。
MpTcpPacketSinkHelper sink(“ns3::TcpSocketFactory”, InetSocketAddress(Ipv4Address::GetAny(), port));
//创建PacketSink应用程序,用于接收数据。
ApplicationContainer sinkApps = sink.Install(nodes.Get(1));
//将PacketSink应用程序安装到n1节点上。
sinkApps.Start(Seconds(0.0));
//在0秒开始运行应用程序。
sinkApps.Stop(Seconds(10.0));
//在10秒停止应用程序。

MpTcpBulkSendHelper source(“ns3::TcpSocketFactory”, InetSocketAddress(Ipv4Address(i.GetAddress(1)), port));
//创建BulkSend应用程序,用于发送数据。
source.SetAttribute(“MaxBytes”, UintegerValue(0));
//设置最大字节数为0,代表发送无限量的数据。
ApplicationContainer sourceApps = source.Install(nodes.Get(0));
//将BulkSend应用程序安装到n0节点上。
sourceApps.Start(Seconds(0.0));
//在0秒开始运行应用程序。
sourceApps.Stop(Seconds(10.0));
//在10秒停止应用程序。

NS_LOG_INFO (“Run Simulation.”);
Simulator::Stop(Seconds(20.0));
//设置仿真时间为20秒。
Simulator::Run();
//运行仿真。
Simulator::Destroy();
//销毁仿真环境。
NS_LOG_INFO (“Done.”);

}

//这段代码是一个网络拓扑的示例,其中有两个节点n0和n1,它们之间有一个点对点的连接。代码使用了ns-3网络仿真框架,用于模拟网络通信。
//代码中首先包含了一些头文件,然后定义了一个主函数main。在主函数中,创建了两个节点n0和n1,然后使用点对点设备连接它们。接着安装了网络协议栈和IP地址,并对节点进行了配置。
//代码中还定义了一个端口号port,并使用这个端口号创建了一个PacketSink应用程序,用于接收数据。同时还创建了一个BulkSend应用程序,用于发送数据。
//最后,设置了仿真的时间和运行。在仿真开始前,需要调用Simulator::Run()进行运行,最后通过Simulator::Destroy()结束仿真。
//这段代码的功能是模拟网络中的数据传输过程,其中节点n0通过MpTcpBulkSendApplication应用程序向节点n1发送数据。代码中还包含了一些网络配置和参数设置。

可视化

ns3可视化工具

常用的ns-3可视化工具:
NetAnim:NetAnim是ns-3中的官方可视化工具,用于可视化网络拓扑、节点移动、数据包传输等。它可以生成动画效果,展示网络仿真的过程和结果。NetAnim还提供了一些交互式功能,如查看节点属性、流量等,以及导出动画结果。
Gnuplot:Gnuplot是一个强大的开源绘图工具,可以与ns-3结合使用,用于绘制各种网络仿真的结果。使用Gnuplot,您可以绘制网络性能指标的图表、绘制拓扑图谱等,以便更好地分析和可视化仿真结果。
PyViz:PyViz是一个基于Python的可视化工具库,可以与ns-3结合使用。它提供了各种绘图功能,使您能够绘制网络拓扑图、数据包传输图、性能指标图等。PyViz还提供了交互式的绘图接口,使您能够自定义和控制绘图过程。
Network Animator(NAM):NAM是一个使用Tcl/Tk编写的网络仿真可视化工具,可以与ns-3一起使用。它可以绘制网络拓扑图、节点移动、数据包传输、流量等,以及提供一些交互式的控制和查看功能。

实测
NetAnim

下载很顺利,打不开.xml文件
提示This XML format is not supported. Minimum Version:3.108
跟着这个改
3.108
https://blog.csdn.net/xinwenfei/article/details/71378307
不对
报错This XML format is not supported. Minimum Version:3.106
3.106
发现下的代码是ns3.13
遂去官网下了 Version:3.104
一直编译不成功
查了很久代码的问题
NetAnim
make解决
qt
NetAnim
NetAnim

最后发现其实是不兼容
哈哈

其他

不行的
一些学习,放这里
PyViz
可以的
gnuplot

调试multipath-ns3.13

有bug,不维护

调试lip6-mptcp/ns3mptcp

看不懂

调试汇总

把之前所有学过的,还有附件7的mptcp部分汇总一下
装到mkheirkhah/mptcp里
gnuplot画图
一些结果,当然还有问题,还在查哎哎哎mptcp,mptcp,c++,tcp,网络mptcp,mptcp,c++,tcp,网络
mptcp,mptcp,c++,tcp,网络
mptcp,mptcp,c++,tcp,网络

学习[附件7]

mpTopology.cc

mptcp,mptcp,c++,tcp,网络
是一个在 802.11ad WiGig 和 WiFi 环境中的 NS-3 仿真项目

代码中包含两个子流,分别在 Wi-Fi 和 60GHz 802.11ad 上工作

涉及了拥塞控制算法和数据包重排序算法

拥塞控制算法

拥塞控制算法通过设置lSocket->SetCongestionCtrlAlgo来选择,默认是使用了Uncoupled_TCPs,即不同的子流(subflow)之间相互独立进行拥塞控制。这意味着每个子流都维护自己的拥塞窗口和拥塞控制算法状态,并独立地进行拥塞控制,而不考虑其他子流的拥塞状况。耦合的拥塞控制算法(Coupled Congestion Control)则是指多个子流共享一个拥塞控制状态,它们共同决定拥塞窗口大小和拥塞控制策略。耦合的拥塞控制算法可以更好地利用网络资源,但也需要更复杂的协调和控制。

数据包重排序算法

数据包重排序算法通过设置lSocket->SetPacketReorderAlgo来选择,默认是使用了D_SACK,即基于选择确认(Selective Acknowledgment,简称SACK)的数据包重排序。因此,这段代码中对拥塞控制和数据包重排序进行了处理,以提高多路径传输的性能和可靠性。
选择确认机制是一种TCP的扩展机制,用于在接收方向发送方报告丢失的数据包信息。当接收方收到乱序的数据包时,会发送选择确认报文,其中包含了已经成功接收的数据包的序列号范围。通过这些选择确认信息,发送方可以了解到哪些数据包已经被接收方成功接收,从而进行数据包的重传和重排序。
基于选择确认的数据包重排序算法(D_SACK)利用了选择确认机制来实现数据包的重排序。当接收方收到乱序的数据包时,会发送选择确认报文,其中包含了已经成功接收的数据包的序列号范围。发送方根据这些选择确认信息,可以知道接收方已经成功接收的数据包序列号范围,从而可以对乱序的数据包进行重排序,并按照正确的顺序进行处理和传输。

IPv4 地址

“10.1.3.0” 是一个 IPv4 地址,它表示了一个局域网的网络地址。IP 地址通常由网络标识符和主机标识符组成,网络标识符指示了IP地址所在的网络,而主机标识符则指示了特定主机的地址。
在这个代码中,“10.1.3.0” 可以被看作是一个网络的起始地址,表示这个局域网中的第一个主机。通过递增主机标识符,可以将不同的主机地址分配给该网络中的不同主机。

命令行参数

以下是每个命令行参数的描述信息:
verbose:告诉应用程序在日志记录时是否启用详细模式。
level:告诉应用程序要使用的日志级别。提供了以下选择:
0 = ERROR
1 = WARN
2 = DEBUG
3 = INFO
4 = FUNCTION
5 = LOGIC
6 = ALL
cc:告诉应用程序要使用的拥塞控制算法。提供了以下选择:
0 = Uncoupled_TCPs
1 = Linked_Increases
2 = RTT_Compensator
3 = Fully_Coupled
pr:告诉应用程序要使用的包重新排序算法。提供了以下选择:
0 = NoPR_Algo
1 = Eifel
2 = TCP_DOOR
3 = D_SACK
4 = F_RTO
sf:告诉应用程序要建立的子流个数。

模拟的参数和变量

static const uint32_t totalTxBytes = 0xFFFFFFFF;
static const uint32_t sendBufSize = 180000; //2000000;
static const uint32_t recvBufSize = 100000; //2000000;
static uint32_t currentTxBytes = 0;
static const double simDuration = 100.0;
//如要发送的字节数、发送缓冲区大小、接收缓冲区大小、当前已发送的字节数和模拟时间的持续时间。
client = nodes.Get(0);
server = nodes.Get(1);
//创建 NS-3 中的节点。
client(客户端)是指发起网络请求的一方。客户端通常是一个应用程序或设备,通过向服务器发送请求来获取某种服务或资源。客户端通常主动发起连接,并向服务器发送请求,然后等待服务器的响应。
server(服务器)是指提供服务或资源的一方。服务器通常是一个运行特定软件的计算机或设备,它监听来自客户端的连接请求,并提供相应的服务或资源。服务器接受客户端的请求并做出响应,常见的服务包括网页、文件、数据库、流媒体等。

static const uint32_t writeSize = 1500;
//使用循环填充字符数组 data,使其包含一系列连续的小写字母。writeSize 控制了要填充的元素数量。

网络堆栈和 TCP 协议栈
网络堆栈是一个软件模块,用于处理网络通信的各个层级。
它负责处理网络协议、数据包的传输和路由、错误检测和校正等功能。网络堆栈通常由多个协议栈组成,其中最常见的是 TCP/IP 协议栈。

TCP 协议栈是网络堆栈中的一个重要组成部分,负责处理传输控制协议(TCP)相关的功能。
TCP 是一种可靠的、面向连接的协议,用于在网络上可靠地传输数据。TCP 协议栈实现了 TCP 协议的各种功能,包括连接建立、数据分段和重组、流量控制、拥塞控制等。
将网络堆栈和 TCP 协议栈安装到节点中的目的是为了使节点能够进行网络通信。
通过在节点上安装网络堆栈和 TCP 协议栈,节点可以与其他网络上的节点进行通信,发送和接收数据。这对于构建和实现各种网络应用和服务是必要的。
在计算机网络中,节点可以是计算机、服务器、路由器或其他网络设备。通过安装网络堆栈和 TCP 协议栈,这些节点能够参与网络通信,并遵循 TCP/IP 协议栈的规范进行数据传输。
MpInternetStackHelper

使用 MpInternetStackHelper 对象来安装多路复用(Multipath)网络堆栈到给定的节点集合中。
MpInternetStackHelper 是一个用于配置和安装多路复用(Multipath)网络堆栈的帮助类。
它提供了一些方法和函数,用于设置和配置多路复用网络堆栈的参数和属性。
Install(nodes) 是 MpInternetStackHelper 类的成员函数,用于将多路复用网络堆栈安装到节点集合 nodes 中。
这样,每个节点都将获得一个配置好的多路复用网络堆栈,以便进行多路复用通信。
不成功

InternetStackHelper

使用 InternetStackHelper 对象来配置和安装 TCP/IP 网络堆栈到给定的节点集合中,并将其中的 TCP 协议设置为 MpTcpL4Protocol。
InternetStackHelper 是一个用于配置和安装 TCP/IP 网络堆栈的帮助类。它提供了一些方法和函数,用于设置和配置 TCP/IP 网络堆栈的参数和属性。

SetTcp(“ns3::MpTcpL4Protocol”) 是 InternetStackHelper 类的成员函数,用于设置 TCP 协议为 MpTcpL4Protocol。这表示该网络堆栈将使用 Multipath TCP(MPTCP)协议作为其 TCP 协议实现。
Install(nodes) 是 InternetStackHelper 类的成员函数,用于将 TCP/IP 网络堆栈安装到节点集合 nodes 中。这样,每个节点都将获得一个配置好的 TCP/IP 网络堆栈,以便进行 TCP/IP 通信。
将 TCP 协议设置为 MpTcpL4Protocol 的目的是为了在网络中启用 Multipath TCP 功能,从而实现多路径数据传输。
Multipath TCP 允许同时使用多条路径进行数据传输,以提高带宽利用率、降低延迟和增强网络鲁棒性。

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 地址

在这个 for 循环中,使用 PointToPointHelper 创建了一些点对点链路。创建多个点对点链路,并为每个链路分配一个 IP 地址,并将这些接口存储在 ipv4Ints 向量中。
使用 Ipv4AddressHelper 设置了 IP 地址,并将其分配给点对点链路中的设备。
通过使用 std::stringstream 构建了一个 IP 地址字符串,并设置了网络地址和子网掩码。然后,使用 Assign 函数将 IP 地址分配给点对点链路上的设备,并将接口存储在 interface 中。
最后,将 interface 插入到 ipv4Ints 向量中。

SetCongestionCtrlAlgo

创建了一个应用程序容器,并将应用程序添加到容器中,然后启动和停止应用程序。连接到服务器,并设置连接的回调、数据发送的回调、关闭连接的回调等。

SetPacketReorderAlgo函数

用于设置包重新排序算法。
pr是一个算法类型的参数,它指定了包重新排序的算法。
Bind函数用于绑定lSocket对象到一个地址和端口。
SetSegmentSize函数用于设置段大小。1500是一个参数,它指定了段的大小。
SetMpWindowTraceCallback函数用于设置多路径窗口跟踪回调函数。
MakeCallback用于将ProprietaryTracing::DefaultWindowTrace函数作为回调函数,并将pTracing作为回调函数的参数。

Eifel

"Eifel"包重新排序算法是一种用于多路径传输控制协议(MPTCP)的包重新排序算法。该算法的目的是减少数据包乱序带来的性能损失,并提高数据传输的效率。
"Eifel"算法的基本原理是,在发送方维护一个发送窗口,并在接收方维护一个接收窗口。发送方根据接收方的窗口大小和期望接收的数据包顺序,决定发送哪些数据包。接收方根据接收到的数据包的顺序,确定是否需要发送确认(ACK)。如果接收方检测到数据包乱序,它可以发送一个SACK(Selective ACK)报文通知发送方重新发送乱序的数据包。
"Eifel"算法的优点是能够有效地减少数据包乱序对传输性能的影响。它可以自适应地调整发送速率,提高网络吞吐量,并降低延迟。此外,它还可以提供对丢包的快速恢复机制,以保证数据传输的可靠性。

辅助函数

定义了一些辅助函数,如连接成功、连接失败、写入数据直到缓冲区满等函数。

StartFlow

函数用于启动流程。
首先设置最大子流数量、最小子流数量、源地址和缓冲区大小等参数。然后调用Connect函数连接到指定的服务器地址和端口。如果连接成功,设置连接成功回调函数、数据发送回调函数和关闭回调函数等。最后,启动拥塞窗口跟踪,并调用WriteUntilBufferFull函数发送数据。

connectionSucceeded

函数是连接成功的回调函数。
在函数中打印连接成功的信息,并使用Simulator::Schedule函数安排定时调用WriteUntilBufferFull函数和CloseConnection函数。

connectionFailed

函数是连接失败的回调函数。
在函数中打印连接失败的信息,并调用Close函数关闭连接。

HandlePeerClose

处理对等方关闭连接的情况。
在函数中打印连接关闭的信息,并调用Close函数关闭连接。

HandlePeerError

处理对等方连接错误的情况。
在函数中打印连接错误的信息,并调用Close函数关闭连接。

CloseConnection

关闭连接。
在函数中调用Close函数关闭连接,并打印当前传输字节数和总传输字节数的信息。

variateDelay

用于随机变化点对点链路的延迟
WriteUntilBufferFull函数用于发送数据直到发送缓冲区满或达到总发送字节数。
在一个循环中,检查当前已发送的字节数是否小于总发送字节数,并且发送缓冲区是否有可用空间。如果满足条件,计算剩余字节数、要写入的字节数和当前写入位置。调用FillBuffer函数将数据填充到发送缓冲区,并更新已发送的字节数。然后调用SendBufferedData函数发送缓冲区中的数据。

header.cc

mptcp,mptcp,c++,tcp,网络
代码中包含了以下类和函数:

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连接的行为和状态。

其中的GetTypeId()函数用于获取MpTcpSocketBase类的类型标识。
用于设置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()

函数用于执行重传操作
函数首先获取指定子流的相关参数,如TCP头部的标志、长度等。然后获取需要重传的数据包的信息。如果找不到需要重传的数据包,则输出相应的日志信息并返回。
接下来,设置重传超时时间,并更新子流的RTT信息。
然后,构造MPTCP头部,并设置相应的字段,如序列号、确认号、源端口、目的端口、窗口大小等。根据拥塞控制算法的选择,添加相应的选项字段。
最后,根据MPTCP头部构造数据包并发送。

SetReTxTimeout()

函数用于设置重传超时定时器
函数首先获取指定子流的相关参数,然后根据子流的RTT信息计算出重传超时时间rto。
接下来,判断当前子流的重传定时器是否已过期。如果已过期,则输出相应的日志信息,并将重传超时定时器设置为rto时间后执行ReTxTimeout函数。
需要注意的是,该代码片段可能依赖于其他类的成员变量和函数,因此无法完全理解其功能和实现细节。

ProcessAction

函数根据指定的动作类型执行相应的操作。
函数首先获取指定子流的相关参数,然后根据动作类型选择相应的操作。
SYN_TX:发送SYN报文
ACK_TX:发送ACK报文
FIN_TX:发送FIN报文
FIN_ACK_TX:发送FIN和ACK报文,并关闭多路径连接
TX_DATA:发送待发送的数据
根据不同的动作类型,执行相应的操作,并返回执行结果。

ProcessAction

用于处理不同的动作。
函数首先获取指定子流的相关参数,然后根据动作类型选择相应的操作。
ACK_TX_1:发送ACK报文,并进行一些初始化操作。记录ACK序列号、设置RTT估计、更新接收序列号等。
SYN_ACK_TX:发送SYN和ACK报文。
NEW_SEQ_RX:已在ProcessHeaderOptions中处理,不再重复处理。
NEW_ACK:接收方执行的动作,调用NewACK函数处理ACK报文。
SERV_NOTIFY:接收到连接建立的确认ACK报文,进行一些相关操作。
如果动作类型不在上述列表中,则调用ProcessAction函数继续处理。
最后,返回处理结果。

getAckedSegment

函数根据指定子流索引和确认号,获取已确认的段(DSNMapping对象)。
首先获取指定子流的相关参数,然后遍历该子流的mapDSN列表,查找与确认号匹配的段。如果找到匹配的段,将其指针赋值给ptrDSN,并跳出循环。
最后,返回ptrDSN指针。
需要注意的是,该代码片段可能依赖于其他类的成员变量和函数,因此无法完全理解其功能和实现细节。

NewACK

函数用于处理接收到的ACK报文。
首先获取指定子流的相关参数,然后获取ACK号和已确认的字节数。接下来调用getAckedSegment函数获取已确认的段(DSNMapping对象)。
如果使用的拥塞控制算法为F_RTO(快速重传超时),则根据一些条件进行处理。随后,根据是否存在DSACK选项来选择打印相应的日志信息。
接下来,根据接收到的ACK是否为重复ACK进行不同的处理。如果不是重复ACK,则进行一系列操作,包括取消重传定时器、更新RTT估计、更新接收序列号等。然后根据未确认数据的数量设置重传定时器,并进行拥塞窗口的调整。最后,通知数据已发送并发送待处理的数据。
如果使用快速恢复或者拥塞控制算法为F_RTO,并且处于相应的状态,处理重复ACK的情况。

ProcessEvent

函数用于处理事件并返回相应的动作。
首先获取指定子流的相关参数,然后根据子流的当前状态和事件查找相应的状态转移和动作。如果子流为空,则返回NO_ACT。
接下来,更新子流的状态,并打印相关日志信息。
如果连接未建立且前一状态为SYN_SENT,当前状态为ESTABLISHED,则表示应用程序已完成握手,将连接状态设置为已建立,并设置m_endPoint的对等地址。
最后,返回动作。

SendEmptyPacket

函数用于发送空的数据包。
首先获取指定子流的相关参数,然后创建一个长度为0的数据包p。
接下来,设置数据包的MP_TCP头部信息,包括源端口、目的端口、标志位、序列号、确认号、窗口大小等。
如果子流的状态为SYN_SENT或者SYN_RCVD并且MPTCP启用,且m_mpSendState为MP_NONE,则设置MP_TCP的MPC选项,并更新选项长度。
然后计算选项长度和填充长度,并调整头部长度。
最后,调用m_mptcp->SendPacket函数发送数据包,并更新子流的相关参数。

SendAcknowledge

函数用于发送带有选项的ACK报文。
首先获取指定子流的相关参数,然后创建一个长度为0的数据包p。
接下来,设置数据包的MP_TCP头部信息,包括源端口、目的端口、标志位、序列号、确认号、窗口大小等。
根据拥塞控制算法的不同,添加相应的选项,并更新选项长度。
最后,调用m_mptcp->SendPacket函数发送数据包,并更新子流的相关参数。

allocateSendingBuffer

函数用于分配发送缓冲区的内存空间。根据指定的大小,创建一个大小为size的DataBuffer对象。

allocateRecvingBuffer

函数用于分配接收缓冲区的内存空间。根据指定的大小,创建一个大小为size的DataBuffer对象。

SetunOrdBufMaxSize

函数用于设置无序缓冲区的最大大小。将参数size赋值给成员变量unOrdMaxSize。

Recv

函数用于从接收缓冲区中读取数据。
首先获取要读取的数据的大小,取接收缓冲区中待接收数据的大小和参数size中较小的一个。
接下来调用recvingBuffer->Retrieve函数从接收缓冲区中读取数据,并将其存储到buf指向的缓冲区中。
最后,返回实际读取的数据的大小。

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

函数用于根据不同的拥塞控制算法来调整拥塞窗口大小。
函数首先获取指定子流的相关参数,如拥塞窗口大小cwnd、慢启动阈值ssthresh、报文段大小segSize等。然后根据子流当前的拥塞控制阶段phase以及拥塞窗口大小的情况,计算出适当的增量increment。
在正常的拥塞控制算法情况下,根据m_algoCC的值选择相应的算法来计算增量。其中包括:
RTT_Compensator:根据alpha和总拥塞窗口大小totalCwnd来计算增量
Linked_Increases:根据alpha和总拥塞窗口大小totalCwnd来计算增量
Uncoupled_TCPs:根据当前子流的拥塞窗口大小cwnd来计算增量
Fully_Coupled:根据总拥塞窗口大小totalCwnd来计算增量
最后,根据总拥塞窗口大小的限制以及接收窗口大小remoteRecvWnd,将增量加到子流的拥塞窗口大小cwnd上。并输出一些相关的日志信息。
最后注释中的代码是一些输出信息的示例,包括输出拥塞窗口大小、吞吐量、全局吞吐量、效率、延迟等

SetCongestionCtrlAlgo

用于设置拥塞控制算法,参数ccalgo是一个枚举类型CongestionCtrl_t,用于表示具体的拥塞控制算法。该函数通过将参数赋值给成员变量m_algoCC来设置拥塞控制算法。函数使用了宏NS_LOG_FUNCTION_NOARGS来记录函数调用,但没有接受任何参数。

SetDataDistribAlgo

用于设置数据分发算法,参数ddalgo是一个枚举类型DataDistribAlgo_t,用于表示具体的数据分发算法。该函数通过将参数赋值给成员变量m_distribAlgo来设置数据分发算法。函数同样使用了宏NS_LOG_FUNCTION_NOARGS来记录函数调用,但没有接受任何参数。文章来源地址https://www.toymoban.com/news/detail-855311.html

到了这里,关于MPTCP多路径传输协议的研究与实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络原理】TCP协议如何实现可靠传输(确认应答机制)

    🥊作者:一只爱打拳的程序猿,Java领域新星创作者,CSDN、阿里云社区优质创作者。 🤼专栏收录于:计算机网络原理 本篇主要讲解:TCP协议段格式,TCP的序列号,SYN、ACK标志位,确认应答机制。 目录 1、TCP协议段格式 1.1 TCP格式段 1.2 TCP协议段格式 2、确认应答机制 2.1 后发

    2024年02月09日
    浏览(36)
  • 【网络编程】传输层协议——TCP协议

    TCP报头当中各个字段的含义如下 源/目的端口号 :表示数据是从哪个进程来,到发送到对端主机上的哪个进程。 32位序号/32位确认序号 :分别代表TCP报文当中每个字节数据的编号以及对对方的确认,是TCP保证可靠性的重要字段。 4位TCP报头长度 :表示该TCP报头的长度,以4字

    2024年02月17日
    浏览(44)
  • 【网络】传输层TCP协议

    目录 一、概述 2.1 运输层的作用引出 2.2 传输控制协议TCP 简介 2.3 TCP最主要的特点 2.4 TCP连接 二、TCP报文段的首部格式 三、TCP的运输连接管理 3.1 TCP的连接建立(三次握手) 3.2 为什么是三次握手? 3.3 为何两次握手不可以呢? 3.4 TCP的连接释放(四次挥手) 3.5 为什么客户端在TIME

    2024年01月23日
    浏览(28)
  • 【计算机网络】传输层协议 -- TCP协议

    认识可靠性 现在的计算机大多都是基于冯诺依曼体系结构的 虽然这里的输入设备、输出设备、内存、CPU是在同一个机器上的,但是它们彼此间却是相互独立的。如果它们之间要进行通信,那就必须要用“线”连接起来,其中连接内存和外设之间的“线”叫做IO总线,连接CP

    2024年02月14日
    浏览(39)
  • 【传输层】网络基础 -- UDP协议 | TCP协议

    端口号(Port)标识了一个主机上进行通信的不同的应用程序 在TCP/IP协议中,用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过 netstat -n 查看) 0 - 1023:知名端口号,HTTP,FTP,SSH等这些广为使用的应用层协议,他

    2024年02月09日
    浏览(40)
  • 【计算机网络-传输层】TCP 协议

    端到端通信 :提供应用进程间的端到端通信(逻辑通信)。因此传输层又称为端到端协议。 差错检测 :对首部和数据部分进行检测。 两种协议 :面向连接的 TCP、无连接的 UDP。 复用和分用 : 概念 解释 传输层 TCP 复用 发送方的部分应用进程的报文在传输层使用 TCP 协议进

    2023年04月13日
    浏览(37)
  • 【网络协议】聊聊TCP如何做到可靠传输的

    网络是不可靠的,所以在TCP协议中通过各种算法等机制保证数据传输的可靠性。生活中如何保证消息可靠传输的,那么就是采用一发一收的方式,但是这样其实效率并不高,所以通常采用的是累计确认或者累计应答。 TCP为了保证顺序性,每个包都有一个ID,这个是建立连接之

    2024年02月08日
    浏览(30)
  • 网络原理(四):传输层协议 TCP/UDP

    目录 应用层 传输层 udp 协议  端口号 报文长度(udp 长度) 校验和 TCP 协议 确认应答 超时重传 链接管理 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 总结 我们第一章让我们对网络有了一个初步认识,第二章和第三章我们通过代码感受了网络通信程序。 而本章的 通信原

    2023年04月27日
    浏览(43)
  • 网络传输层协议:UDP和TCP

    端口号(Port)标识了一个主机上进行通信的不同的应用程序; 在TCP/IP协议中, 用 \\\"源IP\\\", \\\"源端口号\\\", \\\"目的IP\\\", \\\"目的端口号\\\", \\\"协议号\\\" 这样一个五元组来标识一个通信(可以通过 netstat -n查看);  0 - 1023: 知名端口号, HTTP, FTP, SSH 比特科技 等这些广为使用的应用层协议, 他们的端口号

    2024年02月15日
    浏览(40)
  • 【计算机网络】传输层协议——TCP(上)

    TCP报文 等于报头 加 有效载荷 TCP的标准报头长度 整体为20字节 报头的宽度是0-31,表示报头所对应的字节数 (4字节)报文对应的宽度 为0-31 有效的标准报头长度一共 5行,所以 整体为20字节 选项 如:客户端和服务器建立好了链接,但这个链接长时间不关,并且也不发数据,所

    2024年02月09日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包