第四章 可容錯的警告訊息廣播機制之系統實作
4.1 NS2 模組介紹
圖 4-1:NS2 各階層模組架構圖
如圖 4-1 所示,在 NS2 中主要分成四個階層 application layer (AGT)、routing layer (RTR)、
MAC layer (MAC)及 PHY layer (PHY),application layer 提供了不同的應用,如 Ping 及 PBC agent;另外,NS2 將 TCP、UDP、FTP 及 SCTP 歸類成 application layer 上的應用;routing layer 提供了不同的 routing protocol,如 AODV、DSR、DSDV 及 NOAH 等路由協定;在 MAC 及
50
PHY 中,NS2 也分別提供了不同的模組,讓使用者能夠針對不同情境進行模擬實驗。由於 NS2 中,各階層只提供了基本的模組,若使用者想要在 NS2 中模擬客製化的方法,那麼就必須針 對各個階層的協定進行修改。由於本論文所提出的 FTBP 及 FNFP,並不在 NS2 所提供的基本 模組內。因此,我們必須針對 NS2 的模組進行修改,以實作出 FTBP 及 FNFP。
為了實作本論文所提出的方法,我們透過 NS2 的 application layer (AGT)進行修改,也就 是透過 application layer 撰寫出 agent。NS2 中的 agent 主要負責 packet 發送及接收,也就是 packet 的起始點與終點站,我們可以在 agent 中撰寫程式,並輕易的在模擬環境中安排及調度 packet。
簡單來說,我們可以將 NS2 的 agent 想像成 application layer 內的應用程式,我們可以將所提 出的方法,撰寫於 agent 上,接著利用 TCL 腳本程式來設置模擬環境,將模擬環境中的節點安 裝上我們所撰寫的 agent,就能順利在 NS2 中進行模擬實驗。
4.1.1 PBC Agent 簡介
NS-2.34 中提供了 PBC agent (apps/pbc.cc 及 apps/pbc.h)。PBC agent 提供了簡單的訊息廣 播、訊息接收及訊息調度的功能,這與本篇論文所要撰寫的廣播機制大致吻合;因此,我們以 NS-2.34 所提供的 PBC agent 為範例,利用 PBC agent 來撰寫本論文所提出的 Fault-Tolerant Broadcast Protocol (FTBP agent)及 Farthest Node First Protocol(FNFP agent)。在介紹 FTBP agent 及 FNFP agent 各個 function 前,我們將先簡單的介紹 PBC agent 是如何在 NS2 中進行廣播的。
圖 4-2 為 PBC agent 的 singleBroadcast(),它提供了簡單的廣播方法。在程式的最一開始,
先透過第 3 行的 allocpkt()在記憶體中建立一個新的封包結構。接下來,在第 4~6 行中,利用 access()來取得存取 header 的指標,我們可以利用指標的方式存取封包內的 header,如第 4~6 行中,分別利用 cmnhdr、pbchdr 及 iphdr 指標來存取 MAC 的 header、PBC 的 header 及 IP 的 header。接下來,在分別於各個 header 中的欄位填入所需的值,如第 8 行中,在 MAC header
51
中的 next hop (cmnhdr->next_hop())欄位填入 IP_BROADCAST,以便進行廣播。接下來,針對 IP header 的各個欄位分別填入所需的值,如第 11~13 行,分別在 source address (iphdr->src_.addr_) 填入節點本身的 ID number;在 destination address (iphdr->dst_.addr_)填入 IP_BROADCAST;
以及在 destination port (iphdr->dst_.port_)中,填入目的地位址的 port number。最後,透過第 17 行的 send(pkt,0),將該封包往下層送;依這樣的方式,就可以在 NS2 的 agent 完成簡單的訊息
008: cmnhdr->next_hop() = IP_BROADCAST;
009: cmnhdr->size() = size;
010:
011: iphdr->src_.addr_ = here_.addr_;
012: iphdr->dst_.addr_ = IP_BROADCAST;
013: iphdr->dst_.port_ = this->port();
014: pbchdr->send_time = scheduler::instance().clock();
015: …
52
Packet::free(),直接將封包丟棄。
001:void PBCAgent::recv(Packet* pkt, Handler*) 002:{
003: Packet::free(pkt);
004:}
圖 4-3:recv()