• 沒有找到結果。

NS2 資料傳輸模組的設計

在文檔中 中 華 大 學 (頁 37-47)

由於本研究是針對 NS2 的應用層上傳送真實資料為目的,故在我們能力所 及的範圍中,蒐集觀察的研究文獻裡,僅針對 NS2 上的應用層及代理層提出討 論,下面我們會先將認為過往研究所不足與缺少的部份提出,然後提出改進的方 式去彌補我們認為過往研究所缺乏的部份。

第一節  過往研究的討論 

關於針對 NS2 應用層上的研究,我們在前面的章節有提過,因為 NS2 的應 用層只有單純的提供一個固定的封包流量,例如 512KB、1024KB 的封包,讓研 究人員透過這些流量去觀測網路的變化情形,從而能發展出更多有效益的網路協 定與功能。但是時至今日,隨著網路的發展,各種的應用議題也越來越被重視。

舉例來說,在行動隨意網路中,有部份的研究是針對在每一個行動節點上所擁有 的資料去做交換,因為我們在前面有提過,每一個行動節點本身的電力、記憶體 都是有限的,而行動節點所需要的資訊則是會不停的變動。所以如何在有限制的 情況下使每一個行動節點儘量得到所需要的資訊,並且儘量降低所消耗的電力,

藉此增加每一個行動節點的壽命,或是提高行動隨意網路的服務品質。而此類的 研究就必須要有真實的資料在行動節點間傳遞,才能得到較符合現實的結果,但 因為 NS2 本身設計上的限制,使得要在現有的架構下,使用完整的應用層、代 理層及節點連節層這三層來傳送真實資料是有困難的,因此過往的研究大部份都 是捨棄掉應用層這一部份的分層,只使用代理層與節點連結層,並直接在代理層 上面建立一個符合自己研究需求的代理層與封包結構,且將所需要傳遞的資料放 入自訂的封包中,來執行研究者本身想達成的模擬方式,下面我們會介紹是如何 在 NS2 上自訂代理層與封包格式的過程,在下文我們稱一個新的自訂代理層為 ExAgent。

建立 ExAgent 協定:

(1) 自訂 ExAgent 之封包結構

圖 3-1 exagent 所需封包格式

由於此範例之目的,希望得到節點之間的回應時間,並傳送資料。因此在自 訂的封包格式中,需紀錄時間、行動節點狀態的資訊與所想要傳送的資料。圖 3-1 中,我們將 ExAgent 的封包結構較重要的部份提出來介紹,可以看見 Send_time 為紀錄發送端傳送要求回應的時間,State 則為紀錄封包狀態的資訊,

為 0 或 1 的判斷值;Data 是紀錄欲傳送的資料;系統時間則可由 NS2 中的 Scheduler::instance().clock()函式取得,若 state 為 0 時,則表示該封包為要求回應 之封包,而 state 為 1 時,則表示該封包為目的端回應封包。而且由於此封包為 自訂封包,在 NS2 中無法直接使用;因此為了提供 NS2 其他內建元件可以使用 此 自 訂 封 包 格 式 , 因 此 必 須 給 予 一 個 可 供 NS2 專 門 做 封 包 管 理 的 類 別 PacketManager 存取的地方。故必須於自訂封包內加入 offset_參數,並經由 Packet::access()函式取得自訂封包內的資料,包含封包大小、IP 位置等。

  Send_time State Data   ………….. 

(2) 繼承 Agent 建立 ExAgent 類別

圖 3-2 繼承 agent 類別

在 class Agent 的類別圖中,我們舉例了幾個成員函數例如像 send()、

sendto()、sendmsg()、command()等,Agent 為建立代理層協定的父類別,因此當 想要建立新的代理層協定時,必須繼承該物件,才能夠順利運作,如圖 3-2 所示,

其中 command()是最重要的部份,用來撰寫此 Agent 會透過 TCL 下達的指令執 行什麼樣的動作,例如傳送一個封包。

send() sendto() sendmsg() command()

send() sendto() sendmsg() command()

<<Inherits>>

Agent

ExAgent

(3) 自訂封包表頭命名

圖 3-3 自訂封包表頭命名

