ns-2与TCP拥塞模拟 之一 一个简单的示例说明基本要素
ns是NetworkSimulator的英文缩写,又称网络仿真器。它是一款开放源代码的网络模拟软件,最初由加州大学伯克利分校(UC Berkeley)开发。ns-2是指ns version 2。
ns-2支持Windows、Linux、Unix、Mac及其他支持POSIX标准的操作系统。它主要支持的操作系统是Linux系统,目前几乎支持所有主流的Linux发行版本。
ns-2本质上是一个离散事件模拟器。它本身有一个虚拟时钟,所有的仿真都由离散事件驱动。
目前NS2可以用于仿真各种不同的IP网,已经实现的仿真有网络传输协议,如TCP和UDP;业务源流量产生器,如FTP、TELNET、Web CBR和VBR;路由队列管理机制,如Droptail、RED和CBQ;路由算法,如AODV、DSDV、DSR等无线路由协议。ns-2也实现了多播以及一些MAC子层协议。
这个示例使用如图8.2所示的网络拓扑结构,包含了4个网络节点(n0,n1,n2,n3)。
各节点之间的带宽和延迟分别标注在图上,总体上来看,网络拓朴中的带宽瓶颈是在节点n2到节点n3之间,为1.7Mbps,延迟的时间为20ms。每个节点都采用DropTail的队列管理方式,且在节点n2到节点n3之间的最大队列长度为10个包。
在节点n0到n3之间定义一个FTP传输业务,该业务建立在TCP连接之上,因此在源端n0上使用TCP agent发送TCP包;目的端n3上定义一个TCPsinkagent来接收TCP包,产生ACK包并把接收的TCP包释放掉。
另外,在节点n1到n3之间定义一个固定传输速率的连接(Constant Bit Rate,CBR)。CBR应用建立在UDP传输之上,因此在n1上定义一个UDP agent来发送UDP包,由于收到的包只需要简单丢弃,因此在n3上使用Null agent接收并释放接收的包。CBR的传送速度为1Mbps,每一个包的大小为1KB。
CBR在0.1s开始传送,在4.5s结束传输;FTP在1.0s开始传送,在4.0s结束传输。
对应的Tcl脚本源码如下。代码中#为注释符。
#示例1:一个简单的ns-2仿真
#产生一个仿真的对象
set ns [new Simulator]
#针对不同的数据流定义不同的颜色,这是要给nam-1用的
$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 [$nsnode]
set n1 [$nsnode]
set n2 [$nsnode]
set n3 [$nsnode]
#定义节点的连接方式
$nsduplex-link $n0 $n2 2Mb 10ms DropTail
$nsduplex-link $n1 $n2 2Mb 10ms DropTail
$nsduplex-link $n2 $n3 1.7Mb 20ms DropTail
#设定ns2到n3之间的队列长度为10个包
$nsqueue-limit $n2 $n3 10
#设定节点的位置,这个是要供给nam-1显示用的
$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之间队列的变化,这是要给nam-1用的
$nsduplex-link-op $n2 $n3 queuePos 0.5
#建立一条TCP的连接
set tcp [newAgent/TCP]
#class_是一个在agent类中定义的整型变量。放在包头中的,用处是分类、着色
$tcp setclass_ 2
$nsattach-agent $n0 $tcp
set sink [newAgent/TCPSink]
$ns attach-agent $n3 $sink
$ns connect $tcp $sink
#在nam-1中,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-1中,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"
#在仿真环境中,5s后调用结束函数finish函数
#(说明:这是模拟环境中的5s,并不是真正的时间)
$ns at 5.0 "finish"
#执行仿真
$ns run
上述脚本可以通过输入命令“ns <tclscript>”来进行仿真,其中<tclscript>是Tcl脚本文件名。仿真结束后,除了控制台的输出外,模拟器还会产生一些记录文件。例如,上述示例脚本会生成两个文件:一个是供nam-1使用的out.nam文件,一个是记录了封包传送仿真过程中所有的事件的out.tr文件。
仿真结束后,如果正常调用nam-1的话,会动画显示仿真效果,如图所示。