Kết quả thử nghiệm

Một phần của tài liệu Khảo sát truyền dữ liệu bằng flooding có kiểm soát trong mạng di động AD-HOC (Trang 48)

Với việc thiết lập mô phỏng cho thuật toán FWDP như trên, ta có kết quả thử nghiệm như sau:

Hình 4.4: Hiệu năng của FWDP và AODV.

Quan sát hình 4.4 ta thấy rằng, khi tăng kích thước vùng mô phỏng mạng thì tỷ lệ gửi thành công của thuật toán FWDP là cao hơn so với thuật toán AODV.

4.4 Tổng kết chương

Ở chương này, chúng tôi đã tìm hiểu về bộ mô phỏng mạng ns2. Đây là bộ mô phỏng mạng được các nhà nghiên cứu trong lĩnh vực mạng máy tính trên

41

thế giới được ưa chuộng nhất. Sau đó chúng tôi thiết lập mô phỏng cho thuật toán FWDP đã được cài đặt và đưa ra kết quả thử nghiệm của thuật toán này. Kết quả thực nghiệm được thể hiện một cách trực quan thông qua hình minh họa.

42

CHƢƠNG 5 KẾT LUẬN

Mạng ad-hoc được quan tâm và nghiên cứu nhiều trong những năm gần đây. Có thể nói rằng định tuyến vẫn là vấn đề quan trọng nhất, là then chốt của lĩnh vực này. Nó quyết định lớn nhất đến hiệu suất mạng.

Trong luận văn này, chương 1 và 2, chúng tôi đã tìm hiểu chung về mạng ad-hoc và một số giao thức định tuyến chính của nó. Chương 3, chúng tôi trình bày về thuật toán flooding chuẩn và tìm hiểu một số thuật toán flooding có cải tiến. Trong đó, thuật toán FWDP được trình bày một cách chi tiết hơn và được chọn để cài đặt và thử nghiệm khảo sát việc truyền dữ liệu cho mạng ad-hoc. Dựa trên việc cài đặt thuật toán đó, ở chương 4, chúng tôi mô phỏng và đánh giá thuật toán đã cài đặt thông qua bộ mô phỏng mạng ns2. Sau đó, chúng tôi so sánh hiệu năng của giao thức đã cài đặt với giao thức định tuyến AODV. Và cuối cùng, chương 5, chúng tôi tổng kết toàn bộ luận văn và các tài liệu tham khảo.

Hƣớng nghiên cứu tiếp theo

Trên cơ sở những kết quả đạt được của luận văn, chúng tôi dự kiến tiếp tục nghiên cứu những vấn đề sau:

 Cài đặt thuật toán FWDP trên môi trường mạng thực với một mạng ad-hoc thưa (mạng có ít số nút).

 Cải tiến thuật toán FWDP nhằm nâng cao hơn nữa hiệu năng của thuật toán này.

43

PHỤ LỤC

PHỤ LỤC A

Code của giao thức FWDP

Tệp fwdp.h #ifndef __fwdp_h__ #define __fwdp_h__ #include <sys/types.h> #include <cmu-trace.h> #include <priqueue.h> #include <fwdp/fwdp_seqtable.h> #include <list>

#define NOW_ (Scheduler::instance().clock())

#define NETWORK_DIAMETER 30 // 30 hops

#define FORWARD_DELAY 0.01 // random delay #define NO_DELAY -1.0 // no delay

// ====================================================== // FWDP Routing Agent (the routing protocol)

// ======================================================

