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

通讯编程

开发平台:

Visual C++

  1. %
  2. % personal commentary:
  3. %        DRAFT DRAFT DRAFT
  4. %        - KFALL
  5. %
  6. section{shdr{Delays and Links}{delay.cc}{sec:delays}}
  7. Delays represent the time required for a packet to
  8. traverse a link.
  9. A special form of this object (``dynamic link'')
  10. also captures the possibility of a link failure.
  11. The amount of time required for a packet to traverse a link
  12. is defined to be $s/b + d$ where $s$ is the packet size
  13. (as recorded in its IP header), $b$ is the speed of the link
  14. in bits/sec, and $d$ is the link delay in seconds.
  15. The implementation of link delays is closely associated with
  16. the blocking procedures described for Queues in
  17. Sectionref{sec:qblock}.
  18. subsection{shdr{The LinkDelay Class}{delay.cc}{sec:delayclass}}
  19. The code{LinkDelay} class is derived from a
  20. code{Connector} base class.
  21. The following definitions are provided in code{delay.cc}
  22. for the code{DelayLink} object:
  23. begin{small}
  24. begin{verbatim}
  25.         class LinkDelay : public Connector {
  26.          public:
  27.                 LinkDelay();
  28.                 void recv(Packet* p, Handler*);
  29. void send(Packet* p, Handler*);
  30. double delay();    /* line latency on this link */
  31. double bandwidth(); /* bandwidth on this link */
  32. double txtime(Packet* p); /* time to send pkt p on this link */
  33.          protected:
  34.                 double bandwidth_; /* bandwidth of underlying link (bits/sec) */
  35.                 double delay_;     /* line latency */
  36.                 Event intr_;
  37.         };
  38. end{verbatim}
  39. end{small}
  40. The code{recv} function overrides the code{Connector} base class version.
  41. It is defined as follows:
  42. begin{small}
  43. begin{verbatim}
  44.         void LinkDelay::recv(Packet* p, Handler* h)
  45.         {    
  46.          double txt = txtime(p);
  47.          Scheduler& s = Scheduler::instance();
  48.          if (dynamic_) {
  49.          Event* e = (Event*)p;
  50.          e->time_ = s.clock() + txt + delay_; 
  51.          itq_->enque(p);
  52.          schedule_next();
  53.          } else {
  54.          s.schedule(target_, p, txt + delay_);
  55.          }       
  56.          /*XXX only need one intr_ since upstream object should
  57.           * block until it's handler is called
  58.           *       
  59.           * This only holds if the link is not dynamic.  If it is, then
  60.           * the link itself will hold the packet, and call the upstream
  61.           * object at the appropriate time.  This second interrupt is
  62.           * called inTransit_, and is invoked through schedule_next()
  63.           */      
  64.          s.schedule(h, &intr_, txt);
  65.         }   
  66. end{verbatim}
  67. end{small}
  68. For ``non-dynamic'' links,
  69. this method operates by receiving a packet and scheduling two
  70. events.
  71. Assume these two events are called $E_1$ and $E_2$, and that
  72. event $E_1$ is scheduled to occur before $E_2$.
  73. $E_1$ is scheduled to occur when the upstream node attached to this
  74. delay element has completed sending the current packet
  75. (which takes time equal to the packet size divided by the link bandwidth).
  76. $E_1$ is usually associated with a code{Queue} object, and will
  77. cause it to (possibly) become unblocked (see section ref{sec:qblock}).
  78. $E_2$ represents the packet arrival event at the downstream neighbor
  79. of the delay element.
  80. Event $E_2$ occurs a number of seconds later than $E_1$ equal to the
  81. link delay.
  82. subsection{shdr{The Otcl Link Class}{ns-link.tcl}{sec:nslink}}
  83. The code{Link} class is one of a handful of classes implemented
  84. entirely in Otcl.  It has a subclass called code{SimpleLink}
  85. used frequently in the simulator.
  86. The OTcl code{SimpleLink} class uses the C++ code{LinkDelay} class
  87. to simulate packet delivery delays as described above.
  88. The code{Link} class is defined as follows:
  89. begin{small}
  90. begin{verbatim}
  91.         Class Link
  92.         Link instproc init { src dst } {
  93.                 $self next
  94.                 $self instvar trace_ fromNode_ toNode_
  95.                 set fromNode_ $src
  96.                 set toNode_ $dst
  97.                 set trace_ ""
  98.         }
  99.         Link instproc head {} {
  100.                 $self instvar head_
  101.                 return $head_
  102.         }
  103.         Link instproc queue {} {
  104.                 $self instvar queue_
  105.                 return $queue_
  106.         }
  107.         Link instproc link {} {
  108.                 $self instvar link_
  109.                 return $link_
  110.         }
  111. end{verbatim}
  112. end{small}
  113. This class really just holds enough state to describe what nodes the two
  114. endpoints of the link are attached to and also hold references to
  115. C++ code{Queue} and code{LinkDelay} objects which are used by classes
  116. derived from code{Link}, such as code{SimpleLink}.
  117. The code{head_} member indicates the first object to receive
  118. a packet that traverses down the link.
  119. Orinarily this would be the code{Queue} object, but
  120. sometimes it is some form of trace object (see Sectionref{sec:trace}).
  121. subsection{shdr{The Otcl SimpleLink Class}{ns-link.tcl}{sec:nslink}}
  122. The Otcl class code{SimpleLink} implements a simple point-to-point
  123. link with an associated queue and
  124. delay.footnote{The current
  125. version also includes an object to examine the
  126. network layer ``ttl'' field and discard packets if the
  127. field reaches zero.}
  128. It is derived from the base Otcl class code{Link} as follows:
  129. begin{small}
  130. begin{verbatim}
  131.         Class SimpleLink -superclass Link
  132.         SimpleLink instproc init { src dst bw delay q { lltype "DelayLink" } } {
  133.                 $self next $src $dst
  134.                 $self instvar link_ queue_ head_ toNode_ ttl_
  135.                 ...
  136.                 set queue_ $q
  137.                 set link_ [new Delay/Link]
  138.                 $link_ set bandwidth_ $bw
  139.                 $link_ set delay_ $delay
  140.                 $queue_ target $link_
  141.                 $link_ target [$toNode_ entry]
  142.                 ...
  143.                 # XXX
  144.                 # put the ttl checker after the delay
  145.                 # so we don't have to worry about accounting
  146.                 # for ttl-drops within the trace and/or monitor
  147.                 # fabric
  148.                 #
  149.                 set ttl_ [new TTLChecker]
  150.                 $ttl_ target [$link_ target]
  151.                 $link_ target $ttl_
  152.         }
  153. end{verbatim}
  154. end{small}
  155. The ``init'' proc listed here is the Otcl analogue of a C++
  156. constructor.
  157. Thus, when a code{SimpleLink} object is created,
  158. new code{Delay/Link} and code{TTLChecker} objects are
  159. also created.
  160. Note that a code{Queue} object must have already been created.
  161. There are two additional methods implemented (in OTcl) as part
  162. of the code{SimpleLink} class: code{trace} and code{init-monitor}.
  163. These functions are further described in the section about tracing
  164. (see Sectionref{sec:trace}).