您的位置:首页 > 其它

ns3的基础学习

2015-05-30 23:34 253 查看
这个星期要开始学仿真啦!感觉仿真真的是一个特别用的东西,但是因为种种原因都没有机会去学习。

现在实验室需要ns3仿真,所以我也要努力学!

ns3的安装就不说了,网上都有,反正就是安一大堆包的,然后很容易就装好了。

建议学ns3的时候去官网下载一份library,这样边看代码的时候边查,比较方便。

最开始的学习,我是跟着这个博客来学的http://blog.sina.com.cn/s/blog_5356e4790101fq2t.html,博客很棒。。唯一的就是字儿太多了。。。。。。

我也刚学几天,就大概的讲下自己的收获吧:

首先打开example/tutorial/fist.cc文件,这是一个最简单的p2p的例子,我贴代码出来讲解(其实NS3就是C++)

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

定义Log名字(关于LOG的东西下面会讲)

int

main (int argc, char *argv[])                 //主函数

{

  Time::SetResolution (Time::NS);

  LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);      //下面会提到

  LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);

  NodeContainer nodes;                    //创建节点

  nodes.Create (2);

  PointToPointHelper pointToPoint;                                       //创建点到点的链路,设置Attribute属性值,这里是速率和时延)

  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));

  pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

  NetDeviceContainer devices;                                 //创建完节点和链路要创建设备了

  devices = pointToPoint.Install (nodes);

  InternetStackHelper stack;                                  //安装协议栈

  stack.Install (nodes);

  Ipv4AddressHelper address;                           //分配IP地址,SetBase(IP地址,子网掩码),学过计网的应该都清楚,不多说啦

  address.SetBase ("10.1.1.0", "255.255.255.0");

  Ipv4InterfaceContainer interfaces = address.Assign (devices);

  UdpEchoServerHelper echoServer (9);           //建立端口为9的UDP Server

  ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));

  serverApps.Start (Seconds (1.0));               //仿真start和stop时间设置

  serverApps.Stop (Seconds (10.0));

  UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);   //建立客户端,连接Node1 地址,连接端口为9)

  echoClient.SetAttribute ("MaxPackets", UintegerValue (1));

  echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));

  echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

  ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));

  clientApps.Start (Seconds (2.0));

  clientApps.Stop (Seconds (10.0));

 1、现在说说日志这个东西,http://blog.sina.com.cn/s/blog_5356e4790101fq2n.html这里有,但是太长了,我概括一下

       在现有系统中,LOG有多个LEVEL,比如ALL  ,   INFO等,用户当然也可以自定义LEVEL(这里不多讲),举个例子

         LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);     

         LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);

         这里是来自你定义的UdpEchoClient和UdpEchoServer的日志消息,只输出级别为INFO及以下的信息,如果你把LOG_LEVEL_INFO改成LOG_LEVEL_ALL,则会输出很多信息,这个你们可以自己测试。

      还记得最开始我们定义了一个

       NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

      这句话是定义了属于这个程序的LOG,只要你在程序中打出NS_LOG_INFO("  ..."),就会在仿真中输出啦,其实感觉跟cout差不多的

 2、代码中获得cmd参数值

     main (int argc, char *argv[])     中加入两行代码

     CommandLine cmd;

     cmd.Parse(argc,argv);

    如果我们想在命令行中声明链路的DataRate,就可以这样输入:

    ./waf --run "first --ns3::PointToPointNetDevice::DataRate=5Mbps"

    如果想用自己的参数值,而不想敲一大堆代码用他们的函数值,就可以这样:

    main(int argc,char *argv[])

    {

          uint32_t nPackets=1;

          CommandLine cmd;

          cmd.AddValue("nPackets","Number of packets to echo",nPackets);

          cmd.Parse(argc,argv);   

     看到了吧?在中间多加了一行AddValue,这个时候你输入

    ./waf --run "first --PrintHelp"

    就会发现在末尾多出了一个UserArguments,就是你定义的参数啦。

    此时.cc文件中的setAttribute("MaxPackets"那行要改成setAttribute("MaxPackets",UintegerValue(nPackets))

   这个时候就可以输入

   ./waf --run "first --nPackets=2"

3、每次仿真之后,在ns3的文件夹里都会出现一个.tr文件,里面记录的就是仿真信息,我看别的博客讲的不错,我就直接贴过来了

    

我们来更详细的看一下trace文件的第一行。为了看得更清晰,我把这一行分成了不同的部分,并在左边标出序号:

  00 +

  01 2

  02 /NodeList/0/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Enqueue

  03 ns3::PppHeader (

  04   Point-to-Point Protocol: IP (0x0021))

  05   ns3::Ipv4Header (

  06     tos 0x0 ttl 64 id 0 protocol 17 offset 0 flags [none]

  07     length: 1052 10.1.1.1 > 10.1.1.2)

  08     ns3::UdpHeader (

  09       length: 1032 49153 > 9)

  10       Payload (size=1024)

 展开后的trace事件的第一行(序号00)代表操作。+字符表示是一个传输队列的入队操作。第二行(序号01)是单位为秒的仿真时间。你或许回忆起我们让UdpEchoClientApplication在两秒开始发送数据包。我们确定这个正在发生。

Trace的下一行(序号02)告诉我们trace发送端发起这个事件(以tracing命名空间表示)。你可以认为tracing命名空间有点像一个文件系统命名空间。命名空间的根为NodeList。这个NodeList是NS-3核心代码管理的一个容器,此容器包含有一个脚本中创建的所有的节点。。正如一个文件系统在根下有目录,在NodeList下有节点数。字符串/NodeList/0是指NodeList中第0个节点,我们通常认为是"node
0".每个节点中有一个已经安装好的设备列表。这个列表是在命名空间的下一个出现的。可以看到trace事件来自节点中安装的第0个设备DeviceList/0。

下一个字符串,$ns3::PointToPointNetDevice告诉我们第0个节点的设备列表的第0个位置的设备类型。回忆序号00处的+操作表示设备的传输队列发生了入队操作,这个在"trace path"TxQueue/Enqueue的最后部分反映出来了。

Trace中剩下的几行是很直观的。序号03-04处表明数据包封装成点到点协议。序号05-07处显示数据包IP版本,发送端IP地址10.1.1.1,接收端IP地址为10.1.1.2。序号08-09出显示数据包的UDP头,最后序号10处表明数据包数据量为1024bytes。

在trace文件中的下一行显示了这个数据包在这个节点中从传输队列中被移除。

Trace文件的第三行显示了数据包正在被回显服务器所在的节点的网络设备接收。trace如下。

  00 r

  01 2.25732

  02 /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/MacRx

  03   ns3::Ipv4Header (

  04     tos 0x0 ttl 64 id 0 protocol 17 offset 0 flags [none]

  05     length: 1052 10.1.1.1 > 10.1.1.2)

  06     ns3::UdpHeader (

  07       length: 1032 49153 > 9)

  08       Payload (size=1024)

 

注意,trace操作现在是r并且仿真时间已经增加到2.25732秒。如果你一直按照本教程来操作,你已经把网络设备的DataRate,和信道Delay设置成默认值。那么对于这个值,你应该觉得眼熟,因为上一章中已经见过这个值。

在第2行中,Trace发送端命名空间条目已经改变,来显示这个事件是来自节点1(/NodeList/1),即数据包的接收trace端(/MacRx)。通过查看文件中其他的traces,你可以很容易的跟踪数据包。

  4、ns3产生的数据如何编辑成图像?

   有一个用GNU来画图的,http://blog.csdn.net/barcodegun/article/details/6899729网址在这里,说的很详细,会python的同学也可以用python来画图啦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: