zoukankan      html  css  js  c++  java
  • NS3之路---Tweaking

    TWEAKING

    首先,关于这一章,实在不知道这个名字该如何翻译,因此在此直接使用英文。

    但是主要讲了三部分内容,分别介绍了对日志模块、命令行参数、跟踪系统的使用。

    1. 日志模块

    在前面使用过的first.cc中已经简单介绍了下相关的日志类。一般来说,大规模的系统中都会使用日志记录相关信息,ns3同样如此。而通常只有标准错误(stderr)信息才会被输出到控制台。某些系统也会将警告信息输出。我们需要了解的是,日志的存在给我们提供了详细的系统运行过程,使我们的调试过程变得相对容易。

    Ns3日志模块提供了一个很好的日志系统,我们可以随时随地的从中获取我们想要的信息。目前ns3定义了7种日志类型(LOG_TYPE)。

    l  LOG_ERROR:错误信息,相关宏为NS_LOG_ERROR

    l  LOG_WARN:警告信息,相关宏为NS_LOG_WARN

    l  LOG_DEBUG:调试信息,相关宏为NS_LOG_DEBUG

    l  LOG_INFO:程序运行过程信息,宏为NS_LOG_INFO

    l  LOG_FUNCTION:函数调用的描述信息,宏为NS_LOG_FUNCTION(成员函数)和NS_LOG_FUNCTION_NOARGS(静态函数)

    l  LOG_LOGIC:函数逻辑信息,宏为NS_LOG_LOGIC

    l  LOG_ALL:记录以上所有信息,没有宏。

    对于以上每种日志类型,也有等级之分,从上至下递增。使用LOG_LEVEL_TYPE启动层级作用。默认情况下,日志类型等级以下的信息都会被记录(包括自身)。例如使用LOG_INFO只记录宏NS_LOG_INFO定义的信息,而LOG_LEVEL_INFO,则会记录NS_LOG_ERROR,NS_LOG_WARN,NS_LOG_DEBUG定义的信息。

    Ns3也提供了另外一个无条件日志类,NS_LOG_UNCOND,记录相关无条件信息。

    启动NS_LOG

    在第一个例子中,在运行完之后可以看到一系列的输出信息。这些日志信息是由UdpEchoServerApplication和UdpEchoClientApplication记录的,我们可以通过修改NS_LOG环境变量,让其输出信息满足我们的需求。

    在first.cc中,有个例子启用了UdpEchoServerApplication的日志:

    LogComponentEnable (“UdpEchoServerApplication”, LOG_LEVEL_INFO);

    从这句代码中可以看到将UdpEchoServerApplication这个组件的日志等级设置为INFO并将其启用。该过程也可以通过以下方法完成:

    l  使用命令行参数设置NS_LOG环境变量

    $ export NS_LOG = UdpEchoServerApplication = LEVEL_ALL

    上述命令的作用其实就相当于在程序中做如下设置,其中左边是要修改的组件的名字(不是类的名字),右边则是日志的类型:

    UdpEchoServerApplication = LEVEL_ALL

    如此一来就改变了获取到的日志信息量。

    另外为了看出是哪个组件的信息, 我们可以再上述命令中添加一项:

    $ export ‘NS_LOG = UdpEchoServerApplication = LEVEL_ALL | prefix_func’

    注意到,上述条件必须添加单引号。而且在日志等级和前缀之间使用竖线表示OR操作。于是我们就能够清楚的看到信息是来自于哪个组件。上述命令只记录了一个组件,如果要修改多个组件呢?我们可以使用冒号来表示,如下:

    $ export ‘NS_LOG = UdpEchoServerApplication = LEVEL_ALL | prefix_func :   UdpEchoClientApplication = LEVEL_ALL | prefix_func ’

    除了查看组件名字的前缀,我们也可以查看当前仿真时间,使用prefix_time,同样也使用竖线分隔。

    设置全部组件的情况使用 * 作为通配符,替换上述的组件名字即可。

    $ export ‘NS_LOG = * = LEVEL_ALL | prefix_func’

    Ns3支持标准输出的重定向操作,将输出到屏幕的信息重新定位到文件中。

    $ ./waf --run  PROGRAMFILE  >  LOG.out  2 >& 1

    PS:>符号是重定向符号,那么1和2分别表示什么呢? 首先在Linux中,每个进程都和三个系统文件相关联,分别为标准输入stdin、标准输出stdout、标准错误stderr,而这三者对应的文件描述符分别为0,1,2。

    并且,2 > 1表示的是将标准错误重定向到文件1中,而不是标准输出。因此需要使用&符号来表示,固为:2 > & 1的格式。

    在代码中添加日志记录部分。通过宏调用日志组件,并将其添加到程序中。

    日志组件的定义:

    NS_LOG_COMPONENT_DEFINE (“First”);

    定义完该组件之后变可以通过修改NS_LOG环境变量记录相关信息,例如:

    $ export  NS_LOG = First = LEVEL_TYPE

    在重新制定日志的相关信息之前,需要将之前建立的日志等级清除掉:

    $ export NS_LOG =

    1. 2.   使用命令行参数

    Ns3中提供了解析命令行参数的机制,可以通过命令行来设置程序中局部或者全局的变量。但要使用该解析器,就必须在使用之前先声明,如下:

    int main (int argc,  char * argv[]) {

    ……

    CommandLine cmd;       //声明了命令行对象

    cmd.Parse(argc, argv);   //调用自定义方法解析参数

    ……

    }

    为了确认是否解析正确,可以通过打印相关参数识别。Ns3提供了--PrintHelp命令,使用打印函数不需要添加VALUE值,修改程序中的参数时需要有VALUE值。使用双引号将程序名称和参数包起来,如:

    $ ./waf –run “YOUR-PROGRAM   --COMPONENT [= VALUE]”

    钩子

    (等待解析…….)

    1. 3.   使用跟踪系统

    Ns3仿真在于将输出保存起来,用于后期分析。因此,其开发出了一套追踪系统,分为三个层次。

    基本用户:直接使用系统产生标准的追踪源,允许自定义追踪源的产生组件。

    中间用户:可以对系统的输出格式进行修改以满足自身的需求,也可以再不修改核心代码的情况下,添加新的追踪源。

    高级用户:修改核心代码,添加任何想要追踪的细节源。

    ASCII文件追踪

    在程序运行之前(Simulator.Run())定义好ASCII文件,程序开始之后便开始了跟踪。最终结果是产生*.tr文件。下面定义了ASCII追踪实例,该实例创造一个文件流并跟踪你定义的组件变量。

    AsciiTraceHelper ascii;

    YOUR-COMPONENT-NAME.EnableAsciiAll (ascii.CreateFileStream(“*.tr”));

    tr文件可以使用编辑器打开。具体解析过程涉及相关知识较多,详细参考NS3 tutorial第46-48页。

    PCAP追踪

    使用YOUR-COMPONENT-NAME.EnablePcapAll(“NAME”);便可以生成Pcap的追踪文件,值得说明的是NAME不需要后缀,会自动生成。

    Pcap文件的打开工具有两种。1是图形化界面的WireShark,作为包嗅探器,可以显示整个运作过程。2是Linux提供的tcpdump命令。无法使用编辑器打开该类文件。

  • 相关阅读:
    get与post的区别
    shell脚本之变量替换
    Oracle sql性能优化
    HTTP协议报头
    Oracle查看表空间和删除表空间
    shell脚本之cat和wc命令
    java设计模式之单例模式
    Wireshark基本介绍和学习TCP三次握手转
    wrong number of arguments (1 for 2)
    PHP生成.url文件 网站常用的保存到桌面功能
  • 原文地址:https://www.cnblogs.com/yibobo-blog/p/4940549.html
Copyright © 2011-2022 走看看