Tracing System的使用(以first.cc为例)

Trace,英文的意思就是追踪,这是我们收集数据的重要手段。下面是参考别人的经验,在first.cc上做了个数据追踪。很浅显,只是方便以后做trace的时候参考。


1.首先打开我们的脚本 scratch/first.cc 



2.在我们的脚本 scratch/first.cc 中添加一些 ASCII tracing 输出,在调用 Simulator::Run () 之前添加下列代码:

AsciiTraceHelper ascii;
pointToPoint.EnableAsciiAll (ascii.CreateFileStream ("first.tr"));

Tracing System的使用(以first.cc为例)_第1张图片

上述代码的第70行包含两个嵌套的方法调用。第一个是“内部”方法,CreateFileStream() 使用未命名的对象习语在堆栈上创建文件流对象,并把它传递给调用的方法。需要明确的是,你正在创建一个对象,文件名为 “first.tr”,然后你把它传递给 ns3。

第二个方法是外部调用,EnableAsciiAll() 告诉 helper 你想要在仿真中对所有的点对点设备使能 ASCII tracing,想要 trace sinks 以 ASCII 格式写出数据包运动的信息。

Tracing System的使用(以first.cc为例)_第2张图片

3.重新编译运行first.cc文件,注意是在ns-3.27目录下。

sudo ./waf --run scratch/first

Tracing System的使用(以first.cc为例)_第3张图片


4.运行完成后,可以在目录ns-3.27(默认的trace文件保存路径)看到生成的first.tr文件。

Tracing System的使用(以first.cc为例)_第4张图片


5.查看first.tr目录下的内容如下:

Tracing System的使用(以first.cc为例)_第5张图片


对于里边内容的分析参考下边:

first.tr 文件中有很多信息以密集的形式出现,但是我们首先注意到的事情是文本中出现链路很多独特的行。
文件中的每一行都与一个trace event 相关。我们在每个点对点网络设备的传输队列上tracing events 。


注意,Trace 文件每一行开始都有一个单独的字符,其含义为:

  +:设备队列入队操作;
  -:设备队列出对操作;
  d:丢弃数据包;
  r:网络设备接收数据包。


第一行:为了说明方便,这里分段编号显示,显示了一个入队操作:

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 DSCP Default ECN Not-ECT ttl 64 id 0 protocol 17 offset (bytes) 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的最后部分反映出来了。 TxQueue/Enqueue 表示在传送队列上发生了入队操作。
Trace中剩下的几行是很直观的。序号03-04处表明数据包封装成点到点协议。序号05-07处显示数据包IP版本,发送端IP地址10.1.1.1,接收端IP地址为10.1.1.2。序号08-09出显示数据包的UDP头,最后序号10处表明数据包数据量为1024bytes。

第二行:代表的是一个出队操作,即这个数据包在这个节点中从传输队列中被移除。

00 -
01 2
02 /NodeList/0/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Dequeue
03 ns3::PppHeader (
04  Point-to-Point Protocol: IP (0x0021))
05  ns3::Ipv4Header (
06   tos 0x0 DSCP Default ECN Not-ECT ttl 64 id 0 protocol 17 offset (bytes) 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)

第三行:(为了说明方便,这里分段编号显示),显示了数据包正在被回显服务器所在的节点的网络设备接收

00 r
01 2.00369
02 /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/MacRx
03 ns3::PppHeader (
04  Point-to-Point Protocol: IP (0x0021))
05  ns3::Ipv4Header (
06   tos 0x0 DSCP Default ECN Not-ECT ttl 64 id 0 protocol 17 offset (bytes) 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)
注意这个时候的的 仿真时间增加到2.00369。在第02行中,Trace发送端命名空间条目已经改变,来显示这个 事件是来自节点1(/NodeList/1),即数据包的接收trace端(/MacRx)。通过查看文件中其他的traces,你可以很容易的跟踪数据包。


参考博客:

1.https://blog.csdn.net/u013160228/article/details/46279767

2.http://www.cnblogs.com/alice123/p/5467936.html

3.http://www.cnblogs.com/lovemo1314/archive/2011/12/21/2295969.html

4.http://blog.sina.com.cn/s/blog_b0d80d910101ro9m.html

5.http://sparkandshine.net/ns3-tr-file-format-the-trace-file-analysis/#1

你可能感兴趣的:(NS-3)