原链接:http://blog.chinaunix.net/u3/105477/showart_2092728.html
#TCP快速重传和快速恢复过程的模拟演示
#场景:
# 四个节点: n0, n1,n2, n3
# n1 和 n2 之间设置带宽瓶颈;
# 主要监控模拟过程中丢失包发生后cwnd和ssthresh 以及重复确定的情况;
# 运行命令:ns tcpsim_fz.tcl
set ns [new Simulator]
set nf [open tcpnam.nam w]
$ns namtrace-all $nf
set ftr [open tcpsim_slidewin.tr w]
$ns trace-all $ftr
foreach i "0 1 2 3" {
set n$i [$ns node]
}
#创建节点间的连接, 在n1~n2间设置一个带宽较小的链路;
$ns duplex-link $n0 $n1 5Mb 20ms DropTail
$ns duplex-link $n1 $n2 0.5Mb 100ms DropTail
$ns duplex-link $n2 $n3 5Mb 20ms DropTail
$ns queue-limit $n1 $n2 5
$ns duplex-link-op $n0 $n1 orient right
$ns duplex-link-op $n1 $n2 orient right
$ns duplex-link-op $n2 $n3 orient right
#设置队列在Nam中的显示方向
$ns duplex-link-op $n1 $n2 queuePos 0.5
#TCP/Reno已经实现了快速重传和快速回复算法;
set tcp [new Agent/TCP/Reno]
$ns attach-agent $n0 $tcp
set sink [new Agent/TCPSink]
$ns attach-agent $n3 $sink
$ns connect $tcp $sink
#增加业务流量, 使用FTP
set ftp [new Application/FTP]
$ftp attach-agent $tcp
#用于统计和绘图
set f0 [open cwndrec.tr w]
proc Record {} {
global f0 tcp ns
set intval 0.1
set now [$ns now]
set cwnd [$tcp set cwnd_]
puts $f0 "$now $cwnd"
$ns at [expr $now+$intval] "Record"
}
proc finish {} {
global ns nf
$ns flush-trace
close $nf
exec nam tcpnam.nam &
exec xgraph cwndrec.tr -x "Simulation Time" -y "Win_Size" &
exit 0
}
# 设置监控变量, 用于Nam演示时实时显示这些参数的变化;
# 一下代码需要添加在TCP代理创建之后;
$tcp set nam_tracevar_ true ;# 打开Nam的跟踪变量
$ns add-agent-trace $tcp tcp ;# 新增对TCP代理的跟踪并设置跟踪标签为 “tcp”
$ns monitor-agent-trace $tcp ;# 监控跟踪对象
$tcp tracevar cwnd_ ;# 设置需要监控的变量名, cwnd值
$tcp tracevar ssthresh ;# 慢启动门限
$tcp tracevar masseq_ ;# 已发送的最大包序号
$tcp tracevar ack_ ;# 已接收的最大确定序号
$tcp tracevar dupacks_ ;# 重复ACK计数器
$ns at 0.0 "$n0 label TCP"
$ns at 0.0 "$n3 label TCP"
$ns at 0.0 "$ns trace-annotate /"TCP Reno: Fast Recovery/""
$ns at 0.0 "Record"
$ns at 0.1 "$ftp start"
$ns at 5.0 "$ftp stop"
$ns at 5.25 "finish"
$ns run