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

通讯编程

开发平台:

Visual C++

  1. %
  2. % personal commentary:
  3. %        DRAFT DRAFT DRAFT
  4. %        - KFALL
  5. %
  6. chapter{Delays and Links}
  7. label{chap:delays}
  8. Delays represent the time required for a packet to
  9. traverse a link.
  10. A special form of this object (``dynamic link'')
  11. also captures the possibility of a link failure.
  12. The amount of time required for a packet to traverse a link
  13. is defined to be $s/b + d$ where $s$ is the packet size
  14. (as recorded in its IP header), $b$ is the speed of the link
  15. in bits/sec, and $d$ is the link delay in seconds.
  16. The implementation of link delays is closely associated with
  17. the blocking procedures described for Queues in
  18. Sectionref{sec:qblock}.
  19. section{The LinkDelay Class}
  20. label{sec:delayclass}
  21. The clsref{LinkDelay}{../ns-2/delay.cc} is derived from the
  22. base clsref{Connector}{../ns-2/connector.h}.
  23. Its definition is in nsf{delay.cc}, and is briefly excerpted below:
  24. begin{program}
  25.         class LinkDelay : public Connector {
  26.          public:
  27.                 LinkDelay();
  28.                 void recv(Packet* p, Handler*);
  29.                 void send(Packet* p, Handler*);
  30.                 void handle(Event* e);
  31.                 double delay();    * line latency on this link */
  32.                 double bandwidth(); * bandwidth on this link */
  33.                 inline double txtime(Packet* p) { * time to send pkt p on this link */
  34.                         hdr_cmn* hdr = (hdr_cmn*) p->access(off_cmn_);
  35.                         return (hdr->size() * 8. / bandwidth_);
  36.                 }
  37.          protected:
  38.                 double bandwidth_; * bandwidth of underlying link (bits/sec) */
  39.                 double delay_;     * line latency */
  40.                 int dynamic_;     * indicates whether or not link is ~ */
  41.                 Event inTransit_;
  42.                 PacketQueue* itq_; * internal packet queue for dynamic links */
  43.                 Packet* nextPacket_; * to be delivered for a dynamic link. */
  44.                 Event intr_;
  45.         };
  46. end{program}
  47. The 
  48. fcnref{fcn[]{recv} method}{../ns-2/delay.cc}{DelayLink::recv}
  49. overrides the base
  50. fcnref{class Connector}{../ns-2/connector.cc}{Connector::recv} version.
  51. It is defined as follows:
  52. begin{program}
  53.         void LinkDelay::recv(Packet* p, Handler* h)
  54.         {    
  55.                 double txt = txtime(p);
  56.                 Scheduler& s = Scheduler::instance();
  57.                 if (dynamic_) {
  58.                         Event* e = (Event*)p;
  59.                         e->time_ = s.clock() + txt + delay_; 
  60.                         itq_->enque(p);
  61.                         schedule_next();
  62.                 } else {
  63.                         s.schedule(target_, p, txt + delay_);
  64.                 }       
  65.                 /*{cf XXX only need one intr_ since upstream object should}
  66.                  * {cf block until it's handler is called}
  67.                  *       
  68.                  * {cf This only holds if the link is not dynamic.  If it is, then}
  69.                  * {cf the link itself will hold the packet, and call the upstream}
  70.                  * {cf object at the appropriate time.  This second interrupt is}
  71.                  * {cf called code{inTransit_}, and is invoked through fcn[]{schedule_next}}
  72.                  */
  73.                 s.schedule(h, &intr_, txt);
  74.         }   
  75. end{program}
  76. This object supports one 
  77. fcnref{instproc-like}{../ns-2/delay.cc}{LinkDelay::command},
  78. code{$object dynamic},
  79. to set its variable, code{dynamic_}. 
  80. This variable determines whether the link is dynamic or not (ie, prone
  81. to fail/recover at appropriate times).
  82. The internal behavior of the link in each case is different.
  83. For ``non-dynamic'' links,
  84. this method operates by receiving a packet, $p$,  and scheduling two
  85. events.
  86. Assume these two events are called $E_1$ and $E_2$, and that
  87. event $E_1$ is scheduled to occur before $E_2$.
  88. $E_1$ is scheduled to occur when the upstream node attached to this
  89. delay element has completed sending the current packet
  90. (which takes time equal to the packet size divided by the link bandwidth).
  91. $E_1$ is usually associated with a code{Queue} object, and will
  92. cause it to (possibly) become unblocked (see section ref{sec:qblock}).
  93. $E_2$ represents the packet arrival event at the downstream neighbor
  94. of the delay element.
  95. Event $E_2$ occurs a number of seconds later than $E_1$ equal to the
  96. link delay.
  97. Alternately, when the link is dynamic, and receives  $p$, then
  98. it will schedule $E_1$ to possibly unblock the queue at the
  99. appropriate time.
  100. However, $E_2$ is scheduled only
  101. if $p$ is the only packet currently in transit.
  102. Otherwise, there is at least one packet in transit on the link that must
  103. be delivered before $p$ at $E_2$.
  104. Therefore, packet $p$ is held in the object's inTransit queue, code{itq_}.
  105. When the packet just before $p$ in transit on the link is delivered
  106. at the neighbor node, 
  107. the DelayLink object will schedule an event for itself to fire at $E_2$.
  108. At that appropriate time then, 
  109. fcnref{it's fcn[]{handle} method}{../ns-2/delay.cc}{LinkDelay::handle}
  110. will directly send $p$ to its target.
  111. The object's internal
  112. fcnref{fcn[]{schedule_next} method}{../ns-2/delay.h}{%
  113.         LinkDelay::schedule_next} 
  114. will schedule these events for packet sin transit at the appropriate time.
  115. section{Commands at a glance}
  116. The LinkDelay object represents the time required by a packet to
  117. transverse the link and is used internally within a Link. Hence we donot
  118. list any linkdelay related commands suitable for simulation scripts here.