IV. Thực nghiệm mô phỏng 4.1 Các thông số mô phỏng
4.4.2. Kết quả và nhận xét.
Phần trăm gói tin được phân phát thành công
Hình 4.6. Đánh giá kết quả phân phát gói tin trong mô hình Random Waypoint Trễ đầu cuối trung bình
Thông lượng đầu cuối trung bình
Hình 4.8. Đánh giá kết quả thông lượng trong mô hình Random Waypoint
Tải định tuyến chuẩn hóa
Với tập các cấu hình mạng mô phỏng được xây dựng ở trên, nhóm tiến hành mô phỏng, phân tích, đánh giá các kết quả làm việc giữa các giao thức dựa trên các độ đo hiệu suất. Các kết quả so sánh được cho thấy sau đây bao gồm: kết quả phân phát gói tin, độ trễ đầu cuối
trung bình, thông lượng đầu cuối trung bình và tải định tuyến chuẩn hóa của bốn giao thức.
Từ hình 4.6, nếu coi tỷ lệ phân phát gói tin thành công là độ đo quan trọng nhất thì ta có thể đánh giá giao thức AODV hoạt động ổn định, đạt hiệu quả tốt nhất với tỷ lệ phân phát gói tin thành công trung bình trên 80%. Còn lại, 3 giao thức DSDV, DSR và OLSR thì tỷ lệ phân phát gói tin thành công xuống thấp khi vận tốc nút tăng lên. Điều này phù hợp với thông lượng đầu cuối trung bình, hình 29 cho thấy kết quả là thông lượng của AODV lớn nhất trung bình đạt trên 130 kpbs, trong khi thông lượng của DSDV, DSR và OLSR giảm dần khi vận tốc nút tăng. Những cải tiến từ DSR giúp AODV hoạt động tốt hơn, cụ thể là AODV dựa vào thiết lập động các bảng định tuyến ở các nút trung gian, điều này làm giảm rất nhiều tải định tuyến chuẩn hóa so với việc truyền từng gói tin dữ liệu chứa các tuyến đường nguồn trong tiêu đề như trong DSR. Hai nguyên nhân: Một là, DSR là giao thức phản ứng dựa trên định tuyến nguồn; hai là, trong bộ mô phỏng ns-2.34 thời gian giữa các ROUTE REQUEST được phát lại chỉ là 500 ms trong khi thời gian giữ các gói tin chờ đường là 30s dẫn đến số lượng gói tin ROUTE REQUEST là rất lớn lý giải cho vấn đề thông lượng đầu cuối trung bình thấp và độ trễ đầu cuối trung bình cao của DSR. Cuối cùng, ta thấy DSR có tải định tuyến chuẩn hóa rất cao. Từ bốn độ đo trên, trong mô hình này ta có thể đánh giá DSR hoạt động tồi khi vận tốc các nút lớn. Còn đối với AODV, đây là giao thức định tuyến phản ứng dựa trên vec tơ khoảng cách với các bảng định tuyến của các nút hàng xóm được tổ chức để tối ưu hóa thời gian phản ứng các di chuyển cục bộ và cung cấp thời gian phản ứng nhanh cho các yêu cầu thành lập tuyến đường mới. Chính sự linh hoạt này đã khiến AODV hoạt động ổn định, hiệu quả kể cả khi vận tốc các nút tăng.
Với các thể hiện của DSDV, ta có thể nhận thấy rõ hoạt động rất hiệu quả của giao thức chủ ứng dựa trên vecto khoảng cách này trong việc định tuyến khi vận tốc nút tăng. Trễ đầu cuối trung bình của DSDV rất nhỏ, khá ổn định với các mức độ linh động của nút khác nhau mặc dù độ trễ có tăng lên khi vận tốc tăng. Mặt khác, tỷ lệ phân phát gói tin thành công là khá tốt trong khi tải định tuyến chuẩn hóa rất nhỏ, điều này minh chứng cho nhận xét của ta về hoạt động hiệu quả của DSDV. Ta lý giải như sau: DSDV sử dụng cập nhật định kỳ và cập nhật sự kiện nên phản ứng tốt với sự thay đổi cấu hình mạng nhanh, mặt khác nó tối ưu hóa cập nhật bằng cách sử dụng hai loại thông điệp cập nhật là thông điệp cập nhật đầy đủ và thông điệp cập nhật bổ xung do đó trong bốn giao thức, tải định tuyến chuẩn hóa của DSDV là tốt nhất. Để tránh sự bùng nổ các cập nhật định tuyến tại các thời điểm cấu hình mạng thay đổi nhanh, DSDV cũng áp dụng cơ chế hãm các cập nhật tức thời khi có các thay đổi xảy ra trong mạng. Bằng việc ghi nhận các quãng thời gian xảy ra những thay đổi về đường, DSDV làm trễ các cập nhật tức thời theo thời gian đó. Thời gian làm trễ thường là thời gian trung bình để có được tất
cả các quảng bá cập nhật cho một tuyến đường. Bằng cách này, các nút có thể chắc chắn nhận được tất cả những thay đổi đường dẫn định tuyến đến một đích trước khi lan truyền bất cứ thay đổi nào. Điều này làm giảm việc sử dụng băng thông và tiêu thụ điện năng của các nút hàng xóm. Kết quả là, trong hình 4.8 thông lượng của DSDV là khá tốt. Trong mô hình Random Waypoint, giao thức định tuyến OLSR chỉ đạt hiệu quả trung bình. Mặc dù là giao thức định tuyến chủ ứng nhưng tải định tuyến chuẩn hóa của OLSR cao hơn nhiều so với DSDV do nó dựa trên định tuyến trạng thái liên kết dù đã được cải tiến bằng cách sử dụng các chuyển tiếp đa điểm (MultiPoint Relays - MPRs) để giảm chi phí flooding mạng và kích thước của các bản cập nhật trạng thái liên kết. Nhưng so với các giao thức phản ứng như AODV, DSR thì tải định tuyến chuẩn hóa của OLSR khá nhỏ. Tuy nhiên, trễ đầu cuối trung bình của OLSR là rất cao, đi kèm với phần trăm phân phát gói tin thành công thấp. Điều này là phù hợp với thông lượng đầu cuối trung bình chỉ ở mức thấp.
PHỤ LỤC
dsdv-cbr10-rwp0-speed10.tcl
# ============================================================ # Define options
# ============================================================
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
set val(ant) Antenna/OmniAntenna
set val(x) 1500 ;# X dimension of the topography set val(y) 900 ;# Y dimension of the topography set val(ifqlen) 50 ;# max packet in ifq
set val(seed) 1.0 set val(adhocRouting) DSDV
set val(nn) 50 ;# how many nodes are simulated set val(cp) "/home/phd1983/ns-2.34/protocols/cbr/cbr-50-10-4"
set val(sc) "/home/phd1983/ns-2.34/protocols/scen/rwp/rwp-1500-900-50-0-10-0" set val(stop) 900.0 ;# simulation time
# ============================================================ # Main Program
# ============================================================ # Initialize Global Variables
# create simulator instance set ns_ [new Simulator] # setup topography object
set topo [new Topography] # create trace object for ns and nam
set tracefd [open dsdv-cbr10-rwp0-speed10-out.tr w] set namtrace [open dsdv-cbr10-rwp0-speed10-out.nam w] $ns_ trace-all $tracefd
# define topology
$topo load_flatgrid $val(x) $val(y) # Create God
set god_ [create-god $val(nn)] # define how node should be created #global node setting
$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 \ -movementTrace ON \ -macTrace OFF
# Create the specified number of nodes [$val(nn)] and "attach" them to the channel. for {set i 0} {$i < $val(nn) } {incr i} { set node_($i) [$ns_ node]
$node_($i) random-motion 0 ; # disable random motion }
# Define node movement model
puts "Loading connection pattern..." source $val(cp) # Define traffic model
puts "Loading scenario file..." source $val(sc)
# Define node initial position in nam for {set i 0} {$i < $val(nn)} {incr i} { $ns_ initial_node_pos $node_($i) 50
}
# Tell nodes when the simulation ends 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"
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 $tracefd "M 0.0 prop $val(prop) ant $val(ant)" puts "Starting Simulation..."
$ns_ run
average_end-end_delay.pl
# type: perl average_end-end_delay.pl <trace file>
# --- $infile=$ARGV[0]; $speed=$ARGV[1]; $sum=0; $recvnum=0; # ---
open (DATA,"<$infile") || die "Can't open $infile $!"; while (<DATA>) { @x = split(' ');
for ($x[5]) {
if (( $x[0] eq "s") && ( $x[6] eq "cbr" ) && ( $x[3] eq "AGT" )) {$start_time = $x[1]; }
if (( $x[0] eq "r") && ( $x[6] eq "cbr" ) && ( $x[3] eq "AGT" )) {$end_time = $x[1]; $recvnum++;}
$packet_duration =$end_time - $start_time;
if ( $packet_duration > 0 ) { $sum += $packet_duration; } }
}
# --- $delay=$sum/$recvnum;
#print STDOUT "Total delay time of packets = $sum\n"; #print STDOUT "Total packets = $recvnum\n";
print STDOUT "$speed", " ", "$delay\n"; close DATA; exit(0);
normalized_routing_overhead.pl
# type: perl normalized_routing_overhead.pl <trace file> # --- $infile=$ARGV[0]; $speed=$ARGV[1]; $routing_packets=0; $sum_received=0; # ---
open (DATA,"<$infile") || die "Can't open $infile $!"; while (<DATA>) { @x = split(' ');
if (( $x[0] eq "r") && ( $x[6] eq "cbr" ) && ( $x[3] eq "AGT" )) {$sum_received++; }
if (( $x[0] eq "s" || $x[0] eq "f") && ( $x[6] eq "message" ) && ( $x[3] eq "RTR" )) {$routing_packets++; }
}
# --- $normalized_routing_overhead=($routing_packets/$sum_received); #print STDOUT "Total packets received = $sum_received\n";
#print STDOUT "Total routing packets sent & forward = $routing_packets\n"; print STDOUT "$speed", " ", "$normalized_routing_overhead \n";
close DATA; exit(0);
packet_delivery_fraction.pl
# type: perl packet_delivery_fraction_ratio.pl <trace file> # --- $infile=$ARGV[0]; $speed=$ARGV[1]; $sum_sent=0; $sum_received=0; # ---
open (DATA,"<$infile") || die "Can't open $infile $!"; while (<DATA>) { @x = split(' ');
if (( $x[0] eq "s") && ( $x[6] eq "cbr" ) && ( $x[3] eq "AGT" )) {$sum_sent++; }
if (( $x[0] eq "r") && ( $x[6] eq "cbr" ) && ( $x[3] eq "AGT" )) {$sum_received++; }
}
# --- $packet_delivery_ratio=($sum_received/$sum_sent)*100; #print STDOUT "Total packets sent = $sum_sent\n";
#print STDOUT "Total packets received = $sum_received\n"; print STDOUT "$speed", " ", "$packet_delivery_ratio\n";
close DATA; exit(0);
throughput.pl
# type: throughput.pl <trace file>
# --- $infile=$ARGV[0]; $speed=$ARGV[1]; $recvdSize = 0; $startTime = 1000; $stopTime = 0; # ---
open (DATA,"<$infile") || die "Can't open $infile $!"; while (<DATA>) { @x = split(' ');
$pkt_size = $x[7]; # Store start time
if (($x[3] eq "AGT") && ($x[0] eq "s") && ($pkt_size >= 512)) { if ($x[1] < $startTime) { $startTime = $x[1];
} }
# Update total received packets' size and store packets arrival time if (($x[3] eq "AGT") && ($x[0] eq "r") && ($pkt_size >= 512)) {
if ($x[1] > $stopTime) { $stopTime = $x[1];
}
# Rip off the header
$hdr_size = $pkt_size % 512; $pkt_size -= $hdr_size; # Store received packet's size $recvdSize += $pkt_size; }
}
# ---
#print("Average Throughput[kbps] = ",($recvdSize/($stopTime-$startTime))* (8/1000)," ", $startTime," ","$stopTime\n");
print STDOUT "$speed", " ", ($recvdSize/($stopTime-$startTime))*(8/1000),"\n"; close DATA; exit(0);