NS3实例分析 - second.cc

代码分析

#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/csma-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"
#include "ns3/ipv4-global-routing-helper.h"

// Default Network Topology
//
//       10.1.1.0
// n0 -------------- n1   n2   n3   n4
//    point-to-point  |    |    |    |
//                    ================
//                      LAN 10.1.2.0

// n0和n1实现点到点通信, n1~n4是个csma有线局域网.
// 网络可以实现n0经由n1, 和n4进行通信.

using namespace ns3;

// 定义日志组件
NS_LOG_COMPONENT_DEFINE("SecondScriptExample");

int
main (int argc, char *argv[])
{
    // 定义bool变量用于决定是否开启日志组件(默认开启)
    bool verbose = true;
    // 变量nCsma, 用于定义csma网络中有多少个结点
    uint32_t nCsma = 3;

    CommandLine cmd;
    cmd.AddValue ("nCsma", "Number of \"extra\" CSMA nodes/devices", nCsma);
    cmd.AddValue ("verbose", "Tell echo applications to log if true", verbose);

    cmd.Parse(argc, argv);

    if (verbose)
      {
          LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
          LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
      }

    nCsma = nCsma == 0 ? 1 : nCsma;


    /*** 网络拓扑部分 ***/

    // 创建p2p链路链接的两个结点(n0 & n1)
    NodeContainer p2pNodes;
    p2pNodes.Create (2);

    // 创建csma网络结点
    NodeContainer csmaNodes;
    csmaNodes.Add (p2pNodes.Get (1)); // 将n1也加入csma网络中
    csmaNodes.Create (nCsma);

    // 设置p2p传输速率和信道延迟
    PointToPointHelper pointToPoint;
    pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
    pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

    // 安装p2p网卡设备到p2p结点
    NetDeviceContainer p2pDevices;
    p2pDevices = pointToPoint.Install (p2pNodes);

    // 设置csma传输速率和信道延迟
    CsmaHelper csma;
    csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps"));
    csma.SetChannelAttribute ("Delay", TimeValue (NanoSeconds (6560)));

    // 安装网络设备到csma结点 (共计 nCsma + 1个)
    NetDeviceContainer csmaDevices;
    csmaDevices = csma.Install (csmaNodes);

    // 安装网络协议栈
    InternetStackHelper stack;
    stack.Install (p2pNodes.Get (0)); // 在p2p链路中的n0结点上安装
    stack.Install (csmaNodes); // 在n1、n2、n3、n4结点上安装

    // 分配地址
    Ipv4AddressHelper address;

    // 安排p2p网段的地址
    address.SetBase ("10.1.1.0", "255.255.255.0");
    // n0: 10.1.1.1; n1: 10.1.1.2
    Ipv4InterfaceContainer p2pInterfaces;
    p2pInterfaces = address.Assign (p2pDevices);

    // 安排csma网段的地址
    address.SetBase ("10.1.2.0", "255.255.255.0");
    // n1: 10.1.2.1; n2: 10.1.2.2; n3: 10.1.2.3; n4: 10.1.2.4
    Ipv4InterfaceContainer csmaInterfaces;
    csmaInterfaces = address.Assign (csmaDevices);


    /*** 应用程序部分 ***/

    // 设置UDP服务端网络端口号为9
    UdpEchoServerHelper echoServer (9);

    // 将服务端服务安装在csma网段的最后一个结点nCsma上(n4)
    ApplicationContainer severApps = echoServer.Install (csmaNodes.Get (nCsma));
    severApps.Start (Seconds (1.0));
    severApps.Stop (Seconds (10.0));


    // 设定客户端对应远程服务器的IP地址和端口号
    UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);
    echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
    echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
    echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

    // 将客户端服务安装在p2p网段的第一个结点上(n0)
    ApplicationContainer clientApps = echoClient.Install (p2pNodes.Get (0));
    clientApps.Start (Seconds (2.0));
    clientApps.Stop (Seconds (10.0));


    /*** 调用全局路由Helper帮助建立网络路由 ***/

    // 根据结点产生的链路通告为每个节点建立路由表
    Ipv4GlobalRoutingHelper::PopulateRoutingTables ();


    /*** 开启网络嗅探器 ***/
    pointToPoint.EnablePcapAll ("second");
    csma.EnablePcap ("second", csmaDevices.Get (1), true);

    /*** 运行和销毁模拟器 ***/
    Simulator::Run ();
    Simulator::Destroy ();
    return 0;
}

运行结果

NS3实例分析 - second.cc_第1张图片

你可能感兴趣的:(网络)