ns3的入门教程<3>(数据网络技术实验)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

ns3的入门教程<3>


前言

接着上一次的报告继续,实现星型结构网络环境进行仿真

一、硬件实现

在硬件实现方面需要看下在ns3文件夹下的 /usr/local/workspace/ns-allinone-3.28.1/ns-3.28.1/examples/tutorial文夹下的文件,下面有:
first.cc, second.cc, third.cc,等文件,可以很好对ns3的硬件仿真有很好的认识。,我在这里就不再过多的阐述了,直接上星型结构的仿真代码,并进行分析。

// Network topology
//
//        n0   n1   n2  n3  
//        |    |    |    |      
//       -------------------
//             Switch 
//       -------------------
//        |    |    |    |     
//        n4   n5   n6   n7
//
//
// - CBR/UDP flows from n0 to n1 
// - based on UDP
// - Tracing of queues and packet receptions to file "csma-bridge.tr"

#include <iostream>
#include <fstream>
#include "para.h"
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/applications-module.h"
#include "ns3/bridge-module.h"
#include "ns3/csma-module.h"
#include "ns3/internet-module.h"
#include "ns3/netanim-module.h"

using namespace ns3;

NS_LOG_COMPONENT_DEFINE ("CsmaBridgeExample");

int 
main (int argc, char *argv[])
{
  //
  // Users may find it convenient to turn on explicit debugging
  // for selected modules; the below lines suggest how to do this
  //

  CommandLine cmd;
  cmd.Parse (argc, argv);

    NS_LOG_INFO ("Create nodes.");
    
	//设置通信节点的数量,共8个通信节点
    NodeContainer terminals;
    terminals.Create (8);
    
	//创建网桥,即网络中心
    NodeContainer csmaSwitch;
    csmaSwitch.Create (1);

  //创建网桥,信道的带宽为10Mbps,信道延迟为2ms
  NS_LOG_INFO ("Build Topology");
  CsmaHelper csma;
  csma.SetChannelAttribute ("DataRate", DataRateValue (10000000));
  csma.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
  // Create the csma links, from each terminal to the switch
  
   //在网桥上安装通信设备
  NetDeviceContainer terminalDevices;
  NetDeviceContainer switchDevices;

	//将网桥与通信节点相连接
    for (int i = 0; i < 8; i++)
    {
      NetDeviceContainer link = csma.Install (NodeContainer (terminals.Get (i), csmaSwitch));
      terminalDevices.Add (link.Get (0));
      switchDevices.Add (link.Get (1));
    }

    // Create the bridge netdevice, which will do the packet switching
    Ptr<Node> switchNode = csmaSwitch.Get (0);
    BridgeHelper bridge;
    bridge.Install (switchNode, switchDevices);

    // Add internet stack to the terminals
    InternetStackHelper internet;
    internet.Install (terminals);

    // We've got the "hardware" in place.  Now we need to add IP addresses.
    //
    NS_LOG_INFO ("Assign IP Addresses.");
    Ipv4AddressHelper ipv4;
    ipv4.SetBase ("10.1.1.0", "255.255.255.0");
    ipv4.Assign (terminalDevices);

到此,基于星型结构的网络仿真已经实现到网络层,只需要在其上添加其传输层的协议,就可以实现网络仿真。

二、通信实现

1.传输层UDP通信实现

  uint16_t port = 9;   // Discard port (RFC 863)

  // Create a similar flow from n0 to n7, starting at time 1.0 seconds
  //这里的IP地址是指定收的节点的IP地址
  OnOffHelper onoff ("ns3::UdpSocketFactory", 
        Address (InetSocketAddress (Ipv4Address ("10.1.1.8"), port)));
   
  onoff.SetConstantRate (DataRate ("4Mb/s"));         //set node datarate 
    
  ApplicationContainer app = onoff.Install (csmaNodes.Get (0));
    // Start the application
    app.Start (Seconds (1.0));
    app.Stop (Seconds (10.0));

    // Create an optional packet sink to receive these packets
    PacketSinkHelper sink ("ns3::UdpSocketFactory",
           Address (InetSocketAddress (Ipv4Address::GetAny (), port)));
    app = sink.Install (csmaNodes.Get (7));
    app.Start (Seconds (0.0));


    // Create a similar flow from n1 to n6, starting at time 1.0 seconds
    onoff.SetAttribute ("Remote", 
           AddressValue (InetSocketAddress (Ipv4Address ("10.1.1.7"), port)));
    app = onoff.Install (csmaNodes.Get (1));
    app.Start (Seconds (1));
    app.Stop (Seconds (10.0));

    app = sink.Install (csmaNodes.Get (6));
    app.Start (Seconds (0.0));

    // Create a similar flow from n2 to n5, starting at time 1.0 seconds
    onoff.SetAttribute ("Remote", 
            AddressValue (InetSocketAddress (Ipv4Address ("10.1.1.6"), port)));
    
    app = onoff.Install (csmaNodes.Get (2));
    app.Start (Seconds (1));
    app.Stop (Seconds (10.0));

    app = sink.Install (csmaNodes.Get (5));
    app.Start (Seconds (0.0));

    // Create a similar flow from n3 to n4, starting at time 1.0 seconds
    onoff.SetAttribute ("Remote", 
           AddressValue (InetSocketAddress (Ipv4Address ("10.1.1.5"), port)));
    
    app = onoff.Install (csmaNodes.Get (3));
    app.Start (Seconds (1));
    app.Stop (Seconds (10.0));

    app = sink.Install (csmaNodes.Get (4));
    app.Start (Seconds (0.0));


  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
  
  //抓取网络通信过程中的通信包
  csma.EnablePcapAll ("CSAM_4pair_4Mbps_UDP", false);

  FlowMonitorHelper flowmon;
  flowmon.InstallAll ();

  Simulator::Stop (Seconds (10));


  Packet::EnablePrinting ();
  
  //将网络仿真过程可视化,并且设置网络节点的位置。
  AnimationInterface anim("CSAM_4pair_4Mbps_UDP.xml");
  anim.SetConstantPosition(csmaNodes.Get(0),10,10);
  anim.SetConstantPosition(csmaNodes.Get(1),10,20);
  anim.SetConstantPosition(csmaNodes.Get(2),10,30);
  anim.SetConstantPosition(csmaNodes.Get(3),20,10);
  anim.SetConstantPosition(csmaNodes.Get(4),20,20);
  anim.SetConstantPosition(csmaNodes.Get(5),20,30);
  anim.SetConstantPosition(csmaNodes.Get(6),30,10);
  anim.SetConstantPosition(csmaNodes.Get(7),30,20);
  
  //仿真开始
  Simulator::Run ();
  
  //仿真流量监控
  flowmon.SerializeToXmlFile ("CSAM_4pair_4Mbps_UDP.flowmon", true, true);
  
  //仿真结束
  Simulator::Destroy ();
  return 0;

2.代码分析

2.1 其实在NS3中有很多可以实现UDP的类,但是为什么偏偏选择使用onoff类呢,主要有以下两个个原因:

  1. 可以控制流量,可以设置发送速率的大小,满足题目的要求。
  2. 便于UDP和TCP之间的转化,只需要修改 “ns3::UdpSocketFactory” 为**“ns3::TcpSocketFactory”** 就可以实现传输层协议的更换。

2.2 其次有基于 netanim 的仿真实现,其动态效果如下所示。

ns3的入门教程<3>(数据网络技术实验)

三、 总结

实验的全部代码可到我的资源中心下载

上一篇:NS3-命令行参数


下一篇:ns3的入门教程<2>(数据网络技术实验)