class FWDP: public Agent {

44 public:

FWDP(nsaddr_t id);

void recv(Packet *p, Handler *);

protected:

int command(int, const char *const *);

inline int initialized() { return 1 && target_; }

// Route Table Management void rt_resolve(Packet *p);

// Packet TX Routines

void forward(FWDP_RTEntry *rt, Packet *p, double delay);

nsaddr_t index_; // IP Address of this node

// Routing Table

FWDP_RTable rtable_;

// A mechanism for logging the contents of the routing Trace *logtarget; NsObject *uptarget_; NsObject *port_dmux_; private: u_int32_t myseq_; }; #endif /*__fwdp_h__ */ Tệp fwdp.cc #include <fwdp/fwdp.h>

45 #include <fwdp/fwdp_packet.h>

#include <random.h> #include <cmu-trace.h>

// New packet type int hdr_fwdp::offset_;

static class FWDPHeaderClass : public PacketHeaderClass { public: FWDPHeaderClass() : PacketHeaderClass("PacketHeader/FWDP", sizeof(hdr_fwdp)) { bind_offset(&hdr_fwdp::offset_); } } class_fwdphdr; // TCL Hooks

static class FWDPclass : public TclClass { public:

FWDPclass() : TclClass("Agent/FWDP") {}

TclObject* create(int argc, const char*const* argv) { assert(argc == 5);

return (new FWDP((nsaddr_t) atoi(argv[4]))); }

} class_rtProtoFwdp;

int

FWDP::command(int argc, const char*const* argv) { Tcl& tcl = Tcl::instance(); if(argc == 2) { if(strncasecmp(argv[1], "id", 2) == 0) { tcl.resultf("%d", index_); return TCL_OK; }

46

else if (strcmp(argv[1], "uptarget") == 0) { if (uptarget_ != 0) tcl.result(uptarget_->name()); return (TCL_OK); } } else if(argc == 3) { if(strcmp(argv[1], "index_") == 0) { index_ = atoi(argv[2]); return TCL_OK;

} else if(strcmp(argv[1], "log-target") == 0 || strcmp(argv[1], "tracetarget") == 0) {

logtarget = (Trace*) TclObject::lookup(argv[2]); if(logtarget == 0) return TCL_ERROR;

return TCL_OK; }

else if (strcmp(argv[1], "uptarget") == 0) { if (*argv[2] == '0') { target_ = 0; return (TCL_OK); } uptarget_ = (NsObject*)TclObject::lookup(argv[2]); if (uptarget_ == 0) {

tcl.resultf("no such object %s", argv[2]); return (TCL_ERROR);

}

return (TCL_OK); }

else if (strcasecmp (argv[1], "port-dmux") == 0) { TclObject *obj;

port_dmux_ = (NsObject *) obj; return TCL_OK;

47 }

return Agent::command(argc, argv); }

FWDP::FWDP(nsaddr_t id) : Agent(PT_FWDP), port_dmux_(0) { index_ = id;

logtarget = 0; myseq_ = 0; }

// Route Handling Functions void

FWDP::rt_resolve(Packet *p) {

struct hdr_cmn *ch = HDR_CMN(p); struct hdr_ip *ih = HDR_IP(p);

struct hdr_fwdp *fh = HDR_FWDP(p); FWDP_RTEntry* rt;

rt = rtable_.rt_lookup(ih->saddr()); if(rt == NULL) {

rt = new FWDP_RTEntry(ih->saddr(), fh->seq_);

LIST_INSERT_HEAD(&rtable_.rthead,rt,rt_link); forward(rt,p,FORWARD_DELAY); rtable_.rt_print(); } else if(rt->isNewSeq(fh->seq_) ) { forward(rt, p, FORWARD_DELAY);

48 // rt->seq_ = fh->seq_; rt->addSeq(fh->seq_); rtable_.rt_print(); } else { drop(p, "LOWSEQ"); } }

// Packet Reception Routines void

FWDP::recv(Packet *p, Handler*) {

struct hdr_cmn *ch = HDR_CMN(p); struct hdr_ip *ih = HDR_IP(p);

struct hdr_fwdp *fh = HDR_FWDP(p); assert(initialized());

if((ih->saddr() == index_) && (ch->num_forwards() == 0)) { // Must be a packet I'm originating...

ch->size() += IP_HDR_LEN; // Add the IP Header

ih->ttl_ = NETWORK_DIAMETER; fh->seq_ = myseq_++;

forward((FWDP_RTEntry*)1,p,0); return;

} else if(ih->saddr() == index_) { // I received a packet that I sent. Probably a routing loop.

drop(p, DROP_RTR_ROUTE_LOOP); return;

49

if(--ih->ttl_ == 0) { // Check the TTL. If it is zero, then discard. drop(p, DROP_RTR_TTL); return; } } rt_resolve(p); }

// Packet Transmission Routines void

FWDP::forward(FWDP_RTEntry* rt, Packet *p, double delay) { struct hdr_cmn *ch = HDR_CMN(p);

struct hdr_ip *ih = HDR_IP(p);

assert(ih->ttl_ > 0); assert(rt != 0);

// assert(rt->rt_flags == RTF_UP);

ch->next_hop_ = -1; //Broadcast address ch->addr_type() = NS_AF_INET;

ch->direction() = hdr_cmn::DOWN; //important: change the packet's direction

if(delay > 0.0) {

Scheduler::instance().schedule(target_, p, Random::uniform(delay*2));

} else { // Not a broadcast packet, no delay, send immediately

Scheduler::instance().schedule(target_, p, 0.); }

}

50 #ifndef __fwdp_packet_h__

#define __fwdp_packet_h__

// ====================================================== // FWDP Routing Protocol Header Macros

// ======================================================

#define HDR_FWDP(p) ((struct hdr_fwdp*)hdr_fwdp::access(p))

// ====================================================== // General FWDP Header

// ======================================================

struct hdr_fwdp {

u_int32_t seq_; // sequence

u_int32_t dst_group; // destination's group id

// Header access methods

static int offset_; // required by PacketHeaderManager inline static int& offset() { return offset_; }

inline static hdr_fwdp* access(const Packet* p) { return (hdr_fwdp*) p->access(offset_); } }; #endif /* __fwdp_packet_h__ */ Tệp fwdp_seqtable.h #ifndef __fwdp_seqtable_h__ #define __fwdp_seqtable_h__ #include <assert.h>

51 #include <sys/types.h> #include <config.h> #include <lib/bsd-list.h> #include <scheduler.h> #define INFINITY 0xff #define RTF_DOWN 0 #define RTF_UP 1 #define REM_SEQ_COUNT 5000 // ====================================================== // Route Table Entry

// ======================================================

class FWDP_RTEntry {

friend class FWDP_RTable; friend class FWDP;

public:

FWDP_RTEntry();

FWDP_RTEntry(nsaddr_t src,u_int32_t seq);

bool isNewSeq(u_int32_t seq); // old -> false, new->true void addSeq(u_int32_t seq); // add a seqno to seqno array(rt_seqnos)

protected:

LIST_ENTRY(FWDP_RTEntry) rt_link;

nsaddr_t src_;

52

u_int32_t max_seqno; //max seqno u_int32_t min_seqno; //min seqno u_int16_t seq_it; // seqno's iterator };

// ====================================================== // The Routing Table

// ====================================================== class FWDP_RTable {

friend class FWDP; public:

FWDP_RTable() { LIST_INIT(&rthead); } void rt_delete(nsaddr_t id);

FWDP_RTEntry* rt_lookup(nsaddr_t id);

void rt_print(); private:

LIST_HEAD(, FWDP_RTEntry) rthead; };

#endif

Tệp fwdp_seqtable.cc

#include <fwdp/fwdp_seqtable.h>

// ====================================================== // The Routing Table

// ======================================================

FWDP_RTEntry::FWDP_RTEntry() { src_ = 0;

53 for(int i=0;i<REM_SEQ_COUNT;i++) rt_seqnos[i] = 0xffffffff; max_seqno = 0; min_seqno = 0; seq_it = 0; }; // ====================================================== // The Routing Table

// ======================================================

FWDP_RTEntry::FWDP_RTEntry(nsaddr_t src,u_int32_t seq) { src_ = src; // seq_ = seq; for(int i=0;i<REM_SEQ_COUNT;i++) rt_seqnos[i] = 0xffffffff; rt_seqnos[0] = seq; max_seqno = seq; min_seqno = 0; seq_it = 1; };

bool FWDP_RTEntry::isNewSeq(u_int32_t seq) { if(seq > max_seqno) return true; if(seq < min_seqno) return false; for(int i=0;i<REM_SEQ_COUNT;i++) if(seq == rt_seqnos[i])

54 return false;

return true; }

void FWDP_RTEntry::addSeq(u_int32_t seq) { u_int16_t min_it = 0; if(seq < min_seqno) return; if(seq > max_seqno) max_seqno = seq; /* for(int i=0;i<REM_SEQ_COUNT;i++) if(seq == rt_seqnos[i]) return; */ rt_seqnos[seq_it++] = seq; seq_it %= REM_SEQ_COUNT; min_seqno = 0xffffffff; for(int i=0;i<REM_SEQ_COUNT;i++) if(min_seqno > rt_seqnos[i]) min_seqno = rt_seqnos[i]; } // ====================================================== // The Routing Table

// ====================================================== FWDP_RTEntry*

55 FWDP_RTEntry *rt = rthead.lh_first; for(; rt; rt = rt->rt_link.le_next) { if(rt->src_ == id) break; } return rt; } void FWDP_RTable::rt_delete(nsaddr_t id) { FWDP_RTEntry *rt = rt_lookup(id); if(rt) { LIST_REMOVE(rt, rt_link); delete rt; } } void FWDP_RTable::rt_print() { FWDP_RTEntry *rt = rthead.lh_first; for(; rt; rt = rt->rt_link.le_next) {

// printf("index: %d , seq: %d \n",rt->src_,rt->max_seqno); }

return; }

56

PHỤ LỤC B

Hƣớng dẫn cài đặt giao thức FWDP vào bộ mô phỏng NS2

Trước tiên, tạo thư mục fwdp trong thư mục: ~ns-allinone-2.34/ns-2.34 (thư mục fwdp này sẽ chứa toàn bộ code của giao thức).

Chép 5 tệp: fwdp.cc, fwdp.h, fwdp_packet.h, fwdp_seqtable.cc và fwdp_seqtable.h (5 file này xem ở phần phụ lục A).

1. Thay đổi tệp ns-lib.tcl (~/ns-2.34/tcl/lib/ns-lib.tcl)

Thêm đoạn code sau tại dòng 633: OMNIMCAST {

eval $node addr $args

set ragent [$self create-omnimcast-agent $node] }

FWDP {

set ragent [$self create-fwdp-agent $node] }

DumbAgent {

set ragent [$self create-dumb-agent $node] }

Khi nút di động không dây mô tả giao thức định tuyến FWDP thì nó sẽ gọi hàm thành viên create-fwdp-agent để khởi tạo. Vì thế, tại dòng 803 cùng tệp này ta thêm đoạn code sau:

Simulator instproc create-fwdp-agent {node} {

set ragent [new Agent/FWDP [$node id]] $node set ragent_ $ragent

return $ragent }

57

Từ định nghĩa hàm create-fwdp-agent, có thể thấy, khi tạo ra đối tượng Agent/FWDP, thì đối tượng thực sự là một nút di động ns sẽ thay đổi hệ thống trong tệp Tcl.

2. Thay đổi tệp ns-packet.tcl (~/ns-2.34/tcl/lib/ns-packet.tcl)

Tại dòng 164 của tệp ns-packet.tcl, thêm dòng code sau: foreach prot { ……….. FWDP AODV ……….. }

3. Thay đổi tệp packet.h (~/ns/ns-2.34/common/packet.h)

Để định nghĩa loại gói tin cho giao thức định tuyến mới, chúng ta thay đổi tệp ~/ns-2.34/common/packet.h. Đổi PT_NTYPE = 63 và giao thức của chúng tôi là PT_FWDP = 62 tại dòng 185 như sau:

static const packet_t PT_FWDP = 62;

// insert new packet types here

static packet_t PT_NTYPE = 63; // This MUST be the LAST one

4. Thay đổi tệp Makefile (~/ns-2.34/Makefile)

Tại dòng 330, ta chỉ thêm dòng code sau: fwdp/fwdp.o fwdp/fwdp_seqtable.o \

58

PHỤ LỤC C Script mô phỏng mạng

1. Script mô phỏng của thuật toán FWDP

# ==================================================== # Define options

# ==================================================== set opt(chan) Channel/WirelessChannel

set opt(prop) Propagation/TwoRayGround set opt(netif) Phy/WirelessPhy

set opt(mac) Mac/802_11

set opt(ifq) Queue/DropTail/PriQueue set opt(ll) LL

set opt(ant) Antenna/OmniAntenna

set opt(x) 2000 ;# X dimension of the topography set opt(y) 2000 ;# Y dimension of the topography set opt(ifqlen) 50 ;# max packet in ifq

set opt(seed) 0.0 set opt(rp) FWDP

set opt(nn) 25 ;# how many nodes are simulated

set opt(cp) "/home/dattq/myscripts/traffic-patterns/cbr-25n-30c-1p" set opt(sc) "/home/dattq/myscripts/movement-

patterns/test/test2000/dest-25-300-2000-2000.9" set opt(stop) 300 ;# simulation time

proc refresh-packet-count {} {

global sink_ node_ pkt_cnt lost_cnt foreach {i a_sink} [array get sink_] {

59 set pkts [$a_sink set npkts_] set losts [$a_sink set nlost_] puts "$i $pkts $losts"

incr pkt_cnt [$a_sink set npkts_] $a_sink set npkts_ 0

incr lost_cnt [$a_sink set nlost_] $a_sink set nlost_ 0

} }

# 'finish' procedure, without record-one-node proc finish {} {

global ns_ tracefd node_ opt sink_ node_ pkt_cnt lost_cnt

refresh-packet-count

for {set i 0} {$i < $opt(nn)} {incr i} { $node_($i) reset;

}

set r [expr $pkt_cnt * 1.0 / [expr $pkt_cnt + $lost_cnt]] puts $tracefd "pkt_cnt : $pkt_cnt \t lost_cnt : $lost_cnt" puts "result:\t$pkt_cnt\t$lost_cnt\t$r" $ns_ flush-trace close $tracefd puts "NS EXITING..." $ns_ halt }

60

# =================================================== # Main Program

# =================================================== # Initialize Global Variables

set ns_ [new Simulator]

set tracefd [open flooding.tr w] $ns_ trace-all $tracefd

# set up topography

set topo [new Topography]

$topo load_flatgrid $opt(x) $opt(y)

#set namtrace [open flooding.nam w]

#$ns_ namtrace-all-wireless $namtrace $opt(x) $opt(y) $ns_ use-newtrace set pkt_cnt 0 set lost_cnt 0 # # Create God #

set god_ [create-god $opt(nn)]

# Create the specified number of mobilenodes [$val(nn)] and "attach" them # to the channel.

# configure node

set channel [new Channel/WirelessChannel] $channel set errorProbability_ 0.0

61 $ns_ node-config -adhocRouting $opt(rp) \

-llType $opt(ll) \ -macType $opt(mac) \ -ifqType $opt(ifq) \ -ifqLen $opt(ifqlen) \ -antType $opt(ant) \ -propType $opt(prop) \ -phyType $opt(netif) \ -channel $channel \ -topoInstance $topo \ -agentTrace ON \ -routerTrace ON\ -macTrace OFF \ -movementTrace OFF

for {set i 0} {$i < $opt(nn) } {incr i} { set node_($i) [$ns_ node]

$node_($i) random-motion 0; }

#

# Define node movement model #

puts "Loading connection pattern..." source $opt(cp)

#

# Define traffic model #

62 puts "Loading scenario file..."

source $opt(sc)

# Define node initial position in nam for {set i 0} {$i < $opt(nn)} {incr i} {

# 20 defines the node size in nam, must adjust it according to your scenario # The function must be called after mobility model is defined

$ns_ initial_node_pos $node_($i) 20 }

# Tell nodes when the simulation ends #for {set i 0} {$i < $opt(nn) } {incr i} {

# $ns_ at $opt(stop).0 "$node_($i) reset"; #}

$ns_ at $opt(stop) "finish" puts "Starting Simulation..." $ns_ run

2. Script mô phỏng của thuật toán định tuyến AODV

# ==================================================== # Define options

set opt(chan) Channel/WirelessChannel ;# channel type

set opt(prop) Propagation/TwoRayGround;# radio-propagation model set opt(netif) Phy/WirelessPhy ;# network interface type

set opt(mac) Mac/802_11 ;# MAC type

set opt(ifq) Queue/DropTail/PriQueue ;# interface queue type set opt(ll) LL ;# link layer type

set opt(ant) Antenna/OmniAntenna ;# antenna model set opt(ifqlen) 50 ;# max packet in ifq

63

set opt(nn) 25 ;# number of mobilenodes set opt(rp) AODV ;# routing protocol

set opt(x) 2000 ;# X dimension of topography set opt(y) 2000 ;# Y dimension of topography set opt(cp) "/home/dattq/myscripts/traffic-patterns/cbr-25n-30c-1p" set opt(sc) "/home/dattq/myscripts/movement-

patterns/test/test2000/dest-25-300-2000-2000.9"

set opt(stop) 300 ;# time of simulation end

# =================================================== # Main Program

# =================================================== proc refresh-packet-count {} {

global sink_ node_ pkt_cnt lost_cnt foreach {i a_sink} [array get sink_] {

incr pkt_cnt [$a_sink set npkts_] $a_sink set npkts_ 0

incr lost_cnt [$a_sink set nlost_] $a_sink set nlost_ 0

} }

# 'finish' procedure, without record-one-node proc finish {} {

global ns_ tracefd node_ opt sink_ pkt_cnt lost_cnt refresh-packet-count

for {set i 0} {$i < $opt(nn)} {incr i} { $node_($i) reset;

}

64

puts $tracefd "pkt_cnt : $pkt_cnt \t lost_cnt : $lost_cnt" puts "result:\t$pkt_cnt\t$lost_cnt\t$r" $ns_ flush-trace close $tracefd puts "NS EXITING..." $ns_ halt }

# Initialize Global Variables set ns_ [new Simulator] set tracefd [open aodv.tr w] $ns_ trace-all $tracefd # set up topography

set topo [new Topography]

$topo load_flatgrid $opt(x) $opt(y) #set namtrace [open aodv.nam w]

#$ns_ namtrace-all-wireless $namtrace $opt(x) $opt(y) $ns_ use-newtrace set pkt_cnt 0 set lost_cnt 0 # # Create God #

set god_ [create-god $opt(nn)]

set channel [new Channel/WirelessChannel] # Effectively turning off RTS

Mac/802_11 set RTSTheshold_ 3000

65 $ns_ node-config -adhocRouting $opt(rp) \

-llType $opt(ll) \ -macType $opt(mac) \ -ifqType $opt(ifq) \ -ifqLen $opt(ifqlen) \ -antType $opt(ant) \ -propType $opt(prop) \ -phyType $opt(netif) \ -channel $channel \ -topoInstance $topo \ -agentTrace ON \ -routerTrace ON \ -macTrace OFF \ -movementTrace OFF

for {set i 0} {$i < $opt(nn) } { incr i } { set node_($i) [$ns_ node]

$node_($i) random-motion 0; }

#

# Define node movement model #

puts "Loading connection pattern..." source $opt(cp)

#

# Define traffic model #

puts "Loading scenario file..." source $opt(sc)

66 # Define node initial position in nam for {set i 0} {$i < $opt(nn)} {incr i} {

$ns_ initial_node_pos $node_($i) 20 }

$ns_ at $opt(stop) "finish" puts "Starting Simulation..." $ns_ run

67

PHỤ LỤC D Dữ liệu mô phỏng trung bình

Bảng dữ liệu trung bình của 10 kịch bản mô phỏng với các movement pattern khác nhau và có cùng traffic pattern.

Giao thức Phạm vi mô phỏng (m2 ) FWDP AODV 1000 0.794694661891288 0.892994304070770 1200 0.853025601075990 0.786581065075547 1400 0.775300399584839 0.677249565767273 1600 0.651051227503118 0.550533411932406 1800 0.547743654902158 0.474950149370797 2000 0.561164191593186 0.525225460222080

68

TÀI LIỆU THAM KHẢO

Tiếng Anh

[1] C. E. Perkins and P. Bhagwat (1993), “Highly Dynamic Destination- Sequenced Distance-Vector Routing (DSDV) for Mobile Computers”, Proceedings of SIGCOMM’94, pp.234-244.

[2] C. E. Perkins and E. M. Royers (1999), “Ad-hoc On-demand Distance Vector Routing (AODV)”, Proceedings of WMCSA’99, pp. 90-100.

[3] C. E. Perkins, E. M. Royers and S. R. Das (2003), “Ad-hoc On-demand Distance Vector Routing (AODV)”, Internet Draft: draft-ietf-manet-aodv- 13.txt, IETF.

[4] D. B. Johnson and D. A. Maltz (1996), “Dynamic Source Routing in Ad-Hoc Wireless Networks”, Mobile Computing, T.Imielinski and H. Korth, Eds, Kluwer, pp.153-181.

[5] V. D. Park and M. S. Corson (1997), “A Highly Adaptive Distributed Routing Algorithm for Mobile Wireless Networks”, Proc. INFOCOM’97. [6] Broch, J. et. al (1998), “A Performance Comparison of Multi-hop Wireless

Ad-hoc Network Routing Protocols”, Proceedings of MOBICOM’98, pp.85- 97.

[7] S. Ni, Y. Tseng, Y. Chen and J. Sheu (1999), “The Broadcast Storm Problem in a Mobile Ad Hoc Network”, Proc. ACM/IEEE MOBICOM’99, pp.151- 162.

[8] H. Lim and C. Kim (2000), “Flooding in wireless ad hoc networks”, IEEE computer communications.

[9] A. Rahman, W. Olesinski and P. Gburzynski (2004), “Controlled Flooding in Wireless Ad-hoc Networks”, Proceedings of International Workshop on Wireless Ad-hoc Networks (IWWAN 2004), Oulu, Finland.

[10] Trong Duc Le and Hyunseung Choo (2008), “Efficient Flooding Scheme Based on 2-Hop Backward Information in Ad Hoc Networks”, ICC 2008, pp.2443-2447.

69

[11] F. J. Ros and P. M. Ruiz, “Implementing a New Manet Unicast Routing Protocol in NS2”, http://masimum.dif.um.es/nsrt-howto/html/nsrt- howto.html

[12] The Network Simulator – ns2, version 2.34. Online, http://www.isi.edu/nsnam/ns/

[13] Elmurod A. Talipov, “NS2: How to add new routing protocol”, http://elmurod.net/?p=157

[14] F. Dai and J. Wu (2004), “An Extended Localized Algorithm for Connected Dominating Set Formation in Ad Hoc Wireless Networks”, IEEE Trans. Parallel and Distributed Systems, vol. 15, no. 10, pp. 908-920.

[15] A. Tanenbaum, Computer Networks. Prentice Hall, Inc., 1996.

[16] H. Liu, X. Jia, P. J. Wan, X. Liu and F. F. Yao (2007), “A Distributed and Efficient Flooding Scheme Using 1-Hop Information in Mobile Ad Hoc Networks”, IEEE Trans . on Parallel and Distributed Systems, vol. 18, no. 5, pp. 658-671.

[17] Vincent D. Parl and M. Scott Corson (1998), “A Performance Comparison of the Temporally-Ordered Routing Algorithm and Ideal Link-State Routing”, In Proceedings of IEEE Symposium on Computers and

Một phần của tài liệu Khảo sát truyền dữ liệu bằng flooding có kiểm soát trong mạng di động AD-HOC (Trang 48)

Tải bản đầy đủ (PDF)

(77 trang)