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

通讯编程

开发平台:

Visual C++

  1. chapter{Session-level Packet Distribution}
  2. label{chap:session}
  3. This section describes the internals of the Session-level Packet Distribution
  4. implementation in ns.
  5. The section is in two parts:
  6. the first part is an overview of 
  7. a basic Session configuration,
  8. and a ``complete'' description of the configuration parameters 
  9. of a Session.
  10. The second part describes the architecture, internals, and the code path
  11. of the Session-level Packet distribution.
  12. Session-level Packet Distribution enables simulations with large-scale 
  13. topologies.  A 2048 node and 8 connectivity degree topology takes roughly 
  14. 40 MB in memory, 2049-4096 node topology takes about 167 MB, and 4097-
  15. 8194 node topology takes about 671 MB.  However, the queuing delays that
  16. may occur in routers are ignored.  Therefore, if simulations are involved 
  17. with high source rate or multiple sources merging at some point resulting
  18. a high aggregated rate, please avoid using Session-level Packet Distribution.
  19. section{Configuration}
  20. subsection{Basic Configuration}
  21. label{sec:basic-config}
  22. Each Session (i.e., a multicast tree) must be configured strictly in
  23. this order:
  24. creating(obtaining) the session source,
  25. assigning the destination address,
  26. creating the session helper, 
  27. attaching to session source, and
  28. the session members joining the group.
  29. begin{program}
  30.         set ns [new SessionSim]          ; preamble initialization;
  31.         set node [$ns node]              ; source and receiver to reside on this node;
  32.         set group [$ns allocaddr]        ; multicast group for this session;
  33.         set src [new Agent/CBR]
  34.         $src set dst_ $group            ; configure the source;
  35.         $ns attach-agent $node $src
  36.         $ns create-session $node $src   ; creating the session helper and attaching to the source;
  37.         set rcvr [new Agent/NULL]        ; configure the receiver;
  38.         $ns attach-agent $node $rcvr
  39.         $ns at 0.0 "$node join-group $rcvr $group" ; joining the session;
  40.         $ns at 0.1 "$src start"          ; start the source;
  41. end{program}
  42. subsection{Inserting a Loss Module}
  43. label{sec:loss-config}
  44. When simulating mechanism robustness(e.g., SRM error recovery mechanism), 
  45. modules like lossy links are desired to create error senarios.  This 
  46. subsection is describe how to create a lossy link, meaning inserting 
  47. a loss module for a 'virtual link' (a link directly connecting source
  48. and receiver with accumulative bandwidth and delay).
  49. Please note that packets dropped at a particular link in a
  50. multicast tree will not be received by
  51. the receivers in the particular downstream subtree. We have worked 
  52. on this dependency problem and now the loss modules for the downstream 
  53. receivers will be installed automatically when a lossy link is created.
  54. paragraph{Creating a Loss Module}
  55. Before we can insert a loss module in between a source-receiver pair,
  56. we have to create the loss module.  Basically,
  57. a loss module compares two values to decide whether to drop a packet.
  58. The first value is obtained every time when the loss module receives 
  59. a packet from a random variable.  The second value
  60. is fixed and configured when the loss module is created.
  61. The following code gives an example to create a uniform 
  62. 0.1 loss rate.
  63. begin{program}
  64.         # creating the uniform distribution random variable
  65.         set loss_random_variable [new RandomVariable/Uniform] 
  66.         # setting the range of random variable
  67.         $loss_random_variable set min_ 0
  68.         $loss_random_variable set max_ 100
  69.         # creating an error module;
  70.         set loss_module [new ErrorModel]
  71.         # set target for dropped packets;
  72.         $loss_module drop-target [new Agent/Null]
  73.         # setting error rate to 0.1, 10/(100-0);
  74.         $loss_module set rate_ 10
  75.         # attaching the random variable to the loss module;
  76.         $loss_module ranvar $loss_random_variable 
  77. end{program}
  78. Several random variable distributions are available.
  79. %%% Need xref to ranvar pages
  80. Please refer to tcl/ex/ranvar.tcl.
  81. paragraph{Inserting a Loss Module}
  82. If it is intended to insert a loss module for a receiver, keep a handle to the 
  83. loss module when created.  Loss modules can only be inserted after the
  84. corresponding receivers finish joining the group.
  85. begin{program}
  86.         # keep a handle to the loss module;
  87.         set sessionhelper [$ns create-session $node $src] 
  88.         # insert the loss module;
  89.         $ns at 0.1 "$sessionhelper insert-depended-loss $loss_module $rcvr" 
  90. end{program}
  91. section{Architecture}
  92. label{sec:session-arch}
  93. The purpose of Session-level packet distribution is to
  94. speed up simulations and reduce memory consumption while 
  95. maintaining reasonable accuracy(if no queuing involved).  The first
  96. bottleneck observed is the memory consumption by heavy-weight
  97. links and nodes.  Therefore, in SessionSim (Simulator for Session-level
  98. packet distribution), we keep only minimal amount of 
  99. states for links and nodes, and connect the higher level source and 
  100. receiver applications with appropriate delay and loss modules.  When
  101. a connection is a multicast group, we attach a replicator 
  102. to the source application, so the replicator replicates packets
  103. to all loss or delay modules attached to the receiver applications.
  104. In short, almost the entire network layer(routing and queuing)
  105. is abstract out.  Packets in SessionSim do not get routed.  
  106. They only follow the established Session.
  107. section{Internals}
  108. In this section, we explain the internals of Session-level Packet 
  109. Distribution.  The implementation is split into two parts:
  110. begin{list}{}{}
  111. item  Linkage of objects to make a Session in OTcl 
  112. item  Packet forwarding activities are executed by C++ methods.  
  113. end{list}
  114. subsection{Object Linkage}
  115. label{sec:session-objlink}
  116. begin{list}{}{}
  117. item  Simplified links and nodes.
  118. item  Replicator
  119. item  Delay and loss modules
  120. end{list}
  121. paragraph{Nodes and Links}
  122. A link only contains the values of
  123. its bandwidth and delay, and a node contains only its id and port number
  124. for next agent.
  125. begin{program}
  126. SessionSim instproc simplex-link { n1 n2 bw delay type } {
  127.     $self instvar bw_ delay_
  128.     set sid [$n1 id]
  129.     set did [$n2 id]
  130.     set bw_($sid:$did) [expr [string trimright $bw Mb] * 1000000]
  131.     set delay_($sid:$did) [expr [string trimright $delay ms] * 0.001]
  132. }
  133. SessionNode instproc init {} {
  134.     $self instvar id_ np_
  135.     set id_ [Node getid]
  136.     set np_ 0
  137. }
  138. end{program}
  139. paragraph{Replicator}
  140. One replicator is required per source.  While the source is configured,
  141. a replicator (session helper) need to be attached to the source.  By
  142. calling proc[]{create-session}, a replicator is:
  143. created,
  144. attached to the source application, and 
  145. kept in a SessionSim instance variable code{session_} array with 
  146. its source and destination addresses as the index.
  147. Note that the destination of source agent must be set before
  148. calling proc[]{create-session}.
  149. begin{program}
  150. SessionSim instproc create-session { node agent } {
  151.     $self instvar session_
  152.     set nid [$node id]                           ; get source address;
  153.     set dst [$agent set dst_]                    ; get destination address;
  154.     set session_($nid:$dst) [new Classifier/Replicator/Demuxer]  ; creating the replicator;
  155.     $agent target $session_($nid:$dst)           ; attach the replicator to the source;
  156.     return $session_($nid:$dst) ; keep the replicator in the SessionSim instance variable session_ array;
  157. }
  158. end{program}
  159. paragraph{Delay and Loss Modules}
  160. At least one delay module is required per receiver.
  161. See Section~ref{sec:loss-config} for inserting a loss module for a receiver.
  162. When a receiver joins a group, 
  163. the proc[]{join-group} method goes through
  164. all replicators (session helpers) maintained in code{session_}.
  165. If the destination index matches the group address
  166. the receiver are joining, then the following actions are performed.
  167. 1. A new slot of the replicator (session helper) is created and assigned to the receiver.
  168. 2. An accumulated bandwidth and delay between the source and receiver are obtained by SessionSim instance procedure proc[]{get-bw} and proc[]{get-delay}.
  169. 3. A constant random variable is created and assigned with the
  170. accumulative delay.
  171. 4. A delay module is created and assigned with the constant random 
  172. variable and the accumulative bandwidth.
  173. 5. The delay module in inserted into the replicator slot in
  174. front of the receiver.
  175. begin{program}
  176. SessionSim instproc join-group { agent group } {
  177.     $self instvar session_
  178.     foreach index [array names session_] {
  179.         set pair [split $index :]
  180.         if {[lindex $pair 1] == $group} {
  181.             # Note: must insert the chain of loss, delay, 
  182.             # and destination agent in this order:
  183.             #1. insert destination agent into session replicator
  184.             $session_($index) insert $agent
  185.             #2. find accumulative bandwidth and delay
  186.             set src [lindex $pair 0]
  187.             set dst [[$agent set node_] id]
  188.             set accu_bw [$self get-bw $dst $src]
  189.             set delay [$self get-delay $dst $src]
  190.             #3. set up a constant delay random variable
  191.             set random_variable [new RandomVariable/Constant]
  192.             $random_variable set avg_ $delay
  193.             #4. set up the delay module
  194.             set delay_module [new DelayModel]
  195.             $delay_module bandwidth $accu_bw
  196.             $delay_module ranvar $random_variable
  197.             #5. insert the delay module in front of the dest agent
  198.             $session_($index) insert-module $delay_module $agent
  199.         }
  200.     }
  201. }
  202. end{program}
  203. subsection{Packet Forwarding}
  204. label{sec:session-pktforward}
  205. Packet forwarding activities are executed in C++.  A source application 
  206. generates a packet and forwards to its target which must be a replicator 
  207. (session helper).  The replicator copies the packet and forwards 
  208. to targets in the active slots which are either delay modules or loss modules. If loss modules, a decision is made whether to drop the packet.
  209. If yes, the packet is forwarded to the loss modules drop target.  If not,
  210. the loss module forwards it to its target which must be a delay module.
  211. The delay module will forward the packet with a delay to its target which
  212. must be a receiver application.
  213. %% PH: not sure this will come out right
  214. %% PH: make .eps picture but not sure how to import that
  215. begin{program}
  216.                     / Loss module - Delay module - Receiver 1
  217. Source - Replicator --------------- Delay module - Receiver 2
  218.     (Session Helper)bs Loss module - Delay module - Receiver 3
  219. end{program}
  220. endinput
  221. ### Local Variables:
  222. ### mode: latex
  223. ### comment-column: 60
  224. ### backup-by-copying-when-linked: t
  225. ### file-precious-flag: nil
  226. ### End: