Các chức năng mô phỏng chính của NS-2

Một phần của tài liệu (LUẬN văn THẠC sĩ) đánh giá về an toàn giao thức định tuyến trong mạng manet phonesavanh phongsenpheng (Trang 46)

* Đối với mạng có dây:

- Hỗ trợ các đường truyền điểm - điểm đơn công, song công, mạng cục bộ LAN. - Hỗ trợ các nguồn sinh lưu lượng với một số phân bố khác nhau.

- Hỗ trợ một số chính sách phục vụ hàng đợi. - Hỗ trợ một số mô hình sinh lỗi điển hình.

- Hỗ trợ nghiên cứu vấn đề định tuyến đơn hướng/đa hướng (Unicast/Multicastrouting).

- Hỗ trợ các giao thức tầng giao vận: TCP/Tahoe/Reno/New- Reno/Sack/Vegas, UDP, điều khiển lưu lượng và điều khiển tắc nghẽn.

- Hỗ trợ một số giao thức tầng ứng dụng, web caching và truyền luồng dữ liệu đa phương tiện.

* Đối với mạng không dây:

Ngoài phần lớn các chức năng mô phỏng trên, NS-2 còn có khả năng: - Hỗ trợ việc di chuyển của các nút mạng trong không gian hai chiều. - Hỗ trợ mạng LAN không dây (WLAN) 802.11.

- Hỗ trợ Mobile IP.

- Hỗ trợ một số giao thức định tuyến trong mạng không dây đặc biệt MANET: AODV, DSDV, DSR, TORA...

- Hỗ trợ liên mạng sử dụng vệ tinh (Satellite Networking).

* Trong lĩnh vực mạng hỗn hợp có dây và không dây:

- Hỗ trợ các trạm cơ sở đóng vai trò cổng chuyển giữa mạng có dây và mạng không dây.

- Hỗ trợ Snoop TCP.

3.2.4. Thiết lập mô phỏng mạng MANET trong NS-2

Mô hình không dây chủ yếu bao gồm nút di động (MobileNode) ở lõi, với các đặc điểm hỗ trợ mở rộng cho phép mô phỏng các mạng MANET, mạng không dây… Đối tượng MobileNode là một đối tượng tách biệt. Lớp MobileNode được thừa kế từ lớp cha Node trong C++. Do đó lớp MobileNode là đối tượng Node cơ bản với các chức năng thêm vào của nút không dây và di động như là khả năng di chuyển trong hình trạng mạng cho trước, khả năng nhận và truyền các tín hiệu tới và từ kênh không dây. Trong mục này chúng ta sẽ mô tả các thành phần bên trong của MobileNode bao gồm các kỹ thuật định tuyến, việc tạo ngăn xếp mạng cho phép truy cập kênh trong MobileNode, mô tả ngắn gọn của mỗi thành phần ngăn xếp, hỗ trợ dò vết và tạo ra các ngữ cảnh di chuyển/lưu lượng cho mô phỏng không dây.

* Nút di động:

Nút di động (MobileNode) là một đối tượng ns Node cơ bản với các chức năng mở rộng như sự di chuyển, khả năng truyền và nhận trên kênh mà cho phép nó có thể sử dụng để tạo sự di động trong các môi trường mô phỏng không dây. Các đặc điểm di động bao gồm việc di chuyển nút, các cập nhật vị trí định kỳ, bảo đảm đường biên của hình trạng mạng được

38

thực thi trong C++ trong khi các thành phần mạng trong bản thân MobileNode (như bộ phân loại, dmux, LL, Mac, Channel…) lại được thực thi trong Otcl. Các hàm và thủ tục được mô tả dưới đây có thể tìm thấy trong ~ns/common/mobilenode.{cc,h}, ~ns/tcl/lib/ns- mobilenode.tcl, và ~ns/tcl/mobility/aodv.tcl. Các kịch bản ví dụ có thể tìm thấy trong

