一、log功能
ns3的日志功能可以分为多个级别,全部禁用、逐个组件启用,或全局启用。按照详细程度从低到高分为:
- LOG_ERROR—记录错误消息
- LOG_WARN—记录警告消息
- LOG_DEBUG—记录相对罕见、特别调试消息
- LOG_INFO—记录关于程序进程的信息消息
- LOG_FUNCTION—记录调用的每个函数
- LOG_LOGIC—记录描述函数内逻辑流的消息
- LOG_ALL—记录上面提到的所有内容
对于每个LOG_TYPE,还有一个LOG_LEVEL_TYPE,如果使用它,日志除了记录当前其级别之外,还记录它上面的所有级别。此外还提供了NS_LOG_UNCOND,无条件地记录关联的消息
可以使用 shell环境变量(NS_LOG) 或通过日志记录 系统函数调用 来调整日志记录的层级。
以first.cc为例,初始代码如下:(原始情况设置指令为info等级)
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
在命令行中修改日志等级指令为:(这里是修改为最高等级all)
export NS_LOG=UdpEchoClientApplication=level_all
打印结果如下:可以看到相比于之前多了许多条消息
通过命令行输入 export NS_LOG=""
关闭之前配置的level_all属性,此时任何LOG信息都不再打印。
二、跟踪系统Tracing system
在脚本文件中加入如下代码来获取打印输出
#include <iostream>
int main(){
std::cout << "The value of x is " << 1 << std::endl;
}
2.1 ASCII追踪
在Simulator::Run();
前加入下面的代码,创建myfirst文件。
AsciiTraceHelper ascii;
pointToPoint.EnableAsciiAll(ascii.CreateFileStream("myfirst.tr"));
在ns-3-dev目录下输出一个文件myfirst.tr:
开头符号的意义分别是:
+:在设备队列上发生了排队操作;
-:在设备队列上发生了退出队列操作;
d:删除了一个数据包,通常是因为队列已满;
r:网络设备接收到一个数据包。
2.2 PCAP 追踪
pcap是数据包捕获的缩写(packet capture),实际上是一个包含.pcap文件格式定义的API。
启用pcap跟踪的代码:
pointToPoint.EnablePcapAll("myfirst");
在文件中加入此行代码并运行,将在ns-3-dev目录下看到名为“myfirst-0-0.pcap”和“myfirst-1-0.pcap”的文件,它们分别是Node0-device0和Node1-device0的pcap跟踪记录。
2.2.1 TcpDump
TcpDump是对网络上的数据分组进行截获的分组分析工具。TcpDump可以将网络中传送的数据分组的”头“完全截获下来提供分析。它支持针对网络层,协议,主机,网络或端口的过滤,并提供and,or,not等逻辑语句来帮助去掉无用的信息。
使用tcpdump查看上述生成的文件里的myfirst-0-0,在命令行输入:
tcpdump -nn -tt -r myfirst-0-0.pcap
结果图为:
2.2.2 Wireshark
与TcpDump相比,Wireshark界面比较友好,功能也很强大。Wireshark是一个图形用户界面的网络分组封装分析软件,可以获取网络分组封装,并尽可能地显示最为详细的网络分组封装资料。
wireshark安装:
$ sudo apt-get install wireshark
wireshark使用:
sudo wireshark
打开后选择 myfirst-0-0.psap文件,读取信息如下。工作区的上部分是数据分组的简单信息,中间是详细信息,包括各个协议的头格式,下部分是二进制显示。