圖 3-3 中 PacketHeaderClass 為 NS2 中管理封包表頭的一個類別,因此我們 必須給予該封包表頭一個名稱 PacketHeader/EX,並標明其繼承類別,才能使用 自訂的封包表頭去存取封包內的資訊。

init()  alloc()  allocdata()  free() 

init() alloc() allocdata() free()

PacketHeader/EX

<<Inherits>>

PacketHeaderClass

ExHeaderClass

(4) 使用 ExAgent 中傳送封包

圖 3-4 為接收並執行由 TCL 中下達之命令。當我們對 TCL 物件下達 send() 指令時,該 send()指令會送到物件的 command()此函式中進行處理。當接收到 send()指令時,會先配置記憶體位置給封包,並將各種所需資訊寫入自訂的封包 格式中,在此我們將先前建立的自訂封包的三個主要數值提出說明,首先 Send_time 使用 NS2 中的 Scheduler::instance().clock()取得目前系統時間,我們假 設系統時間為 1,其次因為這是一個要求回應的封包,因此 State 的值為 0,最後 將我們想要傳送的資料 realdata 存入 Data 中並一併寫入封包中,完成上述封包建 立動作後,最後將封包再透過 ExAgent 中的 send()傳送出去;若以上動作皆成功 時,則回傳一個 TCL_OK 訊息。

TCL

ExAgent send

command()

Send_time=1 State=0 Data=realdata   ………….. 

send()

圖 3-4  傳送封包 

(5) ExAgent 中接收封包

在代理層 ExAgent 中,另一個重要的成員函數為 recv(),我們在此函式中處 理接收到封包的動作。首先我們先擷取出所需的封包中的資料進行判斷。我們先 判斷接收到的封包為何種型態,此自訂封包的狀態有兩種,一是要求回應,一是 接收回應。圖 3-5 為當接收端收到 state = 0 的封包時,它就會將封包內的時間紀 錄下來,且將來源端所傳送的資料紀錄下來,並將此時間紀錄寫入一個新的封包 中,而 state 也改寫成 1,再利用 send()傳回來源端。

Send_time=1 State=0 Data=realdata   ………….. 

ExAgent

command()

recv()

Data=realdata Time=1

  Send_time=Time State=1 Data   ………….. 

send()

圖  3-5  接收封包(1)

圖 3-6 為當來源端收到封包時,同樣也去檢查 state 的狀態,當它發現 state 為 1 時,則可以得知該封包為目的端處理過後的封包;recv()在詢問系統時間後,

在此我們假設系統時間為 2,將其減去由自訂封包內所取得的時間紀錄,即可得 到目的端的回應時間為 1。

ExAgent

command

recv()

Send_time=1 State=1 Data   ………….. 

System time=2

Response time

=System time-Send_time

=1

圖 3-6  接收封包(2)

經由上述的描述,我們可以得知新增一個新的代理層是要經過相當多的步 驟,而且上述僅僅只有一個簡單的傳送真實資料與計算回應時間,如果是要實現 研究人員所想要的更精細的想法,勢必要增加更多的程式才能達成。而且每一個 代理層都是只針對研究人員的一個想法來執行,如果需要其它的方法來進行 NS2 的實驗,則又必須重新再新增一個代理層。這樣在我們看來是非常沒有效率的一 件事,因為針對一個議題就必須建立一個新的代理層,且還必須對新增的代理層 再建立想要的新的封包格式,重點是這些新增的物件並不是 NS2 本身所已經根 據現有的代理層,如 TCP、UDP 等去建立,而且也將應用層與代理層直接合併 為同一層,在 NS2 的模擬中,只剩下代理層與節點連結層此兩個分層,因此一 些細節的設定,舉例來說:行動節點的電力消耗、代理層的通訊的認定等,所以 透過自訂代理層所表現出來的實現結果是不是真的貼近現實,是讓我們存有疑問 的地方。

因此,在下面我們會先介紹資料傳輸的基本 TCL 命令,再針對上述的問題,

在 NS2 現在有的架構下,以完整的三層架構,包含應用層、代理層與節點連節 層去做真實資料的傳送,並且使用在 NS2 中已經定義的 TCP、FullTCP 為代理層,

以期能夠達到更貼近現實的結果。

