• 沒有找到結果。

TCL 腳本與實驗範例:

在文檔中 中 華 大 學 (頁 70-78)

圖 4-14 tcl 中應用層的設定

在我們的範例中,以基本的三個行動節點來說明,故在圖 4-14 中,我們必 須建立三個行動節點所需要的三個應用層 ecapp,並將之使用 attach-agent 語法與 代理層連結。

圖 4-15 tcl 中代理層的設定

圖 4-15 為代理層的部份,分為 TCP 與 TCPSink,由於我們的模擬中有三個 行動節點,而在前面有提過一個 TCP 只能與一個 TCPSink 連結,因此一個行動 節點必需要有兩個 TCPSink 才能順利的跟其它兩個行動節點通訊。

最後我們在 TCL 的模擬語法為: $ns at 1.0 “$ecapp sendto 512 realdata 1 ”,下 面我們會對此語法做詳細的介紹。

$ns at 1.0 “$ecapp sendto 512 realdata 1 ”這是我們在此節主要用來說明實作 過程的一行 TCL 指令。在這個地方先對一些參數作解釋,$ns 是表示整個 Network Simulator2 整個的模擬環境變數,當我們需求 ns2 去執行動作,例如要使用 NS2 去傳送資料、連結代理層、連結行動節點等,都需要在最前面使用$ns 這個參數,

才能正確的執行。1.0 是代表在系統 1.0 秒的時間會執行後面的動作。$ecapp 是 我們自訂的應用層的變數,sendto 則是 ecapp 上的一個功能函式,而 512 realdata 1 各自表示為欲送出的封包大小,欲傳送的真實資料與目的地行動節點。因此對

$ns at 1.0 “$ecapp sendto 512 realdata 1 ”,可以解讀為,ns 在 1.0 秒的時,使用 ecapp 傳送了一個 512KB 的封包並且包含了 realdata 資料項給行動節點 1。

應用層的運作

當我們使用 TCL 命令下達$ns at 1.0 “$ecapp sendto 512 realdata 1 ”時,在模 擬系統時間的 1.0 秒時,應用層 ecapp 使用 sendto()這個成員函數去接收從 TCL 指令而來所要傳送的所有參數,如圖 4-16 所示。

圖 4-16 類別 ecapp 的成員函式 sendto()

在 sendto()成員函數函式裡,最主要處理的是將想要傳送的真實資料放入 NS2 中已經訂定好的一個資料結構,在第二行中我們可以看到的 PacketData 便是 我們用來儲存傳送真實資料的一個 NS2 中訂定的資料結構,其中 PacketData 會 依據我們要傳送的封包的大小給予能填入的資料多寡,也就是說在所舉例的 TCL 指令中,所要傳送的是 512KB 大小的封包,因此透過 PacketData 所分配的空間,

可以放入 512 字元大小的資料。圖 4-16 為 PacketData 的資料結構。

透過圖 4-17,可以看到 PacketData 主要分為兩個部份,unsigned char* data_

和 int datalen_。unsigned char* data_是做為 NS2 的封包結構中的一個指標成員資 料,也就是將 Packet 與 PacketData 連接起來,關於 Packet 的結構我們在代理層 運作時會說明,而 int datalen_就是決定我們要傳送的封包大小,並且根據此封包 大小去分配一個所能傳送真實資料大小的一個字元陣列結構。

在圖 4-16 的第三行是利用 PacketData 中的 data()成員函數,將所要傳送的資料放 入已經建立的資料陣列中。第四行則是會透過 agent_->sendto()將已經放入 PacketData 的資料與其它參數傳送給代理層,由代理層透過這些參數去決定要傳 送封包的大小及封包的目的地,並且使用這些參數建立一個完整的傳送封包。

代理層的運作

在本實驗中,選擇以 TCP 作為我們的代理層,在前面的章節有提到過 TCP 代理層分為發送端 TCP 與接收端 TCPSink 兩種,因此下面我們會對這兩種代理 層來分別說明。

PacketData

unsigned char* data_

int datalen_

圖  4-17 packetdata 結構  

(1) 發送端 TCP:

在 NS2 中的發送端 TCP 有 TCP、TCP Reno、TCP New Reno、TCP Vegas 等幾種,在此我們選擇最基本的 TCP 作為實驗過程中的代理層。

當 TCP 代理層接收到從應用層所傳遞過來,需要傳送的資料與參數時,TCP 便會開時根據應用層所給予的參數去建立一個可供正確傳送的資料封包。資 料封包的結構圖如下面圖 4-18 所示。

圖 4-18 資料封包結構

在圖 4-18 中,可以看出封包主要分為兩個部份,Packet Header 和 Data Payload,其中 Data Payload 便是在上一節應用層中介紹的 PacketData 部份。

而 Packet Header 所存放的資訊便是一些封包的表頭資訊,包含了 TCP、IP、

Common 等等,而在 NS2 中,比較特別的是以 2nd Level 的方式去儲存這些 表頭資訊,所謂的 2nd Level 便是表頭資訊的儲存方式分為兩個階層,在 1st

Level 中我們可以看到的 TCP Header、IP Header、Common Header 這些都只 是單純的指出在 Packet Header 中這些特定協定的 Header 的位置,而要真正 的存取這些資訊,必須要透過 offset_這個變數才能夠真正的找到所需要的資 訊,而透過 offset_此變數所找到儲存真實表頭資訊的位置就稱為 2nd Level。

舉 Common Header 來說,在 NS2 中一般封包的資訊都會被儲存在 Common Header,我們可以看到在 Common Header 的 2nd Level 中的資訊包含了 uid、

ptype、offset_、size_等;uid 是表示此封包的編號、ptype 則是表示此封包是 什麼型態的封包,如果以我們實驗所使用的封包來說,此欄位會被填入 PT_TCP、offset_則是從 1st Level 中要找到正確的 Common Header 的 2 Level 位置必要的一個變數、size_是紀錄此封包的真正大小。

當了解封包結構之後,我們回到發送端 TCP 的運作,在接收到應用層所傳 遞的參數之後,會依據這些數據來決定封包的大小,將需要傳遞的真實資料 放入封包的 Data Payload 中,然後決定要傳送的是單一的行動節點或是使用 廣播的方式,當要進行點對點傳輸時,會在 IP Header 中將目的地的位置填 入我們一開始在 TCL 指令中所想要傳送的行動節點代號;而當需要進行廣 播方式的傳輸時,則使用 NS2 中所提供的 IP_BROADCAST 來進行廣播的 傳輸方式。上述的資訊都完整的填入封包之後,發送端 TCP 便會在與目的 端經過完整的三次交握之後,將我們所想要傳送的真實資料交由節點連結層 送出。

(2) 接收端 TCPSink:

當發送端 TCP 與接收端 TCPSink 完成三次交握之後,接收端 TCPSink 便會接收到來自發送端 TCP 所送出的資料封包,當收到此資料封包時,

TCPSink 會將封包中的 Data Payload 所儲存的真實資料儲存起來。當完成資 料封包傳輸之後,TCPSink 還必須送出一個 ack 封包與 TCP 確認資料封包 傳輸完成以結束此次的傳輸,因此當 TCPSink 欲傳輸 ack 封包時,我們便將

所收到的資料一並放入此封包經由節點連節層傳送給 TCP,當 TCP 端收到 時,會將資料取出並比對是否與此次傳輸資料相同,如果不同,便會再重覆 一次上述的傳輸動作;如果相同便是完成了此次的資料傳輸。

在文檔中 中 華 大 學 (頁 70-78)

相關文件