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

通讯编程

开发平台:

Visual C++

  1. chapter{Links: Simple Links}
  2. label{chap:links}
  3. This is the second aspect of defining the topology.
  4. In href{the previous chapter}{Chapter}{chap:nodes},
  5. we had described how to create the nodes in the topology in ns.
  6. We now describe how to create the links to connect the nodes and complete
  7. the topology.
  8. In this chapter, we restrict ourselves to describing the simple
  9. point to point links.
  10. ns supports a variety of other media, including
  11. an emulation of a multi-access LAN using a mesh of simple links,
  12. and other true simulation of wireless and broadcast media.
  13. They will be described in a separate chapter.
  14. The CBQlink is derived from simple links and is a considerably more
  15. complex form of link that is also not described in this chapter.
  16. We begin by describing the commands to create a link in this section.
  17. As with the node being composed of classifiers, 
  18. a simple link is built up from a sequence of connectors.
  19. We also briefly describe some of the connectors in a simple link.
  20. We then describe
  21. href{the instance procedures that operate on the various components of
  22. defined by some of these connectors}{Section}{sec:links:components}.
  23. We conclude the chapter
  24. href{with a description the connector object}{Section}{sec:links:connectors},
  25. including brief
  26. descriptions of the common link connectors.
  27. The clsref{Link}{../ns-2/ns-link.tcl}
  28. is a standalone class in OTcl,
  29. that provides a few simple primitives.
  30. The clsref{SimpleLink}{../ns-2/ns-link.tcl}
  31. provides the ability to connect two nodes with a point to point link.
  32. ns provides the instance procedure
  33. fcnref{proc[]{simplex-link}}{../ns-2/ns-link.tcl}{Simulator::simplex-link}
  34. to form a unidirectional link from one node to another.
  35. The link is in the class SimpleLink.
  36. The following describes the syntax of the simplex link:
  37. begin{program}
  38.     set ns [new Simulator]
  39.     $ns simplex-link tup{node0} tup{node1} tup{bandwidth} tup{delay} tup{queue_type}
  40. end{program}
  41. The command creates a link from code{tup{node0}} to code{tup{node1}},
  42. with specified code{tup{bandwidth}} and code{tup{delay}} characteristics.
  43. The link uses a queue of type code{tup{queue_type}}.
  44. The procedure also adds a TTL checker to the link.
  45. Five instance variables define the link:
  46. centerline{begin{tabular}{rp{4in}}
  47. code{head_} & Entry point to the link, it points
  48. to the first object in the link. \
  49. code{queue_} & Reference to the main queue element of the link.
  50. Simple links usually have one queue per link.
  51. Other more complex types of links may have multiple
  52. queue elements in the link. \
  53. code{link_} & A reference to the element
  54. that actually models the link,
  55. in terms of the delay and bandwidth characteristics
  56. of the link. \
  57. code{ttl_} & Reference to the element that manipulates the
  58. ttl in every packet. \
  59. code{drophead_} & Reference to an object that is the head of a
  60. queue of elements that process link drops. \
  61.     end{tabular}}
  62. In addition, if the simulator instance variable, 
  63. code{$traceAllFile_}, is defined, 
  64. the procedure will add trace elements that track when a packet is
  65. enqueued and dequeued from code{queue_}.
  66. Furthermore, tracing interposes a drop trace element after the
  67. code{drophead_}.
  68. begin{figure}[tb]
  69.   centerline{includegraphics{link}}
  70.   caption{Composite Construction of a Unidirectional Link}
  71.   label{fig:link}
  72. end{figure}
  73. The following instance variables track the trace elements:
  74. centerline{begin{tabular}{rp{4in}}
  75. code{enqT_} & Reference to the element that traces
  76. packets entering code{queue_}.\
  77. code{deqT_} & Reference to the element that traces
  78. packets leaving code{queue_}.\
  79. code{drpT_} & Reference to the element that traces
  80. packets dropped from code{queue_}.\
  81. code{rcvT_} & Reference to the element that traces
  82. packets received by the next node.\
  83.     end{tabular}}
  84. Note however, that if the user enable tracing multiple times on the link,
  85. these instance variables will only store a reference to the
  86. last elements inserted.
  87. Other configuration mechanisms that add components to a simple link
  88. are network interfaces (used in multicast routing), 
  89. link dynamics models, and tracing and monitors.
  90. We give 
  91. href{a brief overview of the related objects at the end of this chapter}{%
  92. Section}{sec:links:connectors},
  93. and discuss their functionality/implementation in other chapters.
  94. The instance procedure
  95. fcnref{proc[]{duplex-link}}{../ns-2/ns-link.tcl}{Simulator::duplex-link}
  96. constructs a bi-directional link from two simplex links.
  97. section{Instance Procedures for Links and SimpleLinks}
  98. label{sec:links:components}
  99. paragraph{Link procedures}
  100. The clsref{Link}{../ns-2/ns-link.tcl} is implemented entirely in Otcl.
  101. The OTcl code{SimpleLink} class uses the C++ code{LinkDelay} class
  102. to simulate packet delivery delays.
  103. The instance procedures in the class Link are:
  104. begin{tabularx}{linewidth}{rX}
  105. fcnref{proc[]{head}}{../ns-2/ns-link.tcl}{Link::head} &
  106. returns the handle for code{head_}. \
  107. fcnref{proc[]{queue}}{../ns-2/ns-link.tcl}{Link::queue} &
  108. returns the handle for code{queue_}. \
  109. fcnref{proc[]{link}}{../ns-2/ns-link.tcl}{Link::link} &
  110. returns the handle for the delay element, code{link_}. \
  111. fcnref{proc[]{up}}{../ns-2/ns-link.tcl}{Link::up} &
  112. set link status to ``up'' in the code{dynamics_} element.
  113. Also, writes out a trace line to each file specified through
  114. the procedure proc[]{trace-dynamics}.\
  115. fcnref{proc[]{down}}{../ns-2/ns-link.tcl}{Link::down} &
  116. As with proc[]{up},
  117. set link status to ``down'' in the code{dynamics_} element.
  118. Also, writes out a trace line to each file specified through
  119. the procedure proc[]{trace-dynamics}.\
  120. fcnref{proc[]{up?}}{../ns-2/ns-link.tcl}{Link::up?} &
  121. returns status of the link.   Status is ``up'' or ``down'';
  122. status is ``up'' if link dynamics is not enabled.\
  123. fcnref{proc[]{all-connectors}}{../ns-2/ns-link.tcl}{Link::all-connectors} &
  124. Apply specified operation to all connectors on the link.p
  125. An example of such usage is code{link all-connectors reset}.\
  126. fcnref{proc[]{cost}}{../ns-2/ns-link.tcl}{Link::cost} &
  127. set link cost to value specified.\
  128. fcnref{proc[]{cost?}}{../ns-2/ns-link.tcl}{Link::cost?} &
  129. returns the cost of the link.  Default cost of link is 1, 
  130. if no cost has been specified earlier.\
  131. end{tabularx}
  132. paragraph{SimpleLink Procedures}
  133. The Otcl clsref{SimpleLink}{../ns-2/ns-link.tcl}
  134. implements a simple point-to-point
  135. link with an associated queue and delayfootnote{The current
  136. version also includes an object to examine the
  137. network layer ``ttl'' field and discard packets if the
  138. field reaches zero.}.
  139. It is derived from the base Otcl class Link as follows:
  140. begin{program}
  141.         Class SimpleLink -superclass Link
  142.         SimpleLink instproc init { src dst bw delay q { lltype "DelayLink" } } {
  143.                 $self next $src $dst
  144.                 $self instvar link_ queue_ head_ toNode_ ttl_
  145.                 ...
  146.                 set queue_ $q
  147.                 set link_ [new Delay/Link]
  148.                 $link_ set bandwidth_ $bw
  149.                 $link_ set delay_ $delay
  150.                 $queue_ target $link_
  151.                 $link_ target [$toNode_ entry]
  152.                 ...
  153.                 # XXX
  154.                 # put the ttl checker after the delay
  155.                 # so we don't have to worry about accounting
  156.                 # for ttl-drops within the trace and/or monitor
  157.                 # fabric
  158.                 #
  159.                 set ttl_ [new TTLChecker]
  160.                 $ttl_ target [$link_ target]
  161.                 $link_ target $ttl_
  162.         }
  163. end{program}
  164. Notice that when a code{SimpleLink} object is created,
  165. new code{Delay/Link} and code{TTLChecker} objects are
  166. also created.
  167. Note also that,
  168. the code{Queue} object must have already been created.
  169. There are two additional methods implemented (in OTcl) as part
  170. of the code{SimpleLink} class: code{trace} and code{init-monitor}.
  171. These functions are described in further detail
  172. href{in the section on tracing}{Chapter}{chap:trace}. 
  173. section{Connectors}
  174. label{sec:links:connectors}
  175. Connectors, unlink  classifiers, only generate data for one recipient;
  176. either the packet is delivered to the code{target_} neighbor, or it
  177. is sent to he code{drop-target_}.
  178. A connector will receive a packet, perform some function,
  179. and deliver the packet to its neighbor, or drop the packet.
  180. There are a number of different types of connectors in ns.
  181. Each connector performs a different function.
  182. begin{tabularx}{linewidth}{rX}
  183. networkinterface & labels packets with incoming interface identifier---it 
  184. is used by some multicast routing protocols.
  185. The class variable ``Simulator NumberInterfaces_ 1''
  186. tells ns to add these interfaces, and then, it is
  187. added to either end of the simplex link.
  188. href{Multicast routing protocols are discussed in
  189. a separate chapter}{Chapter}{chap:multicast}.\
  190. DynaLink & Object that gates traffic depending on whether the link 
  191. is up or down.  It expects to be at the head of the link,
  192. and is inserted on the link just prior to simulation start.
  193. It's code{status_} variable control whether the link is
  194. up or down.
  195. href{The description of how the DynaLink object is used
  196. is in a separate chapter}{Chapter}{chap:net-dynamics}.\
  197. DelayLink & Object that models the link's
  198. delay and bandwidth characteristics.
  199. If the link is not dynamic, then this object simply
  200. schedules receive events for the downstream object
  201. for each packet it receives at the appropriate time
  202. for that packet.  However, if the link is dynamic,
  203. then it queues the packets internally, and schedules
  204. one receives event for itself for the next packet that must
  205. be delivered.
  206. Thus, if the link goes down at some point, this object's
  207.  fcnref{fcn[]{reset} method}{../ns-2/delay.cc}{DelayLink::reset}
  208. is invoked, and the object will drop all packets in transit
  209. at the instant of link failure.
  210. We discuss the
  211. href{specifics of this class in another chapter}{Chapter}{%
  212. chap:delays}.\
  213. Queues & model the output buffers attached
  214. to a link in a ``real'' router in a network.
  215. In ns, they are attached to, and 
  216. are considered as part of the link.
  217. We discuss the
  218. href{details of queues and different types of queues in ns
  219. in another chapter}{Chapter}{chap:qmgmt}.\
  220. TTLChecker & will decrement the ttl in each packet that it receives.
  221. If that ttl then has a positive value, the packet is forwarded
  222. to the next element on the link.  In the simple links,
  223. TTLCheckers are automatically added, and are placed
  224. as the last element on the link, between the delay element,
  225. and the entry for the next node.\
  226. end{tabularx}
  227. section{Object hierarchy}
  228. label{sec:linkobjects}
  229. The base class used to represent links is called Link. Methods for
  230. this class are listed in the next section. Other link objects derived from
  231. the base class are given as follows:
  232. begin{itemize}
  233. item SimpleLink Object
  234. A SimpleLink object is used to represent a simple unidirectional link.
  235. There are no state variables or configuration parameters associated with
  236. this object. Methods for this class are:
  237. code{$simplelink enable-mcast <src> <dst>}\
  238. This turns on multicast for the link by creating an incoming network
  239. interface for the destination and adds an outgoing interface for the
  240. source.
  241. code{$simplelink trace <ns> <file> <optional:op>}\
  242. Build trace objects for this link and update object linkage. If op is
  243. specified as "nam" create nam trace files.
  244. code{$simplelink nam-trace <ns> <file>}\
  245. Sets up nam tracing in the link.
  246. code{$simplelink trace-dynamics <ns> <file> <optional:op>}\
  247. This sets up tracing specially for dynamic links. <op> allows setting up
  248. of nam tracing as well.
  249. code{$simplelink init-monitor <ns> <qtrace> <sampleInterval>}\
  250. Insert objects that allow us to monitor the queue size of this link.
  251. Return the name of the object that can be queried to determine the average
  252. queue size.
  253. code{$simplelink attach-monitors <insnoop> <outsnoop> <dropsnoop> <qmon>}\
  254. This is similar to init-monitor, but allows for specification of more of
  255. the items.
  256. code{$simplelink dynamic}\
  257. Sets up the dynamic flag for this link.
  258. code{$simplelink errormodule <args>}\
  259. Inserts an error module before the queue.
  260. code{$simpleilnk insert-linkloss <args>}\
  261. Inserts the error module after the queue.
  262. //Other link objects derived from class SimpleLink are FQLink,
  263. CBQLink and IntServLink.
  264. Configuration parameters for FQLink are:
  265. begin{description}
  266. item[queueManagement_] The type of queue management used in the link.
  267.                         Default value is DropTail.
  268. end{description}
  269. No configuration parameters are specified for CBQLink and IntServLink
  270. objects.
  271. item DelayLink Object
  272. The DelayLink Objects determine the amount of time required for a packet
  273. to traverse a link. This is defined to be size/bw + delay where size is
  274. the packet size, bw is the link bandwidth and delay is the link
  275. propagation delay. There are no methods or state variables associated with
  276. this object. 
  277. Configuration Parameters are:
  278. begin{description}
  279. item[bandwidth_] Link bandwidth in bits per second. 
  280. item[delay_] Link propagation delay in seconds. 
  281. end{description}
  282. end{itemize}
  283. section{Commands at a glance}
  284. label{sec:linkscommand}
  285. Following is a list of common link commands used in simulation scripts:
  286. begin{flushleft}
  287. code{$ns_ simplex-link <node1> <node2> <bw> <delay> <qtype> <args>}\
  288. This command creates an unidirectional link between node1 and node2 with
  289. specified bandwidth (BW) and delay characteristics. The link uses a queue
  290. type of <qtype> and depending on the queue type different arguments are
  291. passed through <args>.
  292. code{$ns_ duplex-link <node1> <node2> <bw> <delay> <qtype> <args>}\
  293. This creates a bi-directional link between node1 and node2. This procedure
  294. essentially creates a duplex-link from two simplex links, one from node1
  295. to node2 and the other from node2 to node1. The syntax for duplex-link is
  296. same as that of simplex-link described above.
  297. code{$ns_ duplex-intserv-link <n1> <n2> <bw> <dly> <sched> <signal> <adc> <args>}\
  298. This creates a duplex-link between n1 and n2 with queue type of intserv, with
  299. specified BW and delay. This type of queue implements a scheduler with two
  300. level services priority. The type of intserv queue is given by <sched>, with
  301. admission control unit type of <adc> and signal module of type <signal>.
  302. code{$ns_ simplex-link-op <n1> <n2> <op> <args>}\
  303. This is used to set attributes for a simplex link. The attributes may be
  304. the orientation, color, label, or queue-position.
  305. code{$ns_ duplex-link-op <n1> <n2> <op> <args>}\
  306. This command is used to set link attributes (like orientation of the links,
  307. color, label, or queue-position) for duplex links.
  308. code{$ns_ link-lossmodel <lossobj> <from> <to>}\
  309. This function generates losses (using the loss model <lossobj> inserted in
  310. the link between <from> node and <to> node) in the link that can be
  311. visualized by nam.
  312. code{$ns_ lossmodel <lossobj> <from> <to>}\
  313. This is used to insert a loss module in regular links.
  314. Following is a list of internal link-related procedures:
  315. code{$ns_ register-nam-linkconfig <link>}\
  316. This is an internal procedure used by code{"$link orient"} to 
  317. register/update the order in which links should be created in nam.
  318. code{$ns_ remove-nam-linkconfig <id1> <id2>}\
  319. This procedure is used to remove any duplicate links (duplicate links may be
  320. created by GT-ITM topology generator).
  321. code{$link head}\
  322. Returns the instance variable code{head_} for the link. The code{head_} is
  323. the entry pont to the link and it points to the first object in the link.
  324. code{$link add-to-head <connector>}\
  325. This allows the <connector> object to be now pointed by the code{head_}
  326. element in the link, i.e, <connector> now becomes the first object in the
  327. link.
  328. code{$link link}\
  329. Returns the instance variable code{link_}. The code{link_} is the element
  330. in the link that actually models the link in terms of delay and bandwidth
  331. characteristics of the link.
  332. code{$link queue}\
  333. Returns the instance variable code{queue_}. code{queue_} is queue element
  334. in the link. There may be one or more queue elements in a particular link.
  335. code{$link cost <c>}\
  336. This sets a link cost of <c>.
  337. code{$link cost?}\
  338. Returns the cost value for the link. Default cost of link is set to 1.
  339. code{$link if-label?}\
  340. Returns the network interfaces associated with the link (for multicast routing).
  341. code{$link up}\
  342. This sets the link status to "up". This command is a part of network
  343. dynamics support in ns.
  344. code{$link down}\
  345. Similar to up, this command marks the link status as "down".
  346. code{$link up?}\
  347. Returns the link status. The status is always "up" as default, if link
  348. dynamics is not enabled.
  349. code{$link all-connectors op}\ 
  350. This command applies the specified operation <op> to all connectors in the
  351. link.  Like, code{$link all-connectors reset} or
  352. code{$link all-connectors isDynamic}. 
  353. code{$link install-error <errmodel>}\
  354. This installs an error module after the code{link_} element.
  355. In addition to the Link and link-related commands listed above, there are
  356. other procedures to support the specific requirements of different types of
  357. links derived from the base class "Link" like simple-link (SimpleLink),
  358. integrated service (IntServLink), class-based queue (CBQLink), fair queue
  359. (FQLink) and procedures to support multicast routing, sessionsim, nam etc.
  360. These and the above procedures may be found in ns/tcl/lib(ns-lib.tcl,
  361. ns-link.tcl, ns-intserv.tcl, ns-namsupp.tcl, ns-queue.tcl),
  362. ns/tcl/mcast/(McastMonitor.tcl, ns-mcast.tcl), 
  363. ns/tcl/session/session.tcl.
  364. end{flushleft}