BTL NS2

Bài trước tôi đã hướng dẫn cách cài đặt và các thành phần của phần mềm mô phỏng mạng NS2 (Network Simulator).

Hướng dẫn cài đặt Network Simulator 2 (NS2)

Dựa vào những kiến thức lý thuyết về định tuyến, hàng đợi, mạng hàng đợi… của môn Cơ sở mạng thông tin đã học trên lớp, kết hợp với việc đọc code và viết code chạy test ngay là cách nhanh nhất để xử lý bài tập lớn môn này.

Sau khi cài đặt thành công NS2, NAM (thành phần cơ bản nhất) thì chúng ta sẽ tiến hành viết code.

Để làm việc với NS2, mã nguồn của bạn phải được soạn thảo và lưu dưới dạng file có phần mở rộng là TCL (*.tcl).

Tiếp theo là mở Terminal (Giao diện dòng lệnh), chuyển thư mục đến nơi chứa file TCL của bạn.

VD tôi để file TCL ở ngoài Desktop (Nhớ là tôi đang ở trong môi trường Linux nhé)

thanh@ubuntu:~$
thanh@ubuntu:~$ cd ~/Desktop/
thanh@ubuntu:~/Desktop$ ns file_code.tcl
thanh@ubuntu:~/Desktop$

Ví dụ nội dung của 1 file TCL, bao gồm đầy đủ việc khai báo link, node, truyền phát gói, đo đếm băng thông….

#===================================
#Creat a new simulator object
#===================================
set ns [new Simulator]
#Set protocol (Auto-routting)
$ns rtproto DV

#===================================
#Define different colors for data flows
#===================================
$ns color 1 Blue
$ns color 2 Red
$ns color 3 SeaGreen

#===================================
#Set packet size
#===================================
set pksize 800.0

set lambdas1 200.0
set lambdas2 400.0
set lambdas3 100.0


#===================================
#Set Queue Size
#Default = 50
#===================================
set queuesize 6

#===================================
#Open the trace file
#===================================
set TraceAll [open out.tr w]
$ns trace-all $TraceAll

set f0 [open Flow_S1-D1.tr w]
set f1 [open Flow_S2-D2.tr w]
set f2 [open Flow_S3-D3.tr w]
set f3 [open Flow_L1+L3.tr w]

#===================================
#Open the Nam trace file
#===================================
set namFile [open out.nam w]
$ns namtrace-all $namFile

#===================================
#Creat nodes and properties
#===================================
#Creat Source 1
set s1 [$ns node]
$s1 color Red
$s1 shape box
$s1 label "S1"
#Creat Source 2
set s2 [$ns node]
$s2 color Red
$s2 shape box
$s2 label "S2"
#Creat Source 3
set s3 [$ns node]
$s3 color Red
$s3 shape box
$s3 label "S3"
#Creat Destination 1
set d1 [$ns node]
$d1 color Black
$d1 shape box
$d1 label "D1"
#Creat Destination 2
set d2 [$ns node]
$d2 color Black
$d2 shape box
$d2 label "D2"
#Creat Destination 3
set d3 [$ns node]
$d3 color Black
$d3 shape box
$d3 label "D3"
#Creat Router
set n1 [$ns node]
$n1 color Blue
$n1 label "Router01"
set n2 [$ns node]
$n2 color Blue
$n2 label "Router02"
set n3 [$ns node]
$n3 color Blue
$n3 label "Router03"
set n4 [$ns node]
$n4 color Blue
$n4 label "Router04"
set n5 [$ns node]
$n5 color Blue
$n5 label "Router05"

#===================================
#Creat links between the nodes
#===================================
#Deficit Round-Robin Queue
$ns duplex-link $n1 $n2 3Mb 100ms DRR
$ns duplex-link $n2 $n4 3Mb 100ms DRR
$ns duplex-link $n1 $n3 3Mb 100ms DRR
$ns duplex-link $n3 $n5 3Mb 100ms DRR
$ns duplex-link $n4 $n5 3Mb 100ms DRR

#Connect from Source to Network
$ns duplex-link $s1 $n1 10Mb 100ms DropTail
$ns duplex-link $s2 $n3 10Mb 100ms DropTail
$ns duplex-link $s3 $n3 10Mb 100ms DropTail

#Connect from Network to Destination
$ns duplex-link $n2 $d3 10Mb 100ms DropTail
$ns duplex-link $n4 $d1 10Mb 100ms DropTail
$ns duplex-link $n4 $d2 10Mb 100ms DropTail

#===================================
#Set queue for nodes
#===================================
$ns queue-limit $n1 $n2 $queuesize
$ns queue-limit $n2 $n4 $queuesize
$ns queue-limit $n1 $n3 $queuesize
$ns queue-limit $n3 $n5 $queuesize
$ns queue-limit $n5 $n4 $queuesize

#===================================
#Monitor the queue for link
#===================================
$ns duplex-link-op $n1 $n2 queuePos 0.5
$ns duplex-link-op $n1 $n3 queuePos 0.5
$ns duplex-link-op $n2 $n4 queuePos 0.5
$ns duplex-link-op $n3 $n5 queuePos 0.5
$ns duplex-link-op $n4 $n5 queuePos 0.5

$ns duplex-link-op $n1 $n2 label " 3Mbps"
$ns duplex-link-op $n1 $n3 label " 3Mbps"
$ns duplex-link-op $n2 $n4 label " 3Mbps"
$ns duplex-link-op $n3 $n5 label " 3Mbps"
$ns duplex-link-op $n4 $n5 label " 3Mbps"