~ns/tcl/ex/wireless-test.tcl và ~ns/tcl/ex/wireless.tcl.

Giao thức định tuyến mạng không dây được hỗ trợ trong NS-2 bao gồm AODV, DSDV, DSR và TORA. Việc tạo các nút di động phụ thuộc vào giao thức định tuyến được sử dụng. Hiện nay NS-2 hỗ trợ API tạo nút di động được mô tả như sau:

$ns_ node-config -adhocRouting $opt(adhocRouting) \ -llType $opt(ll) \ -macType $opt(mac) \ -ifqType $opt(ifq) \ -ifqLen $opt(ifqlen) \ -antType $opt(ant) \ -propType $opt(prop) \

-propInstance [new $opt(prop)] \ -phyType $opt(netif) \

-channel [new $opt(chan)] \ -topoInstance $topo \

-agentTrace ON \ -routerTrace ON \ -macTrace ON \

API ở trên cấu hình cho nút di động với tất cả các giá trị của giao thức định truyến trong MANET như ngăn xếp mạng, cấu trúc mạng, mô hình kênh truyền. Tiếp đến chúng ta tạo các nút di động như sau:

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

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

Thủ tục trên tạo ra các đối tượng nút di động, tạo tác tử định tuyến mạng MANET, tạo ngăn xếp mạng bao gồm lớp liên kết, hàng đợi, lớp MAC và giao diện mạng với ăng

ten, sử dụng mô hình truyền thông được định nghĩa, kết nối các thành phần và kết nối ngăn xếp vào kênh.

* Quy trình mô phỏng mạng MANET với NS-2:

Quá trình mô phỏng mạng MANET với bộ mô phỏng NS-2 [1] thông thường trải qua các bước như sau trong việc xây dựng tệp kịch bản:

- Tạo bộ lập lịch các sự kiện + Tạo bộ lập lịch

set ns_ [new Simulator]

+ Lập lịch sự kiện

$ns at <time><event>

+ Khởi động bộ lập lịch

$ns run

- Ghi lại vết các sự kiện của mạng mô phỏng

+ Dò vết các gói tin trên tất cả các liên kết, xuất ra tệp traceout.tr

$ns trace-all [open traceout.tr w]

+ Dò vết các gói tin trên tất cả các liên kết, xuất ra định dạng dùng trong NAM

$ns namtrace-all [open traceout.nam w]

+ Cũng có thể dò vết một số tham số, ví dụ:

$ns trace-queue $n0 $n1 $ns nam trace-queue $n0 $n1

- Thiết lập mạng mô phỏng + Thiết lập tô-pô mạng

set topo [new Topography]

$topo load_flatgrid $val(x) $val(y) # Create God

create-god $val(nn)

- Cấu hình nút di động + Cấu hình nút di động

$ns_ node-config -adhocRouting $val(rp) \ -llType $val(ll) \

-macType $val(mac) \ -ifqType $val(ifq) \

40 -ifqLen $val(ifqlen) \ -antType $val(ant) \ -propType $val(prop) \ -phyType $val(netif) \ -topoInstance $topo \ -agentTrace ON \ -routerTrace ON \ -macTrace ON \ -movementTrace ON \ -channel $chan_1_

+ Thiết lập vị trí ban đầu

$node_(0) set X_ 1.0 $node_(0) set Y_ 3.0 $node_(0) set Z_ 0.0 $node_(1) set X_ 4.0 $node_(1) set Y_ 6.0 $node_(1) set Z_ 0.0

+ Thiết lập sự di chuyển cho các nút di động ta dùng

$ns_ at 10.0 “$node_(0) setdest 20.0 10.0 15.0”

- Tạo ra các nguồn sinh lưu lượng + Tạo lưu lượng

set udp_(0) [new Agent/UDP]

$ns_ attach-agent $node_(0) $udp_(0) set null_(0) [new Agent/Null]

