unicast.tex
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:41k
源码类别:

通讯编程

开发平台:

Visual C++

  1. chapter{Unicast Routing}
  2. label{chap:unicast}
  3. This section describes the structure of unicast routing in ns.
  4. We begin by describing
  5. href{the interface to the user}{Section}{sec:API},
  6. through methods in the clsref{Simulator}{../ns-2/ns-lib.tcl}
  7. and the clsref{RouteLogic}{../ns-2/ns-lib.tcl}.
  8. We then describe
  9. href{configuration mechanisms for specialized routing}{%
  10.         Section}{sec:uni:specroute}
  11. such as asymmetric routing, or equal cost multipath routing
  12. The next section describes the
  13. href{the configuration mechanisms for individual routing strategies
  14. and protocols}{Section}{sec:uni:protconfig}.
  15. We conclude with a comprehensive look at 
  16. href{the internal architecture}{Section}{sec:rtg-internals}
  17. of routing in ns.
  18. The procedures and functions described in this chapter can be found in
  19. nsf{tcl/lib/ns-route.tcl}, nsf{tcl/rtglib/route-proto.tcl}, 
  20. nsf{tcl/mcast/McastProto.tcl}, and nsf{rtProtoDV.{cc, h}}.
  21. section{The Interface to the Simulation Operator (The API)}
  22. label{sec:API}
  23. The user level simulation script requires one command:
  24. to specify the unicast routing strategy or protocols for the simulation.
  25. A routing strategy is a general mechanism by which ns
  26. will compute routes for the simulation.
  27. There are four routing strategies in ns:
  28. Static, Session, Dynamic and Manual.
  29. Conversely, a routing protocol is a realization of a specific algorithm.
  30. Currently, Static and Session routing use
  31. the
  32. fcnref{Dijkstra's all-pairs SPF algorithm cite{}}{../ns-2/route.cc}{%
  33.         RouteLogic::compute_routes};
  34. one type of dynamic routing strategy is currently implemented: the
  35. fcnref{Distributed Bellman-Ford algorithm cite{}}{../ns-2/route-proto.tcl}{%
  36.         Agent/rtProto/DV::compute_routes}.
  37. In ns, we blur the distinction between strategy and protocol for
  38. static and session routing, considering them simply as protocols%
  39. footnote{The consideration is that static and session routing
  40.   strategies/protocols are implemented as agents derived from
  41.   the clsref{Agent/rtProto},
  42.   similar to how the different dynamic routing protocols are implemented;
  43.   hence the blurred distinctions.}.
  44. fcnref{proc[]{rtproto}}{../ns-2/route-proto.tcl}{Simulator::rtproto}
  45. is the instance procedure in the clsref{Simulator}{../ns-2/ns-lib.tcl}
  46. that specifies the unicast routing protocol to be used in the simulation.
  47. It takes multiple arguments, the first of which is mandatory;
  48. this first argument identifies the routing protocol to be used.
  49. Subsequent arguments specify the nodes
  50. that will run the instance of this protocol.
  51. The default is to run the same routing protocol
  52. on all the nodes in the topology.
  53. As an example, the following commands illustrate the use of the
  54. proc[]{rtproto} command.
  55. begin{program}
  56.         $ns rtproto Static            ; Enable static route strategy for the simulation;
  57.         $ns rtproto Session           ; Enable session routing for this simulation;
  58.         $ns rtproto DV $n1 $n2 $n3    ; Run DV agents on nodes $n1, $n2, and $n3;
  59.         $ns rtproto LS $n1 $n2        ; Run link state routing on specified nodes;
  60. end{program}
  61. If a simulation script does not specify any proc[]{rtproto} command,
  62. then ns will run Static routing on all the nodes in the topology.
  63. Multiple proc[]{rtproto} lines for the same or different routing 
  64. protocols can occur in a simulation script.
  65. However, a simulation cannot use both
  66. centralized routing mechanisms such as static or session routing and 
  67. detailed dynamic routing protocols such as DV.
  68. In dynamic routing, each node can be running more than one routing protocol.
  69. In such situations, more than one routing protocol can have a route to the
  70. same destination.
  71. Therefore, each protocol affixes a preference value to each of its routes.
  72. These values are non-negative integers in the range 0ldots255.
  73. The lower the value, the more preferred the route.
  74. When multiple routing protocol agents have a route to the same destination,
  75. the most preferred route is chosen and
  76. installed in the node's forwarding tables.
  77. If more than one agent has the most preferred routes,
  78. the ones with the lowest metric is chosen.
  79. We call the least cost route from the most preferred protocol the
  80. ``candidate'' route.
  81. If there are multiple candidate routes from the same or different protocols,
  82. then, currently,
  83. one of the agent's routes is randomly chosenfootnote{
  84. This really is undesirable, and may be fixed at some point.
  85. The fix will probably be to favor the agents in class preference order.
  86. A user level simulation relying on this behavior,
  87. or getting into this situation in specific topologies is
  88. not recommended.}.
  89. paragraph{Preference Assignment and Control}
  90. Each protocol agent stores an array of route preferences, code{rtpref_}.
  91. There is one element per destination, indexed by the node handle.
  92. The default preference values used by each protocol are derived from
  93. a class variable, code{preference_}, for that protocol.
  94. The current defaults are:
  95. begin{program}
  96.         Agent/rtProto set preference_ 200               ; global default preference;
  97.         Agent/rtProto/Directfootnote{Direct is a special routing strategy that is used in conjunction with Dynamic routing.  We will describe this in greater detail as part of the route architecture description.} set preference_ 100
  98.         Agent/rtProto/DV set preference_ 120
  99. end{program}
  100. A simulation script can control routing by altering the preference
  101. for routes in one of three ways:
  102. alter the preference 
  103. for a specific route learned via a particular protocol agent,
  104. alter the preference for all routes learned by the agent, or
  105. alter the class variables for the agent before the agent is created.
  106. paragraph{Link Cost Assignment and Control}
  107. In the currently implemented route protocols,
  108. the metric of a route to a destination, at a node,
  109. is the cost to reach the destination from that node.
  110. It is possible to change the link costs at each of the links.
  111. The instance procedure
  112. fcnref{proc[]{cost}}{../ns-2/route-proto.tcl}{Simulator::cost}
  113. %XXX MOVE TO NS-LIB.TCL
  114. is invoked as code{$ns cost tup{node1} tup{node2} tup{cost}},%$
  115. and sets the cost of the link from tup{node1} to tup{node2}
  116. to tup{cost}.
  117. begin{program}
  118.         $ns cost $n1 $n2 10        ; set cost of link textbf{from} $n1 textbf{to} $n2 to 10;
  119.         $ns cost $n2 $n1  5        ; set cost of link in reverse direction to 5;
  120.         [$ns link $n1 $n2] cost?   ; query cost of link from $n1 to $n2;
  121.         [$ns link $n2 $n1] cost?   ; query cost of link in reverse direction;
  122. end{program}
  123. Notice that the procedure sets the cost along one direction only.
  124. Similarly, the procedure
  125. fcnref{proc[]{cost?}}{../ns-2/route-proto.tcl}{Link::cost?}
  126. returns the cost of traversing the specified unidirectional link.
  127. The default cost of a link is 1.
  128. section{Other Configuration Mechanisms for Specialised Routing}
  129. label{sec:uni:specroute}
  130. It is possible to adjust preference and cost mechanisms to get two
  131. special types of route configurations: 
  132. asymmetric routing, and multipath routing.
  133. paragraph{Asymmetric Routing}
  134. Asymmetric routing occurs when the path from node $n_1$ to node $n_2$
  135. is different from the path from $n_2$ to $n_1$.
  136. The following shows a simple topology, and cost configuration
  137. that can achieve such a result:
  138. hfil
  139. begin{minipage}{1.85in}
  140. Nodes $n_1$ and $n_2$ use different paths to reach each other.
  141. All other pairs of nodes use symmetric paths to reach each other.
  142. end{minipage}
  143. hfil
  144. begin{minipage}{1.in}
  145.   includegraphics[height=1in]{asymmetric_routing.eps}
  146. end{minipage}
  147. hfil
  148. begin{minipage}{1.85in}
  149.   begin{program}
  150.     $ns cost $n1 $r1 2
  151.     $ns cost $n2 $r2 2
  152.     $ns cost $r1 $n2 3
  153.   end{program}%$
  154. end{minipage}
  155. hfil
  156. Any routing protocol that uses link costs as the metric can observe
  157. such asymmetric routing if the link costs are appropriately configured%
  158. footnote{Link costs can also be used to favour or disregard
  159. specific links in order to achieve particular topology configurations.}.
  160. paragraph{MultiPath Routing}
  161. Each node can be individually configured
  162. to use multiple separate paths to a particular destination.
  163. The instance variable code{multiPath_} determines whether or not
  164. that node will use multiple paths to any destination.
  165. Each node initialises its instance variable from a class variable
  166. of the same name.
  167. If multiple candidate routes to a destination are available,
  168. all of which are learned through the same protocol,
  169. then that node can use
  170. all of the different routes to the destination simultaneously.
  171. A typical configuration is as shown below:
  172. begin{program}
  173.         Node set multiPath_ 1 ; All new nodes in the simulation use multiPaths where applicable;
  174. {rm or alternately}
  175.         set n1 [$ns Node] ; only enable $n1 to use multiPaths where applicable;
  176.         $n1 set multiPath_ 1
  177. end{program}%$
  178. Currently, only DV routing can generate multipath routes.
  179. section{Protocol Specific Configuration Parameters}
  180. label{sec:uni:protconfig}
  181. paragraph{Static Routing}
  182. The static route computation strategy is
  183. the default route computation mechanism  in ns.
  184. This strategy uses the
  185. fcnref{Dijkstra's all-pairs SPF algorithm cite{}}{../ns-2/route.cc}{%
  186.         RouteLogic::compute_routes}.
  187. The route computation algorithm is run exactly once
  188. prior to the start of the simulation.
  189. The routes are computed
  190. using an adjacency matrix and link costs of all the links in the topology.
  191. (Note that static routing is static in the sense that it is computed
  192.   once when the simulation starts, as opposed to session
  193.   and DV routing that allow routes to change mid-simulation.
  194. An alternative to static routing is Manual routing
  195.   where routes are not computed but instead are set (manually) by the user.)
  196. paragraph{Session Routing}
  197. The static routing strategy described earlier
  198. only computes routes for the topology once in the course of a simulation.
  199. If the above static routing is used and the topology changes while the
  200. simulation is in progress, some sources and destinations may become
  201. temporarily unreachable from each other for a short time.
  202. Session routing strategy is almost identical to static routing,
  203. in that it runs the Dijkstra all-pairs SPF algorithm
  204. prior to the start of the simulation, using the
  205. adjacency matrix and link costs of the links in the topology.
  206. However, it will also run the same algorithm to recompute routes
  207. in the event that the topology changes during the course of a
  208. simulation. 
  209. In other words, route recomputation and recovery is done
  210. instantaneously and there will not be transient routing outage as in
  211. static routing. 
  212. Session routing provides complete and instantaneous routing changes 
  213. in the presence of topology dynamics.
  214. If the topology is always connected, there is
  215. end-to-end connectivity at all times during the course of the simulation.
  216. However, the user should note that the instantaneous route recomputation 
  217. of session routing does not prevent temporary violations of causality,
  218. such as packet reordering, around the instant that the topology
  219. changes. 
  220. paragraph{DV Routing}
  221. DV routing is the implementation of
  222. Distributed Bellman-Ford (or Distance Vector) routing in ns.
  223. The implementation sends periodic route updates every code{advertInterval}.
  224. This variable is a class variable in the clsref{Agent/rtProto/DV}{../ns-2/tcl/rtglib/route-proto.tcl}.
  225. Its default value is 2 seconds.
  226. In addition to periodic updates, each agent also sends triggered updates;
  227. it does this whenever the forwarding tables in the node change.
  228. This occurs either due to changes in the topology, 
  229. or because an agent at the node received a route update,
  230. and recomputed and installed new routes.
  231. Each agent employs the split horizon with poisoned reverse mechanisms
  232. to advertise its routes to adjacent peers.
  233. ``Split horizon'' is the mechanism by which an agent will not advertise
  234. the route to a destination out of the interface that it is using to
  235. reach that destination.
  236. In a ``Split horizon with poisoned reverse'' mechanism,
  237. the agent will advertise that route out of that interface with 
  238. a metric of infinity.
  239. Each DV agent uses a default code{preference_} of 120.
  240. The value is determined by the class variable of the same name.
  241. Each agent uses the class variable code{INFINITY} (set at 32)
  242. to determine the validity of a route.
  243. paragraph{Manual Routing}
  244. Manual routing is not a route computation protocol (like the others),
  245.   but simply a way for users to configure the routing table by hand,
  246.   much as you would with the ``route'' command on a workstation.
  247. To use manual routing, enable it with rtproto, then set each
  248. nodes routing tables with the add-route-to-adj-node command.
  249. For example:
  250. begin{program}
  251. $ns rtproto Manual
  252. set n1 [$ns node]
  253. set n2 [$ns node]
  254. $ns duplex-link $n1 $n2 10Mb 100ms DropTail
  255. $n1 add-route-to-adj-node -default $n2
  256. $n2 add-route-to-adj-node -default $n1
  257. end{program}
  258. For a more complete example, see code{tcl/ex/many_tcp.tcl}.
  259. section{Internals and Architecture of Routing}
  260. label{sec:rtg-internals}
  261. We start with a discussion of the classes associated with
  262. unicast routing, and the code path used to configure and execute
  263. each of the different routing protocols.
  264. We conclude with a description of
  265. the interface between unicast routing and network dynamics, and
  266. that between unicast and multicast routing.
  267. subsection{The classes}
  268. There are four main classes,
  269. the class RouteLogic, the class rtObject, the class rtPeer, and the
  270. base class Agent/rtProto for all protocols.
  271. In addition, the routing architecture extends 
  272. the classes Simulator, Link, Node and Classifier.
  273. paragraph{protectclsref{RouteLogic}{../ns-2/route-proto.tcl}}
  274. This class defines two methods to configure unicast routing,
  275. and one method to query it for route information.
  276. It also defines an instance procedure that is applicable when
  277. the topology is dynamic.
  278. We discuss this last procedure in conjunction
  279. with the interface to network dynamics.
  280. begin{itemize}
  281. item The instance procedure
  282. fcnref{proc[]{register}}{../ns-2/route-proto.tcl}{RouteLogic::register}
  283. is invoked by proc[]{Simulator::rtproto}.
  284. It takes the protocol and a list of nodes as arguments,
  285. and constructs an instance variable, code{rtprotos_}, as an array;
  286. the array index is the name of the protocol, and the value is the list
  287. of nodes that will run this protocol.
  288. item The
  289. fcnref{proc[]{configure}}{../ns-2/route-proto.tcl}{RouteLogic::configure}
  290. reads the code{rtprotos_} instance variable, and 
  291. for each element in the array, 
  292. invokes route protocol methods to perform the appropriate initializations.
  293. It is invoked by
  294. fcnref{the simulator run procedure}{../ns-2/ns-lib.tcl}{Simulator::run}.
  295. For each protocol tup{rt-proto} indexed in the code{rtprotos_} array,
  296. this routine invokes
  297. code{Agent/rtProto/tup{rt-proto} init-all rtprotos_(tup{rt-proto})}.
  298. If there are no elements in code{rtprotos_},
  299. the routine invokes Static routing, as
  300. code{Agent/rtProto/Static init-all}.
  301. item The instance procedure
  302. fcnref{proc[]{lookup}}{../ns-2/route-proto.tcl}{RouteLogic::lookup}
  303. takes two node numbers, $nodeId_1$ and $nodeId_2$, as argument;
  304. it returns the id of the neighbor node that $nodeId_1$ uses to 
  305. reach $nodeId_2$.
  306. The procedure is used by the static route computation procedure to query
  307. the computed routes and populate the routes at each of the nodes.
  308. It is also used by the multicast routing protocols to perform the
  309. appropriate RPF check.
  310. Note that this procedure overloads an instproc-like of the same name.
  311. The procedure queries the appropriate code{rtObject} entities
  312. if they exist
  313. (which they will if dynamic routing strategies are used in the simulation);
  314. otherwise, the procedure invokes the instproc-like to obtain the relevant
  315. information.
  316. end{itemize}
  317. paragraph{protectclsref{rtObject}{../ns-2/route-proto.tcl}}
  318. is used in simulations that use dynamic routing.
  319. Each node has a rtObject associated with it, that
  320. acts as a co-ordinator for the different routing protocols that
  321. operate at a node.
  322. At any node, the rtObject at that node 
  323. tracks each of the protocols operating at that node;
  324. it computes and installs the nest route to each destination
  325. available via each of the protocols.
  326. In the event that the routing tables change, or the topology changes,
  327. the rtObject will alert the protocols to take the appropriate action.
  328. The class defines the procedure
  329. fcnref{proc[]{init-all}}{../ns-2/route-proto.tcl}{rtObject::init-all};
  330. this procedure takes a list of nodes as arguments,
  331. and creates a rtObject at each of the nodes in its argument list.
  332. It subsequently invokes its code{compute-routes}.
  333. The assumption is that the constructor for each of the new objects
  334. will instantiate the ``Direct'' route protocol at each of these nodes.
  335. This route protocol is responsible for computing the routes to 
  336. immediately adjacent neighbors.
  337. When proc[]{compute-routes} is run by the proc[]{init-all} 
  338. procedure, these direct routes are installed in the node by the
  339. appropriate route object.
  340. The other instance procedures in this class are:
  341. begin{itemize}
  342. item fcnref{proc[]{init}}{../ns-2/route-proto.tcl}{rtObject::init}
  343. The constructor sets up pointers from itself to the node,
  344. in its instance variable code{node_}, and from the node to itself,
  345. through the Node instance procedure
  346. proc[]{init-routing} and the Node instance variable code{rtObject_}.
  347. It then initializes an array of
  348. code{nextHop_}, code{rtpref_}, code{metric_}, code{rtVia_}.
  349. The index of each of these arrays is the handle of the destination node.
  350. The code{nextHop_} contains the link that will be used to reach the
  351. particular destination;
  352. code{rtpref_} and code{metric_} are
  353. the preference and metric for the route installed in the node;
  354. code{rtVia_} is the name of the agent whose route is installed in the node.
  355. The constructor also creates the instance of the Direct route protocol,
  356. and invokes proc[]{compute-routes} for that protocol.
  357. item
  358. fcnref{proc[]{add-proto}}{../ns-2/route-proto.tcl}{rtObject::add-proto}
  359. creates an instance of the protocol, stores a reference to it
  360. in its array of protocols, code{rtProtos_}.
  361. The index of the array is the name of the protocol.
  362. It also attaches the protocol object to the node,
  363. and returns the handle of the protocol object.
  364. item fcnref{proc[]{lookup}}{../ns-2/route-proto.tcl}{rtObject::lookup}
  365. takes a destination node handle, and returns the id of the neighbor node
  366. that is used to reach the destination.
  367. If multiple paths are in use, then it returns a list of the
  368. neighbor nodes that will be used.
  369. If the node does not have a route to the destination,
  370. the procedure will return -1.
  371. item
  372. fcnref{proc[]{compute-routes}}{../ns-2/route-proto.tcl}{rtObject::compute-routes}
  373. is the core procedure in this class.
  374. It first checks to see if any of the routing protocols
  375. at the node have computed any new routes.
  376. If they have,
  377. it will determine the best route to each destination
  378. from among all the protocols.
  379. If any routes have changed,
  380. the procedure will notify each of the protocols of the number of
  381. such changes, in case any of these protocols wants to send a fresh update.
  382. Finally, it will also notify any multicast protocol that new unicast route
  383. tables have been computed.
  384. The routine checks the protocol agent's instance variable,
  385. code{rtsChanged_} to see if any of the routes in that protocol
  386. have changed since the protocol was last examined.
  387. It then uses the protocol's instance variable arrays,
  388. code{nextHop_}, code{rtpref_}, and code{metric_}
  389. to compute its own arrays.
  390. The rtObject will install or modify any of the routes as the changes are found.
  391. If any of the routes at the node have changed,
  392. the rtObject will invoke the protocol agent's instance procedures,
  393. proc[]{send-updates} with the number of changes as argument.
  394. It will then invoke the multicast route object, if it exists.
  395. end{itemize}
  396. The next set of routines are used to query the rtObject for various state
  397. information.
  398. begin{itemize}
  399. item
  400. fcnref{proc[]{dump-routes}}{../ns-2/route-proto.tcl}{rtObject::dump-routes}
  401. takes a output file descriptor as argument, and writes out the
  402. routing table at that node on that file descriptor.
  403. A typical dump output is:
  404. {small
  405. begin{verbatim}
  406. end{verbatim}
  407. }
  408. item
  409. fcnref{proc[]{rtProto?}}{../ns-2/route-proto.tcl}{rtObject::rtProto?}
  410. takes a route protocol as argument, and returns a handle to the instance
  411. of the protocol running at the  node.
  412. item
  413. fcnref{proc[]{nextHop?}}{../ns-2/route-proto.tcl}{rtObject::nextHop?}
  414. takes a destination node handle, and returns the link that is used to reach
  415. that destination.
  416. item
  417. Similarly,
  418. fcnref{proc[]{rtpref?}}{../ns-2/route-proto.tcl}{rtObject::rtpref?} and
  419. fcnref{proc[]{metric?}}{../ns-2/route-proto.tcl}{rtObject::metric?}
  420. take a destination node handle as argument, and return the preference
  421. and metric of the route to the destination installed at the node.
  422. end{itemize}
  423. paragraph{The protectclsref{rtPeer}{../ns-2/route-proto.tcl}}
  424. is a container class used by the protocol agents.
  425. Each object stores the address of the peer agent, and the 
  426. metric and preference for each route advertised by that peer.
  427. A protocol agent will store one object per peer.
  428. The class maintains the instance variable code{addr_}, and the
  429. instance variable arrays, code{metric_} and code{rtpref_};
  430. the array indices are the destination node handles.
  431. The class instance procedures,
  432. fcnref{proc[]{metric}}{../ns-2/route-proto.tcl}{rtPeer::metric} and
  433. fcnref{proc[]{preference}}{../ns-2/route-proto.tcl}{rtPeer::preference},
  434. take one destination and value, and set the respective array variable.
  435. The procedures,
  436. fcnref{proc[]{metric?}}{../ns-2/route-proto.tcl}{rtPeer::metric?} and
  437. fcnref{proc[]{preference?}}{../ns-2/route-proto.tcl}{rtPeer::preference?},
  438. take a destination and return the current value for that destination.
  439. The instance procedure
  440. fcnref{proc[]{addr?}}{../ns-2/route-proto.tcl}{rtPeer::addr?}
  441. returns the address of the peer agent.
  442. paragraph{protectclsref{Agent/rtProto}{../ns-2/route-proto.tcl}}
  443. This class is the base class from
  444. which all routing protocol agents are derived.
  445. Each protocol agent must define the procedureproc[]{init-all}
  446. to initialize the complete protocol,
  447. and possibly instance procedures proc[]{init}, proc[]{compute-routes}, and
  448. proc[]{send-updates}.
  449. In addition, if the topology is dynamic, and the protocol supports 
  450. route computation to react to changes in the topology,
  451. then the protocol should define the procedure proc[]{compute-all}, and
  452. possibly the instance procedure proc[]{intf-changed}.
  453. In this section, we will briefly describe the interface for the basic
  454. procedures.
  455. We will defer the description of proc[]{compute-all} and
  456. proc[]{intf-changed}
  457. to the section on network dynamics.
  458. We also defer the description of the details of each of the protocols
  459. to their separate section at the end of the chapter.
  460. begin{list}{---}{}
  461. item
  462. The procedure
  463. fcnref{proc[]{init-all}}{../ns-2/route-proto.tcl}{Agent/rtProto::init-all}
  464. is a global initialization procedure for the class.
  465. It may be given a list of the nodes as an argument.
  466. This the list of nodes that should run this routing protocol.
  467. However, centralized routing protocols such as static and session routing
  468. will ignore this argument;
  469. detailed dynamic routing protocols such as DV will use this argument
  470. list to instantiate protocols agents at each of the nodes specified.
  471. Note that derived classes in OTcl do not inherit the procedures
  472. defined in the base class. 
  473. Therefore, every derived routing protocol class must define its own
  474. procedures explicitly.
  475. item
  476. The instance procedure
  477. fcnref{proc[]{init}}{../ns-2/route-proto.tcl}{Agent/rtProto::init}
  478. is the constructor for protocol agents that are created.
  479. The base class constructor initializes the default preference 
  480. for objects in this class,
  481. identifies the interfaces incident on the node and their current status.
  482. The interfaces are indexed by the neighbor handle and stored in the instance
  483. variable array, code{ifs_};
  484. the corresponding status instance variable array is code{ifstat_}.
  485. Centralized routing protocols such as static and session routing do not
  486. create separate agents per node, and therefore do not access any of these
  487. instance procedures.
  488. item
  489. The instance procedure
  490. fcnref{proc[]{compute-routes}}{../ns-2/route-proto.tcl}{Agent/rtProto::compute-routes}
  491. computes the actual routes for the protocol.
  492. The computation is based on the routes learned by the protocol, and
  493. varies from protocol to protocol.
  494. This routine is invoked by the rtObject whenever the topology changes.
  495. It is also invoked when the node receives an update for the protocol.
  496. If the routine computes new routes, 
  497. proc[]{rtObject::compute-routes} needs to be invoked
  498. to recompute and possibly install new routes at the node.
  499. The actual invoking of the rtObject is done by the procedure
  500. that invoked this routine in the first place.
  501. item
  502. The instance procedure
  503. fcnref{proc[]{send-updates}}{../ns-2/route-proto.tcl}{Agent/rtProto::send-updates}
  504. is invoked by the rtObject whenever the node routing tables have changed,
  505. and fresh updates have to be sent to all peers.
  506. The rtObject passes as argument the number of changes that were done.
  507. This procedure may also be invoked when there are no changes to the routes,
  508. but the topology incident on the node changes state.
  509. The number of changes is used to determine the list of peers to which
  510. a route update must be sent.
  511. end{list}
  512. Other procedures relate to responding to topology changes and
  513. href{are described later}{Section}{sec:rtglibAPI}.
  514. paragraph{Other Extensions to the Simulator, Node, Link, and Classifier}
  515. begin{list}{---}{}
  516. item   % class Simulator
  517.   We have discussed the methods proc[]{rtproto} and proc[]{cost}
  518.   in the class Simulator href{earlier}{Section}{sec:API}.
  519.   The one other method used internally is
  520.   fcnref{proc[]{get-routelogic}}{../ns-2/route-proto.tcl}{Simulator::get-routelogic};
  521.   this procedure returns the instance of routelogic in the simulation.
  522.   The method is used by the class Simulator, and unicast and multicast routing.
  523. item   % class Node
  524.    The class Node contains these additional instance procedures
  525.    to support dynamic unicast routing:
  526. fcnref{proc[]{init-routing}}{../ns-2/route-proto.tcl}{Node::init-routing},
  527. fcnref{proc[]{add-routes}}{../ns-2/route-proto.tcl}{Node::add-routes},
  528. fcnref{proc[]{delete-routes}}{../ns-2/route-proto.tcl}{Node::delete-routes},
  529. and
  530. fcnref{proc[]{rtObject?}}{../ns-2/route-proto.tcl}{Node::rtObject?}.
  531. The instance procedure proc[]{init-routing}
  532. is invoked by the code{rtObject} at the node.
  533. It stores a pointer to the rtObject, in its instance variable
  534. code{rtObject_}, for later manipulation or retrieval.
  535. It also checks its class variable to see if it should use multiPath routing,
  536. and sets up an instance variable to that effect.
  537. If multiPath routing could be used,
  538. the instance variable array code{routes_} stores a count of the number of
  539. paths installed for each destination.
  540. This is the only array in unicast routing that is indexed by the node id,
  541. rather than the node handle.
  542. The instance procedure proc[]{rtObject?}
  543. returns the rtObject handle for that node.
  544. The instance procedure proc[]{add-routes}
  545. takes a node id, and a list of links.
  546. It will add the list of links as the routes to reach the destination
  547. identified by the node id.
  548. The realization of multiPath routing is done by using a separate
  549. Classifier/multiPath.
  550. For any given destination id $d$, if this node has multiple paths to $d$,
  551. then the main classifier points to this multipath classifier instead of 
  552. the link to reach the destination.
  553. Each of the multiple paths identified by the interfaces being used is
  554. installed in the multipath classifier.
  555. The multipath classifier will use each of the links installed in it for
  556. succeeding packets forwarded to it.
  557. The instance procedure proc[]{delete-routes}
  558. takes a node id, a list of interfaces, and a nullAgent.
  559. It removes each of the interfaces in the list from the installed list of
  560. interfaces.
  561. If the entry did not previously use a multipath classifier,
  562. then it must have had only one route, and the route entry is set to point
  563. to the nullAgent specified.
  564. Q:  WHY DOES IT NOT POINT TO NULLAGENT IF THE ENTRIES IN THE MPATHCLASSIFIER
  565. GOES TO ZERO?
  566. item   % class Link
  567.   The main extension to the class Link for unicast routing is
  568.   to support the notion of link costs.
  569.   The instance variable code{cost_}
  570.   contains the cost of the unidirectional link.
  571.   The instance procedures
  572.   fcnref{proc[]{cost}}{../ns-2/route-proto.tcl}{Link::cost}
  573.   and
  574.   fcnref{proc[]{cost?}}{../ns-2/route-proto.tcl}{Link::cost?}
  575.   set and get the cost on the link.
  576.   Note that proc[]{cost} takes the cost as argument.
  577.   It is preferable to use the simulator method to set the cost variable,
  578.   similar to the simulator instance procedures to set the queue or delay
  579.   on a link.
  580.   
  581. item   % class Classifier
  582. The clsref{Classifier}{../ns-2/ns-lib.tcl}
  583. contains three new procedures, two of which overloads an existing
  584. instproc-like, and the other two provide new functionality.
  585. The instance procedure 
  586. fcnref{proc[]{install}}{../ns-2/route-proto.tcl}{Classifier::install}
  587. overloads the existing instproc-like of the same name.
  588. The procedure stores the entry being installed in the instance
  589. variable array, code{elements_}, and then invokes the instproc-like.
  590. The instance procedure 
  591. fcnref{proc[]{installNext}}{../ns-2/route-proto.tcl}{Classifier::installNext}
  592. also overloads the existing instproc-like of the same name.
  593. This instproc-like simply installs the entry into the next available slot.
  594. The instance procedure 
  595. fcnref{proc[]{adjacents}}{../ns-2/route-proto.tcl}{Classifier::adjacents}
  596. returns a list of tup{key, value} pairs of all elements installed in the
  597. classifier.
  598. end{list}
  599. subsection{Interface to Network Dynamics and Multicast}
  600. label{sec:rtglibAPI}
  601. This section describes the methods applied in unicast routing to respond
  602. to changes in the topology.
  603. The complete sequence of actions that cause the changes in the topology,
  604. and fire the appropriate actions is described in a different section.
  605. % NEED XREF
  606. The response to topology changes falls into two categories:
  607. actions taken by individual agents at each of the nodes, and
  608. actions to be taken globally for the entire protocol.
  609. Detailed routing protocols such as the DV implementation
  610. require actions to be performed by individual protocol agents at the
  611. affected nodes.
  612. Centralized routing protocols such as static and session routing fall into
  613. the latter category exclusively.
  614. Detailed routing protocols could use such techniques to gather statistics
  615. related to the operation of the routing protocol;
  616. however, no such code is currently implemented in ns.
  617. paragraph{Actions at the individual nodes}
  618. Following any change in the topology,
  619. the network dynamics models will first invoke
  620. fcnref{proc[]{rtObject::intf-changed}}{../ns-2/route-proto.tcl}{rtObject:;intf-changed}
  621. at each of the affected nodes.
  622. For each of the unicast routing protocols operating at that node,
  623. proc[]{rtObject::intf-changed} will invoke 
  624. each individual protocol's instance procedure,  proc[]{intf-changed},
  625. followed by that protocol's proc[]{compute-routes}.
  626. After each protocol has computed its individual routes
  627. proc[]{rtObject::intf-changed} invokes proc[]{compute-routes}
  628. to possibly install new routes.
  629. If new routes were installed in the node,
  630. proc[]{rtObject::compute-routes} will invoke
  631. proc[]{send-updates} for each of the protocols operating at the node.
  632. The procedure will also
  633. fcnref{flag the multicast route
  634.         object}{../ns-2/route-proto.tcl}{rtObject::flag-multicast}
  635. of the route changes at the node, indicating the number of changes 
  636. that have been executed.
  637. proc[]{rtObject::flag-multicast} will, in turn, notify
  638. the multicast route object to take appropriate action.
  639. The one exception
  640. to the interface between unicast and multicast routing is the interaction
  641. between dynamic dense mode multicast and detailed unicast routing.
  642. This dynamicDM implementation in ns assumes neighbor nodes
  643. will send an implicit update whenever their routes change,
  644. without actually sending the update.  
  645. It then uses this implicit information to compute
  646. appropriate parent-child relationships for the multicast spanning trees.
  647. Therefore, detailed unicast routing will invoke
  648. code{rtObject_ flag-multicast 1} whenever it receives a route update as well,
  649. even if that update does not result in any change in its own routing tables.
  650. paragraph{Global Actions}
  651. Once the detailed actions at each of the affected nodes is completed,
  652. the network dynamics models will
  653. fcnref{notify the RouteLogic instance (proc[]{RouteLogic::notify})}{%
  654.         ../ns-2/route-proto.tcl}{RouteLogic::notify} 
  655. of changes to topology.
  656. This procedure invokes the procedure proc[]{compute-all}
  657. for each of the protocols that were ever installed at any of the nodes.
  658. Centralized routing protocols such as session routing use this signal to
  659. recompute the routes to the topology.
  660. Finally, the proc[]{RouteLogic::notify} procedure notifies 
  661. any instances of centralized multicast that are operating at the node.
  662. section{Protocol Internals}
  663. label{sec:protocol-internals}
  664. In this section, we describe any leftover details of each of the routing
  665. protocol agents.
  666. Note that this is the only place where we describe the
  667. internal route protocol agent, ``Direct'' routing.
  668. paragraph{Direct Routing}
  669. This protocol tracks the state of the incident links,
  670. and maintains routes to immediately adjacent neighbors only.
  671. As with the other protocols, it maintains instance variable arrays
  672. of code{nextHop_}, code{rtpref_}, and code{metric_}, indexed by 
  673. the handle of each of the possible destinations in the topology.
  674. The instance procedure
  675. fcnref{proc[]{compute-routes}}{../ns-2/route-proto.tcl}{Agent/rtProto/Direct::compute-routes}
  676. computes routes based on the current state of the link, and the previously
  677. known state of the incident links.
  678. No other procedures or instance procedures are defined for this protocol.
  679. paragraph{Static Routing}
  680. The procedure
  681. fcnref{proc[]{compute-routes}}{../ns-2/ns-lib.tcl}{RouteLogic::compute-routes}
  682. in the clsref{RouteLogic}{../ns-2/ns-lib.tcl}
  683. first creates the adjacency matrix, and then
  684. invokes the C++ method, fcn[]{compute_routes} of the shadow object.
  685. Finally, the procedure retrieves the result of the route computation,
  686. and inserts the appropriate routes at each of the nodes in the topology.
  687. The class only defines the procedure
  688. fcnref{proc[]{init-all}}{../ns-2/route-proto.tcl}{Agent/rtProto/Static::init-all}
  689. that invokes proc[]{compute-routes}.
  690. paragraph{Session Routing}
  691. The class defines the procedure
  692. fcnref{proc[]{init-all}}{../ns-2/route-proto.tcl}{Agent/rtProto/Session::init-all}
  693. to compute the routes at the start of the simulation.
  694. It also defines the procedure
  695. fcnref{proc[]{compute-all}}{../ns-2/route-proto.tcl}{Agent/rtProto/Session::compute-all}
  696. to compute the routes when the topology changes.
  697. Each of these procedures directly invokes proc[]{compute-routes}.
  698. paragraph{DV Routing}
  699. In a dynamic routing strategy, nodes send and receive messages,
  700. and compute the routes in the topology based on the messages exchanged.
  701. The procedure
  702. fcnref{proc[]{init-all}}{../ns-2/route-proto.tcl}{Agent/rtProto/DV::init-all}
  703. takes a list of nodes as the argument;
  704. the default is the list of nodes in the topology.
  705. At each of the nodes in the argument, the procedure starts the
  706. clsref{rtObject}{../ns-2/route-proto.tcl} and a 
  707. clsref{Agent/rtProto/DV}{../ns-2/route-proto.tcl} agents.
  708. It then determines the DV peers for each of the newly created DV agents,
  709. and creates the relevant code{rtPeer} objects.
  710. The
  711. fcnref{constructor for the DV agent}{%
  712.         ../ns-2/route-proto.tcl}{Agent/rtProto/DV::init}
  713. initializes a number of instance variables;
  714. each agent stores an array, indexed by the destination node handle,
  715. of the preference and metric, the interface (or link) to the next hop,
  716. and the remote peer incident on the interface,
  717. for the best route to each destination computed by the agent.
  718. The agent creates these instance variables, and then
  719. schedules sending its first update within the first
  720. 0.5 seconds of simulation start.
  721. Each agent stores the list of its peers indexed by the handle
  722. of the peer node.
  723. Each peer is a separate peer structure that holds
  724. the address of the peer agent, the metric and preference
  725. of the route to each destination advertised by that peer.
  726. We discuss the rtPeer structure later
  727. when discuss the route architecture.
  728. The peer structures are initialized by the procedure
  729. fcnref{proc[]{add-peer}}{../ns-2/route-proto.tcl}{Agent/rtProto/DV::add-peer}
  730. invoked by proc[]{init-all}.
  731. The routine 
  732. fcnref{proc[]{send-periodic-update}}{../ns-2/route-proto.tcl}{Agent/rtProto/DV::send-periodic-update}
  733. invokes proc[]{send-updates} to send the actual updates.
  734. It then reschedules sending the next periodic update
  735. after code{advertInterval} jittered slightly to avoid
  736. possible synchronization effects.
  737. fcnref{proc[]{send-updates}}{../ns-2/route-proto.tcl}{Agent/rtProto/DV::send-updates}
  738. will send updates to a select set of peers.
  739. If any of the routes at that node have changed, or for periodic updates,
  740. the procedure will send updates to all peers.
  741. Otherwise, if some incident links have just recovered,
  742. the procedure will send updates to the adjacent peers on those incident
  743. links only.
  744. proc[]{send-updates} uses the procedure
  745. fcnref{proc[]{send-to-peer}}{../ns-2/route-proto.tcl}{Agent/rtProto/DV::send-to-peer}
  746. to send the actual updates.
  747. This procedure packages the update, taking the
  748. split-horizon and poison reverse mechanisms into account.
  749. It invokes the instproc-like,
  750. fcnref{proc[]{send-update} (Note the singular case)}{%
  751.         ../ns-2/rtProto.cc}{rtProtoDV::command}
  752. to send the actual update.
  753. The actual route update is stored in the class variable
  754. code{msg_} indexed by a non-decreasing integer as index.
  755. The instproc-like only sends the index to code{msg_} to the remote peer.
  756. This eliminates the need to convert from OTcl strings to alternate formats
  757. and back.
  758. When 
  759. fcnref{a peer receives a route update}{../ns-2/route-proto.tcl}{%
  760.         Agent/rtProto/DV::recv-update}
  761. it first checks to determine if the update from differs from the previous
  762. ones.
  763. The agent will compute new routes if the update contains new information.
  764. section{Unicast routing objects}
  765. label{sec:routeobjects}
  766. Routelogic and rtObject are two objects that are significant to unicast
  767. routing in ns. Routelogic, essentially, represents the routing table
  768. that is created and maintained centrally for every unicast simulation.
  769. rtObject is the object that every node taking part in dynamic
  770. unicast routing, has an instance of. Note that nodes will not have an
  771. instance of this object if Session routing is done as a detailed
  772. routing protocol is not being simulated in this case. The methods for
  773. RouteLogic and rtObject are described in the next section.
  774. section{Commands at a glance}
  775. label{sec:unicastcommand}
  776. Following is a list of unicast routing related commands used in simulation
  777. scripts:
  778. begin{flushleft}
  779. code{$ns_ rtproto <routing-proto> <args>}%$
  780. where <routing-proto> defines the type of routing protocol to be used, like
  781. Static, Manual, Session , DV etc. args may define the list of nodes on
  782. which the protocol is to be run. The node list defaults to all nodes in
  783. the topology.
  784. Internal methods:
  785. code{$ns_ compute-routes}%$
  786. This command computes code{next_hop} information for all nodes in the
  787. topology using the topology connectivity. This code{next_hop} info is
  788. then used to populate the node classifiers or the routing tables.
  789. compute-routes calls compute-flat-routes or compute-hier-routes depending
  790. on the type of addressing being used for the simulation.
  791. code{$ns_ get-routelogic}%$
  792. This returns a handle to the RouteLogic object (the routing table),
  793. if one has been created. Otherwise a new routing table object is created.
  794. code{$ns_ dump-routelogic-nh}%$
  795. This dumps next hop information in the routing table.
  796. code{$ns_ dump-routelogic-distance}%$
  797. This dumps the distance information in the routing table.
  798. code{$node add-route <dst> <Target>}%$
  799. This is a method used to add routing entries (nexthop information) in
  800. the node's 
  801. routing table. The nexthop to <dst> from this node is the <target> object
  802. and this info is added to the node's classifier.
  803. code{$routelogic lookup <srcid> <destid>}%$
  804. Returns the id of the node that is the next hop from the node with id
  805. srcid to the node with id destid. 
  806. code{$routelogic dump <nodeid>}%$
  807. Dump the routing tables of all nodes whose id is less than nodeid. Node
  808. ids are typically assigned to nodes in ascending fashion starting from 0
  809. by their order of creation. 
  810. code{rtobject dump-routes <fileID>}
  811. Dump the routing table to the output channel specified by fileID. fileID
  812. must be a file handle returned by the Tcl open command and it must have
  813. been opened for writing. 
  814. code{$rtobject rtProto? <proto>}%$
  815. Returns a handle to the routing protocol agent specified by proto if it
  816. exists at that node. Returns an empty string otherwise. 
  817. code{$rtobject nextHop? <destID>}%$
  818. Returns the id of the node that is the next hop to the destination
  819. specified by the node id, <destID>. 
  820. code{$rtobject rtpref? destID }%$
  821. Returns the preference for the route to destination node given by destid.
  822. code{$rtobject metric? destID }%$
  823. Returns metric for the route to destid.
  824. end{flushleft}
  825. endinput
  826. ### Local Variables:
  827. ### mode: latex
  828. ### comment-column: 60
  829. ### backup-by-copying-when-linked: t
  830. ### file-precious-flag: nil
  831. ### End:
  832. % LocalWords:  Unicast unicast API ns lib tcl RouteLogic uni specroute rtg SPF
  833. % LocalWords:  multipath protconfig rtglib mcast McastProto rtProtoDV cc outes
  834. % LocalWords:  rtProto DV rtproto LS rtpref eps multiPath advertInterval rtPeer
  835. % LocalWords:  multicast rtObject rtprotos rt init RPF instproc co nextHop addr
  836. % LocalWords:  rtVia rtProtos rtsChanged intf OTcl ifs ifstat rtglibAPI msg nh
  837. % LocalWords:  routelogic nullAgent MPATHCLASSIFIER installNext adjacents recv
  838. % LocalWords:  dynamicDM rtobject hier dst nexthop nodeid ids fileID destID
  839. % LocalWords:  destid flushleft