NS3 Tracing System详解
转自:http://blog.sina.com.cn/s/blog_7ec2ab360102wxh3.html
整个仿真的目的是为了进一步研究生成结果,其中NS3提供的Tracing系统就是为了这个目的而定制的。
因为NS3是由C++编写的,所以C++的标准输入输出是在NS-3中是可以用的:
#include
…
int main()
{
…
std::cout<<"The value of x is "<<x<<std::endl;
…
}
我们可以用日志模块来为我们的解决方法添加一些小结构。这种方法会产生很多已知的问题,所以我们提供了一种生成事件的tracing子系统来解决那些我们认为重要的问题。
NS3 tracing系统的基本目标是:
1.对于基本的任务,tracing系统允许用户为常用的tracing发送端生产标准的tracing,并且可以定制哪些对象生成tracing。
2.中间的用户必须能够拓展tracing系统来修改生成的输出格式,或者在不修改仿真器核心的情况下,插入新的tracing发送端。
3.高级用户可以修改仿真器核心来增加新的tracing发送端和接收端。
NS3 tracing系统是建立在独立的tracing发送端和接收端概念上,并且有统一的机制来连接发送端和接收端。Trace发送端可以在仿真过程中产生信号事件,并且提供有关数据访问通道。例如,一个trace发送端可以提供一个数据包被一个网络设备接收的时间,并且根据接收端的要求提供此数据包的内容。
Trace发送端自身是没用的,必须和接收端提供的有用信息代码段“相连”。Trace接收端是trace发送端提供的事件和时间的使用者。例如,可以创建一个可以输出数据包有用信息的trace接收端(当连接到之前例子中的trace发送端)。
这种发送端和接收端明确分工的基本原理是允许用户将已有的发送端与新类型的接收端相连,而不需要编辑和重新编译仿真器的核心。因此,上面的例子中,用户可以在他的脚本中定义一个新的tracing接收端,并且可以将其与与仿真核心中第一的tracing接收端相连。
NS3提供两种tracing机制:ASCII码tracing和pcap级别的tracing。
一.ASCII码Tracing
NS3提供了封装底层tracing系统的helper功能,用来提供配置简单数据包的更多细节。如果你使用了这个功能,将在ASCII文件中输出结果——这就是为什么这种tracing得名ASCII tracing。对于熟悉NS2的用户,这种trace与out.tr相似。
让我们在first.cc脚本中添加ASCIItracing输出。
首先,在Simulator::Run()前,添加下面的代码:
AsciiTraceHelper ascii; //创建一个ASCII trace对象
pointToPoint.EnalbeAsciiAll (ascii.CreateFileStream("first.tr")); //包含两个方法调用。
//CreateFileStream()用未命名的对象在协议栈中创建了一个文件流,并把这个文件流传递给了调用方法,即创建了一个对象代表着一个名为“first.tr”的文件,并传递给了NS3。
//EnableAsciiAll()告诉helper你想要将ASCII tracing安装在仿真中的点到点设备上,并且你想要接收端以ASCII格式写出数据包移动信息。
这两行代码用来打开一个将被写入名为“first.tr”文件中的数据流。代码段中的第二行告诉NS3在仿真中为所有点到底设备启用ASCII tracing功能,并且你想要用ASCII格式来写出数据流中数据包的移动信息。类似于NS2中,trace事件和一般的trace“+”、“-”、“d”、“r”事件。
编译并运行脚本,可以看到编译成功的信息。
此时,程序将创建一个名为“first.tr”的文件。由于Waf的工作方式,这个文件将不在本地目录下创建,而是在NS3根目录中创建。
结果中的每一行对应了一个trace事件。本例中,我们查看每个点到点设备的传输队列的trace事件。传输队列是任意目的地为点到点信道的数据包必经的队列。注意!trace文件的每一行都以一个单独的字符开始(后面带有空格)。这些字符具有如下含义:
+ :设备队列中的入队操作;
- :设备队列中的出队操作;
d :数据包被丢弃,通常是因为队列已满;
r :数据包被网络备接收;
我们来详细看第一行,为了看得清楚,我把这一行分为不同的部分,并在左边标出了序号:
1. + //操作。传输队列入队操作。
2. 2 //仿真时间,以s为单位。
3. /NodeList/0/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Enqueue //告诉我们哪个trace发送端发起这个事件(以tracing命名空间表示)。你可以认为tracing命名空间有点像一个文件系统命名空间。命名空间的根为NodeList。NodeList是NS3核心代码管理的一个容器,这个容器包含有一个脚本中创建的所有节点。就像文件系统在根下有目录,在NodeList下有节点数目。字符串/NodeList/0是指NodeList中的第0个节点。每个节点中有一个已经安装好的设备列表。这个列表是在命名空间的下一个出现的。可以看到trace事件来自节点中安装的第0个设备DeviceList/0。
//$ns3::PointToPointNetDevice告诉我们第0个节点的设备列表的第0个位置的设备类型。
//入队操作在最后部分的“trace path”TxQueue/Enqueue中体现。
4. ns3::PppHeader( //4-5:表明数据包封装成点到点协议
5. Point-to-Point Protocol: IP(0x0021))
6. ns3::Ipv4Header( //6-8:显示数据包IP版本,发送端IP地址10.1.1.1,接收端地址为10.1.1.2
7. tos 0x0 DSCP Default ECN Not-ECT ttl 64 id 0 protocol 17 offset (bytes) 0 flags [none]
8. length: 1052 10.1.1.1 > 10.1.1.2)
9. ns3::UdpHeader( //9-10:显示数据包的UDP头
10. length: 1032 49153>9)
11. Payload (size=1024) //表明数据包数据量为1024bytes
在trace文件中的下一行显示这个数据包在这个节点中从传输队列中被移除。
trace文件的第三行显示了数据包正在被echo服务器所在的节点的网络设备接收。trace如下:
1. r
2. 2.00369 //这是DataRate=5Mbps,Delay=2ms的仿真时间
3. /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/MacRx //Trace发送端命名空间条目已经改变,这个事件来自节点1(NodeList/1),即数据包的接收trace端(/MacRx)。
4. ns3::PppHeader( //4-5:表明数据包封装成点到点协议
5. Point-to-Point Protocol: IP(0x0021))
6. ns3::Ipv4Header(
7. tos 0x0 DSCP Default ECN Not-ECT ttl 64 id 0 protocol 17 offset (bytes) 0 flags [none]
8. length: 1052 10.1.1.1>10.1.1.2)
9. ns3::UdpHeader
10. length: 1032 49153>9)
11. Payload (size=1024)
二.PCAP Tracing
NS3也支持创建.pcap格式的trace文件,缩写pcap表示packet capture,事实上是包含有定义一个.pcap文件格式的API。可以读取并且显示这种格式的程序是Wireshark。然而,有很多其他分析器也使用这个数据包格式。本例中,我们用tcpdump来查看pcap trace。
pointToPoint.EnalbePcapAllll ("first");
在first.cc中,我们刚增加的ASCIItrace代码后面插入这行代码。注意字符串是“first”,而不是“first.pcap”。这是因为这里传递的参数是个前缀,而不是完整的文件名。在仿真过程中,PointToPointHelper将为每一个点到点设备创建trace文件。文件名将包含预设前缀,节点数,设备数和".pcap"后缀。
编译运行脚本后:
会得到3个日志文件:ASCII码的trace文件:first.tr,pcap的trace文件:first-0-0.pcap,first-1-0.pcap。
first-0-0.pcap代表第0个节点的第0个设备。
用tcpdump来读pcap文件。
$ tcpdump -nn -tt -r first-0-0.pcap
$ tcpdump -nn -tt -r first-1-0.pcap
用Wireshark读pcap文件。
如果不是很了解Wireshark,可以通过官网获取相关信息:http://www.wireshark.org/
-------------------------------完-----------------------------------
NS3 Tracing System详解相关推荐
- 【Ubuntu 学习】Package manager / Package management system 详解
文章目录 1. 什么是 Package 2. 什么是 Package manager 2.1 有哪些常见的 Package manager 2.2 安装 package 的不同方式:编译后的二进制形式 ...
- HDFS(hadoop distributed File System)详解
HDFS(hadoop distributed File System)分布式文件系统 特点:高容错性(多个文本副本存储),价格低,高吞吐量. 常见的系统 gfs,HDFS.Lustre .Ceph ...
- 【分布式系统】GFS(Google File System )详解
GFS 是什么? GFS是一个可扩展的分布式文件系统,用于大型的.分布式的.对大量数据进行访问的应用.它运行于廉价的普通硬件上,并提供容错功能.它可以给大量的用户提供总体性能较高的服务. 为什么要用G ...
- Qt MetaObject 详解
这个系列的几篇文章通过阅读Qt帮助文档和相关的源代码来学习研究Qt meta-object所提供的功能,及其实现的方式. Qt meta-object系统基于三个方面: 1.QObject提供一个基类 ...
- .net System.Web.Caching.Cache缓存类使用详解(转载)
转自:http://www.cnblogs.com/virusswb/articles/1681561.html net System.Web.Caching.Cache缓存类使用详解 System. ...
- linux awk命令详解,使用system来内嵌系统命令,批量github,批量批下载视频, awk合并两列...
linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...
- java system sleep_详解Java中的sleep()和wait()的区别
详解Java中的sleep()和wait()的区别 对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序 ...
- (119)System Verilog 父类与子类对象复制(自定义函数)详解
(119)System Verilog 父类与子类对象复制(自定义函数)详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog 父类与子 ...
- (118)System Verilog 父类与子类对象复制(copy函数)详解
(118)System Verilog 父类与子类对象复制(copy函数)详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog 父类与 ...
- (117)System Verilog类继承详解
(117)System Verilog类继承详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog类继承详解 5)结语 1.2 FPGA ...
最新文章
- 顺序表-元素逆置(首尾交换)
- 如果提高声音测距的分辨率?
- 假期《JAVA技术》预备作业01
- 分子生物学-肽和多肽
- c 连接mysql数据库查询_C语言实现访问及查询MySQL数据库的方法
- python经典笔试、面试题-01
- Fatal error in launcher: Unable to create process using ''之解决办法
- 闪回flashback table配合flashback versions query的注意事项
- 使用SQL查询分析器删除所有用户表
- 通信网络基本概念一览
- 批量打印证书 php,巧用WPS2013批量打印证书
- (转帖)ConcurrentHashMap实现原理(3)
- python中dispatch_在django,dispatch的用途是什么?
- 电子科技大学信息与通信工程学院保研面试题
- linux cpan 参数配置,Linux下使用CPAN进行Perl模块的安装
- 华为云-基于Ambari构建大数据平台
- python实现12306余票
- 赵小楼《天道》《遥远的救世主》深度解析(47)为什么要给韩楚风的司机小赵点赞?芮小丹是怎么做到“反客为主、打破阶层”的?
- 使用Jupyter Notebook远程连接服务器
- 微信小程序自动化构建(云效)