$ns_ attach-agent $node_(1) $null_(0) set cbr_(0) [new Application/Traffic/CBR] $cbr_(0) set packetSize_ 512

$cbr_(0) set interval_ 4.0 $cbr_(0) set random_ 1 $cbr_(0) set maxpkts_ 10000 $cbr_(0) attach-agent $udp_(0) $ns_ connect $udp_(0) $null_(0)

$ns_ at 158.7047093914378 “$cbr_(0) start"

+ Việc tạo lưu lượng có thể lấy từ tệp sinh lưu lượng của công cụ có sẵn cbrgen trong bộ mô phỏng NS-2.

3.3. Cài đặt bổ sung các giao thức

Trong phiên bản NS-2.35 đã hỗ trợ các giao thức định tuyến trong mạng MANET như AODV, DSDV, DSR,… Tuy nhiên, không hỗ trợ sẵn giao thức

mô phỏng lỗ đen, chống tấn công lỗ đen như IDSAODV và RAODV. Luận văn dựa trên ý tưởng và mã nguồn của tác giả Semih Dokurer, nhóm tác giả Chonggun Kim, Elmurod Talipov và Byoungchul Ahn, thông qua việc nghiên cứu cụ thể các mã nguồn trên cũng như tham khảo rất kỹ trong tài liệu [8] để tiến hành cài đặt các giao thức định tuyến mới. Quá trình cài đặt cụ thể như sau:

3.3.1. Cài đặt giao thức blackholeAODV mô phỏng tấn công lỗ đen

Việc cài đặt giao thức blackholeAODV chỉ là chỉnh sửa lại của giao thức gốc AODV. Trong đó chỉ thay đổi hành vi của nút trung gian đóng vai trò nút độc hại sửa đổi gói tin RREP để chiếm quyền điều khiển tuyến, thực hiện loại bỏ gói tin.

- Thứ nhất, chỉnh sửa tệp “\tcl\lib\ns-lib.tcl”, đây là nơi chứa các thủ tục khai báo các giao thức. Khi node sử dụng giao thức blackholeAODV, agent này sẽ được lập lịch để bắt đầu quátrình mô phỏng và nó được gán thuộc tính của agent này cho những nút sẽ sử dụng giao thức blackholeAODV

-Thứ hai, tập tin được điều chỉnh là “/makefile” trong thư mục gốc “ns- 2.35”. Thêm các dòng mã như sau:

