<?xml version="1.0" encoding="Big5"?>
<?xml-stylesheet type="text/css" href="document.css"?>
<document xmlns:HTML="http://www.w3.org/1999/xhtml">
	<title>
	Unicast Routing (單點廣播路由)
	</title>
	<content>
	<subject>→ Unicast (單點廣播)</subject>
	透過一個網路在單一傳送者與單一接收者之間進行傳輸。雙向、點對點的傳輸方式在網路通訊中是以單點廣播為代表。
	<HTML:BR/>
	<HTML:IMG src="graph/ns_routing_intro_1.PNG" border="0"/>
	<HTML:BR/>
	</content>	
	<content>
	<subject>→ ns 中的四種路由策略</subject>
	ns 會利用路由策略來為模擬計算路由. ns中的四種路由策略分別是 Static Routing、Session Routing、Dynamic 
	Routing 和 Manual Routing. 相反地, 一個路由協定是某一特定演算法的實現. 目前 Static Routing 和 
	Session routing 使用 Dijkstra's all-pairs SPF algorithm, 而 Dynamic routing 使用 Distributed 
	Bellman-Ford algorithm。	
	</content>
	<content>
	<subject>→	Unicast routing 相關指令</subject>
	<HTML:B>rtproto</HTML:B> 指令用來指定在模擬時所需要用到的 unicast routing protocol
	(單點廣播路由協定), 其後可接多個參數. 第一個參數是必須的, 用來指定模擬所用到的協定. 
	其後的參數為非必須的, 用來指定執行該協定的點 (內定值為在拓樸中的所有點上執行相同協定). 
	以下是一些使用 <HTML:B>rtproto</HTML:B> 指令的例子 : 
	<HTML:BR/>
		<HTML:OL>
			<item>
			<HTML:FONT color="green">#模擬時在拓樸中的所有點上執行 Static Routing</HTML:FONT>
			</item>
			<item>
			<HTML:B>$ns rtproto Static</HTML:B>
			</item>
			<HTML:BR/>
			<item>
			<HTML:FONT color="green">#模擬時在拓樸中的所有點上執行 Session Routing</HTML:FONT>
		    </item>
			<item>
			<HTML:B>$ns rtproto Session</HTML:B>
			</item>	
			<HTML:BR/>
			<item>
			<HTML:FONT color="green">#模擬時在拓樸中的指定點 n1,n2,n3 上執行 DV agent</HTML:FONT>
			</item>
			<item>
			<HTML:B>$ns rtproto DV $n1 $n2 $n3</HTML:B>
			</item>
			<HTML:BR/>
			<item>
			<HTML:FONT color="green">#模擬時在拓樸中的指定點 n1,n2 上執行 Link State Routing</HTML:FONT>
			</item>
			<item>
			<HTML:B>$ns rtproto LS $n1 $n2</HTML:B>
			</item>
			<HTML:BR/>
		</HTML:OL>
	如果模擬程式中並沒有使用rtproto指令指定特定的協定, ns 會在拓樸中的所有點上執行 Static Routing.
	<HTML:BR/>
	在 simulation script 裡使用 rtproto 時可用一樣或是不同的 routing protocols. simulation 裡不能同時使用 
	centralized routing (ex : static或session routing) 及 dynamic routing (ex : DV routing).
	<HTML:BR/>
	在 dynamic routing 裡, 每一個 node 可能執行多於一個的 routing protocol. 在一些情況下, 一個以上的
	protocol 可有一樣目的地的路線. 因此, 每一個 protocol 會標上它的優先值給每一個它的 route. 
	這些值是正數, 從 0-255. 優先值越低的 protocol 就越會被優先傳送. 當一個 multiple routing protocol 
	agent 有到相同目的地的路線時, 優先值較低的會先被選擇, 被會被植入 node 的 forwarding table 裡.
    如果多於一個的 agent 有被優先傳送的 route, 那麼較低的 metric 會被選擇. 我們把這個最小 cost 
	被選擇使用的 protocol 稱為"候選"路線. 如果在相同或不同的 protocol 裡有多個候選路線, 那麼 agent
	的路線會被隨機選出.
	</content>
	<content>
	<subject>→ 連結成本的指定與控制</subject>
	<HTML:B>cost</HTML:B> 指令用來設定每一連結的連結成本. 指令格式為
		<HTML:OL>$ns cost &lt; node1 &gt; &lt; node2 &gt; &lt; cost &gt;</HTML:OL>
	意思是將從 node1 到 node2 的連結成本設為 <HTML:B>cost</HTML:B>. 以下是一些使用
	<HTML:B>cost</HTML:B> 指令的例子 : 
		<HTML:OL>
			<item>
			<HTML:FONT color="green">#將從點 n1 到點 n2 的連結成本設為10</HTML:FONT>
			</item>
			<item>
			<HTML:B>$ns cost $n1 $n2 10</HTML:B>
			</item>
			<HTML:BR/>
			<item>
			<HTML:FONT color="green">#將從點 n2 到點 n1 的連結成本設為5</HTML:FONT>
			</item>
			<item>
			<HTML:B>$ns cost $n2 $n1 5</HTML:B>
			</item>
			<HTML:BR/>
			<item>
			<HTML:FONT color="green">#查詢點 n1 到點 n2 的連結成本</HTML:FONT>
			</item>
			<item>
			<HTML:B>[$ns link $n1 $n2] cost?</HTML:B>
			</item>
			<HTML:BR/>
			<item>
			<HTML:FONT color="green">#查詢點 n2 到點 n1 的連結成本</HTML:FONT>
			</item>
			<item>
			<HTML:B>[$ns link $n2 $n1] cost?</HTML:B>
			</item>
			<HTML:BR/>
		</HTML:OL>
	<HTML:B>cost</HTML:B> 指令只設定單一方向的連結成本. 同樣地, cost? 指令也是回傳單一方向的連結成本.
	內定連結成本值為1.	
	</content>
	<content>
	<subject>→ Static Routing (靜態路由)</subject>
	靜態路由是 ns 中內定的路由計算策略. 這種策略使用 Dijkstra's all-pairs SPF 演算法. 
	靜態路由只在模擬開始時執行一次 Dijkstra's all-pairs SPF 演算法. (注意 : 
	靜態路由之所以為靜態的原因在於只在模擬開始時執行一次 Dijkstra's all-pairs SPF 演算法. 相反地, 
	Session Routing 和 DV Routing 允許在模擬中執行 Dijkstra's all-pairs SPF 演算法來改變路由. )	
	</content>
	<content>
	<subject>→ Session Routing </subject>
	Session Routing 和 Static Routing 是幾乎相同的. Session routing 會在模擬開始時執行 Dijkstra's all-pairs 
	SPF 演算法. 但是, 當在模擬中發生拓樸改變時, Session routing 會執行 Dijkstra all-pairs SPF 
	演算法重新計算路由. 換句話說, Session Routing 有迅速重新計算路由並恢復傳輸的能力, 因此能避免在
	Static Routing 中可能會發生的傳輸中斷情形.
	</content>
	<content>
	<subject>→ DV Routing </subject>
	DV routing 是 Distributed Bellman-Ford routing (Distance Vector) 的實做. 這個實做在每個 advertInterval
	時會送一段路線更新. 這是個 class variable (在 Agent/rtProto/DV../ns-2/tcl/rtglib/route-proto.tcl),
    預設值是2秒鐘. 
	<HTML:BR/>
	在週期性更新時, 每個 agent 同時會送觸發更新 (triggered update). 任何時刻只要 forwarding table 有
    node 改變, 更新都會進行. 更新發生在拓樸改變時或在 agent 在 node 收到路線更新, 會重新計算及設置新的路線時.
	<HTML:BR/>
	每個 agent 利用 split horizon 來破壞反向機制以達成廣為宣傳自己的路線給鄰近的 peers. Split horizon
	是種 agent 不會宣傳至目的地的路徑到 interface 之外的方法. 在這個方法中, agent 會以無限大的 metric
	來宣傳至目的地的路徑.
	<HTML:BR/>
	每個 DV agent 預設 preference_ 為 120. 這個值就是同一個 class variable 裡被決定的值. 每一個 agent
	用 class variable INFINITY (設定成32) 來決定路線的正確性.	
	</content>
	<content>
	<subject>→ Manual Routing</subject>
	Manual routing 不是利用路線計算的 protocol (像其他 protocol 一樣), 它只是很簡單的讓使用者能夠手動設定
	routing table, 就像你可以在 workstation 次打 route 這個指令一樣.
	<HTML:BR/>
	使用 Manual routing, 要用 <HTML:B>rtproto</HTML:B>來使用它. 然後設定每個 nodes 的 routing table
	則使用<HTML:B>add-route-to-adj-node</HTML:B> 這個 command, 舉例 :
		<HTML:OL>
		<HTML:B>
		<item>$ns rtproto Manual</item>
		<item>set n1 [$ns node]</item>
		<item>set n2 [$ns node]</item>
		<item>$ns duplex-link $n1 $n2 10Mb 100ms DropTail</item>
		<item>$n1 add-route-to-adj-node -default $n2</item>
		<item>$n2 add-route-to-adj-node -default $n1</item>
		</HTML:B>
		</HTML:OL>
	要看更多的完整 example, 請看 ~ns2/tcl/ex/many_tcp.tcl.	
	</content>
</document>

