NS3学习——fifth基础上运行tcpVegas算法(附完整源码)

环境:VMware17.5 Ubuntu20.04

目的:在fifth.cc基础上设置TCP拥塞控制算法,通过创建一个简单的网络拓扑(两个节点和点对点连接),并在节点上安装应用程序进行数据流传输,同时利用回调函数来监控拥塞窗口的变化和丢包事件。

1.复制fifth.cc文件,命名为fifth-copy.cc

确保当前位于fifth.cc文件所在路径,如:

cd ~/tarballs/ns-allinone-3.36.1/ns-3.36.1/examples/tutorial

执行复制命令:

cp fifth.cc fifth-copy.cc

确认是否复制成功:

ls //应该能看到 fifth-copy.cc 文件出现在文件列表中

2.修改fifth-copy代码

(完整代码在最后)

使用vi/vim命令进行编辑修改

linux------vi命令常用操作-CSDN博客

头文件中增加以下代码:

#include "ns3/tcp-congestion-ops.h" // 包含自定义的 TCP 拥塞控制算法头文件

使用自定义的拥塞控制算法 更改为对应算法:

// 设置自定义的拥塞控制算法

Config::SetDefault ("ns3::TcpL4Protocol::SocketType", StringValue ("ns3::TcpVegas")); // 使用自定义的拥塞控制算法

3.修改CMakeLists.txt 文件并保存(关键)

(否则编译运行以后会报错:Target to build does not exist: examples/tutorial/fifth-copy.cc)

将fifth-copy.cc文件注册到构建系统中。虽然 fifth.cc 文件已经被注册,但如果需要单独编译和运行fifth-copy.cc,必须将其添加到 CMakeLists.txt 文件中。

CMakeLists.txt 路径:examples/tutorial/CMakeLists.txt

在CMakeLists.txt最后添加以下代码:

build_example(

NAME fifth-copy

SOURCE_FILES fifth-copy.cc

tutorial-app.cc

LIBRARIES_TO_LINK

${libcore}

${libpoint-to-point}

${libinternet}

${libapplications}

)

4.重新配置并编译项目

每次修改CMakeLists.txt 后,需要重新运行配置和编译命令:

cd ~/tarballs/ns-allinone-3.36.1/ns-3.36.1

./ns3 configure

./ns3 build //也可以直接编译fifth-copy ./ns3 build examples/tutorial/fifth-copy

5.运行fifth-copy

./ns3 run examples/tutorial/fifth-copy

此时即可得到对应数据点(时间点和窗口大小以及丢包情况)

6.结果可视化

同ffth.cc程序一样,用gnuplot进行结果可视化

具体见:NS3学习------运行第五个(fifth.cc)示例(附fifth.cc源代码_ns3运行tutorial-CSDN博客

7.生成窗口图如下

完整源码:

cpp 复制代码
#include <fstream>
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/applications-module.h"
#include "ns3/point-to-point-module.h"
#include "tutorial-app.h"
#include "ns3/tcp-congestion-ops.h"  // 包含自定义的 TCP 拥塞控制算法头文件

using namespace ns3;

NS_LOG_COMPONENT_DEFINE ("FifthScriptExample");

// ===========================================================================
// 你的网络拓扑和应用程序代码...
// ===========================================================================

static void
CwndChange (uint32_t oldCwnd, uint32_t newCwnd)
{
  NS_LOG_UNCOND (Simulator::Now ().GetSeconds () << "\t" << newCwnd);
}

static void
RxDrop (Ptr<const Packet> p)
{
  NS_LOG_UNCOND ("RxDrop at " << Simulator::Now ().GetSeconds ());
}

int 
main (int argc, char *argv[])
{
  CommandLine cmd (__FILE__);
  cmd.Parse (argc, argv);

  // 设置自定义的拥塞控制算法
  Config::SetDefault ("ns3::TcpL4Protocol::SocketType", StringValue ("ns3::TcpVegas"));  // 使用自定义的拥塞控制算法
  Config::SetDefault ("ns3::TcpSocket::InitialCwnd", UintegerValue (1));
  Config::SetDefault ("ns3::TcpL4Protocol::RecoveryType", TypeIdValue (TypeId::LookupByName ("ns3::TcpClassicRecovery")));
  
  NodeContainer nodes;
  nodes.Create (2);

  PointToPointHelper pointToPoint;
  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
  pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

  NetDeviceContainer devices;
  devices = pointToPoint.Install (nodes);

  Ptr<RateErrorModel> em = CreateObject<RateErrorModel> ();
  em->SetAttribute ("ErrorRate", DoubleValue (0.00001));
  devices.Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (em));

  InternetStackHelper stack;
  stack.Install (nodes);

  Ipv4AddressHelper address;
  address.SetBase ("10.1.1.0", "255.255.255.252");
  Ipv4InterfaceContainer interfaces = address.Assign (devices);

  uint16_t sinkPort = 8080;
  Address sinkAddress (InetSocketAddress (interfaces.GetAddress (1), sinkPort));
  PacketSinkHelper packetSinkHelper ("ns3::TcpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), sinkPort));
  ApplicationContainer sinkApps = packetSinkHelper.Install (nodes.Get (1));
  sinkApps.Start (Seconds (0.));
  sinkApps.Stop (Seconds (20.));

  Ptr<Socket> ns3TcpSocket = Socket::CreateSocket (nodes.Get (0), TcpSocketFactory::GetTypeId ());
  ns3TcpSocket->TraceConnectWithoutContext ("CongestionWindow", MakeCallback (&CwndChange));

  Ptr<TutorialApp> app = CreateObject<TutorialApp> ();
  app->Setup (ns3TcpSocket, sinkAddress, 1040, 1000, DataRate ("1Mbps"));
  nodes.Get (0)->AddApplication (app);
  app->SetStartTime (Seconds (1.));
  app->SetStopTime (Seconds (20.));

  devices.Get (1)->TraceConnectWithoutContext ("PhyRxDrop", MakeCallback (&RxDrop));

  Simulator::Stop (Seconds (20));
  Simulator::Run ();
  Simulator::Destroy ();

  return 0;
}
相关推荐
云上艺旅14 小时前
K8S学习之基础七十四:部署在线书店bookinfo
学习·云原生·容器·kubernetes
大丈夫立于天地间14 小时前
ISIS协议中的数据库同步
运维·网络·信息与通信
你觉得20514 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
大数据·人工智能·python·gpt·学习·机器学习·aigc
Dream Algorithm14 小时前
路由器的 WAN(广域网)口 和 LAN(局域网)口
网络·智能路由器
IT猿手14 小时前
基于CNN-LSTM的深度Q网络(Deep Q-Network,DQN)求解移动机器人路径规划,MATLAB代码
网络·cnn·lstm
吴盐煮_14 小时前
使用UDP建立连接,会存在什么问题?
网络·网络协议·udp
hyshhhh15 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
A旧城以西15 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea
无所谓จุ๊บ15 小时前
VTK知识学习(50)- 交互与Widget(一)
学习·vtk
FAREWELL0007515 小时前
C#核心学习(七)面向对象--封装(6)C#中的拓展方法与运算符重载: 让代码更“聪明”的魔法
学习·c#·面向对象·运算符重载·oop·拓展方法