blackholeAODV {

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

Simulator instproc create-blackholeaodv-agent { node } { set ragent [new Agent/blackholeAODV [$node node-addr]] $self at 0.0 "$ragent start" # start BEACON/HELLO Messages $node set ragent_ $ragent

return $ragent }

42

Cho tới lúc này, về mặt hình thức đã tạo xong giao thức định tuyến mới blackholeAODV. Tuy nhiên về bản chất để nó thực hiện đúng cơ chế loại bỏ gói tin như mong muốn cần phải tiến hành sửa đổi cơ chế làm việc của ciao thức AODV trong tệp blackholeaodv.cc. Hành vi của các nút được giải thích cụ thể như sau:

Khi một gói tin được nhận bởi hàm “recv” trong tệp “aodv/aodv.cc”, nó xử lý gói tin tùy theo loại gói tin này. Nếu gói tin là một trong số các gói thông tin điều khiển quá trình định tuyến AODV, nó sẽ gửi gói tin tới hàm “recvAODV” được giải thích ở dưới. Còn nếu gói tin nhận được là gói dữ liệu, thì theo thông thường nó sẽ được chuyển tới đích, nhưng với hành vi của nút lỗ đen nó sẽ loại bỏ toàn bộ gói tin mà không cần thiết với nó. Trong đoạn mã dưới đây, điều kiện if đầu tiên xử lý quá trình nhận dữ liệu nếu đúng là địa chỉ đích, điều kiện else nút độc hại sẽ loại bỏ toàn bộ dữ liệu nhận được. Đoạn mã như sau:

Trường hợp gói tin là một trong số các gói thông tin điều khiển định tuyến AODV, hàm “recv”sẽ gửi chúng tới hàm“recvblackholeAODV”. Tại đây hàm này sẽ kiểm tra loại của gói tin điều khiển AODV và dựa trên loại gói tin đó sẽ gửi chúng đến các hàm tương ứng bằng câu lệnh case. Ví dụ, nếu gói tin là RREQ sẽ được gửi đến hàm “recvRequest”, nếu là gói RREP sẽ được gửi tới hàm “recvReply”. Đoạn mã như sau

if ((u_int32_t)ih->saddr() == index)

forward((blackholeaodv_rt_entry*) 0, p, NO_DELAY); else

Trong đó chú ý tới hành vi của nút lỗ đen thông qua hàm xử lý gói tin RREQ để trả lời gói tin giả mạo RREP. Nút độc hại cố gắng đánh lừa các nút gửi bằng gói RREP của mình với giá trị của số SN được gán giá trị cao nhất 4294967295 và hop count gán bằng 1. Giá trị cụ thể của gói tin sai RREP được minh họa dưới đây:

Sau khi thực hiện những thay đổi trên, tiến hành biên dịch lại NS-2 để tạo các đối tượng tệp.

3.3.2. Cài đặt giao thức IDSAODV làm giảm ảnh hưởng tấn công lỗ đen

Để cài đặt giải pháp IDSAODV, phải tiến hành thay đổi hàm nhận gói RREP (recvReply) và tạo cơ chế bộ đệm gói tin RREP để đếm số gói tin RREP thứ hai. Cụ thể như sau:

Cơ chế bộ đệm gói RREP được tạo thành với các hàm chức năng: “rrep_insert” có chức năng lưu đệm gói RREP, “rrep_lookup” có chức năng tìm kiếm bất kỳ gói RREP nếu nó tồn tại, “rrep_remove” loại bỏ tuyến đường với RREP đến từ nút được xác định và “rrep_purge” có chức năng xóa định kỳ từ danh sách những gói

case AODVTYPE_RREQ: recvRequest(p); break; case AODVTYPE_RREP: recvReply(p); break; case AODVTYPE_RERR: recvError(p); break; case AODVTYPE_HELLO: recvHello(p); break; default:

fprintf(stderr, "Invalid blackholeAODV type (%x)\n", ah>ah_type); exit(1);

sendReply(rq->rq_src, // IP Destination 1, // Hop Count index, // Dest IP Address

4294967295, // Highest Dest Sequence Num MY_ROUTE_TIMEOUT, // Lifetime

44

tin RREP đã hết hạn. Ở đây chọn thời gian hết hiệu lực (BCAST_ID_SAVE) đối với gói tin RREP trùng với thời gian hết hiệu lực trong giao thức AODV là 3s. Đoạn mã dưới đây mô tả cơ chế bộ đệm gói tin RREP

Ids

AODV::rrep_insert(nsaddr_t id) {

idsBroadcastRREP *r = new idsBroadcastRREP(id); assert(r);

r->expire = CURRENT_TIME + BCAST_ID_SAVE; r->count ++; LIST_INSERT_HEAD(&rrephead, r, link); } idsBroadcastRREP * idsAODV::rrep_lookup(nsaddr_t id) { idsBroadcastRREP *r = rrephead.lh_first; for( ; r; r = r->link.le_next) { if (r->dst == id) return r; } return NULL; } void idsAODV::rrep_remove(nsaddr_t id) { idsBroadcastRREP *r = rrephead.lh_first; for( ; r; r = r->link.le_next) { if (r->dst == id) LIST_REMOVE(r,link); delete r; break; } }

Tiếp đến là sửa đổi hàm recvReply, đầu tiên là việc kiểm soát nếu gói tin RREPđến cho chính nó thì chức năng “rrep_lookup” được gọi tới nếu gói tin được nhận, ngược lại chức năng “rrep_insert” được gọi để chèn các gói RREP cho các đích tương ứng của nó. Nếu gói tin RREP đã được lưu trước đó cho cùng địa chỉ đích thì chức năng RREP thông thường sẽ được thực hiện. Nếu không có nghĩa là gói tin RREP được chuyển tiếp tới các hàng xóm thích hợp của nó. Đoạn mã dưới đây cho thấy chức năng hen gói tin RREP của IDSAODV được thực hiện.

void

IdsAODV::rrep_purge() {

idsBroadcastRREP *r = rrephead.lh_first; idsBroadcastRREP *rn;

double now = CURRENT_TIME; for(; r; r = rn) { rn = r->link.le_next; if(r->expire <= now) { LIST_REMOVE(r,link); delete r; } } } idsAODV::recvReply(Packet *p) { idsBroadcastRREP * r = rrep_lookup(rp->rp_dst); if(ih->daddr() == index) { if (r == NULL) { count = 0; rrep_insert(rp->rp_dst); } else { r->count ++; count = r->count; }

UPDATE ROUTE TABLE } else {

Forward(p); }

46

Sau khi tất cả thay đổi kết thúc, tiến hành biên dịch lại tất cả các tệp trong phần mềm NS-2.

3.3.3. Cài đặt giao thức RAODV làm giảm ảnh hưởng tấn công lỗ đen

Việc cài đặt giao thức RAODV được thực hiện trong tệp tin raodv.cc. Cụ thể như sau:

Khi nhận được 1 RREQ, RAODV sẽ kiểm tra số SN để xác định đây là một tuyến đường có hiệu lực đến nút đích.

Trước khi gửi lại R-RREQ, tiến hành kiểm tra xem nút nhận có phải là nút đích hay không. Nếu đúng sẽ sử dụng sendReverse() để quảng bá R-RREQ cho các nút hàng xóm với dữ liệu vào là thông tin của nút nhận

Với RAODV sẽ có hàm recvReverse() để nhận và xử lý R-RREQ. Vì RRREQđược quảng bá nên trước hết cần tiến hành kiểm tra xem gói tin vừa gửi

có xuất phát từ chính nút đó hay không. Trong khi ở AODV thì không cần thiết việc này

if (rq->rq_src_seqno > rt0->rt_seqno ) { rt0->pc_insert(ih->saddr());

if(rq->rq_dst == index) // Kiểm tra node nhận được có phải nút đích hay không { seqno = max(seqno,rq->rq_dst_seqno) + 1; if (seqno%2) seqno++; sendReverse(rq->rq_src); Packet::free(p); } void RAODV::recvReverse(Packet *p) { //struct hdr_cmn *ch = HDR_CMN(p); struct hdr_ip *ih = HDR_IP(p);

struct hdr_raodv_reply *rp = HDR_RAODV_REPLY(p); char suppress_reply = 0;

double delay = 0.0; raodv_rt_entry *rtc; raodv_rt_entry *rt0;

// Kiểm tra gói tin nhận được có phải xuất phát từ chính node đó if (rp->rp_src == index) {

Tiếp đến, đồng thời kiểm tra tuyến đường đến đã phải là tureen đích hay chưa. Nếu chưa sẽ thực hiện nghiệp vụ xem đây có phải là tuyến mới với số hop ngắn hơn không, đồng thời cập nhật lại route entry.

Sau đấy RAODV sẽ kiểm tra nếu message gửi đi đã từng nhận được hay chưa. Hủy nếu đã từng có, cập nhật thêm mới nếu chưa.

return; }

// Kiểm tra rt entry, nếu chưa có thì add vào route table rt0 = rtable.rt_lookup(rp->rp_src); if(rt0 == 0) { rt0 = rtable.rt_add(rp->rp_src); } if (rp->rp_dst != index) {

if ((rt0->rt_seqno < rp->rp_dst_seqno ) || route mới hơn (( rt0->rt_seqno == rp->rp_dst_seqno) &&

( rt0->rt_hops > rp->rp_hop_count ))) { rt0->rt_expire = max(rt0->rt_expire, (CURRENT_TIME+REV_ROUTE_LIFE));

rt0->pc_insert(ih->saddr()); // Update the rt entry

rt_update(rt0, rp->rp_dst_seqno, rp->rp_hop_count,ih->saddr(), max(rt0->rt_expire, (CURRENT_TIME + REV_ROUTE_LIFE)));

if (rt0->rt_req_timeout > 0.0 ) { //reset lại state của route

rt0->rt_req_cnt = 0; rt0->rt_req_timeout = 0.0; rt0->rt_req_last_ttl = rp->rp_hop_count; rt0->rt_expire=CURRENT_TIME + ACTIVE_ROUTE_TIMEOUT; } } }

// Kiểm tra nếu đã từng nhận được message này trước đó. Nếu có - hủy if (id_lookup(rp->rp_src, rp->rp_bcast_id)) {

Packet::free(p); return;

48

Nếu nút đến là đích thì cần xác định tuyến mới có phải xuất phát từ cùng một nút trước đó không. Cập nhật lại route entry trong bảng định tuyến.

Nếu không phải thì đây sẽ là một tuyến mới từ một nút đến khác nút trước đó. Thêm mới và cập nhật lại route entry trong bảng định tuyến

// Kiểm tra nếu đã từng nhận được message này trước đó. Nếu có - hủy if (id_lookup(rp->rp_src, rp->rp_bcast_id)) {

Packet::free(p); return;

//Xác định là route mới hơn hay không từ chính node trước đó

if ( (rt0->rt_seqno < rp->rp_dst_seqno ) || // route mới hơn ? (( rt0->rt_seqno == rp->rp_dst_seqno) &&

( rt0->rt_hops > rp->rp_hop_count )) && (rt0->rt_nexthop==ih- >saddr()) ) /* từ chính nút node trước đó */ {

//Tạo mới hoặc update route entry trong route table rt0->rt_expire = max(rt0->rt_expire,

(CURRENT_TIME+REV_ROUTE_LIFE)); // Update the rt entry

rt_update(rt0, rp->rp_dst_seqno, rp->rp_hop_count,ih->saddr(), max(rt0->rt_expire, (CURRENT_TIME + REV_ROUTE_LIFE)));

if (rt0->rt_req_timeout > 0.0 ) { rt0->rt_req_cnt = 0; rt0->rt_req_timeout = 0.0; rt0->rt_req_last_ttl = rp->rp_hop_count; rt0->rt_expire=CURRENT_TIME + ACTIVE_ROUTE_TIMEOUT; } rt0->rt_disc_latency[rt0->hist_indx] = (CURRENT_TIME - rp- >rp_timestamp) / (double) rp->rp_hop_count;

rt0->hist_indx = (rt0->hist_indx + 1) % MAX_HISTORY; rtable.order_routes(rp->rp_src);

//rt_print(rp->rp_src); //Print Source Node's Routing Table }

else if ((rp->rp_dst_seqno >= rt0->rt_seqno)) { // && (rtable.total_rts(rp- >rp_src)< 5)) {

rt0=rtable.rt_add(rp->rp_src);

rt_update(rt0, rp->rp_dst_seqno, rp->rp_hop_count,ih->saddr(), max(rt0->rt_expire, (CURRENT_TIME + REV_ROUTE_LIFE)));

Thay vì gửi lại một RREP trở lại nút nguồn như AODV thì giao thức RAODV tạo ra một gói reverse route request (R-RREQ) và quảng bá cho các nút lân cận giống

Một phần của tài liệu (LUẬN văn THẠC sĩ) đánh giá về an toàn giao thức định tuyến trong mạng manet phonesavanh phongsenpheng (Trang 46)

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

(89 trang)