• 沒有找到結果。

sendto(nbytes,data,dst) send()

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

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

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

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

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

圖  3-8  ecapp class 

在 ecapp 中會新增一個成員函數稱為 sendto()來達成我們上面所想要的功 能,此 sendto()成員函數包含下列了幾個部份:

a. nbytes:這個成員資料是表示我們想要傳送的封包流量大小。

b. data:此成員資料能讓我們自己輸入想要傳送的真實資料,也是最重要的一個 部份。

c. dst:這個成員資料則是能決定我們要傳送給那一個行動節點,在此我們能執 行廣播和點對點傳輸等兩個基本的動作,當需要廣播時,我們輸入的參數為 -1;其它數字則為行動節點的位置編號。

第四節  資料傳輸模組代理層的設計 

在解說此章節前,我們先對應用層與代理層之間如何做連結提出解說,在圖 3-9 中,我們可以看到在應用層中有我們上一個小節所提到的重要成員資料 Agent

*agent,透過 TCL 所下的一個指令$application attach-agent $agent,NS2 會將應用 層與代理層透過 Agent *agent 連結起來。

應用層   

agent

代理層   

Application

Agents

send recv

圖  3-9  應用層與代理層連結 

接下來會對我們在此研究中所使用的兩個代理層來解說,分別是 FullTCP 與 TCP 這兩個代理層,會選擇以此兩個代理層來使用的原因是因為它提供了可靠的 點對點連線、完整的回應機制、錯誤控制、擁塞機制控制等。

(1) FullTCP:

一開始我們是選擇 FullTCP 來做為實驗的代理層,因為 FullTCP 本身支援雙 工的傳輸,所謂雙工傳輸就是一個 FullTCP 的代理層可以同時的接收從其它 行動節點傳送過來的封包,也能夠有回應的能力。且 FullTCP 也保有 TCP 的特性,透過三次交握的特性來達成可靠的點對對傳輸。且在 NS2 中,本 身有提供針對 FullTCP 而建立的一個應用層,能傳送我們所想要的真實資 料,名為 tcpapp,但是經過我們的試驗,發現此應用層只適用在有線的環境 底下,並不適合用在我們所需要的行動隨意網路的環境之下,因此我們改用 上面所自行建立的一個應用層 ecapp。在一開始點對點的情境之下,兩個行 動節點能順利的達成我們所想要的結果,但是當我們將行動節點的數目增加 時,發現 FullTCP 不能正確的將所需要傳送的資訊傳送到正確的行動節點,

舉例來說:我們有五個行動節點,行動節點 1 至行動節點 5,當行動節點 1 與行動節點 2 達成三次交握之後便會開始傳送資料,如圖 3-10 所示。

但是當我們想要再使用行動節點 1 傳送其他資料給另外一個行動節點時,卻 產生了無法傳送的情況,經過研究及蒐集資料,發現這是 FullTCP 設計上的缺 陷,許多研究人員也碰到此一問題。解決的方式為當需要再利用同一個行動節點 傳送資料給不同的行動節點時,必須要先將上一次兩個行動節點之間的 connect 連線關閉,再讓欲送資料的行動節點跟接收的行動節點重新建立三次交握,才能 順利的達行使用同一個行動節點傳送資料給不同行動節點的此一目的。延續上述 行動點節 1 傳送資料給行動節點 2 的問題,當行動節點 1 完成傳送資料給行動節 點 2 的傳輸動作後,想再傳送另外一個資料給行動節點 5,就必須利用我們上面 所敘述的方式才能順利的傳送給行動節點 5,如圖 3-11 表示。

1

2

5

4 3

Realdata

 

圖  3-10  fulltcp 網路拓樸(1)

