• 沒有找到結果。

3. 系統設計與實作

3.1 NCTU NS 網路模擬器帄台介紹

NCTUns 網路模擬器是一套用來模擬不同網路型態的模擬器,目前已支援的網路型 態包括 WiMAX (IEEE 802.16d PMP/Mesh,IEEE 802.16e,IEEE 802.16j)、IEEE 802.11 a/b/p、GPRS、Ethernet、DVB-RCS 等,其具有三大特點:(1) 結合真實世界的網路協定 堆疊(TCP/IP 或 UDP/IP)進行模擬,以得到更真實的模擬結果。(2) 允許真實世界的應用 程式在模擬器上運作,例如 VLC、P2P 軟體等。(3) 高度整合的圖形化介面(Graphical User Interface;GUI),讓使用者操作更方便且設置模擬環境更加容易。

模擬器的組成主要分為三大部分:(1) 圖形化使用者介面、(2) 模擬引擎、(3) 修改 過的系統核心。圖形化使用者介面提供了一個方便而簡單的模擬操作環境,使用者可以 藉由此工具輕鬆且任意的部屬網路拓樸並進行相關參數的設定,簡化了操作所需的時間;

模擬引擎是整個模擬系統的核心部分,其功能為模擬事件的建立、排程與執行、計時器

39

的管理與網路封包的組成並提供一套 API,作為在模擬器上實作網路協定模組的使用者 與 UNIX 系統核心進行溝通的介面。此外,模擬引擎裡還包含了眾多網路協定模組,

NCTUns 模擬器將網路協定模組化,不同的網路協定可以經由連結多個模組所構成,使 用者可以很方便地在 NCTUns 網路模擬器上增加新的網路模組,或修改目前模擬器中既 有的模組,並搭配其他網路模組來進行相關的模擬及研究;最後是關於修改過的核心的 部分,藉此才可讓真實世界的應用程式透過 socket 介面在模擬器上運作。

Host1 Switch Host2

Interface

Tunnel Interface Simulation Engine

socket

Tunnel Interface (tun2) socket

TCP/IP

User level

Kernel level Module-Based platform

圖 3-1 NCTUns 裡的模組堆疊架構

圖 3-1 顯示了在 NCTUns 網路模擬器裡,兩個 Host 節點透過一個 Switch 節點相連 時的模組堆疊架構。模擬器裡的 Host 具有一個有線網路的介面,其模組堆疊由上到下 分別是 Interface 模組、ARP 模組、FIFO 模組、802.3 模組、PHY 模組及 Link 模組等。

在此圖中,封包傳送方向是由 Host1 到 Host2,Host1 上執行的應用程式(Traffic Generator)

40

所送出的封包從應用層往下經過作業系統的傳輸層、網路層後送往 tunnel interface,此 時 Host1 的 Interface 模組會從 kernel 的 tunnel interface 抓取封包。封包進入 interface 後 再一路經過 ARP、FIFO 模組的處理往下送至 Link 模組,這是傳送端的角度來看。若是 以接收封包的角度來看,Host2 接收由 Link 傳送過來的封包,會先到達 PHY 模組,再 經由 802.3 模組往上層遞交,直到該封包被接收完畢。底下將近一步說明模組的基本架 構以及封包如何在模組間傳遞。

NslObject - char *name_

- u_int32_t nodeID_

- u_int32_t portid_

- u_int32_t nodeType_

+ NslObject(U_int32_t, u_int32_t, struct plist*, char *) + NslObject()

+ ~NslObject() + int init()

+ int recv(ePacket_ *) + int send(ePacket_ *)

+ int get(ePacket_ *, MBinder *) + int put(ePacket_ *, MBinder *) + int put1(ePacket_ *, Mbinder *) + int command(int argc, char *argv[]) + void set_port(u_int32_t portid) + u_int32_t get_port()

+ char * get_name() + u_int32_t get_nid() + u_int32_t get_type()

圖 3-2 Nslobject class 定義

NslObject 是 NCTUns 網路模擬器中最基本的類別,如圖 3-2 所示,所有實作的模組 都必頇繼承這個類別,並可依照個別模組的功能與需求自行定義其中的函式。在此類別 中最重要的兩個函式是 send()與 recv(),兩者代表不同的傳遞方向,如圖 3-3:send()是 將封包往下一個模組傳遞;recv()則是收到封包時由底層往上層的模組傳遞。例如圖 3-1 中,當封包要從 Host1 傳遞到 Host2 時,Host1 的 Interface 模組會呼叫 send()並利用 put() 將封包傳遞至下一個模組即 ARP,而 ARP 模組會在 send()函式收到封包並繼續往下層

41

丟,以此順序,最後在 Host1 的 Link 模組呼叫 send()才算走完傳送端的流程。另一方面,

Hos2 最底層的 Link 模組會先被呼叫,接著利用 put()將封包送至下個目標,即 PHY 模 組,PHY 再呼叫 recv()將封包往上傳遞,依此順序,最後封包將到達 Host2 的 Interface 模組並將封包導入 kernel 的 tunnel interface 再藉由 Host2 應用層的 traffic generator 接收 端將封包收上來。

Module 1

Module 2 int recv(Event_ *)

Module 3

int send(Event_ *)

int recv(Event_ *) int send(Event_ *)

int recv(Event_ *) int send(Event_ *)

圖 3-3 模組間封包的傳遞架構