NS2无师自通Word文档下载推荐.docx
《NS2无师自通Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《NS2无师自通Word文档下载推荐.docx(51页珍藏版)》请在冰豆网上搜索。
2.3在linux环境下安装NS-2
假设你已经安装好linux系统,下面开始NS-2模拟环境的安装与配置。
NS-2软件建议选择allinone(即allinone).此处和以后的试验环境我们使用的是ns-allinone-2.30。
将ns-allinone-2.30.tar.gz文件放在当前用户的home目录下,如果你是从网络上下载,一般默认是在这个目录下,你可以检查下;
如果你通过其他方式,本实验是通过U盘的方式,把文件复制到该目录中。
2.3.1安装ns-2
如果是root用户的显示为“主机名#”,非root用户显示为“主机名$"
.果是root用户,你的home目录为/root,非root用户的home目录为/home/用户名。
命令说明:
$cd(转到home目录下),$tarzxfns-allione-2.30.tar.gz(解压软件包)$cdns-allinone-2.30(进入ns-allinone-2.30目录下)$./install
(运行安装命令)
2.3.2设置全局路径变量
上一步的安装成功后,最后输出部分会提示你必须设置三个全局变量path,ld_library_path和tcl_library.在自己的根目录下编辑终端配置文件.bashrc,注意要带"
."
开头,.bashrc是bash终端的配置文件,在Linux中它是隐藏文件,一般用ls命令看不出来,但可以采用vi命令编辑该文件:
$cd
$vi.bashrc(用linux系统提供的vi编辑器来编辑.bashrc文件)
将光标移动到最后一行,按下insert键进行插入
exportNS_HOME=~/ns-allinone-2.30
exportPATH=$NS_HOME/tcl8.4.13/unix:
$NS_HOME/tk8.4.13/unix:
$NS_HOME/bin:
$PATH
exportLD_LIBRARY_PATH=$NS_HOME/tcl8.4.13/unix:
$NS_HOME/otcl-1.12:
$NS_HOME/vlib:
$LD_LIBRARY_PATH
exportTCL_LIBRARY=$NS_HOME/tcl8.4.13/library
在设置的过程中一定要细心。
export后有一个空格,其他地方是以”:
”来分割的。
”~/“home目录,你也可以不用设置这个变量都是可以的,对于具体的版本中包含软件版本不同,可参看上面的图和下边的脚本进行相应放入更改。
编辑结束,按键盘上的退出键esc:
退出插入模式,再输入“:
wq”存盘退出.
2.3.3简单测试
打开一个新终端输入ns回车,在%号后输入空格+puts+空格+"
helloworld"
,如果显示helloworld则配置成功。
否者查找原因重新配置。
如有问题请发邮件询问与技术支持:
duankesong@
网络仿真利器NS-2无师自通七天速成系列Ⅱ:
NS-2实例编写
安装NS-2后,就可以运行该软件了。
NS-2有两种运行方式,第一种是“脚本方式”,假设这里有个已编好的文件example.tcl文件,通过在linux控制端输入nsexample.tcl就可以运行该脚本了。
第二种方法就是“命令行方式”,通过在linux系统下输入ns进入NS-2模拟环境。
然后输入各种指令交互的运行。
1.编写一个tcl脚本一般分为以下几个步骤:
1)
创建模拟器对象,用来定义和控制模拟过程。
在这个过程中,首先创建一个simulator对象。
2)
设置跟踪文件
3)
创建网络拓扑结构。
4)
配置节点属性。
5)
创建拓扑结构
6)
设置代理和应用层协议,并进行绑定。
7)
使用模拟器对象的at过程设置节点事件和时间的对应关系。
8)
使用模拟器对象的run过程开始模拟。
9)
结果分析。
模拟结束后,将得到保存模拟过程的trace文件,接下来的主要工作就是对于这个结果文件根据需求进行数据分析,同时可以用gnuplot等画图工具直观的显示数据分析结果。
2,下边是一个实例。
新建一个文件,保存为example.tcl
[TclScript]
#产生一个仿真的对象
setns[newSimulator]
#针对不同的资料流定义不同的颜色,这是要给NAM用的
$nscolor1Blue
$nscolor2Red
#开启一个NAMtracefile
setnf[openout.namw]
$nsnamtrace-all$nf
#开启一个tracefile,用来记录封包传送的过程
setnd[openout.trw]
$nstrace-all$nd
#定义一个结束的程序
procfinish{}{
globalnsnfnd
$nsflush-trace
close$nf
close$nd
#以背景执行的方式去执行NAM
execnamout.nam&
exit0
}
#产生四个网络节点
setn0[$nsnode]
setn1[$nsnode]
setn2[$nsnode]
setn3[$nsnode]
#把节点连接起来
$nsduplex-link$n0$n22Mb10msDropTail
$nsduplex-link$n1$n22Mb10msDropTail
$nsduplex-link$n2$n31.7Mb20msDropTail
#设定ns2到n3之间的QueueSize为10个封包大小
$nsqueue-limit$n2$n310
#设定节点的位置,这是要给NAM用的
$nsduplex-link-op$n0$n2orientright-down
$nsduplex-link-op$n1$n2orientright-up
$nsduplex-link-op$n2$n3orientright
#观测n2到n3之间queue的变化,这是要给NAM用的
$nsduplex-link-op$n2$n3queuePos0.5
#建立一条TCP的联机
settcp[newAgent/TCP]
$tcpsetclass_2
$nsattach-agent$n0$tcp
setsink[newAgent/TCPSink]
$nsattach-agent$n3$sink
$nsconnect$tcp$sink
#在NAM中,TCP的联机会以蓝色表示
$tcpsetfid_1
#在TCP联机之上建立FTP应用程序
setftp[newApplication/FTP]
$ftpattach-agent$tcp
$ftpsettype_FTP
#建立一条UDP的联机
setudp[newAgent/UDP]
$nsattach-agent$n1$udp
setnull[newAgent/Null]
$nsattach-agent$n3$null
$nsconnect$udp$null
#在NAM中,UDP的联机会以红色表示
$udpsetfid_2
#在UDP联机之上建立CBR应用程序
setcbr[newApplication/Traffic/CBR]
$cbrattach-agent$udp
$cbrsettype_CBR
$cbrsetpacket_size_1000
$cbrsetrate_1mb
$cbrsetrandom_false
#设定FTP和CBR资料传送开始和结束时间
$nsat0.1"
$cbrstart"
$nsat1.0"
$ftpstart"
$nsat4.0"
$ftpstop"
$nsat4.5"
$cbrstop"
#结束TCP的联机(不一定需要写下面的程序代码来实际结束联机)
$nsdetach-agent$n0$tcp;
$nsdetach-agent$n3$sink"
#在仿真环境中,5秒后去呼叫finish来结束仿真(这样要注意仿真环境中
#的5秒并不一定等于实际仿真的时间
$nsat5.0"
finish"
#执行仿真
$nsrun
3,实验结果与数据分析如下:
仿真结束后,会产生两个档案,一个是out.nam,这是给NAM用的,用来把仿真的过程用可视化的方式呈现出来,这可以让使用者用”看”的方式去了解封包传送是如何从来源端送到接收端。
另一个档案是out.tr,这个档案记录了仿真过程中封包传送中所有的事件,例如第一笔记录是一个CBR的封包,长度为1000bytes,在时间0.1秒的时候,从n1传送到n2。
这个档案对我们做效能分析很重要,所以要先对这个档案的格式做仔细的介绍。
+
0.1
1
2
cbr
1000
-------
1.0
3.1
0
-
0.108
1
1
r
0.114
3
0.116
2
0.122
0.122
.................................................................
每一笔记录的开始都是封包事件发生的原因,若是r则表示封包被某个节点所接收,若是+则表示进入了队列,若是-则表示离开队列,若是d则表示封包被队列所丢弃。
接着的第二个字段表示的是事件发生的时间;
字段三和字段四表示事件发生的地点(从fromnode到tonode);
字段五表示封包的型态;
字段六是封包的大小,字段七是封包的旗标标注;
字段八表示封包是属于那一个资料流;
字段九和字段十是表示封包的来源端和目的端,这两个字段的格式是a.b,a代表节点编号,b表示埠号(portnumber);
字段十一表示封包的序号;
最后字段十二表示封包的id。
以前面tracefile的第一笔为例,意思就是说有一个封包pakcetid为0,资料流id为2,序号为0,长度为1000bytes,型态为CBR,它是从来源端1.0要到目的地3.1,在时间0.1秒的时候,从节点1进入了节点2的队列中。
网络仿真利器NS-2无师自通七天速成系列Ⅲ:
Tcl和Otcl语言
Ns-2的实现是由表示层和实现层。
实现层:
采用C++对象,方便协议和算法的实现,提高执行效率;
表示层:
采用OTcl对象,方便拓扑和节点属性的修改,提高仿真便利性。
语法说明:
Tcl只支持”字符串”一种数据结构,一种分割符就是空格
1、基本命令格式:
Commandargarg1arg2arg3
一个Tcl命令是由空格符分割的关键字所组成。
其中,command是命令名称或者是一个Tcl过程名,其余都是该命令的参数。
一个Helloworld!
的例子:
%putsstdout{HelloWorld!
在这个例子,命令puts后面跟着两个参数,stdout用来定义标准输入流。
大括号把多个单词组成一个简单的参数。
2、变量:
用set命令进行定义。
注意参数之间是一个空格进行分割。
Set参数一,参数二参数一为变量名,参数二为变量的赋值。
用$命令来获取变量的值,具体格式为:
$变量名,中间没有空格
用unset命令来删除变量,使用方式为unset变量名1,变量名二,。
。
用info命令来查看变量是否存在,
3.
变量的组合和替代
变量的替代分为命令替代,又称欠套替代和反斜杠替代,与转移字符类似。
命令替代用中括号[]来实现。
反斜杠替代与转义字符的含义类似。
双引号组合把组合内容作为字符串来看待,中间不允许有替代出现,而大括号替代则可是有替代出现,两者都实现把一串命令组合为一组命令的作用
4
数学运算支持数学运算和位运算和逻辑运算。
用expr命令把表达式传递给解释器,如:
expr4*5
5.
Tcl中用proc来定义过程,命令格式为:
Proc过程名参数过程体
过程名可以为任何字符,过程名和变量名没有任何冲突,为了习惯,过程名第一个字母大写。
参数多余一个用大括号组合,过程体多余一行也用大括号组合
过程体中的return可以省略。
6.流程控制命令
6.1,if表达式then命令体1else命令体2
6.2,switchflags表达式条件一命令体1条件二命令体2。
default命令体n
一般情况下的格式为组合格式:
switchflags表达式{条件一{命令体1}条件二{命令体2}。
default{命令体n}}
其中flags为表达式的匹配方式,有三种,-exact为默认的,为精确匹配
-glob为通配模式,*为任意字符,?
为单个字符。
-regexp为正则表达式匹配,表达式为正则表达式。
6.3,for循环命令
For初始化测试表达式循环体
Foreach
While
6.4,catch命令用来扑获错误
6.5用break,continue,return
6,注释#来注释。
最前注释一行,后边注释加分号和#如;
#
7,数组
8,面向对象的tcl
在tcl中增加了对象的支持,如类的定义,继承与封装,构造和析构函数
网络仿真利器NS-2无师自通七天速成系列Ⅳ:
NS-2网络控件及其使用方法
1,Simulator类
在NS-2中,每个模拟过程需要一个类对整个过程进行控制和管理。
这个类就是simulator类。
这个类封装了节点(note),链路(link),代理(agent),数据分组格式等。
整个模拟过程通过创建一个模拟类对象开始,通过调用这个对象的各个过程实现创建节点,构建拓扑结构图,对模拟的各个方面进行配置,定义事件,根据定义的事件模拟整个网络的运行等。
创建一个模拟器类对象的格式为:
Setns[newsimulator]
2,NS-2是一个事件驱动的模拟器,通常包括两部分:
事件的触发时间和用来处理时间的功能函数的句柄。
NS-2中模拟内部at过程的主要功能是在特定的时间调度事件处理函数处理事件。
$nsat5.0“handle_fun”
Prochandle_fun{}{puts”thisistheeventhandlefunction”}
目前事件调度程序有四种事件调度器,分别为:
链式,堆式,时间队列式,和实时,其中时间队列式为默认的。
本节相关概念为:
Setnow[$nsnow]
$nshalt
$nsat<
time>
<
event>
3,节点note
在网络中将分布在不同地理位置的主机,交换机,路由器等网络设备在NS-2中统统抽象为一个节点,本节将介绍NS-2中节点的创建和配置方法。
根据网络节点之间通信方式的不同,分组的传输方式有两类,单播和多播。
单播节点的配置:
Setns[newsimulator]
Setn0[$nsnode]
一个单播节点是由地址分类器和端口分类器两个tcl对象组成的。
地址分类器主要判断分组的地址和转发分组到下一个接收器。
节点的地址模拟网络中的ip地址,有两种类型,默认为flat类型的,分类器中有一张shot表模拟网络中的路由表,一个shot码和一个节点地址相对应。
端口分类器的主要功能是按照分组的目的端口进行匹配,将分组传递给相应的agent对象。
多播节点的配置:
多播节点的配置,首先要把Multicast属性值设置为:
on,然后调用node过程创建多播节点。
创建一个多播节点的方法:
Setns[newSimulator-Multicaston]
Setn1[$nsnode]
注意多播结构是一对多的通信,一个多播分组在转发时,分组需要被转发给多个目标对象,这就要求多播节点能够生成该分组的多个拷贝,多播节点包含复制器(Replicator)对象,并使用其生成分组的拷贝。
多播节点主要是由多播分类器和复制器组成。
多播分类器根据源地址,和目的地址,将分组分类,富欧泊分类器内部保存了一张链式hash表,表的每一项包含源地址,多播目的地址,和slot码。
3.1节点的配置。
无线网了中的节点是移动节点,拥有不同于有限节点的各种特性。
所谓节点的配置就是在节点创建之前设定节点的各项属性,可是使用模拟器对象ns的内部过程node-config{}来配置节点的属性。
包括,所有节点的属性,无线节点的属性和卫星节点的配置。
与节点有关的命令
$nsnode[<
hier_addr>
]配置节点的类型,默认为没有分层的flat类型。
$nodeid此命令是返回节点的id号。
$nodenode-addr此命令是返回节点的地址。
$nodereset此命令重新设置绑定于节点的代理。
$nodedetach<
agent>
null_agent>
将代理从这个节点上删除,然后在这个端口上绑定一个空代理。
$nodeattach<
<
optional:
port_num>
节点自动为其分配一个端口号,并将该代理绑定到节点上。
3.2链路(link)
链路层负责对物理层上传输的数据进行检错和纠错。
NS-2中的数据链路层同时实现了物理层,数据链路层和部分网络层的功能。
本节主要讲述如何将不同的节点连接起来。
完成整个网络拓扑的结构的构建。
因此,一个完整的网络拓扑包括节点的创建和节点的连接(用链路)两个部分,即节点和链路是组成网络哟拓扑的两个要素。
网络设备见的通信方式可以分为单工,半双工和全双工三种方式。
单工是数据只能沿一个方向传输。
任何时候都不能改变数据传输的方向,在NS-2中我们采用创建简单的单向链路simplex-link来进行模拟这种通信方式。
半双工通信方式中,数据可以单向传输,但必须交替进行。
不常用。
全双工通信放式中,数据可以同时双向传输。
在NS-2中我们通过创建双向链路duplex-link来进行模拟。
创建单向链路
$nssimples-link<
node1>
node2>
bandwidth>
delay>
queue_type>
上述代码创建了一条node1到node2的单向链路,并且定义了链路的一下各项特性。
创建链路的带宽。
延时<
队列类型
创建双向链路
$nsduplex-link<
等价于
Set