NS3实例分析second.cc_Building a Bus Network Topology

转自:http://blog.sina.com.cn/s/blog_7ec2ab360102wxgi.html


NS3中提供了CSMA的网络设备和信道。

NS3 CSMA设备模仿了一个简单的以太网网络。一个真正的以太网用带有指数退避算法的CSMA/CD(带冲突检测的载波监听多路访问技术)来共享传输媒介。NS3 CSMA设备和信道模型只是其子集。

正如之前构建点对点拓扑中的PointToPointHelper,这里我们将看到类似的CSMA Helper。这些Helper的操作都类似。

在examples/tutorial目录下的second.cc脚本,是之前的first.cc的升级版,我们在原来的点到点仿真中添加了CSMA进去。

下面,我们来看一下代码。

 

一.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
//n0、n1是点到点,右边是n1、n2、n3、n4是总线形局域网
//          10.1.1.0
// n0 -------------- n1   n2   n3   n4
//    point-to-point  |    |    |    |
//                    ================
//                              LAN 10.1.2.0                           LAN上的节点数可以随意改变,但必须是两个以上

 


using namespace ns3;

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

int
main (int argc, char *argv[])
{
  bool verbose = true;            //用verbose flag 判定UdpEchoClientApplication和UdpEchoServerApplication日志组件是否启用。当verbose为真时,启用日志。
  uint32_t nCsma = 3;            //因为CSMA机制,所以必须存在两个以上的节点。nCsma代表了额外的节点或者设备的数量。如果nCsma=1,那么代表一共有两个节点,nCsma=3,则一共有4个节点。
 

  CommandLine cmd;
  cmd.AddValue ("nCsma", "Number of "extra" CSMA nodes/devices", nCsma);             //向命令行参数系统添加nCsma属性

  cmd.AddValue ("verbose", "Tell echo applications to log if true", verbose);                     //向命令行参数系统添加verbose属性

  cmd.Parse (argc,argv);

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

  nCsma = nCsma == 0 ? 1 : nCsma;                           //为了确保nCsma不等于0

 

 

  NodeContainer p2pNodes;                                       //创建两个p2p节点对象,并创建两个节点
  p2pNodes.Create (2);

 

 

  NodeContainer csmaNodes;                                          //创建CSMA节点对象
  csmaNodes.Add (p2pNodes.Get (1));                              //从p2p节点容器中取出序号为1的节点同时加到CSMA节点容器中,即有一个节点即是p2p节点,又是CSMA节点,该节点同时连接两种网络。
  csmaNodes.Create (nCsma);                                           //创建CSMA节点来组成CSMA网络,其中CSMA网络中的节点数为nCsma+1

 

 

  PointToPointHelper pointToPoint;                                      //设置设备和信道参数
  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
  pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

 

 

  NetDeviceContainer p2pDevices;                                         //创建p2p网络设备对象
  p2pDevices = pointToPoint.Install (p2pNodes);                 //安装p2p网络设备到p2p节点上

 

 

 CsmaHelper csma;          //类似于PointToPointHelper。CsmaHelper用于创建和连接CSMA设备和信道。
  csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps"));                     //注意!DataRate是由SetChanelAttribute()方法设置!那是因为一个真实的CSMA网络不允许同一个信道上有多个不同数据速率的设备!

  csma.SetChannelAttribute ("Delay", TimeValue (NanoSeconds (6560)));                    //设置信道时延

 

 

  NetDeviceContainer csmaDevices;                  //创建CSMA网络设备对象,并安装在CSMA节点上
  csmaDevices = csma.Install (csmaNodes);

 

 

  InternetStackHelper stack;                 //安装协议栈
  stack.Install (p2pNodes.Get (0));    
  stack.Install (csmaNodes);                 //p2p的第二节点包含在CSMA节点中

 

 

  Ipv4AddressHelper address;              //给设备接口安排IP地址
  address.SetBase ("10.1.1.0", "255.255.255.0");
  Ipv4InterfaceContainer p2pInterfaces;
  p2pInterfaces = address.Assign (p2pDevices);           //p2p节点的地址为:n0:10.1.1.1     n1:10.1.1.2

  address.SetBase ("10.1.2.0", "255.255.255.0");
  Ipv4InterfaceContainer csmaInterfaces;
  csmaInterfaces = address.Assign (csmaDevices);       //CSMA节点的地址为:n1:10.1.2.1     n2:10.1.2.2        n3:10.1.2.3           n4:10.1.2.4

 

 

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

  ApplicationContainer serverApps = echoServer.Install (csmaNodes.Get (nCsma));        //将Server服务安装在CSMA网络中的最后一个节点上,nCsma是可变的,因此不能用3。
  serverApps.Start (Seconds (1.0));                    //应用在第1秒开始,在第10秒停止。
  serverApps.Stop (Seconds (10.0));

 

  UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);      //告诉echo客户端,服务端的地址是最后一个节点的地址。

  echoClient.SetAttribute ("MaxPackets", UintegerValue (1));            //设置最大数据包发送数
  echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));     //时间间隔
  echoClient.SetAttribute ("PacketSize", UintegerValue (1024));        //数据包大小

 

  ApplicationContainer clientApps = echoClient.Install (p2pNodes.Get (0));        //将客户端服务安装在p2p网络中的第一个节点
  clientApps.Start (Seconds (2.0));                                                   //应用在第2秒开始,在第10秒停止.
  clientApps.Stop (Seconds (10.0));

 

 

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

  pointToPoint.EnablePcapAll ("second");                              //创建pcap追踪文件,追踪p2p网络
  csma.EnablePcap ("second", csmaDevices.Get (1), true);      //追踪csma设备1,true表示是否开启promiscuous模式。

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

}

 

 

 

 

二.CSMA的两种trace方法

