码迷,mamicode.com
首页 > 其他好文 > 详细

NS3实例分析(3)-- second.cc

时间:2015-04-24 09:15:59      阅读:676      评论:0      收藏:0      [点我收藏+]

标签:ns3   以太网   p2p   

这一小节我们来看看第三个例子,这个例子应用了一个P2P信道和一个实现CSMA的以太信道。

网络拓扑如下:

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


接下来,分析一下 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"

using namespace ns3;

//声明了一个叫SecondScriptExample的日志构件,通过引用SecondScriptExample这个名字的操作,
//可以实现打开或者关闭控制台日志的输出。
NS_LOG_COMPONENT_DEFINE ("SecondScriptExample");

int main (int argc, char *argv[])
{
  //定义变量,用于决定是否开启两个UdpApplication的Logging组件;默认true开启
  bool verbose = true;
  uint32_t nCsma = 3;        

  CommandLine cmd;
  cmd.AddValue ("nCsma", "Number of \"extra\" CSMA nodes/devices", nCsma);
  //命令行参数设置是否开启logging
  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链路链接的2个node
  NodeContainer p2pNodes;
  p2pNodes.Create (2);

  //创建另一个NodeContainer类对象,用于总线(CSMA)网络
  NodeContainer csmaNodes;
  //将之前P2P的NodeContianer的第二个节点添加到CSMA的NodeContainer,
  //以获得CSMA device;这个node将会有两个device
  csmaNodes.Add (p2pNodes.Get (1));
  //再创建Bus network上另外3个node
  csmaNodes.Create (nCsma);

  //设置传送速率和信道延迟
  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)));

  NetDeviceContainer csmaDevices;
  csmaDevices = csma.Install (csmaNodes);

  //安装网络协议
  InternetStackHelper stack;
  //P2P链路中的第一个节点
  stack.Install (p2pNodes.Get (0));
  //P2P链路中的第二个节点
  stack.Install (csmaNodes);

  //两个网段的IP地址类对象
  Ipv4AddressHelper address;
  //安排P2P网段的地址
  address.SetBase ("10.1.1.0", "255.255.255.0");
  Ipv4InterfaceContainer p2pInterfaces;
  p2pInterfaces = address.Assign (p2pDevices);

  //安排CSMA网段地址
  address.SetBase ("10.1.2.0", "255.255.255.0");
  Ipv4InterfaceContainer csmaInterfaces;
  csmaInterfaces = address.Assign (csmaDevices);
  /********************网络拓扑部分结束*********************/

  /**********************应用程序部分*********************/
  UdpEchoServerHelper echoServer (9);

  //将Server服务安装在CSMA网段的最后一个节点上
  ApplicationContainer serverApps = echoServer.Install (csmaNodes.Get (nCsma));
  serverApps.Start (Seconds (1.0));
  serverApps.Stop (Seconds (10.0));

  UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);
  echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
  echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
  echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

  //将Client服务安装在P2P网段的第一个节点上
  ApplicationContainer clientApps = echoClient.Install (p2pNodes.Get (0));
  clientApps.Start (Seconds (2.0));
  clientApps.Stop (Seconds (10.0));
  /**********************应用程序部分结束*********************/

  /****************调用全局路由Helper帮助建立网络路由*******************/
  //全局路由管理器根据节点产生的链路通告为每个节点建立路由表
  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

  /****************开启pcap跟踪*******************/
  //开启P2PHelper类对象的pcap
  pointToPoint.EnablePcapAll ("second");
  //开启csmaHelper类对象的pcap
  //使用csma网段第二个节点进行sniff,True开启混杂模式
  csma.EnablePcap ("second", csmaDevices.Get (1), true);

  Simulator::Run ();
  Simulator::Destroy ();
  return 0;
}

-------------------------------------------------------------------------------------------------------

编译并运行,结果如下:

技术分享



需要注意的有几点:

1、CsmaChannel信道模拟了用于一个可以实现载波侦听多路访问通信子网中的媒介。这个信道具有和以太网相似的功能。

2、NetDevice类提供了管理连接其他节点和信道对象的各种方法,并且允许开发者以面向对象的方法来自定义。本例中用到了CsmaNetDevice和PointToPointNetDevice。CsmaNetDevice被设计成在csma信道中工作,而PointToPointNetDevice 在PointToPoint信道中工作。以后还会遇见WifiNetNevice,这是在wifi信道中工作。

3、使用了全局路由管理器,根据节点产生的链路通告为每个节点建立路由表

4、开启了网络嗅探器

NS3实例分析(3)-- second.cc

标签:ns3   以太网   p2p   

原文地址:http://blog.csdn.net/liuruiqun/article/details/45226683

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!