NS2是一个全开源的比较成熟的网络模拟器,与之相对有的有商业付费软件OPNet。因为工作需要,所以对NS2进行了调研,安装并简单使用了一下,做个记录。NS2早在2011年就已经不维护了,这算是考古了。
NS2是面向对象的、开源的离散事件模拟器。可用于仿真各种不同的IP网,实现有一些MAC层协议。注重低级协议仿真,监视,分析包踪迹和队列行为。
NS2采用系统编程语言C++和脚本编程语言OTcl共同开发。NS2作为OTcl的脚本解释器,由事件调度器、网络组件对象和网络组装模块库组成,其中事件调度器和网络组件(协议实现由C++完成),仿真配置由Tcl脚本实现。
其实有很多博客都说到了NS2的安装,也说的很好。这里就简单说一下:
参考:
https://blog.csdn.net/liyongqi_/article/details/71774170
https://blog.csdn.net/mingyong_blog/article/details/41114421
1. 首先是NS2源码的下载,下载地址:http://www.isi.edu/nsnam/ns/ns-build.html,下这个就好了。
2. 然后就是依赖工具包的安装:
sudo apt-get install build-essential
sudo apt-get install tcl8.5 tcl8.5-dev tk8.5 tk8.5-dev
sudo apt-get install libxmu-dev libxmu-headers
3. 解压资源文件并安装,因为NS2源码问题,会出现编译错误,需要修改ns/ns-2.35/linkstate/ls.h中的137行:
将 void eraseAll() { erase(baseMap::begin(), baseMap::end()); }
改为: void eraseAll() { this->erase(baseMap::begin(), baseMap::end()); }
tar -xvzf ns-allinone-2.35.tar.gz
mv ns-allinone-2.35 ns
cd ns
sudo ./install
4. 安装完成之后,会提示叫设置环境变量。在 ~/.bashrc中添加,主要是三个,一个PATH,一个LD_LIBRARY_PATH,一个TCL_LIBRARY。照着提示来就好了的,我设置的这样:
export NS_HOME=$HOME/workspace/ns-allinone-2.35
export TK_HOME=$NS_HOME/tk8.5.10
export TCl_HOME=$NS_HOME/tcl8.5.10
#为了简略后面的变量设置,额外设置了几个
export PATH=$PATH:$NS_HOME/bin:$TK_HOME/unix:$TCL_HOME/unix
export LD_LIBRARY_PATH=$NS_HOME/otcl-1.14:$NS_HOME/lib
export TCL_LIBRARY=$TCL_HOME/library
5. 测试。输入ns ,进入NS编辑界面,%开头。则安装成功
首先自己安装完NS2之后,就进入了一种懵逼状态(我在哪儿,我要干嘛...)。完全不知道后面要干什么的样子,怎么运用NS2进行模拟,这个过程全程懵逼,开始的第一步都不知道,哈哈哈哈。找了一段时间之后,终于知道怎么启动模拟了。
ns xxx.tcl #就是这么简单
NS2内置很多协议,和模型,比如TCP/IP的五层网络模型以及其中的一些协议,初始用现成的模型与协议进行模拟就可以了。那还差的就是网络拓扑配置,以及参数配置了,网络流量(消息大小,消息间隔等等)的设置。之前介绍说过NS2的是由C++和TCL来完成模拟的,C++编写协议,TCL脚本则是用来编写网络配置。下面就介绍一个简单的TCL的示例及说说明,具体可参见NS2教程,一个中文PDF,《NS与网络模拟》。下面直接上脚本代码:
set ns [new Simulator] #建立一个Simulator对象的实例,赋值给ns
set tracefd [open test.tr w] #打开一个test.tr的文件,用来记录trace数据,名tracefd
$ns trace-all $tracefd
set namtracefd [open test.nam w] #打开一个test.nam的文件,用来记录nam的trace数据
$ns namtrace-all $namtracefd
proc finish {} { #一个procedure,用来关闭两个trace,调用nam程序
global ns tracefd namtracefd
$ns flush-trace
close $tracefd
close $namtracefd
exec nam test.nam &
exit 0
}
set n0 [$ns node] #设置ns节点,一个n0,一个n1
set n1 [$ns node]
#设置两个节点之间的链路,链路带宽1Mb/s,延时10ms,队列类型:DropTail
$ns duplex-link $n0 $n1 1Mb 10ms DropTail
set udp0 [new Agent/UDP] #新建一个UDP Agent,udp0
$ns attach-agent $n0 $udp0 #将 udp0 绑定到 n0
#新建一个CBR(Constant Bit Rate)流量发生器(traffic generator)
set cbr0 [new Application/Traffic/CBR]
$cbr0 set packetSize_ 500 #设置分组大小
$cbr0 set interval_ 0.005 #设置消息发送间隔
$cbr0 attach-agent $udp0 #绑定到udp0
set null0 [new Agent/Null] #新建一个Null Agent,一种数据接收器(traffic sink)
$ns attach-agent $n1 $null0 #绑定到n1
$ns connect $udp0 $null0 #将udp0和null0 两个Agent连接起来
$ns at 0.5 "$cbr0 start" #设置启动时间
$ns at 4.5 "$cbr0 stop" #设置停止发送时间
$ns at 5.0 "finish" #设置finish时间
$ns run #开始模拟
运行:ns test.tcl。就会出现的模拟界面了。
至于怎么编写自己的协议,因为我没有继续下去了,所以Good Luck!