(一)trace全网数据

CSMA网络是一个多点到点网络。这意味着在一个共享媒介上有多个终端。每个终端都有一个网络设备与之连接。对于这样的网络,有两种收集追踪信息的方法。一个是为每个网络设备创建trace文件,并且只存储由该网络设备发出或接收的数据包。另一个方法是选择其中一个设备并且设置为promiscuous模式。这个单一的设备将嗅探网络中的全部数据包,并且将它们存储在一个单一的pcap文件中。本例使用方法2。

 

编译运行脚本后:

NS3实例分析second.cc_Building <wbr>a <wbr>Bus <wbr>Network <wbr>Topology

在ns-3.25目录下,会出现3个.pcap文件:

NS3实例分析second.cc_Building <wbr>a <wbr>Bus <wbr>Network <wbr>Topologysecon-0-0.pcap:p2p网络

NS3实例分析second.cc_Building <wbr>a <wbr>Bus <wbr>Network <wbr>Topology链路类型:PPP代表Point-to-Point


secon-1-0.pcap:p2p网络

NS3实例分析second.cc_Building <wbr>a <wbr>Bus <wbr>Network <wbr>Topology
secon-2-0.pcap:CSMA网络
NS3实例分析second.cc_Building <wbr>a <wbr>Bus <wbr>Network <wbr>TopologyARP:地址解析协议,Address Resolution Protocol。是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

链路类型:EN10MB代表以太网

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

分析:n1想要发送数据包给IP地址为10.1.2.4的节点,但是它不知道该节点的MAC地址。于是,n1在CSMA网络广播询问IP地址为10.1.2.4的设备。对应的节点就回应n1说自己的MAC地址是00:00:00:00:00:06。n2并没有直接涉及此次信息交换,但是却嗅探整个网络并且记录它所看见的所有数据流。

服务器收到echo请求并将数据包发回发送端。服务器知道这个地址是另一个网络的,通过IP地址10.1.2.1到达。

这是因为我们初始化了全局路由,全局路由将这些信息告知我们。但是echo服务器节点并不知道n1的MAC地址,所以它必须像n1那样ARP地址。

服务器将echo发到转发节点。

 

 

nCsma可以通过CommandLine来改变,例如:

NS3实例分析second.cc_Building <wbr>a <wbr>Bus <wbr>Network <wbr>Topology当nCsma=5,服务器节点变为nCsma的最后一个节点,地址为10.1.2.6.

(二)trace单设备数据
之前的CSMA网络trace方法是让一个设备嗅探整个网络的数据包存于一个pcap文件中。当你不关心其他数据流,只想得到某个网络设备自身接收与发送的数据流时,可以利用下面的代码替换原来的EnablePcap代码:

pointToPoint.EnablePcap("second",p2pNodes.Get(0)->GetId(),0);

csma.EnablePcap("second",csmaNodes.Get(nCsma)->GetId(),0,false);

csma.EnablePcap("second",csmaNodes.Get(nCsma-1)->GetId(),0,false);
NS3 helpers提供将节点数和设备数作为参数的方法。由上述代码可知,我们要创造名为second的pcap文件,其中我们感兴趣的网络设备为0号。

为了得到节点标号,我们共有2种方法:1.节点在创建过程中按顺序从0开始以单调增长的方式被标号。2.根据节点创建顺序,手动计算节点标号。

在NS3中,Node对象有GetID()的方法可以返回节点ID,即节点标号。

false:代表节点的trace处于non-promiscuous模式。

最后一个CSMA节点是第nCsma+1个节点。

为了确保.pcap文件不会混淆,清除所有的pcap文件:

$ rm *.pcap

$ rm *.tr      // 清除所有的trace文件和pcap文件

编译运行代码,并查看second-100-0.pcap文件:

NS3实例分析second.cc_Building <wbr>a <wbr>Bus <wbr>Network <wbr>Topology可知,node100在echo交换中就是一个旁观者。它接收到的唯一的数据包是全CSMA网络广播的ARP请求。

-------------------------------完-----------------------------------

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
02f,18aug03,agi added #include 02e,02jun03,agi removed #include "rwproto.h" 02d,02jun03,agi changed #include "rwos.h" to include "ospf_rwos.h" 02c,29may03,agi removed unused includes, added new includes 02c,08may03,asr Changes to make OSPF virtual stack compatible 02b,09may03,agi added #include , removed #include 02a,17feb02,ram SPR 81808 Added OSPF memory partition support 21,13october01,kc Dynamic configuration changes. 20,21september01,kc Removed unused raw socket specific declarations. 19,26september00,reshma Added WindRiver CopyRight 18,25september00,reshma RFC-1587 implementation for OSPF NSSA Option, also tested against ANVL. 17,20july00,reshma Unix compatibility related changes. 16,06july00,reshma Removed unnecessary header files and defines. 15,23february00,reshma Changes for ospf mib 14,23december99,reshma Compatibility with VxWorks-IP and VxWorks RTM-interface 13,13august99,jack compilation fixes no IP case 12,05august99,nishit Replaced including IP header files by the new ospf_ip_structures.h 11,17may99,jack Added new include file ospf_patricia_32_bits_key_prototypes.h 10,28december98,jack Compiled and added some comments 09,25november98,rajive Deleted socket include file 08,11november98,jack Config changes, linted and big endian changes 07,30october98,jack Incorporate changes for compilation on Vxworks 06,12february98,release engineer code style changes, feature enhancements, complete CISCO and BAY compaltibility. OSPF v4.2.0 05,10july97,cindy Pre-release v1.52b 04,10february97,cindy Release Version 1.52 03,22october97,cindy Release Version 1.50 02,05june96,cindy Including visnpstr.h as a kludge for the first beta release. 01,05june96,cindy First Beta Release

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值