网络仿真利器NS-2无师自通七天速成系列Ⅰ: NS-2简介与实验环境的安装 网络仿真利器NS-2无师自通七天速成系列Ⅰ: NS-2简介与实验环境的安装 近年来,网络通信技术日新月异,网络技术的研究炙手可热,促进人们不断的提高研究水平,更新研究技术,增加研究手段。目前网络通信的研究一般分为以下三种方式:(1)理论研究,(2)网络模拟,(3)试验测试。而网络模拟是目前网络通信研究中一种重要的方法。而NS-2是进行网络仿真最流行的软件之一,已广泛被科研院所和各大高校用于进行网络分析、研究和教学。 1.简介 NS-2(Network Simulator Version 2)最早来源于1989年哥伦比亚大学开发的Real Network Simulator项目,是一款开源免费的网络模拟软件。目前NS-2 可用于仿真各种不同的通信网络。已经实现的仿真模块有:网络传输
,如TCP 和UDP;业务源流量产生器,如FTP、Telnet、Web CBR 和VBR;路由队列管理机制,如Droptai、RED 和CBQ;路由算法,如Dijkstra,以及无线网络的WLAN,Ad hoc 路由,移动IP 和卫星通信网络等。NS-2 也为进行局域网的仿真而实现了多播以及一些MAC 子层协议。 2. NS-2试验环境的安装与配置 NS-2需要在linux操作系统下运行,然而大多数人对linux操作系统不太熟悉,更习惯于windows操作系统,所以就需要把NS-2安装在windows平台下。 本实验环境的配置工具如下:Winxp+ VMware Workstation6+RedHat linux+ ns-allinone-2.30. 2.1 Winxp下安装VMware Workstation6 2.2启动VMware Workstation6,新建虚拟机,在新建的虚拟机中选择Red linux 5,安装linux系统. 插入系统盘,进行启动,系统自动的会找到未分区的预留空间进行安装,按照提示进行安装.在分区的过程中,建议划出一个2倍于内存的交换类型空间(swap类型),一个100M的ex3类型的"/home"空间,剩下的全部分给ex3类型的"/"根空间。分区采用自动分区,分区如下: 在安装的过程中,要选择开发的组件,默认是不安装的,刚开始不太熟悉,可以选择全部安装。然后按照提示一步步的安装即可。 注意:在安装linux过程中要注意以下两点:第一,在虚拟机下安装,一定要选择自定义模式,然后选择硬盘类型为IDE类型,否则无法安装成功,第二,一定要在linux系统的安装过程中,要选择自定义方式,安装需要的软件,包括编辑软件。第三,配置linux环境有三种选择,直接安装linux系统,windows+模拟环境cygwin和windows+虚拟机+linux下安装。如果出于学习考虑,建议采用第三种方法,如果真正的去做实验建议采用第一种方法。当然,我们也可以选择不安装,而使用模拟环境cygwin来模拟linux系统,如果你要真正的学习网络模拟的话,不建议采用这中方法。 2.3在linux环境下安装NS-2 假设你已经安装好linux系统,下面开始NS-2模拟环境的安装与配置。NS-2软件建议选择allinone (即all in one).此处和以后的试验环境我们使用的是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目录下),$tar zxf ns-allione-2.30.tar.gz(解压软件包)$cd ns-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键进行插入 export NS_HOME=~/ns-allinone-2.30 export PATH=$NS_HOME/tcl8.4.13/unix:$NS_HOME/tk8.4.13/unix:$NS_HOME/bin:$PATH export LD_LIBRARY_PATH=$NS_HOME/tcl8.4.13/unix:$NS_HOME/tk8.4.13/unix:$NS_HOME/otcl-1.12:$NS_HOME/vlib:$LD_LIBRARY_PATH export TCL_LIBRARY=$NS_HOME/tcl8.4.13/library 在设置的过程中一定要细心。export后有一个空格,其他地方是以”:”来分割的。”~/“home目录,你也可以不用设置这个变量都是可以的,对于具体的版本中包含软件版本不同,可参看上面的图和下边的脚本进行相应放入更改。 编辑结束,按键盘上的退出键esc:退出插入模式,再输入“:wq”存盘退出. 2.3.3 简单测试 打开一个新终端 输入ns回车,在%号后输入空格+puts+空格+"hello world",如果显示 hello world 则配置成功。否者查找原因重新配置。 如有问题请发邮件询问与技术支持:duankesong@126.com 网络仿真利器NS-2无师自通七天速成系列Ⅱ: NS-2实例编写 安装NS-2后,就可以运行该软件了。NS-2有两种运行方式,第一种是“脚本方式”,假设这里有个已编好的文件example.tcl文件,通过在linux控制端输入 ns example.tcl就可以运行该脚本了。第二种方法就是“命令行方式”,通过在linux系统下输入ns进入NS-2模拟环境。然后输入各种指令交互的运行。 1.编写一个tcl脚本一般分为以下几个步骤: 1) 创建模拟器对象,用来定义和控制模拟过程。在这个过程中,首先创建一个simulator 对象。 2) 设置跟踪文件 3) 创建网络拓扑结构。 4) 配置节点属性。 5) 创建拓扑结构 6) 设置代理和应用层协议,并进行绑定。 7) 使用模拟器对象的at过程设置节点事件和时间的对应关系。 8) 使用模拟器对象的run过程开始模拟。 9) 结果分析。模拟结束后,将得到保存模拟过程的trace文件,接下来的主要工作就是对于这个结果文件根据需求进行数据分析,同时可以用gnuplot等画图工具直观的显示数据分析结果。 2,下边是一个实例。新建一个文件,保存为example.tcl [Tcl Script] # 产生一个仿真的对象 set ns [new Simulator] #针对不同的资料流定义不同的颜色,这是要给NAM用的 $ns color 1 Blue $ns color 2 Red #开启一个NAM trace file set nf [open out.nam w] $ns namtrace-all $nf #开启一个trace file,用来记录封包传送的过程 set nd [open out.tr w] $ns trace-all $nd #定义一个结束的程序 proc finish {} { global ns nf nd $ns flush-trace close $nf close $nd #以背景执行的方式去执行NAM exec nam out.nam & exit 0 } #产生四个网络节点 set n0 [$ns node] set n1 [$ns node] set n2 [$ns node] set n3 [$ns node] #把节点连接起来 $ns duplex-link $n0 $n2 2Mb 10ms DropTail $ns duplex-link $n1 $n2 2Mb 10ms DropTail $ns duplex-link $n2 $n3 1.7Mb 20ms DropTail #设定ns2到n3之间的Queue Size为10个封包大小 $ns queue-limit $n2 $n3 10 #设定节点的位置,这是要给NAM用的 $ns duplex-link-op $n0 $n2 orient right-down $ns duplex-link-op $n1 $n2 orient right-up $ns duplex-link-op $n2 $n3 orient right #观测n2到n3之间queue的变化,这是要给NAM用的 $ns duplex-link-op $n2 $n3 queuePos 0.5 #建立一条TCP的联机 set tcp [new Agent/TCP] $tcp set class_ 2 $ns attach-agent $n0 $tcp set sink [new Agent/TCPSink] $ns attach-agent $n3 $sink $ns connect $tcp $sink #在NAM中,TCP的联机会以蓝色表示 $tcp set fid_ 1 #在TCP联机之上建立FTP应用程序 set ftp [new Application/FTP] $ftp attach-agent $tcp $ftp set type_ FTP #建立一条UDP的联机 set udp [new Agent/UDP] $ns attach-agent $n1 $udp set null [new Agent/Null] $ns attach-agent $n3 $null $ns connect $udp $null #在NAM中,UDP的联机会以红色表示 $udp set fid_ 2 #在UDP联机之上建立CBR应用程序 set cbr [new Application/Traffic/CBR] $cbr attach-agent $udp $cbr set type_ CBR $cbr set packet_size_ 1000 $cbr set rate_ 1mb $cbr set random_ false #设定FTP和CBR资料传送开始和结束时间 $ns at 0.1 "$cbr start" $ns at 1.0 "$ftp start" $ns at 4.0 "$ftp stop" $ns at 4.5 "$cbr stop" #结束TCP的联机(不一定需要写下面的程序代码来实际结束联机) $ns at 4.5 "$ns detach-agent $n0 $tcp ; $ns detach-agent $n3 $sink" #在仿真环境中,5秒后去呼叫finish来结束仿真(这样要注意仿真环境中 #的5秒并不一定等于实际仿真的时间 $ns at 5.0 "finish" #执行仿真 $ns run 3,实验结果与数据分析如下: 仿真结束后,会产生两个档案,一个是out.nam,这是给NAM用的,用来把仿真的过程用可视化的方式呈现出来,这可以让使用者用”看”的方式去了解封包传送是如何从来源端送到接收端。另一个档案是out.tr,这个档案记录了仿真过程中封包传送中所有的事件,例如第一笔记录是一个CBR的封包,长度为1000bytes,在时间0.1秒的时候,从n1传送到n2。这个档案对我们做效能分析很重要,所以要先对这个档案的格式做仔细的介绍。 + 0.1 1 2 cbr 1000 ------- 2 1.0 3.1 0 0 - 0.1 1 2 cbr 1000 ------- 2 1.0 3.1 0 0 + 0.108 1 2 cbr 1000 ------- 2 1.0 3.1 1 1 - 0.108 1 2 cbr 1000 ------- 2 1.0 3.1 1 1 r 0.114 1 2 cbr 1000 ------- 2 1.0 3.1 0 0 + 0.114 2 3 cbr 1000 ------- 2 1.0 3.1 0 0 - 0.114 2 3 cbr 1000 ------- 2 1.0 3.1 0 0 + 0.116 1 2 cbr 1000 ------- 2 1.0 3.1 2 2 - 0.116 1 2 cbr 1000 ------- 2 1.0 3.1 2 2 r 0.122 1 2 cbr 1000 ------- 2 1.0 3.1 1 1 + 0.122 2 3 cbr 1000 ------- 2 1.0 3.1 1 1 ................................................................. 每一笔记录的开始都是封包事件发生的原因,若是r则表示封包被某个节点所接收,若是+则表示进入了队列,若是-则表示离开队列,若是d则表示封包被队列所丢弃。接着的第二个字段表示的是事件发生的时间;字段三和字段四表示事件发生的地点(从from node到to node);字段五表示封包的型态;字段六是封包的大小,字段七是封包的旗标标注;字段八表示封包是属于那一个资料流;字段九和字段十是表示封包的来源端和目的端,这两个字段的格式是a.b,a代表节点编号,b表示埠号(port number);字段十一表示封包的序号;最后字段十二表示封包的id。以前面trace file的第一笔为例,意思就是说有一个封包pakcet id为0,资料流id为2,序号为0,长度为1000 bytes,型态为CBR,它是从来源端1.0要到目的地3.1,在时间0.1秒的时候,从节点1进入了节点2的队列中。 网络仿真利器NS-2无师自通七天速成系列Ⅲ:Tcl和Otcl语言 Ns-2的实现是由表示层和实现层。实现层:采用C++对象,方便协议和算法的实现,提高执行效率;表示层:采用OTcl对象,方便拓扑和节点属性的修改,提高仿真便利性。 语法说明: Tcl只支持”字符串”一种数据结构,一种分割符就是空格 1、基本命令格式: Command arg arg1 arg2 arg3 一个Tcl命令是由空格符分割的关键字所组成。其中,command是命令名称或者是一个Tcl过程名,其余都是该命令的参数。 一个Hello world!的例子: % puts stdout {Hello World!} 在这个例子,命令puts后面跟着两个参数,stdout 用来定义
输入流。大括号把多个单词组成一个简单的参数。 2、变量: 用set命令进行定义。注意参数之间是一个空格进行分割。 Set 参数一, 参数二 参数一为变量名,参数二为变量的赋值。 用$命令来获取变量的值,具体格式为:$变量名,中间没有空格 用unset命令来删除变量,使用方式为unset 变量名1,变量名二,。。。。。 用info命令来查看变量是否存在, 3. 变量的组合和替代 变量的替代分为命令替代,又称欠套替代和反斜杠替代,与转移字符类似。 命令替代用中括号[]来实现。 反斜杠替代与转义字符的含义类似。 双引号组合把组合内容作为字符串来看待,中间不允许有替代出现,而大括号替代则可是有替代出现,两者都实现把一串命令组合为一组命令的作用 4 数学运算 支持数学运算和位运算和逻辑运算。用expr命令把表达式传递给解释器,如:expr 4*5 5. Tcl中用proc来定义过程,命令格式为: Proc 过程名 参数 过程体 过程名可以为任何字符,过程名和变量名没有任何冲突,为了习惯,过程名第一个字母大写。 参数多余一个用大括号组合,过程体多余一行也用大括号组合 过程体中的return可以省略。 6.流程控制命令 6.1,if 表达式 then 命令体1 else 命令体2 6.2,switch flags 表达式 条件一 命令体1 条件二 命令体2。。。default 命令体n 一般情况下的格式为组合格式: switch flags 表达式{ 条件一 {命令体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),数据分组格式等。整个模拟过程通过创建一个模拟类对象开始,通过调用这个对象的各个过程实现创建节点,构建拓扑结构图,对模拟的各个方面进行配置,定义事件,根据定义的事件模拟整个网络的运行等。 创建一个模拟器类对象的格式为: Set ns [new simulator] 2,NS-2是一个事件驱动的模拟器,通常包括两部分:事件的触发时间和用来处理时间的功能函数的句柄。NS-2中模拟内部at过程的主要功能是在特定的时间调度事件处理函数处理事件。 Set ns [new simulator] $ns at 5.0 “handle_fun” $ns run Proc handle_fun{}{puts”this is the event handle function”} 目前事件调度程序有四种事件调度器,分别为:链式,堆式,时间队列式,和实时,其中时间队列式为默认的。 本节相关概念为: Set ns [new simulator] Set now[$ns now] $ns halt $ns run $ns at
3,节点note 在网络中将分布在不同地理位置的主机,交换机,路由器等网络设备在NS-2中统统抽象为一个节点,本节将介绍NS-2中节点的创建和配置方法。 根据网络节点之间通信方式的不同,分组的传输方式有两类,单播和多播。 单播节点的配置: Set ns [ new simulator] Set n0 [$ns node] 一个单播节点是由地址分类器和端口分类器两个tcl对象组成的。 地址分类器主要判断分组的地址和转发分组到下一个接收器。节点的地址模拟网络中的ip地址,有两种类型,默认为flat类型的,分类器中有一张shot表模拟网络中的路由表,一个shot码和一个节点地址相对应。 端口分类器的主要功能是按照分组的目的端口进行匹配,将分组传递给相应的agent对象。 多播节点的配置: 多播节点的配置,首先要把 Multicast属性值设置为: on,然后调用node过程创建多播节点。 创建一个多播节点的方法: Set ns [new Simulator -Multicast on] Set n1 [$ns node] 注意多播结构是一对多的通信,一个多播分组在转发时,分组需要被转发给多个目标对象,这就要求多播节点能够生成该分组的多个拷贝,多播节点包含复制器(Replicator)对象,并使用其生成分组的拷贝。 多播节点主要是由多播分类器和复制器组成。多播分类器根据源地址,和目的地址,将分组分类,富欧泊分类器内部保存了一张链式hash表,表的每一项包含源地址,多播目的地址,和slot码。 3.1节点的配置。 无线网了中的节点是移动节点,拥有不同于有限节点的各种特性。所谓节点的配置就是在节点创建之前设定节点的各项属性,可是使用模拟器对象ns的内部过程node-config{}来配置节点的属性。包括,所有节点的属性,无线节点的属性和卫星节点的配置。 与节点有关的命令 $ns node[] 配置节点的类型 ,默认为没有分层的flat类型。 $node id 此命令是返回节点的id号。 $node node -addr 此命令是返回节点的地址。 $node reset 此命令重新设置绑定于节点的代理。 $node detach 将代理从这个节点上删除,然后在这个端口上绑定一个空代理。 $node attach 节点自动为其分配一个端口号,并将该代理绑定到节点上。 3.2链路 (link) 链路层负责对物理层上传输的数据进行检错和纠错。NS-2中的数据链路层同时实现了物理层,数据链路层和部分网络层的功能。 本节主要讲述如何将不同的节点连接起来。完成整个网络拓扑的结构的构建。因此,一个完整的网络拓扑包括节点的创建和节点的连接(用链路)两个部分,即节点和链路是组成网络哟拓扑的两个要素。 网络设备见的通信方式可以分为单工,半双工和全双工三种方式。单工是数据只能沿一个方向传输。任何时候都不能改变数据传输的方向,在NS-2中我们采用创建简单的单向链路simplex-link来进行模拟这种通信方式。 半双工通信方式中,数据可以单向传输,但必须交替进行。不常用。 全双工通信放式中,数据可以同时双向传输。在NS-2中我们通过创建双向链路duplex-link来进行模拟。 创建单向链路 Set ns [new simulator] $ns simples-link 上述代码创建了一条node1到node2的单向链路,并且定义了链路的一下各项特性。 创建链路的带宽。 延时队列类型 创建双向链路 Set ns [new simulator] $ns duplex-link 等价于 Set ns [new simulator] $ns simples-link $ns simples-link 本节相关命令: $ns simples-link $ns duplex-link $ns simples-link $ns duplex-link 以上两个命令主要设置链路的属性,主要包括:方向,颜色,标签和队列的位置。设置这些主要用于nam的动画显示。 4.代理 agent NS-2中通过创建节点和链路来构建网络拓扑结构,然后就可以在各个节点间和链路上产生业务流。而NS-2中采用定义路由,代理和网络应用层来模拟实际的业务流。 代理可以构建和销毁网络层的分组,是网络层的起点和终点,同时,代理还可以实现各种不同层的网络协议。NS-2中采用“/”作为类名的分割符的。 Agent类是有c++和otcl共同实现的。 Udp和tcp是tcl/ip协议族在传输层主要的两个协议。Udp协议 无连接,但传输速度快。Tcp基于三次握手协议但传输速度没有udp速度快。 Udp代理 agent/udp类agent类的一个子类,模拟了udp协议的主要功能。NS-2中创建和设置udp代理可以分为以下几个步骤。 步骤一:创建一个agent/udp对象并将其绑定到相应的节点上作为分组的发送器。 步骤二:设置agent/udp的部分内部变量。 步骤三:创建一个agent/null对象并将其绑定到相应的节点上作为分组的接受器。 步骤四:在两个发送和接受代理之间创建connection连接。 以下tcl代码具体显示了如何创建。Udp代理,激射节点n0和n1,以及模拟器对象已建立。 Set udp0[new Agent/UDP] $ns attach-agent $n0 $udp0 $udp0 set packetsize_536 Set null0[new Agent/NULL] $attach – agent $n1 $ null0 $ns connect $udp0 $null0 TCP代理 TCP代理分为单向代理和双向代理,这里主要是单向代理。 agent/TCPSink类为例。NS-2中创建和设置TCP代理可以分为以下几个步骤。 步骤一:创建一个agent/TCP对象,作为分组的发送器。 步骤二:设置Agent/TCP对象的部分内部变量。 步骤三:创建一个agent/TCPSink对象,作为分组的接受器。 步骤四:在两个发送和接受代理之间创建connection连接。 以下tcl代码具体显示了如何创建TCP代理,激射节点n0和n1,以及模拟器对象已建立。 Set tcp[new Agent/TCP] $ns attach-agent $n0 $tcp $tcp set fid_1 $tcp set window_20 Set sink[new Agent/TCPSink] $attch – agent $n1 $ sink $ns connect $tcp $sink 与Agent相关的一些命令 Set agent [new Agent/agent type] $ns attach-agent $agent port $agent dst –port $agent attach –app $ns connection $ns create-connect $agent attach-trace 5应用层 在NS-2中,应用层建立在传输层之上。分为两大类。流量产生器(traffic generator)和应用模拟器(simolated application) 流量产生器一般用在udp代理之上。应用模拟器代理一般在tcp代理之上。 流量产生器: 一般有四种udp代理:指数分布流量代理器,pareto分布流量产生器。固定比率流量产生器。Trace文件流量产生器。 下面是一个例子说明流量产生器的使用,本节配置的是固定比率cbr流量发生器 步骤一:创建代理层对象并将传输层代理绑定到相应的节点上。创建 绑定 连接 Set src[new Agent/UDP] Set sinl[new Agent/NULL] $ns attach-agent $n0 $src $ns attach-agent $n0 $link $ns connect $src $sink 步骤二:创建流量产生器对象,设置对象属性,并将其与传输层的源代理绑定 可以通过调用application类的方法,也可以使用agent类中的方法 Set e[new Application/traffic/cbr] $e set packetsize_300 $e set rate_32kb $e set random_On $e attach-agent $src 或: Set e[new Application/traffic/cbr] $e set packetsize_300 $e set rate_32kb $e set random_true $e attach-app $e 步骤三:启动和停止流量产生器 $ns at “$e start” $ns at 5.0 “$e stop” 应用模拟器: 主要介绍ftp应用模拟器和telnet应用模拟器。 ftp模拟器:对应的Otcl类为:Application/FTP,主要用来模拟大量数据的传送。 telnet应用模拟器:telnet对象有两种分组的方法,如果interval_为零,那么分组发送的时间间隔均值为interval_ 的指数分布,如果为零,那么分组的发送时间间隔的选择按住奥tcplib经验分布,下面以tcp为例 set src[new Agent/TCP] ;#创建一个TCP源代理,作为tcp分组的发送者。 set sink[new Agent/TCPSink] ;#创建一个tcpsink对象,作为tcp分组的接受者 $ns attach-agent $no $src ;#绑定节点 $ns attach-agent $n1 $sink ;#绑定节点 $ns connection $src $sink ;#连接 Set ftp1[new Application/FTP] ;#;创建 $ftp attach-agent $src ;#绑定代理 $ns at 0.5 “ftp start” ;#启动 网络仿真利器NS-2无师自通七天速成系列Ⅴ:数据的记录,演示,数据分析 1. 数据的记录 NS-2中主要有两种数据记录格式,一种是Trace格式,该对象详细记录了模拟的整个过程,第二种是Monitor,用来记录有用的数值。 Ø Trace文件的建立: $ns trace-all ;#记录整个模拟过程。 $ns trace-queue ;#记录n1和n2之间的链路事件,为可选项。 例如: set tracefile [open out.tr w] $ns trace-all $tracefile 或 set tracefile [open out.tr w] $ns trace-queue $n1 $n2 $tracefile 注:在有线网络中,调用trace-queue方法之前,链路必须已经建立。 Ø Trace文件的格式: 1 2 3 4 5 6 7 8 9 10 11 12 Event Time From node To node Pkt type Pkt size Flags Fid Src addr Dst addr Seq num Pkt id 1.Event 发生的事件类型。 + 表示分组进入链路队列(Enqueue) - 表示分组离开链路队列 (Dequeue) r 表示目的队列接受(receive)事件 d 表示队列丢弃(drop)分组事件 2. time 表示事件发生的事件 3. From node 表示分组发送节点的id 4. To node 表示分组传送目的节点的id 5. Pkt type 表示分组类型 6. Pkt size 表示分组的大小 7. Flags 表示标志项 8. Fid Flow id的标识符 9. Src addr 表示源地址,格式为:node.port。node为分组发送节点的id,port代表发送分组节点的端口号。 10. Dst addr 表示目的地址,格式为:node.port。node为分组接收节点的id,port代表接收分组节点的端口号。 11. Seq num 分组的序列号 12. Pkt id 分组的唯一标识符。 部分trace文件内容如下: - 4.004353 2 3 tcp 1040 ------- 1 0.0 3.0 216 946 r 4.005153 2 3 tcp 1040 ------- 1 0.0 3.0 213 939 + 4.005153 3 2 ack 40 ------- 1 3.0 0.0 213 963 - 4.005153 3 2 ack 40 ------- 1 3.0 0.0 213 963 r 4.006141 3 2 ack 40 ------- 1 3.0 0.0 211 957 + 4.006141 2 0 ack 40 ------- 1 3.0 0.0 211 957 - 4.006141 2 0 ack 40 ------- 1 3.0 0.0 211 957 Ø Monitor文件 2.模拟结果的演示 Nam是用于动态演示NS-2模拟的过程,Gnuplot和Xgraph是用于绘制模拟曲线,Gawk则用于从trace文件中提取数据信息。 Nam是一个基于Tcl/Tk的动画程序,用来观察网络模拟的轨迹或者真实环境中生成的包的轨迹。Nam可以从namtrace文件中读取动画事件的命令,事件命令保存在文件中。Nam可以显示各种各样的网络对象,包括节点,链路(有线网络),数据流,无线网络中的电波信号,丢包等等。 Nam文件的产生。 $set nf [open out.nam w] $ns nam trace-all $nf 网络拓扑布局的生成。 设置节点的固定布局 $ns duplex-link-op $n0 $n2 orient right-down $ns duplex-link-op $n0 $n1 orient right-up $ns duplex-link-op $n0 $n1 orient right 自动布局方法,适用于网络节点教多的情况。 x,y坐标方式布局,适用于无线环境的拓扑构造。 节点的显示属性 ?????? $node $node color red $node shape hexagon $node label “mytext” $node label-color blue $node label-at up 链路的显示属性 $ns duplex-link-op 设置数据流属性 $ns color $n blue $agent set fie_ $n 例如:$ns color 1 blue $tcp set fid_ 1 $ns color 2 red $udp set fid_ 2 nam的运行 在脚本中加入 exec nam $namfile 在nam文件产生后,可在命令行下输入:nam out.nam运行。 关于nam的详细使用,可以参考NS手册中的说明,熟练掌握nam的使用,可以帮助读者更直观的分析模拟的过程,扑捉模拟时间发生的大致时间,从而加快对模拟结果的分析和处理。 3.Gnuplot 它是一个命令行驱动的,互动式函数和数据绘制程序,支持大多数的数学表达式和数学函数。 在命令行下输入:gnuplot gnuplot>>plot sin(exp(x)) plot用来绘制二维图形,Splot用来绘制三维图形。 4.xgraph是集成在ns-allinone软件包中的一个绘图工具。 5.Gawk是GNU开发的AWK程序语言。用来分析模拟产生的trace文件。 gawk是一种程序语言,对于资料的处理具有很强的功能,可以使用很短的代码轻易地完成对文本档案做修改、分析、提取和比较等处理。在NS的模拟结果分析中,经常用到gawk来进行数据分析和统计等。命令如下: gawk 'program' input-file1 input-file2 ... 程序代码较短 gawk -f program-file input-file1 input-file2... 程序较长 gawk程序是由很多的pattern和action所组成的: pattern {action}。 功能是针对文件的每一行搜寻指定的模式(pattern),当一行里有符合指定的模式时,gawk就会在此一行执行指定的动作(action)。 Gawk文件的读取,gawk在处理数据时是一个一个记录地处理,每个记录默认为一行。记录被分为多个区域(fields)在gawk程序中,“$1”表示第一个栏位,”$2”表示第二个栏位。依次类推,”$nf”表示最后一个栏位。 gawk文件的输出: 用 Print来输出 用printf来精心控制输出。 6.用nam gawk gnuplot xgraph来对trace文件进行分析 源程序:example_1.tcl 该程序执行完后生成 out.nam和out.tr文件 1.nam动画演示 2.gawk脚本分析分析CBR业务丢包率,时延,FTP业务中的TCP序列号的变化过程。 丢包率(loss rate)是一个比率,gawk参看脚本 loss.awk [loss.awk] BEGIN { num_pkts_sent =0; num_pkts_rcvd =0; } { action =$1; time =$2; from =$3; to =$4; type =$5; pktsize=$6; flow_id=$8; src=$9; dst = $10; seq_no =$11; packet_id =$12; if(from=="1"&&action=="+"&&flow_id=="2") num_pkts_sent++; if(to=="3"&&flow_id=="2"&&action=="r") num_pkts_rcvd++; } END { printf("number of packets sent:%d lost: %d\n",num_pkts_sent,num_pkts_sent-num_pkts_rcvd); printf("the loss rate of packets is %f\n",num_pkts_rcvd/num_pkts_sent); } 执行 gawk –f loss.awk out.tr 显示如下: 3.业务时延,脚本参看 delay.awk [delay.awk] BEGIN { largest_index =0; } { action =$1; time =$2; from =$3; to =$4; type =$5; pktsize=$6; flow_id=$8; src=$9; dst = $10; seq_no =$11; packet_id =$12; if(largest_index < seq_no) largest_index = seq_no; if(action=="+"&&from==1)start_time[seq_no]=time; if(action=="r"&&to==3)end_time[seq_no]=time; } END { printf("the largest_index is %d\n",largest_index); for(i =0;i>tcp_seq_sent.txt gawk’($5==”tcp”&&$1==”r”&&$4==”3”) {print $2,$11}’out.tr>>tcp_seq_rcvd.txt 然后执行 gnuplot gnuplot>>plot “tcp_seq_sent.txt”using 2:1,”tcp_seq_rcvd.txt”using2:1 也可执行: xgraph tcp_seq_rcvd.txt tcp_seq_sent.txt 网络仿真利器NS-2无师自通七天速成系列Ⅵ:无线网络模拟与实例 目前无线网络可以分为两类,有固定接入点的无线网络和无固定接入点的无线网络。无固定接入点的网络,通常称为Ad Hoc网络,或自组织网络。 1. Ad hoc一词来源于拉丁语,是“特别地,专门地为某一即将发生的特定目标、事件或局势而不为其他的”的意思。这里提出的“Ad hoc技术”所标称的就是一种无线特定的网络结构,强调的是多跳、自组识、无中心的概念,所以国内一般把基于Ad hoc技术的网络译为“自组网”,或者“多跳网络”等等。 Ad hoc技术起源于20世纪70年代的美国军事领域,它是在美国国防部DARPA资助研究的“战场环境中的无线分组数据网(PRNET)”项目中产生的一种新型的网络构架技术。DARPA当时所提出的网络是一种服务于军方的无线分组网络,实现基于该种网络的数据通信。后来,DARPA又于1983年和1994年分别资助进行了抗毁可适应性网络(SURAN:Survivable Adaptive Network)和全球移动信息系统(GloMo:Global Information Systems)两个项目的研究,以便能够建立某些特殊环境或紧急情况下的无线通信网络。Ad hoc技术就是吸取了PRNET、SURAN以及GloMo等项目的组网思想,从而产生的一种新型的网络构架技术。 随着移动通信和移动终端技术的高速发展,Ad hoc技术不但在军事领域中得到了充分的发展,而且也在民用移动通信中得到了应用,尤其是在一些特殊的工作环境中,比如所在的工作场地没有可以利用的设备或者由于某种因素的限制(投入、安全、政策等)不能使用已有的网络通信基础设施时,用户之间的信息交流以及协同工作(Cooperative Work)就需要利用Ad hoc技术完成通信网络的立即部署,满足用户对移动数据通信的需求。在Ad hoc网络中,无线移动Ad hoc网络(WMANET)被认为是下一代移动通信系统解决方案中最有希望被采用的末端网络。 首先从总体上概括Ad hoc技术的一般概念,然后从OSI模型的角度分层次来介绍Ad hoc的技术特征以及构成Ad hoc网络的各种技术标准。最后就WMANET的网络体系结构以及其在下一代移动通信网络中的应用做了初步的探讨。 1,与其他通信网络相比,基于Ad hoc技术的Ad hoc网络具有以下特征: ⑴ 网络的自组性。Ad hoc网络可以在任何时刻任何地方构建,而不需要现有的信息基础网络设施的支持,形成一个自由移动的通信网络。 ⑵ 动态网络的拓扑结构。从网络的网络层来看,Ad hoc网络中,移动用户可以以任意的速度和任意方式在网中移动,加上无线发送装置发送功率的变化、无线信道间的相互干扰因素、地形因素等的影响,节点间通过无线信道形成的网络拓扑结构随时都会发生变化。 ⑶ 有限的无线传输带宽。无线信道本身的物理特性使Ad hoc网络的网络带宽相对有线方式要低的多,另外还要考虑无线信道竞争时所产生的信号衰落、碰撞、阻塞、噪声干扰等因素,这使得实际带宽要小的多。 ⑷ 移动终端的有限性。Ad hoc网络中的移动用户终端内存小、CPU处理能力低、所带电源有限使得Ad hoc网络得设计更加困难。 ⑸ 安全性差。Ad hoc网络是一种无线方式的分布式结构,所以更加容易被窃听、入侵、网络攻击和拒绝服务等。 ⑹ 网络的分布式。Ad hoc网络中的移动节点都兼有独立路由和主机功能,不存在类似于基站的网络中心控制点,节点地位平等,采用分布式控制方式,增强了网络健壮性。 ⑺ 网络的可扩展性不强。由于采用TCP/IP协议中的子网技术使得INTERNET具有网络的可扩展性,而Ad hoc网络动态变化的拓扑结构使得子网技术所带来的网络可扩展性不能得到应用。 ⑻ 单向无线信道的存在。 ⑼ 生存时间短。组网通常是由于某个特定原因而临时创建的,使用结束后,网络环境将会自动消失。Ad hoc网络的生存时间相对于固定网络而言是短暂的。 我们认为Ad hoc网络是移动计算机通信网络的一种类型,后者是指用户终端可以在网内随意移动的计算机网络。所以Ad hoc网络是移动通信和计算机网络的交叉。这一点在Ad hoc网络中的体现是:一方面,网络的信息采用了计算机网络中的分组交换机制,而不是电话交换网中的电路交换机制;另一方面,用户终端是便携式的,比如笔记本电脑、PDA、掌上型电脑、车载台等,并配置有相应的无线收发设备,并且用户可以随意移动或处于静止状态。 2.Ad hoc技术的OSI模型分层 这里,作者将参照OSI七层模型,从各个层面上来分析Ad hoc网络的技术特点,并就各个层次的构成来逐一介绍。 构筑网络时如果采用Ad hoc方式,所选用各层次的构建方式是可选的。物理层完成无线信号编码译码、发送和接收等工作;数据链路层控制对共享无线信道的访问以及对逻辑链路的控制,所以数据链路层又分为MAC(媒质接入控制)层和LLC(逻辑链路控制)层;网络层是Ad hoc技术的重点,也是它与其他现有网络的主要区别所在。IPV4协议、IPV6协议或其他网络层协议提供网络层数据服务;网络层的单目标路由协议维护路由表,使其与当前的Ad hoc网络拓扑结构一致;多目标路由协议提供群组通信的底层支持;网际互联支持Ad hoc网络中与其他现有网络互联,QoS支持提供可保证的QoS服务,路由安全提供对路由协议的安全保障。传输层主要完成端到端通信的建立,目前一般的思路是对有线网中的TCP/UDP进行改造,使之适应无线环境;Ad hoc的高层主要包括的是建立在Ad hoc之上的无线应用以及接入移动通信核心网的各种业务。 2.1 Ad hoc物理层 Ad hoc OSI模型中,介绍了Ad hoc网络物理层的一些构成标准。其实在实际的应用中,Ad hoc物理层的设计要根据实际的需要而定。 基于接收发信主要功能的物理层首先要考虑的是通信信号的传送媒质,一般而言,Ad hoc网络都是基于无线通信,后