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

通讯编程

开发平台:

Visual C++

  1. chapter{DelayBox: Per-Flow Delay and Loss}
  2. label{chap:delaybox}
  3. DelayBox is an ns node that should be placed in between the source and
  4. destination nodes. With Delaybox, packets from a TCP flow can be
  5. delayed, dropped, and/or forced through a bottleneck link before being
  6. passed on to the next node. A distribution can be used to specify
  7. delay, loss, and/or bottleneck link speed for a source - destination
  8. pair.  Each flow between that source - destination pair draws from the
  9. distribution to determine its characteristics. Delays in DelayBox are
  10. per-flow, rather than per-packet. Since DelayBox distinguishes between
  11. flows, the {tt fid_} variable (flow identifier) should be set for
  12. each flow in the simulation.  DelayBox can be used with both Tcp and
  13. FullTcp agents.
  14. section{Implementation Details}
  15. DelayBox maintains two tables: a rule table and a flow table.  Entries
  16. in the rule table are added by the user in the OTcl simulation script
  17. and give an outline of how flows from a source to a destination should
  18. be treated.  The fields are source, destination, delay Random Variable
  19. (in ms), loss rate Random Variable (in fraction of packets dropped),
  20. and bottleneck link speed Random Variable (in Mbps).  The bottleneck
  21. link speed field is optional.  Entries in the flow table are created
  22. internally and specify exactly how each flow should be handled.  Its
  23. values are obtained by sampling from the distributions given in the
  24. rule table.  The fields are source, destination, flow ID, delay, loss,
  25. and bottleneck link speed (if applicable).  Full-TCP flows are defined
  26. as beginning at the receipt of the first SYN of a new flow ID and
  27. ending after the sending of the first FIN.  Packets after the first
  28. FIN are forwarded immediately (<i>i.e.</i>, they are neither delayed
  29. nor dropped by DelayBox). For TcpAgent, flows are defined as beginning
  30. at the receipt of the first 40 byte packet of a new flow ID.  Since
  31. there are no FIN packets in TcpAgent, TcpAgent flows are never
  32. considered finished nor are they removed from the flow table.
  33. DelayBox also maintains a set of queues to handle delaying packets.
  34. There is one queue per entry in the flow table.  These queues are
  35. implemented as delta queues, in that the time to transfer the packet
  36. is kept only for the head packet.  All other packets are stored with
  37. the difference between the time they should be transferred and the
  38. time the previous packet should be transferred.  The actual time the
  39. previous packet should be transferred is stored in the variable {tt
  40.   deltasum_}, named so because it is the sum of all delta values in
  41. the queue (including the head packet's transfer time).  If the
  42. bottleneck link speed has been specified for the flow, a processing
  43. delay is computed for each packet by dividing the size of the packet
  44. by the flow's bottleneck link speed.
  45. When a packet is received, its transfer time (current time + delay) is
  46. calculated.  (This transfer time is the time that the first bit of the
  47. packet will begin transfer.  Packets that wait in the queue behind
  48. this packet must be delayed by the amount of time to transfer all bits
  49. of the packet over the bottleneck link.)  There are two scenarios to
  50. consider in deciding how to set the packet's delta:
  51. begin{enumerate}
  52.   item If the packet is due to be transferred before the last bit of
  53.     the last packet in the queue, its delta (the time between transferring
  54.    the previous packet and transferring this packet) is set to the
  55.    previous packet's processing delay.  This packet has to queue
  56.    behind the previous packet, but will be ready to be transmitted as
  57.    soon as the previous packet has completed its transfer.
  58.   item If the packet is due to be transferred after the last bit of
  59.     the last packet in the queue, its delta is difference between this
  60.    packet's transfer time and the previous packet's transfer time.
  61. end{enumerate}
  62. If the current packet is the only packet in the queue, DelayBox
  63. schedules a timer for the receipt of the packet.  When this timer
  64. expires, DelayBox will pass the packet on to the standard packet
  65. forwarder for processing.  Once a packet has been passed up,
  66. DelayBox will look for the next packet in the queue to be
  67. processed and schedule a timer for its transfer. All packets, both
  68. data and ACKs, are delayed in this manner.
  69. Packets that should be dropped are neither queued nor passed on.  All
  70. packets in a queue are from the same connection and are delayed
  71. the same amount (except for delays due to packet size) and are
  72. dropped with the same probability.  {bf Note:} Drops at DelayBox are
  73. not recorded in the trace-queue file.
  74. section{Example}
  75. More examples are available in the {tt tcl/ex/delaybox/} directory of the
  76. ns source code.  The validation script {tt test-suite-delaybox.tcl}
  77. is in {tt tcl/test/} and can be run with the command {tt
  78. test-all-delaybox} from that directory.
  79. begin{verbatim}
  80. # test-delaybox.tcl - NS file transfer with DelayBox
  81. # setup ns
  82. remove-all-packet-headers;            # removes all packet headers
  83. add-packet-header IP TCP;             # adds TCP/IP headers
  84. set ns [new Simulator];               # instantiate the simulator
  85. global defaultRNG
  86. $defaultRNG seed 999
  87. # create nodes
  88. set n_src [$ns node]
  89. set db(0) [$ns DelayBox]
  90. set db(1) [$ns DelayBox]
  91. set n_sink [$ns node]
  92. # setup links
  93. $ns duplex-link $db(0) $db(1) 100Mb 1ms DropTail
  94. $ns duplex-link $n_src $db(0) 100Mb 1ms DropTail
  95. $ns duplex-link $n_sink $db(1) 100Mb 1ms DropTail
  96. set src [new Agent/TCP/FullTcp]
  97. set sink [new Agent/TCP/FullTcp]
  98. $src set fid_ 1
  99. $sink set fid_ 1
  100. # attach agents to nodes
  101. $ns attach-agent $n_src $src
  102. $ns attach-agent $n_sink $sink
  103. # make the connection
  104. $ns connect $src $sink
  105. $sink listen
  106. # create random variables
  107. set recvr_delay [new RandomVariable/Uniform];     # delay 1-20 ms
  108. $recvr_delay set min_ 1 
  109. $recvr_delay set max_ 20
  110. set sender_delay [new RandomVariable/Uniform];    # delay 20-100 ms
  111. $sender_delay set min_ 20
  112. $sender_delay set max_ 100
  113. set recvr_bw [new RandomVariable/Constant];       # bw 100 Mbps
  114. $recvr_bw set val_ 100
  115. set sender_bw [new RandomVariable/Uniform];       # bw 1-20 Mbps
  116. $sender_bw set min_ 1
  117. $sender_bw set max_ 20
  118. set loss_rate [new RandomVariable/Uniform];       # loss 0-1% loss
  119. $loss_rate set min_ 0
  120. $loss_rate set max_ 0.01
  121. # setup rules for DelayBoxes 
  122. $db(0) add-rule [$n_src id] [$n_sink id] $recvr_delay $loss_rate $recvr_bw
  123. $db(1) add-rule [$n_src id] [$n_sink id] $sender_delay $loss_rate $sender_bw
  124. # output delays to files
  125. $db(0) set-delay-file "db0.out"
  126. $db(1) set-delay-file "db1.out"
  127. # schedule traffic
  128. $ns at 0.5 "$src advance 10000"
  129. $ns at 1000.0 "$db(0) close-delay-file; $db(1) close-delay-file; exit 0"
  130. # start the simulation
  131. $ns run
  132. end{verbatim}
  133. section{Commands at a Glance}
  134. The following commands on the DelayBox class can be accessed from OTcl:
  135. {tt [$ns DelayBox]}\
  136. Creates a new DelayBox node.
  137. {tt $delaybox add-rule <srcNodeID> <dstNodeID> <delayRV> [<lossRV>] [<linkSpeedRV>]}\
  138.   Add a rule to the rule table, specifying delay, loss rate, and
  139.   bottleneck link speed RandomVariables for packets flowing from {tt
  140.   srcNode} to {tt dstNode}.  Delay is required, but loss rate and
  141.   link speed are optional.
  142. {tt $delaybox list-rules}\
  143. List all rules in the rule table
  144. {tt $delaybox list-flows}\
  145. List all flows in the flow table
  146. {tt $delaybox set-asymmetric}\
  147. Specifies that the delay should be only on the data path rather than
  148. applied to both the data and ACK paths
  149. {tt $delaybox set-delay-file <filename>}\
  150. Output delays for each flow to {tt filename}.  Format: {tt srcNode
  151. dstNode fid delay} 
  152. {tt $delaybox close-delay-file}\
  153. Closes the file where delays are written
  154. {tt $delaybox set-debug <int>}\
  155. Set the debugging level
  156. begin{itemize}
  157. item{1: Output when packets are dropped at DelayBox}
  158. item{2: Level 1 + \
  159. Contents of the queue at each queue operation
  160. }
  161. end{itemize}