第二節  資料傳輸 TCL 命令 

在這個部份我們會解說五個主要的 TCL 命令在資料傳輸上的實現。

(1) $application attach-agent $agent:此 TCL 命令主要的作用是在於將應用層與代 理層兩方面透連結起來,以便應用層傳輸資料時能順利的將所想要傳送的資 料給予代理層去執行處理。如果沒有此 TCL 命令,那麼應用層便無法透過 代理層將資訊傳送出去,進而造成錯誤。

(2) $application start:透過應用層所下達的 start 是一會直傳送相同大小的封包流

量,直到系統模擬的時間結束或是下達 stop 指令時才會停止傳輸資料封包。

(3) $application stop:在資料傳輸中,用來停止上述 start 所不斷產生的流量,因 為 start 只有在系統模擬時間結束時才會停止傳輸流量。因此若要在系統模 擬時間結束前預先停止透過 start 所產生的流量,就並需使用 stop。

(4) $application send $size:這個 TCL 命令亦是傳輸資料封包流量的一個 TCL 命 令語法,但與 start 不同的是,此 TCL 用於資料傳輸上只會傳輸一次的資料 封包流量,比如說我們想要傳輸一個 100KB 大小的封包,就只需要將 size 的地方設定成 100 便能達成。

(5) $application sendto $size $data $node:此 TCL 命令在資料傳輸上是一個我們 所建立的全新的命令,除了保有 start 與 send 的傳輸資料封包流量的功能外,

在前面的章節有提過,NS2 的只能傳輸空有流量的封包。因此此 TCL 命令 還能指定所要傳送的對象行動節點與傳送真實資料,達成所想要傳送真實資 料的概念。

在下面兩個小節,我們會針對 NS2 中現有應用層與代理層去做描述,並且 說明我們是如何新增應用層。同時結合 NS2 現有的代理層,TCP 與 FullTCP 去 達成真實資料的傳送。新增應用層並不會對我們所想得知的行動節點資訊,如電 力消耗有所影響,因為這些數據都是透過代理層中的協定與節點連結層去做計 算,因此之後如果欲使用我們所新增的應用層來研究如合作快取、資料重置等等 的議題,只需要在針對 TCL 上對該應用層下達所設計之想要嘗試的方法,便能 達成,而不需要在像上一小節那樣新增一連串的自訂協定。

第三節  資料傳輸模組應用層的設計 

在 NS2 中既有的應用層,我們在第二章介紹 NS2 時已經提過主要分為:Traffic Generators、Simulated Application 兩大類。不論是 Traffic Generators 或是 Simulated Application,都僅是傳送只有流量的封包,而並非傳送真實的資料,因此下面會 闡述我們如何在新增應用層,以下稱為 ecapp,來達成傳送真實資料的概念。

NS2 中不論是應用層或是代理層都有一個父類別,此類別包含了一些基本的 成員函數,任何繼承它的子類別都能直接去使用,而我們所建構的 eacpp 類別就 是從應用層父類別中去衍生出來,如圖 3-7 所示。

舉例來說,我們的 ecapp 繼承了父類別中的幾 send、start、stop 幾個函式,send圖  3-7  application 繼承 

應用層 

ecappClass

send()  start()  stop() 

Agent *agent  send() 

start()  stop() 

Agent *agent 

<<Inherits>>

ApplicationClass

例如說我們想在 1.0 秒時送出一個 512kb 的封包就能使用 send()這個成員函式,

而 start()則是當想要不停的傳送封包,用以測試類似網擁塞程度控制時,可以使 用 start()並輸入參數-1,那麼 NS2 就會從開始執行 start()的時間傳送封包流量,

直到模擬結束;stop 則是能停止所有流量的傳輸。Agent *agent 則是連結應用層 和代理層的一個重要成員資料,我們在下一節提到代理層時會解說。

由於一開始的 Application 只有單純的提供 send()此成員函數功能,所以我們 只能傳送一個單純的封包流量,而不能指定要傳什麼樣的資料內容及傳送給那一 個行動節點。圖 3-8 為我們所新增的 ecapp 及其成員函數與成員資料。

圖  3-8  ecapp class 

在文檔中 中 華 大 學 (頁 37-47)

相關文件