#===================================
#Setup Position for Topo
#Chu y: De co dinh vi tri cho moi node
#can phai viet cap node giong nhu thu tu
#da tao link giua cac node
#===================================
$ns duplex-link-op $n1 $n2 orient right
$ns duplex-link-op $n2 $n4 orient down
$ns duplex-link-op $n1 $n3 orient left-down
$ns duplex-link-op $n3 $n5 orient right
$ns duplex-link-op $n4 $n5 orient left

$ns duplex-link-op $s1 $n1 orient right-down
$ns duplex-link-op $s2 $n3 orient right-down
$ns duplex-link-op $s3 $n3 orient right

$ns duplex-link-op $n2 $d3 orient right-up
$ns duplex-link-op $n4 $d1 orient right
$ns duplex-link-op $n4 $d2 orient right-up

#===================================
#Creat protocol, traffic
#===================================
set udp0 [new Agent/UDP]
$udp0 set class_ 1
$ns attach-agent $s1 $udp0
set udp1 [new Agent/UDP]
$udp1 set class_ 2
$ns attach-agent $s2 $udp1
set udp2 [new Agent/UDP]
$udp2 set class_ 3
$ns attach-agent $s3 $udp2

#Enable monitor loss packet
set sink0 [new Agent/LossMonitor]
$ns attach-agent $d1 $sink0
set sink1 [new Agent/LossMonitor]
$ns attach-agent $d2 $sink1
set sink2 [new Agent/LossMonitor]
$ns attach-agent $d3 $sink2

#Connect the traffic sources
$ns connect $udp0 $sink0
$ns connect $udp1 $sink1
$ns connect $udp2 $sink2

#===================================
#Phan bo mu - Exponential Function
#===================================
set InterArrivalTime0 [new RandomVariable/Exponential]
$InterArrivalTime0 set avg_ [expr 1/$lambdas1]
set InterArrivalTime1 [new RandomVariable/Exponential]
$InterArrivalTime1 set avg_ [expr 1/$lambdas2]
set InterArrivalTime2 [new RandomVariable/Exponential]
$InterArrivalTime2 set avg_ [expr 1/$lambdas3]

#===================================
#Send packet
#===================================
proc sendpacket0 {} {
    global ns udp0 InterArrivalTime0 pksize
    #Get the current time
    set time [$ns now]
    #Schedule for next send packet time
    $ns at [expr $time + [$InterArrivalTime0 value]] "sendpacket0"
    $udp0 send $pksize
}

proc sendpacket1 {} {
    global ns udp1 InterArrivalTime1 pksize
    set time [$ns now]
    $ns at [expr $time + [$InterArrivalTime1 value]] "sendpacket1"
    $udp1 send $pksize
}

proc sendpacket2 {} {
    global ns udp2 InterArrivalTime2 pksize
    set time [$ns now]
    $ns at [expr $time + [$InterArrivalTime2 value]] "sendpacket2"
    $udp2 send $pksize
}

#===================================
#2. Do bang thong cac luon (Si,Di) su dung
#===================================
proc record_bandwidth {} {
    global sink0 sink1 sink2 f0 f1 f2 f3
    #Get an instance of the simulator
    set ns [Simulator instance]
    #Set the time get sample
    set time 0.1
    #How many bytes have been tranfer by the traffic sink
    set bw0 [$sink0 set bytes_]
    set bw1 [$sink1 set bytes_]
    set bw2 [$sink2 set bytes_]
    #Get the current time
    set now [$ns now]
    #Calculate the bandwidth in Kbit/s (Si, Di)
    #S1-D1
    puts $f0 "$now [expr $bw0/$time*8/1000]"
    #S2-D2
    puts $f1 "$now [expr $bw1/$time*8/1000]"
    #S3-D3
    puts $f2 "$now [expr $bw2/$time*8/1000]"
    #Traffic over L1 + L3
    puts $f3 "$now [expr ($bw0+$bw1+$bw2)/$time*8/1000]"

    #Reset the bytes_ value
    $sink0 set bytes_ 0
    $sink1 set bytes_ 0
    $sink2 set bytes_ 0

    #Re-Schedule the procedure
    $ns at [expr $now + $time] "record_bandwidth"
}

#===================================
#Define Finish Procs
#===================================
proc finish {} {
    global ns namFile f0 f1 f2 f3 TraceAll
    $ns flush-trace
    #Close trace file
    close $namFile
    close $f0
    close $f1
    close $f2
    close $f3
    close $TraceAll
    #Execute nam on the trace file
    exec nam -a out.nam &
    exec awk -f lost_pkt.awk out.tr > Lost_p.tr
    exec xgraph Flow_S1-D1.tr Flow_S2-D2.tr Flow_S3-D3.tr Flow_L1+L3.tr -geometry 800x400 -t "BandWidth for each flow" -x "Time(s)" -y "Speed(Kbit/s)" &
    exec xgraph Lost_p.tr -geometry 800x400 -t "Packets Lost" -x "Time(s)" -y "Packets" &
    exit 0
}

#===================================
#Schedule Control Simulator
#===================================
$ns at 0.0 "record_bandwidth"
$ns at 0.1 "sendpacket0"
$ns at 0.1 "sendpacket1"
$ns at 0.1 "sendpacket2"
$ns rtmodel-at 2.0 down $n3 $n5
$ns rtmodel-at 4.0 up $n3 $n5
$ns at 5.0 "finish"

#===================================
#Run
#===================================
$ns run

Bạn có thể tham khảo nội dung của file TCL trong file tổng hợp bạn sẽ tải về bên dưới. Hầu hết code đều được comment nên bạn có thể hiểu được mỗi phần chúng có nhiệm vụ gì, và từ đó có thể chỉnh sửa cho phù hợp với bài tập của bạn.

Trong file tổng hợp này bao gồm tài liệu tham khảo, code bài tập lớn của một số nhóm trước đã làm.

Download BTL NS2

Chú ý những lỗi mà các bạn có thể gặp phải: