NS2常用命令总结
set ns [new Simulator] ;#新建一个Simulator对象ns
set n0 [$ns node] ;#创建一个单播节点n0
set ns [new Simulator -Multicast on] ;#将ns内部的-Multicast属性设置为on
set n1 [$ns node] ;#创建一个多播节点n1
注:一旦-Multicast的属性值设置为on,在此之后调用$ns node过程建立的节点都将是多播节点,如果要再创建单播节点,必须先将-Multicast的值重新设置为off。
*******************************************************************************
$ns simplex-link
;#建立一条node1到node2的单向链路
;#
;#
;#
1) XCP: 显示拥塞控制协议(eXplicit Congestion control Protocol)
2) REM: 随机指数标记(random exponential marking)
3) Vq: 虚拟队列(Virtual queueing)
4) PI: 成比例积分(proportional integral)
5) dsRED: DiffServ中使用的多RED队列
6) JoBS: 基于类的队列(Class-Based Queueing)
7) SRR: 简单轮询(Simple Round Robin)
8) DRR: 差额轮询(Deficit Round Robin)
9) FQ: 公平队列(Fair Queueing)
10) SFQ: 随机公平队列(Stochastic Fair Queueing)
11) RED: 随机早期检测(Random Early Detection)
12) SimpleIntServ: 简单综合服务(simple integrated service)
13) DropTail: 丢弃队尾先进先出队列
$ns duplex-link
;#建立一条node1到node2的双向链路
注:一条双向链路其实是由两条方向不同的单向链路构成。
$ns simplex-link-op
$ns duplex -link-op
;#设置链路的属性,包括方向、颜色、标签、队列位置,设置这些属性主要用于Nam的动画显示。
$ns queue-limit $n0 $n1 10
;#设置节点n0到节点n1之间的链路的最大队列长度是10个分组的长度。
*******************************************************************************
set udp0 [new Agent/UDP] ;#创建一个UDP Agent对象udp0
$ns attach-agent $n0 $udp0 ;#将udp0绑定在节点n0上,作为分组的发送器
$udp0 set packetSize_536 ;#设置UDP数据分组大小为536字节
set null0 [new Agent/Null] ;#创建一个空代理对象null0
$ns attach-agent $n1 $null0 ;#将null0绑定在节点n1上,作为分组的接收器
$ns connect $udp0 $null0 ;#在两个Agent对象之间建立连接
注:Agent/Null是空代理类,空代理将接收到的分组不做任何处理直接丢弃,因此空代理作为UDP代理的接收器是合适的,因为UDP协议是一种无连接的不可靠的协议,它并不要求接收端对分组做出任何响应。
*******************************************************************************
set tcp0 [new Agent/TCP] ;#创建一个TCP Agent对象tcp0
$ns attach-agent $n0 $tcp0 ;#将tcp0绑定在节点n0上,作为分组的发送器
$tcp0 set fid_1 ;#设置IP层数据流fid
$tcp0 set window_20 ;#设置TCP滑动窗口的大小为20
set sink0 [new Agent/TCPSink] ;#创建分组的接收代理对象sink0
$ns attach-agent $n1 $sink0 ;#将接收器sink0绑定在节点n1上,作为分组的接收器
$ns connect $tcp0 $sink0 ;#在两个Agent对象之间建立连接
注:传输层的代理Agent的主要功能是在源节点和目的节点之间创建了一条端到端的连接即逻辑上的连接,但并不产生业务流,在NS-2中业务流是由应用层程序Application产生的。
在NS-2中,应用层程序构建在传输层之上,它分为两大类:
1) 流量产生器(traffic generator):一般用在UDP代理之上;
2) 应用模拟器(simulated application):一般用在TCP代理之上。
*******************************************************************************
set e [new Application/Traffic/Exponential]
;#创建一个指数分布流量产生器,该流量产生器按照指数On/Off分布产生数据,在On阶段,分组以固定的速率发送;在Off阶段,分组停止发送。On和Off两种状态的时间都符合指数分布。
set e [new Application/Traffic/Pareto]
;#创建一个Pareto分布流量产生器,该产生器的On和Off两种状态的时间符合Pareto分布,其它时间按指数On/Off分布。
set e [new Application/Traffic/CBR]
;#创建一个固定比特率流量产生器,该产生器按照一个固定的速率产生业务流,分组的长度为一个常数值,可以选择需要时对分组发送的时间间隔产生随机抖动。
set tfile [new Tracefile] ;# 创建一个Trace文件对象
$tfile filename ex-trace ;#将Trace文件命名为ex-trace
set e [new Application/Traffic/Trace] ;#创建一个Trace文件流量产生器,该产生器按照一个Trace文件产生数据。Trace文件中的每条记录包含两个字段,第一个字段为两个相邻分组产生的时间间隔,第二个字段为下一个分组的大小,单位为字节。
$e attach-tracefile $tfile ;#将流量产生器e与Trace文件绑定
注:还可以对流量产生器设置属性,如:
packetSize_250 ;#数据分组的大小为250字节
burst_time_300ms ;#处于On状态的平均时间为300ms
idle_time_300ms ;#处于Off状态的平均时间为300ms
rate_50kb ;#在On状态时数据的发送速率50kb/s
random_true ;#是否在CBR流量产生器的分组的发送时间上加入随机噪声的标志位
流量产生器对象创建以后,必须和传输层的源代理绑定。假设UDP的源代理udp0和流量产生器e已经创建,有两种方法实现绑定:
1) $e attach-agent $udp0
2) $udp0 attach-app $e
$ns at 0.0 “$e start” ;#在0.0秒启动流量产生器
$ns at 5.0 “$e stop” ;#在5.0秒停止流量产生器
*******************************************************************************
set ftp1 [new Application/FTP] ;#创建一个FTP应用模拟器对象
$ftp1 attach-agent $tcp0 ;#将ftp1和传输层TCP的源代理tcp0绑定
$ns at 5.0 “ftp1 start” ;#在5.0秒的时候启动Application/FTP,发送数据
在NS-2中,有两种主要不同的数据监视器对象:
1) Trace:该对象可以记录整个模拟过程的事件,将所有模拟细节都记录下来,也可以根据需要记录模拟过程中的某些细节,并存储于Trace文件中;
2) Monitor:用来记录各种有用的数值,比如到达、离开链路或队列的数据分组数、字节数等。
*******************************************************************************
set tracefile [open out.tr w] ;#以写方式打开一个名为out.tr的文件(如果该文件不存在则创建该文件),并将该文件的句柄赋给变量tracefile
$ns trace-all $tracefile ;#调用Simulator类的trace-all方法将整个模拟过程的数据写入out.tr文件中
$ns trace-queue $n0 $n1 $tracefile ;#调用Simulator类的trace- queue方法将节点n0和n1之间的链路事件数据写入out.tr文件中
Trace文件格式:
1) Event:发生时间的类型:
a) + 分组进入链路队列(enqueue)
b) - 分组离开链路队列(dequeue)
c) r 目的节点接收分组(receive)
d) 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) Scr addr:发送节点的地址(节点号.端口号,即id.port)
10) Dst addr:接收节点的地址(节点号.端口号,即id.port)
11) Seq num:分组的序列号
12) Pkt id:分组的唯一标识符
*******************************************************************************
Monitor有两种:
1) 队列监测(Queue Monitoring)
2) 流监测(Per-Flow Monitoring)
$ns monitor-queue
;#创建一个队列监视器,跟踪在节点n1和n2之间的链路上队列的平均长度,并将相关数据写入名为qtrace的Trace文件中,可选项< sampleinterval>为两次记录之间的时间间隔,默认值为0.1秒。
set monfile [open mon.tr w] ;#监测文件
set fmon [$ns makeflowmon Fid] ;#采用流标记创建一个数据流的监视对象
$ns attach-fmon $flink $fmon ;#将监测对象$fmon与需要监测的链路$flink关联
$fmon attach $monfile ;#将监测记录文件$monfile与监测器对象$fmon关联
注:每个流监视都包含了一个数据分组和字节的到达、离开和丢弃的整体统计,这样就无需再创建一个队列监视来记录整体的统计数据。
*******************************************************************************
使用gawk分析Trace文件:
1) gawk从输入文件读取的基本单位是“记录(record)”,一般而言,一条记录相当于数据文件中的一行数据。
2) gawk读入一条记录后,会将该记录的每个字段(以空格符分隔)的值自动存入变量:
a) 变量$0:当前gawk读入的一条记录
b) 变量$1:$0上第一个字段的值
c) 变量$2:$0上第二个字段的值
d) ……
$gawk ‘program’ inputfile1
#如果gawk程序很短,则可以直接在命令行上执行gawk程序
$gawk -f programfile inputfile1
#如果程序较长,将gawk程序存为文件programfile,然后执行上述命令
$gawk -f programfile inputfile1>xfile
#如果要把gawk的结果存到一个文件xfile,可采用重定向的方式
*******************************************************************************
$xgraph filename <-options>
#xgraph的运作是把数据文件filename的第一列当作x轴的数据,第二列当作是y轴的数据,然后把图给画出来。xgraph可以将多个数据文件画在一张图上,有利于数据的比较。-options可以设定相关参数,例如绘图的颜色、输出图形文件的格式、图形的标题等。
*******************************************************************************
gnuplot也可以从数据文件中读入数据并绘制图形,其要求的数据文件格式与xgraph相似,就是两列或多列数据。数据文件中#符号开头的行将作为注释,不会被gunplot分析,数据文件中的第一列当作x轴的数据,第二列当作是y轴的数据。
$gnuplot
#进入交互方式
gnuplot>plot “filename”
#绘制filename的图
gnuplot> plot “cbr_delay” with linespoints
#把cbr_delay中的数据用lines和points连起来。
gnuplot> set terminal gif
#把输出设成存成gif格式,内定为X11 terminal
gnuplot> set output “cbr_delay.gif”
#把输出的档名设为cbr_delay.gif
gnuplot> replot
#把数据重新绘一次