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

通讯编程

开发平台:

Visual C++

  1. Ryan S. Barnett
  2. June 28, 2001
  3. University of Southern California
  4. PGM HOWTO
  5. A simplified version of the Pragmatic General Multicast (PGM) Reliable
  6. Transport Protocol has been provided for ns 2.1b8.  This implementation
  7. conforms to a subset of the specification provided by IETF Draft v6 by
  8. Speakman et al.  The implementation and other PGM related files are contained
  9. in the ~ns/pgm directory.  The default OTcl parameters for all PGM objects
  10. are specified in ~ns/tcl/lib/ns-default.tcl.
  11. 1. What is supported?
  12. All general PGM procedures are supported, including at least the following:
  13. Senders:
  14.    a. Multiple PGM senders on a single network,
  15.    b. RDATA generation,
  16.    c. NAK reliability,
  17.    d. Source Path State generation.
  18. Network Elements:
  19.    a. Source Path State processing,
  20.    b. NAK reliability,
  21.    c. Constrained NAK forwarding,
  22.    d. NAK elimination,
  23.    e. Constrained RDATA forwarding,
  24.    f. NAK Anticipation.
  25. Receivers:
  26.    a. NAK suppression (with a random back-off interval),
  27.    b. NAK reliability.
  28. 2. What is NOT supported?
  29. This implementation of PGM does not support the following features described
  30. in the PGM specification.  These are left for future enhancements:
  31.    a. PGM Options: These include fragmentation, late joining, redirection,
  32.       Forward Error Correction, reachability, and session control.
  33.    b. Designated Local Repairer (DLR) support.
  34.    c. Congestion control techniques.
  35.    d. Transmit Windows and Receive Windows. The sender is assumed to have an
  36.       infinitely large buffer to provide a repair retransmission for any
  37.       sequence number.
  38. 3. PGM Agents Overview
  39. Three PGM agents are available to be used within the Tcl simulation 
  40. environment: Agent/PGM, Agent/PGM/Sender, and Agent/PGM/Receiver.
  41. Agent/PGM provides the "network element" functionality.  This allows the
  42. node to intercept intermediate PGM packets, not designated to that node, and
  43. process them accordingly.  (The required behavior is similar to the
  44. IP Router Alert option that must be used by PGM routers.)  The typical
  45. behavior of Agent/PGM includes: source path state processing, NAK
  46. confirmation, constrained reliable NAK forwarding, and constrained RDATA
  47. forwarding.
  48. Agent/PGM/Sender provides the functionality for a node to be the source of
  49. packets for a PGM session.  An Application is run on top of this agent 
  50. such as Application/Traffic/CBR.  The typical behavior of Agent/PGM/Sender
  51. includes: heartbeat SPM generation, NAK confirmation, and delayed repair
  52. transmission.
  53. Agent/PGM/Receiver provides the functionality for a node to be a receiver
  54. of a PGM session.  The typicial behavior of Agent/PGM/Receiver includes:
  55. constrained NAK generation and NAK retransmission.
  56. NOTE: A single node can have both the Agent/PGM and Agent/PGM/Receiver
  57. (or Agent/PGM/Sender) attached to the node.  In fact,
  58. when PGM is activated in the Simulator, an Agent/PGM is automatically created
  59. and attached to _every_ node created thereafter.  This is required to
  60. allow the node to intercept PGM packets (aka router-alert) if it is to be
  61. a "network element".  Hence, the user never explicitly creates Agent/PGM
  62. agents.  A command can be issued to the node to disable its
  63. Agent/PGM, if desired, to simulate an environment with non-PGM routers.  It
  64. is perfectly normal for a node to be both an Agent/PGM and a Receiver,
  65. with the Agent/PGM enabled, regardless if it is a leaf node or not.
  66. 4. PGM Agent Settings
  67. The following are tunable parameters that are available for the three PGM
  68. agent types.  The default settings are located in ~ns/tcl/lib/ns-default.tcl.
  69.    a. Agent/PGM
  70.       pgm_enabled_: [0 or 1, default: 1] This is used to toggle whether the
  71.          given agent is active.  When set to 0 the node simply forwards
  72.          packets to the next node or agent without any PGM processing.
  73.       nak_retrans_ival_: [default: 50ms] The amount of time the
  74.          agent waits between retransmitting a NAK that it is waiting for a NCF
  75.          packet.
  76.       nak_rpt_ival_: [default: 1000ms] This is the amount of time the network
  77.          element will continue to repeat NAKs while waiting for a
  78.          corresponding NCF.  Once this time expires and no NCF is received,
  79.          then the entire repair state is removed for that sequence number.
  80.       nak_rdata_ival_: [default: 10000ms] This is the length of time the
  81.          network element will wait for the corresponding RDATA before removing
  82.          the entire repair state.
  83.       nak_elim_ival_: [default: 5000ms] Once a NAK has been confirmed, the
  84.          network elements must discard all further NAKs for up to this length
  85.          of time.  This should be a fraction of nak_rdata_ival_.
  86.    b. Agent/PGM/Sender
  87.       spm_interval_: [default: 500ms] The length of time to wait between
  88.          sending SPM packets.
  89.       rdata_delay_: [default: 70ms] The length of time to delay sending out
  90.          an RDATA in response to a NAK packet.  This is to allow slow NAKs to
  91.          get processed so we don't send out duplicate RDATA.  This delay
  92.          should not exceed twice the greatest propagation delay in the loss
  93.          neighborhood.
  94.    c. Agent/PGM/Receiver
  95.       max_nak_ncf_retries_: [default: 5] Maximum number of times the receiver
  96.          can send out a NAK and time-out waiting for an NCF reply.  Once the
  97.          receiver hits this many retries, it discards the NAK state entirely
  98.          and suffers permanent data loss.
  99.       max_nak_data_retries_: [default: 5] Maximum number of times we can
  100.          time-out waiting for RDATA after an NCF confirmation for a NAK
  101.          request.  Once the receiver hits this many retries, it discards the
  102.          NAK state entirely and suffers permanent data loss.
  103.       nak_bo_ivl_: [default: 30ms] The random back-off interval.  The
  104.          receiver will select a random amount of time no greater than this
  105.          value, before it will send out a NAK packet when detecting a gap in
  106.          the data stream.  It is during this time that the receiver is
  107.          looking for an NCF from another node that might have detected the
  108.          gap first.
  109.       nak_rpt_ivl_: [default: 50ms] The amount of time to wait for a NCF
  110.          packet after sending out a NAK packet to the upstream node.  If no
  111.          NCF is received, another random back-off time is observed, and then
  112.          the NAK is retransmitted.
  113.       nak_rdata_ivl_: [default: 1000ms] The amount of time to wait for RDATA
  114.          after receiving an NCF confirmation for a given NAK.  Once this timer
  115.          expires, another random back-off time is observed, and then the NAK
  116.          is retransmitted.
  117. 5. Using PGM
  118. PGM requires that multicast be enabled, therefore your Tcl simulation script
  119. needs to initialize the ns object with the following statement:
  120.    set ns [new Simulator -multicast on]
  121. To allow nodes to intercept PGM packets and process them, the following
  122. statement must be used:
  123.    $ns node-config -PGM ON
  124. This will instruct ns to implicitly create an Agent/PGM agent for every
  125. new node that is created.  If you want to deactivate an Agent/PGM for a node,
  126. (for example to simulate a non-PGM router), you must extract the agent
  127. from the node using "get-pgm", and then set pgm_enabled_ to 0.  Here is an
  128. example:
  129.    set node1 [$ns node]
  130.    set pgm_agent1 [$node1 get-pgm]
  131.    $pgm_agent1 set pgm_enabled_ 0
  132. Note that it is perfectly fine to keep an Agent/PGM enabled even if it has
  133. a Receiver or Sender attached to it.
  134. Create the multicast group for your PGM session, for example:
  135.    set group [Node allocaddr]
  136. Create the Sending PGM agent, for example:
  137.    set src [new Agent/PGM/Sender]
  138.    $ns attach-agent node2 $src
  139.    $src set dst_addr_ $group
  140.    $src set dst_port_ 0
  141. Attach the Constant Bit Rate traffic source to the PGM Sender, for example:
  142.    set cbr [new Application/Traffic/CBR]
  143.    $cbr attach-agent $src
  144.    $cbr set rate_ 448Kb
  145.    $cbr set packetSize_ 210
  146.    $cbr set random_ 0
  147. Create the PGM Receiver agents and attach them to the nodes that should act
  148. as receivers, for example:
  149.    set rcv3 [new Agent/PGM/Receiver]
  150.    $ns attach-agent $node3 $rcv3
  151.    $ns at 0.01 "$node3 join-group $rcv3 $group"
  152. You must of course attach the links to the nodes using duplex-link, and
  153. set the routing protocol.  You may also want to add loss modules to
  154. have packets be dropped from various links.  See the examples in the
  155. ~ns/pgm/tcl directory for further information.
  156. In order to start the simulation you should first have the PGM Sender
  157. begin to send out heartbeat SPM packets.  These will initialize the
  158. PGM nodes with source path state.  This allows the nodes to know where
  159. to send NAK packets in the event of a packet drop.  The SPM's should be
  160. propagated throughout the network before ODATA is sent from the PGM Sender.
  161. This is done such as:
  162.    $ns at 0.3 "$src start-SPM"
  163. Now you can activate the CBR traffic source, such as:
  164.    $ns at 0.4 "$cbr start"
  165. To finish the simulation you should first terminate the CBR, and then 
  166. terminate the heartbeat SPM packets from the PGM Sender.  For example:
  167.    $ns at 1.5 "$cbr stop"
  168.    $ns at 2.0 "$src stop-SPM"
  169. And then call the finish procedure:
  170.    $ns at 2.0 "finish"
  171. You can then gather PGM statistics on the results of the simulation through
  172. the finish procedure.  To do this you issue the command "print-stats" on the
  173. desired Agent/PGM, Agent/PGM/Sender, or Agent/PGM/Receiver.  Remember
  174. that Receiver and Sender nodes may also have an Agent/PGM, so you will need
  175. to execute two print-stats for a single node.  For example,
  176.    proc finish {} {
  177.       ...
  178.       $src print-stats
  179.       set pgm_agent2 [$node2 get-pgm]
  180.       $pgm_agent2 print-stats
  181.       set pgm_agent3 [$node3 get-pgm]
  182.       $pgm_agent3 print-stats
  183.       $rcv3 print-stats
  184.  
  185.       ...
  186.    }
  187. The statistics that are printed out for Agent/PGM/Sender look like the
  188. following:
  189.    pgmSender-0
  190.            Last ODATA seqno: 266
  191.            Last SPM seqno: 3
  192.            Number of NAKs received: 27
  193.            Number of RDATA transmitted: 27
  194.            Max retransmission count for a single RDATA: 0
  195. The first line is a unique identifier of the Sender.  Every time that a
  196. "new Agent/PGM/Sender" statement is executed the counter increments by one.
  197. The first sender will have a unique identifier of "pgmSender-0".
  198. The next line indicates the sequence number of the last packet transmitted
  199. from this source.  Then we have the last sequence number of the SPM packet
  200. that was transmitted.  Followed by the number of NAK packets that this
  201. source received and the number of RDATA transmitted.
  202. The last line indicates the maximum number of retransmissions of RDATA for
  203. any particular sequence number.
  204. The statistics that are printed out for Agent/PGM look like the following:
  205.    pgmAgent-0:
  206.            NAKs Transmitted:       27
  207.            NAKs Suppressed:        0
  208.            Unsolicited NCFs:       0
  209.            Unsolicited RDATA:      0
  210. The first line is the unique identifier of this agent, it is determined by
  211. the order of node creation.  The second line indicates the number of NAKs
  212. that were transmitted upstream.  The third line is the number of NAKs that
  213. were not acted upon because previous NAK state exists already for that NAK.
  214. The fourth line is the number of NCF packets that were received for a
  215. sequence number when a NAK was not transmitted, this quantifies the NAK
  216. anticipation functionality.  The last line indicates the number of extra
  217. RDATA that the agent received.  This occurs if an upstream router does not
  218. support PGM.
  219. The statistics that are printed out for Agent/PGM/Receiver look like the
  220. following:
  221.    pgmRecv-0:
  222.            Last packet:            266
  223.            Max packet:             266
  224.            Packets recovered:      27
  225.            Latency (min, max, avg):        0.134128, 0.156994, 0.144058
  226.            Total NAKs sent:        27
  227.            Retransmitted NAKs:     0
  228. The first line is the unique identifier of this agent.  The next line is the
  229. last sequence number received, followed by the maximum contiguous packet
  230. received.  The next line is the number of packets recovered by RDATA,
  231. followed by the average latency to recover those packets.  The next line
  232. indicates the total number of NAKs that were sent, followed by the
  233. number of NAKs that were retransmitted due to timeouts.
  234. 6. Using the PGM Error Model
  235. The PGMErrorModel allows the user to specify which packets should be lost
  236. on a given link during the simulation.  The interface to this model is
  237. similar to that of the Periodic Error Model.  You use the procedure
  238. "drop-packet" with the first argument being the type of PGM packet you
  239. would like dropped, followed by the cycle period, and finally the offset
  240. within each period.
  241. To specify the type of PGM packet, use one of the following
  242. strings: SPM, ODATA, RDATA, NAK, or NCF.
  243. Here is an example of how to drop the fifth ODATA packet that crosses the
  244. link from Node 1 to Node 2, and continue to drop the fifth packet
  245. when the next 10 ODATA packets cross the link:
  246.    set loss_module [new PGMErrorModel]
  247.    $loss_module drop-packet ODATA 10 5
  248.    $loss_module drop-target [$ns set nullAgent_]
  249.    $ns lossmodel $loss_module $node1 $node5
  250. Note that the packet drop cycle is counted by the number of packets that
  251. cross the link that are the given PGM packet type.  It is not dependant on
  252. the sequence number contained within the packet.
  253. The PGMErrorModel only allows one type of PGM packet to be dropped.  
  254. Other error models are located in ~ns/errmodel.cc if you need a more
  255. sophesticated error modeling capability.