参照博客
问题1 报错"extra characters after close-brace"
如图所示
开始是命令不对,然后输入ns labll.tcl Tahoe
,仍然报相同的错误,尝试在{$argc !=1}
后面添加空格。错误消失,再次执行命令,出现新错误。
问题2 报错"can’t read “ns_o3”: no such variable"
解决方法在第11行set ns[new Simulator]
在ns后添加空格
问题3 报错"wrong # args: should be “proc name args body”
解决上面的错误方式是将finish{}
改成finish {}
即花括号前后加空格,record函数也是花括号前后加空格。
问题4 “can’t read “link_(1:2)”: no such variable”
首先在50-52行首添加$
,即
$ns duplex-link $n0 $r0 10Mb 1ms DropTail
$ns duplex-link $n0 $r1 1Mb 4ms DropTail
$ns duplex-link $r1 $n1 10Mb 1ms DropTail
然后继续报相同的错误,百度后发现错误原因是r0与r1之间没有建立链路,需检查r0和r1间是否有链路。
然后将51修改为r0与r1成链路关系,即
$ns duplex-link $r0 $r1 1Mb 4ms DropTail
问题5 报错"extra characters after close-brace"
同问题1,在第59行和61行花括号前后添加空格。
问题6 invalid command name “Agent/TCCP”
将60行的TCCP
改成TCP
问题7 ns: finish: invalid command name “putsaverage throughput:946 Kbps”
问题8 “ns: finish: invalid command name “putsaverage throughput:946 Kbps””
在第24行puts后加空格即
puts [format "average throughput:%1.f Kbps"\
扫描二维码关注公众号,回复:
8940089 查看本文章
问题9 “ns: finish: can’t read “f0”: no such variable”
将22行的fo
改成f0
运行结果
最近历经万难,终于运行出来了
执行ns lab11.tcl Tahoe
执行ns lab11.tcl Reno
lab11.tcl源代码(未修改的)
if {$argc != 1}{
puts"Usage: ns lab11.tcl TCPversion"
puts"Example:ns lab11.tcl Tahoe or ns lab11.tcl Reno"
exit
}
set par1 [lindex $argv 0]
#产生一个仿真的对象
set ns[new Simulator]
#打开一个trace file, 用来记录封包传送的过程
set nd [open out-$par1.tr w]
$ns trace-all $nd
#打开一个文件用来记录cwnd 变化情况
set f0 [open cwnd-$par1.tr w]
#定义一个结束的程序
proc finish{}{
global ns nd fo tcp
#显示最后的平均吞吐量
puts[format "average throughput:%1.f Kbps"\
[expr [$tcp set ack_]* ([$tcp set packetSize_]) *8/1000.0/10]]
$ns flush-trace
#关闭文件
close $nd
close $f0
exit 0
}
#定义一个记录的程序
#每格0.01s就去记录当时的cwnd
proc record{}{
global ns tcp f0
set now [$ns now]
puts $f0 "$now [$tcp set cwnd_]"
$ns at [expr $now+0.01] "record"
}
#产生传送结点,路由器r1,r2和接收结点
set n0 [$ns node]
set r0 [$ns node]
set r1 [$ns node]
set n1 [$ns node]
#建立链路
ns duplex-link $n0 $r0 10Mb 1ms DropTail
ns duplex-link $n0 $r1 1Mb 4ms DropTail
ns duplex-link $r1 $n1 10Mb 1ms DropTail
#设置队列长度为18个封包大小
set queue 18
$ns queue-limit $r0 $r1 $queue
#根据用户的设置,指定TCP版本
if{$par1 == "Tahoe"}{
set tcp [new Agent/TCCP]
}else{
set tcp [new Agent/TCP/Reno]
}
$ns attach-agent $n0 $tcp
set tcpsink [new Agent/TCPSink]
$ns attach-agent $n1 $tcpsink
$ns connect $tcp $tcpsink
#建立FTP应用程序
set ftp [new Application/FTP]
$ftp attach-agent $tcp
#在0.0s时,开始传送
$ns at 0.0 "$ftp start"
#在10.0s时,结束传送
$ns at 10.0 "$ftp stop"
#在0.0s时调用record来记录TCP的cwnd变化情况
$ns at 0.0 "record"
#在第10.0s时调用finish来结束模拟
$ns at 10.0 "finish"
#执行模拟
$ns run
lab11.tcl源代码(修改后的)
if {$argc != 1} {
puts "Usage: ns lab11.tcl TCPversion"
puts "Example:ns lab11.tcl Tahoe or ns lab11.tcl Reno"
exit
}
set par1 [lindex $argv 0]
#产生一个仿真的对象
set ns [new Simulator]
#打开一个trace file, 用来记录封包传送的过程
set nd [open out-$par1.tr w]
$ns trace-all $nd
#打开一个文件用来记录cwnd 变化情况
set f0 [open cwnd-$par1.tr w]
#定义一个结束的程序
proc finish {} {
global ns nd f0 tcp
#显示最后的平均吞吐量
puts [format "average throughput:%1.f Kbps"\
[expr [$tcp set ack_]* ([$tcp set packetSize_]) *8/1000.0/10]]
$ns flush-trace
#关闭文件
close $nd
close $f0
exit 0
}
#定义一个记录的程序
#每格0.01s就去记录当时的cwnd
proc record {} {
global ns tcp f0
set now [$ns now]
puts $f0 "$now [$tcp set cwnd_]"
$ns at [expr $now+0.01] "record"
}
#产生传送结点,路由器r1,r2和接收结点
set n0 [$ns node]
set r0 [$ns node]
set r1 [$ns node]
set n1 [$ns node]
#建立链路
$ns duplex-link $n0 $r0 10Mb 1ms DropTail
$ns duplex-link $r0 $r1 1Mb 4ms DropTail
$ns duplex-link $r1 $n1 10Mb 1ms DropTail
#设置队列长度为18个封包大小
set queue 18
$ns queue-limit $r0 $r1 $queue
#根据用户的设置,指定TCP版本
if {$par1 == "Tahoe"} {
set tcp [new Agent/TCP]
} else {
set tcp [new Agent/TCP/Reno]
}
$ns attach-agent $n0 $tcp
set tcpsink [new Agent/TCPSink]
$ns attach-agent $n1 $tcpsink
$ns connect $tcp $tcpsink
#建立FTP应用程序
set ftp [new Application/FTP]
$ftp attach-agent $tcp
#在0.0s时,开始传送
$ns at 0.0 "$ftp start"
#在10.0s时,结束传送
$ns at 10.0 "$ftp stop"
#在0.0s时调用record来记录TCP的cwnd变化情况
$ns at 0.0 "record"
#在第10.0s时调用finish来结束模拟
$ns at 10.0 "finish"