由於行動隨意網路的特性之一,網路拓樸變化快速,所以上述 FullTCP 每次 需要傳送資料給不同的行動節點,就必須重新再建立一次 connect 並不適合用在 行動隨意網上,因為當一個行動節點在傳送資料給另外一個行動節點時,就已經 知道下一個資料是要傳給另外一個行動節點,但是還是必須等待此次的傳輸完成 後再中斷連線,然後再跟下一個需要傳送資料的行動節點進行連線,再傳送資 料,這中間的時間可能行動節點已經離開通訊範圍或是所需的資料已經不是新鮮 的。因此在下面我們會介紹 TCP 來解決 FullTCP 上的此一問題。

(2) TCP:

為了處理上述 FullTCP 的問題,因此我們改用 TCP 做為代理層,和 FullTCP 不同的是,TCP 並非支援雙工,意思是在 TCP 中分為發送端與接收端兩種 的 TCP,發送端稱為 TCP,而接收端稱為 TCPSink,也就是說一個行動節點 上面必須同時具備 TCP 與 TCPSink 才能有接收和傳送的能力。舉例來說,

有兩個行動節點 A 與 B,當 A 與 B 使用 TCP 為代理層時,此兩個行動節點 1

2

5

4 3

中 斷 行 動 節 點

間的 connect

建立新的 connect 並

傳送 Realdata

  圖  3-11  fulltcp 網路拓樸(2) 

都必須各自具備發送端 TCP 與接收端 TCPSink,且行動節點 A 的發送端 TCP 必要與行動節點 B 的接收端 TCPSink 連結,而行動節點 B 的發送端 TCP 亦 必需要跟行動節點 A 的接收端 TCP 連結,如此這兩個行動節點才能夠達成 雙工的功能,彼此接收與傳送資料封包,如圖 3-12 所示。

但 FullTCP 卻只需要一個單純的代理層就能達成,可是也因為 TCP 分 為發送端和接收端,因此我們能克服 FullTCP 上的缺點-當同一個行動節點 上想要傳送資料給不同的行動節點,就並需要中斷與一個行動節點的連線,

並與另一個行動節點再建立一個新的連線。TCP 在 NS2 中也有設計上的問 題,便是 TCP 發送端只會具備傳送的能力,TCPSink 接收端則只具有接收 能力,因此在想要達成我們想要利用 TCP 與 TCPSink 的情況之下,並需要 讓 TCP 端與 TCPSink 端都具備回應能力,我們是透過 TCP 協定中的三次交 握的 ACK 封包來達成使 TCP 與 TCPSink 具有回應的能力,詳細的過程說

A B

TCP TCPSink TCPSink TCP

圖  3-12  行動節點上的 tcp 代理層 

明如下,當兩個行動節點 A 與 B 時,行動節點 A 欲傳送一個資料給行動節 點 B,此時行動節點 A 會先尋找路由表是否有路由到達行動節點 B,在此我 們假設路由已知且是可用的,此時行動節點 A 會發出一個 SYN 的訊息封包 給行動節點 B,而當行動節 B 收到後,便會回傳一個 SYN+ACK 的訊息封 包給行動節點 A,接下來行動節點 A 便會回送一個 ACK 封包給予行動節點 B,並且開始傳輸我們想要傳送給行動節點 B 的資料封包,一但完成傳輸後,

行動節點 A 會傳送中止傳輸的訊息封包,而當行動節點 B 收到此訊息封包 時,我們便將剛剛從行動節點 A 所傳送過來的資料,放入行動節點 B 要回 傳給行動節點 A 的訊息封包中,當行動節點 A 收到此訊息封包時,會查看 收到的資料是否和欲傳送的資料相同,藉此來賦予 TCP 發送端與 TCPSink 接收端具有我們想要的回應能力。

在第四章中,我們先對所設計的模組做介紹,再來介紹實驗的參數,再 來說明 TCL 腳本的架構,最後使用一個 TCL 上的命令,詳細的說明從 TCL 指令下達之後,NS2 是如何經由應用層、代理層去達到我們所想要的透過完 整現有的 NS2 架構,去傳送真實的資料,而不是透過自訂代理層與自訂封 包協定的方式。

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

相關文件