目 录CONTENT

文章目录

例程-fifth.cc

Rho
Rho
2023-08-27 / 0 评论 / 0 点赞 / 33 阅读 / 5192 字
这段代码是一个基于ns-3网络模拟器的示例应用程序,用于模拟一个简单的点对点网络拓扑,其中包含两个节点和一个TCP连接。

该程序通过ns-3模拟一个简单的点对点网络拓扑,并使用TCP协议进行数据传输。并且还演示了如何通过回调函数追踪TCP拥塞窗口的变化以及接收端数据包丢失的情况。

//         node 0                 node 1
//   +----------------+    +----------------+
//   |    ns-3 TCP    |    |    ns-3 TCP    |
//   +----------------+    +----------------+
//   |    10.1.1.1    |    |    10.1.1.2    |
//   +----------------+    +----------------+
//   | point-to-point |    | point-to-point |
//   +----------------+    +----------------+
//           |                     |
//           +---------------------+
//                5 Mbps, 2 ms
#include "tutorial-app.h"

#include "ns3/applications-module.h"
#include "ns3/core-module.h"
#include "ns3/internet-module.h"
#include "ns3/network-module.h"
#include "ns3/point-to-point-module.h"

#include <fstream>

using namespace ns3;

NS_LOG_COMPONENT_DEFINE("FifthScriptExample");

/**
 * Congestion window change callback
 *
 * \param oldCwnd Old congestion window.
 * \param newCwnd New congestion window.
 */

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

// Rx drop callback
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);

    // Configure TCP parameters
    Config::SetDefault("ns3::TcpL4Protocol::SocketType", StringValue("ns3::TcpNewReno")); // 设置TCP拥塞控制算法为TcpNewReno
    Config::SetDefault("ns3::TcpSocket::InitialCwnd", UintegerValue(1)); // 设置TCP连接的初始拥塞窗口为1个数据包
    Config::SetDefault("ns3::TcpL4Protocol::RecoveryType",
                       TypeIdValue(TypeId::LookupByName("ns3::TcpClassicRecovery"))); // 设置TCP的快速恢复算法为经典的快速恢复

    NodeContainer nodes;
    nodes.Create(2); // 创建两个节点

    PointToPointHelper pointToPoint;
    pointToPoint.SetDeviceAttribute("DataRate", StringValue("5Mbps")); // 设置点对点链路的数据速率为5Mbps
    pointToPoint.SetChannelAttribute("Delay", StringValue("2ms")); // 设置点对点链路的延迟为2ms

    NetDeviceContainer devices;
    devices = pointToPoint.Install(nodes); // 在节点之间安装点对点网络设备

    Ptr<RateErrorModel> em = CreateObject<RateErrorModel>();
    em->SetAttribute("ErrorRate", DoubleValue(0.00001)); // 设置接收端设备的错误率为0.00001 (0.001%)
    devices.Get(1)->SetAttribute("ReceiveErrorModel", PointerValue(em)); // 将错误模型应用于接收端设备

    InternetStackHelper stack;
    stack.Install(nodes); // 在节点上安装网络协议栈

    Ipv4AddressHelper address;
    address.SetBase("10.1.1.0", "255.255.255.252"); // 设置IP地址的基础和子网掩码
    Ipv4InterfaceContainer interfaces = address.Assign(devices); // 为网络设备分配IP地址

    uint16_t sinkPort = 8080;
    Address sinkAddress(InetSocketAddress(interfaces.GetAddress(1), sinkPort)); // 创建接收端地址
    PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory",
                                      InetSocketAddress(Ipv4Address::GetAny(), sinkPort)); // 创建PacketSink应用程序帮助类
    ApplicationContainer sinkApps = packetSinkHelper.Install(nodes.Get(1)); // 在节点1上安装PacketSink应用程序
    sinkApps.Start(Seconds(0.)); // 启动接收端应用程序
    sinkApps.Stop(Seconds(20.)); // 停止接收端应用程序

    Ptr<Socket> ns3TcpSocket = Socket::CreateSocket(nodes.Get(0), TcpSocketFactory::GetTypeId()); // 创建TCP套接字
    ns3TcpSocket->TraceConnectWithoutContext("CongestionWindow", MakeCallback(&CwndChange)); // 连接拥塞窗口变化的回调函数

    Ptr<TutorialApp> app = CreateObject<TutorialApp>(); // 创建自定义应用程序
    app->Setup(ns3TcpSocket, sinkAddress, 1040, 1000, DataRate("1Mbps")); // 设置应用程序的属性
    nodes.Get(0)->AddApplication(app); // 在节点0上安装应用程序
    app->SetStartTime(Seconds(1.)); // 设置应用程序的开始时间
    app->SetStopTime(Seconds(20.)); // 设置应用程序的停止时间

    devices.Get(1)->TraceConnectWithoutContext("PhyRxDrop", MakeCallback(&RxDrop)); // 连接接收端设备的数据包丢失回调函数

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

拥塞窗口 关于将TCP连接的初始拥塞窗口设置为1个数据包意味着在建立连接时,发送方最初只能发送一个数据包大小的数据量。拥塞窗口是用于控制发送方发送数据的窗口大小,它的大小会根据网络的拥塞情况进行调整。

当TCP连接建立时,发送方希望以一个保守的速率开始发送数据,以便在网络出现拥塞时能够快速感知并减小发送速率。通过将初始拥塞窗口设置为较小的值(如1个数据包),可以降低网络拥塞的风险,因为发送方只发送少量数据并等待确认,以便检测网络是否能够承受该速率。

随着时间的推移,根据TCP的拥塞控制算法,发送方会根据网络的反馈逐渐增加拥塞窗口的大小,以提高数据传输的效率。初始拥塞窗口的选择是为了在连接开始时保持网络的稳定性,并逐渐增加发送速率以适应网络的容量。

0

评论区