# 產生一個模擬的物件

set ns [new Simulator]

 

 

#針對不同的資料流定義不同的顏色,這是要給NAM用的

$ns color 1 Blue #這是給ns這ㄧ個物件所使用的兩個顏色嗎?

$ns color 2 Red

 

#這只是告訴ns這個物件定義兩種顏色,顏色1是藍色,顏色2是紅色

#當使用NAM觀察動態模擬過程時, flow id=1那條flow會呈現藍色

#flow id =2 那條flow會呈現紅色

 

#開啟一個NAM trace file

set nf [open out.nam w]

#w是指寫入到out.nam 這ㄧ個檔案當中

#所謂的nf或是ns 的物件都是專門為了某些事情而建的,所以名字都沒關析nf 也可叫別的名子

#關於這個問題,請先看完TCL簡介

 

$ns namtrace-all $nf

#這句話好像很多範例都這樣寫,但是我不是很懂,可以請您解釋一下嗎?

#當要使用NAM觀察動態模擬過程時,就要使用這個指令,若不想看,可以不寫

#這指令就是把相關的事件記錄到out.nam(因為nf是file descriptor)中

 

#開啟一個trace file,用來記錄封包傳送的過程

set nd [open out.tr w]

$ns trace-all $nd#這句也是一樣,謝謝您

#當需要使用trace file來做效能分析時,就需要這個指令,若不用分析時,也可以不寫

#這個指令會把相關的事件記錄到out.tr中 (內容可以參考Tool Introduction)

#請不要跟namtrace-all弄混,因為namtrace-all是用來記錄動態模擬過程所需要的事件

 

#定義一個結束的程序

proc finish {} {

        global ns nf nd

        $ns flush-trace

        close $nf

        close $nd

        #以背景執行的方式去執行NAM

        exec nam out.nam &

        exit 0

}

 

#請問上述的語法若是不要寫是不是也可以工作,只是因為NF ND這兩只是用來支援.out .nam

#這個finish只是當模擬結束後,需要把資料完全寫入到記錄

#這個procedure最重要的是exit 0,這是要離開模擬程式

 

#產生四個網路節點

set n0 [$ns node]

set n1 [$ns node]

set n2 [$ns node]

set n3 [$ns node]

 

#把節點連接起來

$ns duplex-link $n0 $n2 2Mb 10ms myfifo

$ns duplex-link $n1 $n2 2Mb 10ms myfifo

$ns duplex-link $n2 $n3 1.7Mb 20ms myfifo

 

#設定ns2到n3之間的Queue Size為10個封包大小

$ns queue-limit $n2 $n3 10

 

#因為n2 到 n3這是一個bottleneck 所以我們才要設定他中間的queue的大小,其他如果要設定也是可以的嗎?

#這是希望n2到n3是bottleneck,所以才會把queue-limit設為10個packet,

#若是沒有設定的話,會使用default值(可到ns-default.tcl)找到, default=50

 

#設定節點的位置,這是要給NAM用的

$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之間queue的變化,這是要給NAM用的

$ns duplex-link-op $n2 $n3 queuePos 0.5 #請問queuePos 0.5

 

#建立一條TCP的連線

set tcp [new Agent/TCP]

#想要問的是 set tcp 也是一個變數,建立一個新的Agent是以TCP的連,所以可以寫成set tcp或是其他的名字

#這個指令是建立一個TCP Tahoe的傳送端,建立完後把它指派給名稱為tcp這個descriptor,取其它名稱也可以

#以後若是要設定這一條TCP Tahoe連線的參數,就使用$tcp去做設定

 

$tcp set class_ 2 #這一行不是很懂,煩請指導一下

#這個我有點忘記了,要查一下,不過這行不寫,也OK啦

 

$ns attach-agent $n0 $tcp

set sink [new Agent/TCPSink] #設定sink是指接收的那一端的部份也是走TCP連線,也是一樣建立一個 new Agent

#剛剛我們建立了一個TCP Tahoe的傳送端,現在當然要設定一個接收端來接收由傳送端送過來的資料,並回應Ack

 

$ns attach-agent $n3 $sink #把n3和新的Agent連在一起,也就是讓n3這一個使用sink讓他能夠和接收

#這個意思就是說,node n3上會跑TCPSink接收端程式(agent)

 

$ns connect $tcp $sink #把tcp 和sink相連接

 

#在NAM中,TCP的連線會以藍色表示

$tcp set fid_ 1

#設定flow id為1

 

#我的問題,是不是tcp一定要用sink去接,建立一個udp的連線 一定要用null去接

#TCP接收端的種類有很多種,如TCPSink, TCPSink/DelAck, TCPSink/Sack1, or …,不同的Agent,行為就會有所不同

#UDP的agent也不一定要用Null,使用LossMonitor,或自己寫的都可以…

#關於有那些agent可以當TCP或接收端,請自己找ns的source code…我沒辦法全部告訴你

 

#在TCP連線之上建立FTP應用程式

set ftp [new Application/FTP]

$ftp attach-agent $tcp

$ftp set type_ FTP

 

#建立一條UDP的連線,我想要問的是請問一下要建立udp的連線的時候一定要對方一定要用null收嗎?

#因為在上面的建立tcp的連線的時候另外一邊要TCPSink收然後再用connect把兩個相連接,

 

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中,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  #因為是cbr所以radom關掉

 

#設定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"

 

#在模擬環境中,5秒後去呼叫finish來結束模擬(這樣要注意模擬環境中

#的5秒並不一定等於實際模擬的時間

$ns at 5.0 "finish"

 

#執行模擬

$ns run