<?xml version="1.0" encoding="Big5"?>
<?xml-stylesheet type="text/css" href="document.css"?>
<document xmlns:HTML="http://www.w3.org/1999/xhtml">
	<title>
	什麼是 NS2?
	</title>
	<content>
	<subject>→ 簡介</subject>
	NS2, 是 Network Simulator - Version 2 的簡寫. 在 1989 年首先由 REAL Network Simulator 改版而來, 當時由 
	<HTML:A href="http://www.isi.edu/nsnam/vint/index.html">VINT Project</HTML:A> 這個團體所維護, 現在由 
	<HTML:A href="http://www.isi.edu/saman/index.html">SAMAN</HTML:A> 和 
	<HTML:A href="http://www.isi.edu/conser/index.html">CONSER</HTML:A> 負責. 
	<HTML:BR/>
	常看到這樣的一句話 : NS is a discrete event simulator targeted at networking research. 這邊所指的 
	discrete event 是說, NS 在模擬送封包時, 是用單一執行緒的方式, 也就是說同一個 Node 
	在同一時間是沒有辦法送出 1 個以上的封包的. 請看以下的範例：
	<HTML:BR/>
		<item>
		1. 在 1.0 秒時, 假設 A 點送出了一個封包；
		</item>
		<item>
		2. 在 1.005 秒時, A 點上的網路卡開始解析封包, 並進行傳送；
		</item>
		<item>
		3. 在 1.006 秒時, B 點收到了 A 點送過來的封包；
		</item>
		<item>
		4. 在 1.1 秒時, B 點的網路卡解析封包, 並送給 B 點的應用程式.
		</item>
	<HTML:BR/>		
	<HTML:IMG src="graph/ns_what_1.PNG" border="0"/>
	<HTML:BR/>
	以上是 NS2 送出一個封包時的情形, 而 NS2 會一直以這樣的方式傳送封包, 直到送完為止. 其中每次送封包時, 所採
	用的時間是虛擬的, 在 NS 中的時間和真實世界中用的時間不同 (例如說 NS 中的 1 ms可能是真實世界中的 1 s).	
	</content>
	<content>
	<subject>→ 結構</subject>
	NS2 整體架構 :  
	<HTML:BR/>
	<HTML:IMG src="graph/ns_what_2.PNG" border="0"/>
	<HTML:BR/>
	上面這個圖可以用來做一個簡單的 NS 結構說明. 對一般使用 NS 的使用者來說, 你可能會用 OTcl 這個 script 
	language 來撰寫網路拓撲的部分, 而 OTcl 其實就是架構在 Tcl 之上的 Object-Oriented 後所延伸出來的. 在 
	Event Scheduler 和 Network Component 這二部分, 主要是以 C++ 所寫出來的東西. NS 是以 event-driven 
	的概念在做模擬, 比如說 : 在 1.2 秒的時候開始做 FTP 資料的傳輸, 在 2.0 秒的時候結束傳輸. 這是 Event 
	Scheduler 的部分. 至於 Network Component 則是 NS 中的 Agent (TCP、UDP...)、Traffic Generator 
	(FTP、CBR...) 這部分. C++ 畫在最底層則是表示 NS 的核心主要就是 C++. 最後就是一個用來溝通 OTcl 及 C++ 
	的橋樑 : Tclcl. 最後搭配一個 User Interface, 這就構成了 NS 本身. 
	<HTML:BR/>
	<HTML:IMG src="graph/ns_what_3.PNG" border="0"/>
	<HTML:BR/>
	上面的圖簡單地說明了 C++ 和 OTcl 是怎麼做「溝通」. 我們可以看到在左圖的部分有一些像樹狀的東西, 這就是 
	OTcl 這部分的 Object Hierarchy, 而右邊的部分也是類似的道理, 屬於 C++ 的 Object Hierarchy. 
	而中間有虛線箭頭相連的部分, 就是 OTcl 和 C++ 共享, 可以互相存取的物件. 至於該怎麼存取, 請自行參考 Tclcl 
	的相關文件, 在此不再多說. 
	</content>	
	<content>
	<subject>→ 為什麼要用二種語言</subject>
	使用 2 種主要的語言：C++、OTcl. 使用 2 種語言的原因在於, 像一些比較底層架構的東西, 或者是封包傳送、
	繞送方法...等, 這些是屬於比較需要考慮時間、速度的部分, 選擇用 C++ 來處理是比較適當的做法. 
	通常這些底層的東西也不太常常會變動, 所以利用編譯式的語言也比較恰當, 只需編譯過一次就可以一直使用. 
	除非當有需要新增或修改這些底層的架構時, 才會另外再做編譯的動作. 而 OTcl 則主要用來處理網路情境模擬的部分, 
	也就是大部分時間在寫的 script, 雖然這 OTcl Script 在每次要執行時可能會花一點時間, 
	但是因為情境模擬的部分會比較常在改變, 若用 C++ 這類要做編譯動作的語言並不合適. 另外 OTcl 
	主要還有負責一些設定檔, 及使用編譯過的 C++ Objects. 整理如下：
	<HTML:BR/>
	用 C++ : 
		<HTML:OL>
		<item>1. 處理封包傳送</item>
		<item>2. 更改一些底層或新增 protocols 之類的 C++ Class</item>
		<item>3. 不常更動, 執行速度快</item>
		</HTML:OL>
	用 OTcl :
		<HTML:OL>
		<item>1. 負責設定檔部分</item>
		<item>2. 運作已編譯過的 C++ Objects</item>
		<item>3. 常會更動, 執行時需花一點直譯的時間</item>	
		</HTML:OL>
	</content>
	<content>
	<subject>→ 使用 NS2 的流程</subject>
	<HTML:BR/>
	<HTML:IMG src="graph/ns_what_4.PNG"/>
	<HTML:BR/>
	假設今天我們的問題是：「觀察 FTP 傳送封包的情況」. 那我們可以來個「情境模擬 (scenario)」, 
	想像有簡單的二個點 (node) 要做 FTP 資料的傳輸, 這時候我們就得「做點事」：寫個 OTcl Script. 在這個 
	Script 中撰寫什麼是 node、什麼是 link、掛上什麼樣的 Agent、Traffic Generator, 這就是個簡單的情境模擬. 
	之後將這個 OTcl Script 交給 NS2 去做模擬, 產生結果後, 利用 Nam, Xgraph 來幫我們做進一步的分析, 
	並重覆這些步驟直到我們認為可以了為止.
	</content>
</document>

