Thực chất mô hình wireless bao gồm MobileNode trong lõi (core) cùng với các đặc tính hỗ trợ thêm vào cho phép các trình mô phỏng của mạng multi-hop với thủ tục Ad-Hoc, mạng LAN wireless… Đối tượng MobileNode là một đối tượng tách biệt. Lớp MobileNode trong C++ xuất phát từ lớp cha là lớp Node. Vì vậy, một MobileNode là một đối tượng Node cơ sở cộng thêm các chức năng của wireless, có khả năng di chuyển bên trong một topo và nhận hoặc truyền tín hiệu thông qua một kênh wireless.
Tạo MobileNode trong NS:
MobileNode là đối tượng nsNode cơ sở cùng với các chức năng như sự di chuyển, khả năng truyền và nhận trên một kênh cho phép tạo các môi trường mobile và môi trường wireless. Các tính năng mobile gồm có di chuyển node, cập nhập vị trí định kỳ, duy trì đường biên của topo,… được thực thi trong C++ trong quá trình dò tìm các thành phần của mạng bên trong của MobileNode (như các phân lớp, dmux, LL, Mac, Channel,…) được thực thi trong Otcl. Mã cấu hình MobileNode được viết như sau:
-llType $val(ll) \ -macType $val(mac) \ -ifqType $val(ifq) \ -ifqLen $val(ifqlen) \ -antType $val(ant) \ -propType $val(prop) \ -phyType $val(netif) \ -channelType $val(chan) \ -topoInstance $topo \ -agentTrace ON \ -routerTrace ON \ -macTrace ON \ -movementTrace ON\
Tạo sự hoạt động cho Node:
MobileNode được hoạt động trên dạng flat (phẳng) với tọa độ X, Y, Z (Z=0). Có hai phương thức đưa ra sự di chuyển trong các MobileNode
Phương thức 1: vị trí bắt đầu của node và các đích sau này của nó có thể được thiết lập một cách rõ ràng, có thể được thiết lập bằng cách sử dụng API sau:
$node set X_ <x1> $node set Y_ <y1> $node set Z_ <z1>
Tại $time sec, node sẽ bắt đầu hoạt động (moving) từ vị trí bắt đầu của nó là (x1,y1) chuyển tiếp sang đích (x2,y2) với tốc độ (speed) xác định. Trong phương thức này, node-movement-updates được khởi tạo (triggered) bất cứ vị trí nào của node tại thời gian được yêu cầu.
Phương thức 2: tận dụng quá trình họat động ngẫu nhiên của node. Mã API thường được sử dụng là $mobilenode start để khởi động mobilenode với một vị trí ngẫu nhiên và thường cập nhật để thay đổi hướng và tốc độ của node. Giá trị đích và tốc độ được tạo ra một cách ngẫu nhiên.
Dạng topo không cấu trúc (flat) thông thường được tạo ra dựa vào đặc tả chiều dài và chiều rộng của topo cơ sở. Mã API được viết như sau:
set topo [new Topography]
$topo load_flatgrid $opt(x) $opt(y)
Trong đó opt(x) opt(y) là giới hạn được sử dụng trong trình mô phỏng. 2. Các bước viết mã tcl để thực thi mô phỏng mạng wireless:
Bước 1: Thiết lập mô phỏng và xác định các hằng số.
Bước đầu tiên của mô phỏng là định nghĩa các tham số môi trường vật lý không dây và khởi tạo mô phỏng
# Định nghĩa lớp vật lý
set val(chan) Channel/WirelessChannel set val(prop) Propagation/TwoRayGround set val(netif) Phy/WirelessPhy
set val(mac) Mac/802_11
set val(ifq) Queue/DropTail/PriQueue set val(ll) LL
# Các tham số kịch bản
set val(x) 2000;# X dimension of the
topography
set val(y) 2000;# Y dimension of the topography
set val(ifqlen) 100;# max packet in queue set val(seed) 0.0;# random seed
set val(adhocRouting)[routing protocol]
set val(nn) [no. of nodes];# number of nodes set val(cp) [traffic pattern file]
set val(sc) [mobility scenario file]
set val(stop) [simulation duration];# simulation time
Bước 2: Tạo các đối tượng mô phỏng.
# Tạo một thể hiện mô phỏng
set ns_ [new Simulator]
# Tạo đối tượng kiến trúc mạng set topo [new Topography]
# Tạo các file lưu vết
set tracefd [open output trace file name w]
$ns_ use-newtrace
set namtrace [open nam trace file name w] $ns_ trace-all $tracefd
# Định nghĩa kiến trúc mạng
$topo load_flatgrid $val(x) $val(y) # Tạo đối tượng GOD
set god_ [create-god $val(nn)] Bước 3: Cấu hình nút.
$ns_ node-config -adhocRouting $val(adhocRouting) \ -llType $val(ll) \ -macType $val(mac) \ -ifqType $val(ifq) \ -ifqLen $val(ifqlen) \ -antType $val(ant) \ -propType $val(prop) \ -phyType $val(netif) \ -channelType $val(chan) \ -topoInstance $topo \ -agentTrace ON \ -routerTrace ON \ -macTrace ON
Mặc định, một nút được xác định là nút unicast. Nếu có một giao thức multicast được yêu cầu, thì phải khai báo cụ thể như sau:
set ns [new Simulator -multicast on] Bước 4: Tạo các nút và gán các hoạt động cho các nút.
for {set i 0} {$i < $val(nn) } {incr i} { set node_($i) [$ns_ node]
$node_($i) random-motion 0 ;# disable random motion }
# Xác định vị trí ban đầu cho các nút for {set i 0} {$i < $val(nn) } {incr i} { $node_($i) set X_ [x1]
$node_($i) set Y_ [y1] $node_($i) set Z_ [z1] }
# Tạo sự di chuyển cho nút
$ns_ at 0.1 “$node_(1) setdest 25.0 20.0 15.0”
Bước 5: Thiết lập luồng traffic giữa các node (đoạn mã sau thiết lập luồng cho
nút 0 và nút 1).
for {set i 0} {$i < $val(nn)} {incr i} { set sink_($i) [new Agent/LossMonitor] $ns attach-agent $n_($i) $sink_($i) set tcp_($i) [new Agent/TCP]
$ns attach-agent $n_(0) $tcp_($i) }
#Thủ tục thiết lập luồng
proc attach-CBR-traffic { node sink size interval } { set ns [Simulator instance]
set cbr [new Agent/CBR] $ns attach-agent $node $cbr $cbr set packetSize_ $size $cbr set interval_ $interval $ns connect $cbr $sink
return $cbr }
#Thiết lập luồng cho nút 0 và nút 1
set cbr0 [attach-CBR-traffic $n_(0) $sink_(1) 512 0.25] Bước 6: Kết thúc và thực thi mô phỏng.
# Xác định thời điểm kết thúc mô phỏng của các nút for {set i 0} {$i < $val(nn) } {incr i} {
$ns_ at $val(stop).0 "$node_($i) reset"; }
$ns_ at $val(stop).0002 "puts \"NS EXITING...\" ; $ns_ halt"
# Đưa các thông tin mô phỏng ban đầu vào các file lưu vết
puts $tracefd "M 0.0 nn $val(nn) x $val(x) y $val(y) rp $val(adhocRouting)"
puts $tracefd "M 0.0 sc $val(sc) cp $val(cp) seed $val(seed)"
puts "Starting Simulation..." $ns_ run
Sau đây em sẽ đưa ra một ví dụ về mô phỏng hoạt động giao thức AODV trong mạng Manet.
Đầu tiên ta có đoạn mã để thực hiện như sau, ví dụ tên file là aodv50.ns sẽ miêu tả hoạt động của giao thức AODV với 50 node mạng, để chạy file này ta gõ ns aod50.ns trên Terminal. # =============================================================== ======= # Define options # =============================================================== =======
Mac/802_11 set dataRate_ 11Mb ;#Rate for Data Frames set val(chan) Channel/WirelessChannel ;# channel type
set val(prop) Propagation/TwoRayGround ;# radio-propagation model set val(ant) Antenna/OmniAntenna ;# Antenna type
set val(ll) LL ;# Link layer type
set val(ifq) Queue/DropTail/PriQueue ;# Interface queue type set val(ifqlen) 50 ;# max packet in ifq
set val(netif) Phy/WirelessPhy ;# network interface type set val(mac) Mac/802_11 ;# MAC type
set val(rp) AODV ;# routing protocol set val(x) 10000
set val(y) 10000
set ns [new Simulator] #ns-random 0
set tracefd [open aodv50.tr w]
#set windowVsTime2 [open win.tr w] set namtrace [open aodv50.nam w] $ns use-newtrace
$ns trace-all $tracefd
$ns namtrace-all-wireless $namtrace $val(x) $val(y)
#set f0 [open So_Goi_Da_Gui.tr w] #set f1 [open So_Goi_Mat.tr w] #set f2 [open proj_out2.tr w] #set f3 [open proj_out3.tr w]
set topo [new Topography]
create-god $val(nn)
set chan_1 [new $val(chan)]
# CONFIGURE AND CREATE NODES
$ns node-config -adhocRouting $val(rp) \ -llType $val(ll) \ -macType $val(mac) \ -ifqType $val(ifq) \ -ifqLen $val(ifqlen) \ -antType $val(ant) \ -propType $val(prop) \ -phyType $val(netif) \ #-channelType $val(chan) \ -topoInstance $topo \ -agentTrace OFF \ -routerTrace ON \ -macTrace ON \ -movementTrace OFF \ -channel $chan_1 # \
proc finish {} {
global ns f f0 f1 f2 f3 namtrace $ns flush-trace
close $namtrace
exec nam -r 5m aodv50.nam & exit 0
}
proc record {} {
global sink0 sink1 sink2 sink3 sink4 sink5 sink6 sink7 sink8 sink9 f0 f1 f2 f3 #Get An Instance Of The Simulator
set ns [Simulator instance]
#Set The Time After Which The Procedure Should Be Called Again set time 0.05
#How Many Bytes Have Been Received By The Traffic Sinks? set bw0 [$sink9 set npkts_]
set bw1 [$sink9 set nlost_]
#Get The Current Time set now [$ns now]
#Save Data To The Files puts $f0 "$now [expr $bw0]" puts $f1 "$now [expr $bw1]" #puts $f2 "$now [expr $bw2]" #puts $f3 "$now [expr $bw3]"
#Re-Schedule The Procedure $ns at [expr $now+$time] "record" }
for {set i 0} {$i < $val(nn)} {incr i} { set n_($i) [$ns node]
$n_($i) random-motion 0 $ns initial_node_pos $n_($i) 20 }
for {set i 0} {[expr $i < $val(nn)/10]} {incr i} { for {set j 0} {$j < 10} {incr j} {
$n_($id) set X_ [expr $j*100+120] $n_($id) set Y_ [expr $i*100+120] $n_($id) set Z_ 0.0
} }
for {set i 0} {$i < $val(nn)} {incr i} { if {$i%3 == 0} {
$ns at 0.0 "$n_($i) setdest [expr $i%7*1040+20] [expr $i%3*3000+20] 10.0" }
if {$i%3 == 1} {
$ns at 0.0 "$n_($i) setdest [expr $i%6+20] [expr $i%3*3000+20] 10.0" }
if {$i%3 == 2} {
$ns at 0.0 "$n_($i) setdest [expr $i%7*1040+20] [expr $i%3+10] 10.0" }
}
set sink_($i) [new Agent/LossMonitor] $ns attach-agent $n_($i) $sink_($i)
set tcp_($i) [new Agent/TCP] $ns attach-agent $n_(0) $tcp_($i) }
proc attach-CBR-traffic { node sink size interval } { #Get an instance of the simulator
set ns [Simulator instance]
#Create a CBR agent and attach it to the node set cbr [new Agent/CBR]
$ns attach-agent $node $cbr $cbr set packetSize_ $size $cbr set interval_ $interval
#Attach CBR source to sink; $ns connect $cbr $sink return $cbr
}
set cbr0 [attach-CBR-traffic $n_(0) $sink_([expr $val(nn)-1]) 512 0.25] set cbr0 [attach-CBR-traffic $n_(3) $sink_([expr $val(nn)-2]) 512 0.25]
$ns at 30.0 "$cbr0 stop" $ns at 30.0 "finish"
puts "Start of simulation.." $ns run
- Sau khi chạy đoạn mã bằng ns2 thì ta nhận được kết quả là một file aodv50.nam có ý nghĩa thực thi và một file aodv50.tr là kết quả của chương trình
Ban đầu ta có được một sơ đồ mạng với 50 node như sau:
Khi cho chạy giao thức AODV ta sẽ nhận thấy kết quả mô phỏn như sau:
Và sau đây là kết quả mô phỏng được trình bày bằng chương trình trgraph:
Thời gian mô phỏng 30s
Số gói được tạo ra 1111
Số gói gửi 1108
Số gói chuyển tiếp 555
Số gói rơi 652
Số gói nhận ( số gói gửi – số gói rơi) 1108 – 652 = 456
Tỷ lệ gửi thành công: 41.16%
KẾT LUẬN
Mạng Manet hiện đang là một thách thức của các nhà nghiên cứu trong việc tìm ra những giao thức mạng, chuẩn mạng mới với mục đích cuối cùng là đạt được một hệ thống mạng ổn định và hiệu suất khai thác cao trên các dịch vụ truyền thông đa phương tiện thông qua giao thức AODV. Qua một thời gian nghiên cứu về khóa luận thì em đạt được những kết quả như sau:
- Trình bày tổng quan về mạng di động không dây Manet, đặc điểm trong mạng Manet, phân tích một số công nghệ ứng dụng mạng không dây, tổng quan về các ứng dụng của Manet trong cuộc sống.
- Nghiên cứu hoạt động của giao thức định tuyến AODV trong mạng Manet. - Thiết kế một mô hình mạng Manet trên phần mềm NS – 2. Cài đặt mô
phỏng giao thức AODV để minh họa quá trình hoạt động.
Trpng qus trinh làm khóa luận do thời gian và trinh độ có hạn nên em chỉ dừng ở mức độ mô phỏng hoạt động của giao thức AODV còn về phân tích kết quả và đánh giá em vẫn chưa thể tìm hiểu được, mong quý thầy cô và các bạn giúp đỡ, bổ sung cho em.
Hướng phát triển: Nghiên cứu, đánh giá kết quả hoạt động của giao thức AODV và tìm hiểu thêm các giao thức khác.
TÀI LIỆU THAM KHẢO
1. Ad-hoc On-Demand Distance Vector Routing Charles E. Perkins Sun
Microsystems phòng thí nghiệm nâng cao phát triển Nhóm Menlo Park, CA 94025
2. Elizabeth M. Royer Phòng Điện và Kỹ thuật Máy tính trường Đại học California, Santa Barbara, Santa Barbara, CA 93.106
3. AODV Tiếng Việt - http://vi.scribd.com 4. http://vi.wikipedia.org/, google.com… 5. Tài liệu NS2.