从入门示例看ns2脚本的基本结构

在ns2的文档中给出了如下的示例,从中可以发现ns2的一些基本概念:
# 第1步:创建一个仿真管理器Simulator
set ns [new Simulator] ;
# 第二步,创建要记录仿真结果的文件
set f [open out.tr w]
$ns trace-all $f
set nf [open out.nam w]
$ns namtrace-all $nf
# so, we lied. now, we define the topology #     
     n0   
           \      
    5Mb \    
    2ms \   
               \
              n2 ------------n3       
#               /        1.5Mb
#     5M    /         10ms
# 2ms /
#      n1   
#
#第三步,创建网络中的所有节点                  
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
#第四步,建立节点之间的物理连接,并定义在此物理链接上对数据包的处理方式,因为物理层的介质是有速度上限的,因此在这里定义了当上层协议要求发送的数据包超过此上限时就对此数据包进行丢弃。
$ns duplex-link $n0 $n2 5Mb 2ms DropTail
$ns duplex-link $n1 $n2 5Mb 2ms DropTail
$ns duplex-link $n2 $n3 1.5Mb 10ms DropTail
# 第五步,创建节点0和节点3的网络层协议,并将两个网络层协议相连。在节点0上创建一个发送数据包的应用协议,它将使用节点0的网络层协议发送数据。
# 5.1,创建节点0的网络层协议,在此使用UDP协议
set udp0 [new Agent/UDP] ;
$ns attach-agent $n0 $udp0 ;
# 5.2,在节点0上创建一个应用层协议,在此没有具体的应用,只在要求不断地发送一个UDP数据包,至于数据包的内容则无关紧要。这种方式可以用于测试网络层的协议。
set cbr0 [new Application/Traffic/CBR] ;
$cbr0 attach-agent $udp0 ;
$udp0 set class_ 0 ;# actually, the default, but. . .
# 5.3,在节点3上创建一个网络层协议,这个协议只是简单地将收到的数据包丢弃
set null0 [new Agent/Null] ;# Its sink
$ns attach-agent $n3 $null0
# 5.4,将节点0和节点3的网络层相连
$ns connect $udp0 $null0
# 5.5,设置应用层协议开始的时刻及其参数
$ns at 1.0 "$cbr0 start"
puts [$cbr0 set packetSize_]
puts [$cbr0 set interval_]
# 第六步,创建节点1和节点3的网络层协议,并将两个网络层协议相连。在节点1上创建一个FTP应用协议,它将使用节点1的网络层协议发送数据。
# 6.1 创建节点1的网络层协议,此处由于要建立FTP应用,故选用TCP
# A FTP over TCP/Tahoe from $n1 to $n3, flowid 2
set tcp [new Agent/TCP]
$tcp set class_ 1
$ns attach-agent $n1 $tcp
# 6.2 创建节点3的网络层协议,此处仅仅是将接收到的数据包用TCP协议进行响应,但是不向应用层报告此数据,即节点3没有应用层协议。
set sink [new Agent/TCPSink]
$ns attach-agent $n3 $sink
# 6.3 在节点1上创建一个FTP应用并设置为使用在节点1上创建的TCP网络层协议发送数据。
set ftp [new Application/FTP] ;
$ftp attach-agent $tcp
#6.4 设置FTP开始的时刻
$ns at 1.2 "$ftp start"
#6.5 将节点1和节点3的网络层相连
$ns connect $tcp $sink
#第七步,设置协议终止的时刻
$ns at 1.35 "$ns detach-agent $n1 $tcp ; $ns detach-agent $n3 $sink"
#第八步,终止整个仿真过程
$ns at 3.0 "finish"
proc finish {} {
global ns f nf
$ns flush-trace
close $f
close $nf
puts "running nam..."
exec nam out.nam &
exit 0
}
在整个程序中,实际数据包的流程如下图所示:
数据包流向图
FTP的数据包流向用实线表示,TCP协议返回的ACK数据包用虚线表示。 
原文地址:https://www.cnblogs.com/zhangleiccst/p/2042083.html