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

通讯编程

开发平台:

Visual C++

  1. chapter{PLM}
  2. {sloppy
  3. label{sec:PLM}
  4. This chapter describes the ns  implementation of the PLM protocol
  5. cite{legout_sigmetrics2000}. The code of the PLM 
  6. protocol  is written in both C++ and OTcl. The PLM Packet Pair generator is
  7. written in C++ and the PLM core machinery is written in OTcl. The chapter has simply
  8. three parts: the first part shows how to create and configure a PLM session; the
  9. second part describes the Packet Pair source generator; the third part describes
  10. the architecture and internals of the PLM protocol. In this last part, rather
  11. than giving a list of procedures and functions, we introduce the main
  12. procedures per functionality (instantiation of a PLM source, instantiation of a
  13. PLM receiver, reception of a packet, detection of a loss, etc.).
  14. The procedures, functions, and variables described in this chapter can be found in:
  15. nsf{plm/cbr-traffic-PP.cc}, nsf{plm/loss-monitor-plm.cc}, nsf{tcl/plm/plm.tcl},
  16. nsf{tcl/plm/plm-ns.tcl}, nsf{tcl/plm/plm-topo.tcl}, nsf{tcl/lib/ns-default.tcl}.
  17. section{Configuration}
  18. label{sec:Configuration}
  19. paragraph{Creating a simple scenario with one PLM flow (only one receiver)\}
  20. This simple example can be run as is (several complex scenarios can be found in
  21. the file nsf{tcl/ex/simple-plm.tcl}).
  22. begin{program}
  23.   set packetSize 500                          ;Packet size (in bytes);
  24.   set plm_debug_flag 2                        ;Debugging output;
  25.   set rates "50e3 50e3 50e3 50e3 50e3"        ;Rate of each layer;
  26.   set rates_cum [calc_cum $rates]       ;Cumulated rate of the layers (mandatory);
  27.   set level [llength $rates]            ;Number of layers (mandatory);
  28.   
  29.   set Queue_sched_ FQ                         ;Scheduling of the queues;
  30.   set PP_burst_length 2                       ;PP burst length (in packets);
  31.   set PP_estimation_length 3                  ;Minimum number of PP required to make an estimate;
  32.   Class Scenario0 -superclass PLMTopology
  33.   Scenario0 instproc init args {
  34.     eval $self next $args
  35.     $self instvar ns node
  36.     
  37.     $self build_link 1 2 100ms 256Kb           ;Build a link;
  38.     set addr(1) [$self place_source 1 3]      ;Set a PLM source;
  39.     $self place_receiver 2 $addr(1) 5 1       ;Set a PLM receiver;
  40.     
  41. {cf #set up the multicast routing}
  42.     DM set PruneTimeout 1000                  ;A large PruneTimeout value is required;
  43.     set mproto DM
  44.     set mrthandle [$ns mrtproto $mproto {} ]
  45.     }
  46.   set ns [new Simulator -multicast on]            ;PLM needs multicast routing;
  47.   $ns multicast
  48.   $ns namtrace-all [open out.nam w]               ;Nam output;
  49.   set scn [new Scenario0 $ns]                     ;Call of the scenario;
  50.   $ns at 20 "exit 0"
  51.   $ns run
  52. end{program}
  53. Several variables are introduced in this example. They all need to be set in the
  54. simulation script (there is no default value for these variables). In particular
  55. the two following lines  are mandatory and must not be omitted:
  56. begin{program}
  57.   set rates_cum [calc_cum $rates]
  58.   set level [llength $rates]
  59. end{program}
  60. We describe now in detail each variable:
  61. begin{description}
  62. item[tt packetSize] represents the size of the packets in bytes sent by the PLM
  63.   source. 
  64. item [tt plm_debug_flag] represents the verbose level of debugging output: from 0 no
  65.   output to 3 full output. For code{plm_debug_flag} set to 3 (full output), long
  66.   lines output are 
  67.   generated which is not compatible with nam visualization. 
  68. item [tt rates] is a list specifying
  69.   the bandwidth of each layer (this is not the cumulated bandwidth!). 
  70. item [tt rates_cum] is a list specifying the cumulated bandwidth of the
  71.   layers: the first element of code{rates_cum} is the bandwidth a layer 1, the
  72.   second element of code{rates_cum} is the sum of the bandwidth of layer 1 and
  73.   layer 2, etc. The proc proc{calc_cum} computes the cumulated rates. 
  74. item [tt level] is the number of layers. 
  75. item [tt Queue_sched_] represents the scheduling of the queues. This is used by the
  76.   PLMTopology instproc code{build_link}. PLM requires FQ scheduling or a
  77.   variation. 
  78. item [tt PP_burst_length] represents the size of the Packet Pair bursts
  79.   in packets. 
  80. item [tt PP_estimation_length] represents the minimum number of Packet
  81.   Pair required to compute an estimate (see
  82.   section~ref{sec:PLMReception-Packet}). 
  83. end{description}
  84. All the simulations for PLM should be setup using the PLMTopology environment (as
  85. in the example script where we define a PLMTopology superclass called Scenario0). The
  86. user interface is (all the instproc can be found in nsf{tcl/plm/plm-topo.tcl}):
  87. begin{description}
  88. item[tt build_link a b d bw] creates a duplex link between node
  89.   code{a} and code{b} with a delay code{d} and a bandwidth code{bw}. If
  90.   either node does not exist, code{build_link} creates it.
  91. item[tt place_source n t] creates and places a PLM source at node code{n} and
  92.   starts it at time code{t}. code{place_source} returns code{addr} which
  93.   allows to attach receivers to this source.
  94. item[tt place_receiver n addr C nb] creates and places a PLM receiver at node
  95.   code{n} and attached it to the source which return the address code{addr}. The
  96.   check value for this PLM receiver is code{C}. An optional parameter code{nb}
  97.   allows to get an instance of the PLM receiver called code{PLMrcvr($nb)}. This
  98.   instance is only useful to get some specific statistics about this receiver
  99.   (mainly the number of packets received or lost). %$
  100. end{description}
  101. section{The Packet Pair Source Generator}
  102. This section describes the Packet Pair source generator; the relevant files are:
  103. nsf{plm/cbr-traffic-PP.cc}, nsf{tcl/lib/ns-default.tcl}. The OTcl class name of
  104. the PP source is: Application/Traffic/CBR_PP. 
  105. The Packet Pair (PP) source generator is in the file
  106. nsf{plm/cbr-traffic-PP.cc}. This source 
  107. generator is a variation of the CBR source generator in nsf{cbr_traffic.cc}.
  108. We just describe the salient differences between the code of
  109. the CBR source and the code of the PP source. 
  110. The default values in nsf{tcl/lib/ns-default.tcl} for the PP source generator are the same
  111. than for the CBR source. We need for the PP source generator a new parameter {tt PBM_}:
  112. begin{program}
  113. Application/Traffic/CBR_PP set PBM_ 2 ;Default value;
  114. end{program}
  115. The OTcl instvar bounded variable {tt PBM_} (same name in C++ and in OTcl)
  116. specifies the number of back-to-back packets to be sent. For {tt PBM_}=1 we
  117. have a CBR source, for {tt PBM_}=2 we have a Packet Pair source (a source which
  118. sends two packets back-to-back), etc. The mean rate of the PP source is
  119. code{rate_}, but the packets are sent in burst of code{PBM_} packets. Note
  120. that we also use the terminology Packet Pair source and Packet Pair burst for
  121. {tt PBM_$>$2}.
  122. We compute the code{next_interval} as:
  123. begin{program}
  124. double CBR_PP_Traffic::next_interval(int& size)
  125. {
  126. {cf /*(PP_ - 1) is the  number of packets in the current burst.*/}
  127.         if (PP_ >= (PBM_ - 1)){         
  128.                 interval_ = PBM_*(double)(size_ << 3)/(double)rate_;
  129.                 PP_ = 0;
  130.         }
  131.         else {
  132.                 interval_ = 1e-100; //zero
  133.                 PP_ += 1 ;
  134.         }
  135. ...
  136. }
  137. end{program}
  138. The proc{timeout} method puts the {tt NEW_BURST} flag in the first packet of a
  139. burst. This is useful for the PLM protocol to identify the beginning of a PP
  140. burst.
  141. begin{program}
  142.   void CBR_PP_Traffic::timeout()
  143.   {
  144.     ...
  145.     if (PP_ == 0) 
  146.       agent_->sendmsg(size_, "NEW_BURST");
  147.     else 
  148.       agent_->sendmsg(size_);
  149.     
  150.     ...
  151.     }
  152. end{program}
  153. section{Architecture of the PLM Protocol}
  154. The code of the PLM protocol is divided in three files: nsf{tcl/plm/plm.tcl},
  155. which contains the PLM protocol machinery without any specific interface with
  156. ns; nsf{tcl/plm/plm-ns.tcl}, which contains the specific ns interface.
  157. However, we do not guarantee the strict validity of this ns interfacing;
  158. nsf{tcl/plm/plm-topo.tcl}, which contains a user interface to build simulation
  159. scenarios with PLM flows. 
  160. In the following we do not discuss the various procedures per object (for
  161. instance all the instproc of the PLM class)  but rather per functionality (for
  162. instance which instproc among the various classes are involved in the instantiation
  163. of a PLM receiver). For a given functionality, we do not describe in details all
  164. the code involved, but we give the principal steps.
  165. subsection{Instantiation of a PLM Source}
  166. To create a PLM source, place it at node code{n}, and start it at {tt t$_0$},  we call
  167. the PLMTopology instproc {tt place_source n t$_0$}. This instproc return {tt
  168. addr}, the address required to attach a receiver to this source. {tt
  169. place_source} calls the Simulator instproc code{PLMbuild_source_set} that
  170. creates as many 
  171. Application/Traffic/CBR_PP instances as there are layers (in the following we call an
  172. instance of the class Application/Traffic/CBR_PP a layer). Each layer corresponds to a
  173. different multicast group. 
  174. To speed up the simulations when the PLM sources start we use the
  175. following trick:
  176. At $t=0$, code{PLMbuild_source_set} restricts each
  177. layer to send
  178. only one packet ({tt maxpkts_} set to 1). That allows to build the multicast trees
  179. -- one multicast tree per layer -- without flooding the whole network. Indeed,
  180. each layer only sends one packet to build the corresponding multicast tree. 
  181. The multicast trees take at most the maximum RTT of the network to be established and
  182. must be established before {tt t$_0$}, the PLM source starting time. Therefore,
  183. {tt t$_0$} must be carrefully chosen, otherwise the source sends a large number of 
  184. useless packets. However, as 
  185. we just need to start the PLM source after the multicast trees are estabished,
  186. {tt t$_0$} can be largely overestimated. 
  187. At time {tt t$_0$}, we set {it maxpkts_} to 268435456 for all the layers.
  188. It is fundamental, in order to have persistent multicast trees, that the
  189. prune timeout is set to a large value. For instance, with DM routing: 
  190. begin{program}
  191.   DM set PruneTimeout 1000
  192. end{program}
  193. Each layer of a same PLM source has the same flow id {tt fid_}. Consequently,
  194. each PLM source is considered as a single flow for a Fair Queueing
  195. scheduler. The PLM code manages automatically the {tt fid_} to prevent different
  196. sources to have the same {tt fid_}. The {tt fid_} starts at 1 for the first
  197. source and is increased by one for each new source. Be careful to avoid other
  198. flows (for instance concurrent TCP flows) to have the same {tt fid_} than the
  199. PLM sources. Additionally, If you consider {tt fid_} larger than 32, do not
  200. forget to increase the {tt MAXFLOW} in nsf{fq.cc} ({tt MAXFLOW} must be set
  201. to the highest {tt fid_} considered in the simulation).
  202. subsection{Instantiation of a PLM Receiver}
  203. begin{figure}[tbp]
  204.   centerline{includegraphics{instanPLMrecv.eps}}
  205.   caption{Inheritance and instantiation when we create a receiver.}
  206.   label{fig:instanPLMrecv}
  207. end{figure}
  208. All the PLM machinery is implemented at the receiver. In this section we decribe
  209. the instantiation process of a receiver. To create, place at node
  210. {tt n},  attach to source {tt S}, and start at {tt t$_1$} a PLM receiver we
  211. call the PLMTopology instproc {tt 
  212.   build_receiver n addr t$_1$ C} where {tt addr} is the address returned
  213. by {tt place_source} when {tt S} was created, and {tt C} is the check value. The
  214. receiver created by {tt build_receiver} is an instance of the class PLM/ns,
  215. the ns interface to the PLM 
  216. machinery. At the initialisation of the receiver, the PLM instproc {tt init} is
  217. called due to inheritance. {tt init} calls the PLM/ns instproc
  218. {tt create-layer} and, by this way,  creates as many instances of the class 
  219. PLMLayer/ns (the ns interface to the PLMLayer class) as there are layers. Each
  220. instance of PLMLayer/ns creates an instance of the class PLMLossTrace which is
  221. reponsible for 
  222. monitoring the received and lost packets thanks to the fact that the class
  223. PLMLossTrace inherits from the class Agent/LossMonitor/PLM. 
  224. Fig.~ref{fig:instanPLMrecv} schematically describes the process  of a PLM
  225. receiver instantiation. In the following we describe the behavior of a PLM
  226. receiver when it receives a packet and when it detects a loss.
  227. subsection{Reception of a Packet}
  228. label{sec:PLMReception-Packet}
  229. We create a new c++ class PLMLossMonitor (nsf{plm/loss-monitor-plm.cc}) that
  230. inherits from LossMonitor. The OTcl class name of the c++ PLMLossMonitor class is
  231. Agent/LossMonitor/PLM.
  232. begin{program}
  233. class PLMLossMonitor : public LossMonitor {
  234. public:
  235.         PLMLossMonitor();
  236.         virtual void recv(Packet* pkt, Handler*);
  237. protected:
  238.         // PLM only
  239.         int flag_PP_;
  240.         double packet_time_PP_;
  241.         int fid_PP_;
  242. };
  243. static class PLMLossMonitorClass : public TclClass {
  244. public:
  245.         PLMLossMonitorClass() : TclClass("Agent/LossMonitor/PLM") {}
  246.         TclObject* create(int, const char*const*) {
  247.                 return (new PLMLossMonitor());
  248.         }
  249. } class_loss_mon_plm;
  250. end{program}
  251. We add in {tt void PLMLossMonitor::recv(Packet* pkt, Handler*)} a Tcl call to the
  252.   Agent/LossMonitor/PLM instproc {tt log-PP} each time a packet is received :
  253. begin{program}
  254.   void LossMonitor::recv(Packet* pkt, Handler*)
  255.   {
  256.     ...
  257.     if (expected_ >= 0) {
  258.       ...
  259.       }
  260.     Tcl::instance().evalf("%s log-PP", name());
  261.     }
  262. end{program}
  263. The Agent/LossMonitor/PLM instproc {tt log-PP} is empty. In fact, we define the {tt
  264.   log-PP} instproc for the class PLMLossTrace. {tt log-PP}
  265. computes an estimate of the available bandwidth based on a single PP burst (of
  266. length {tt PP_burst_length} in packets). Once {tt log-PP} has received the 
  267.   {tt PP_burst_length} packets of the burst, it computes the estimate and
  268.   calls the PLM instproc {tt make_estimate} with the computed estimate as
  269.   argument. 
  270. {tt make_estimate} puts the estimate based on a single PP
  271. ({tt PP_value}) in an array of  estimate samples ({tt PP_estimate}). If {tt
  272.   PP_value} is lower than the current subscription level (i.e.~lower than the
  273. throughput achieved according to the current number of layers subscribed), {tt
  274.   make_estimate} calls the PLM instproc {tt stability-drop} which simply drops
  275. layers until the current subscription level becomes lower than {tt PP_value}.
  276. {tt make_estimate} makes an estimate {tt PP_estimate_value} by taking the
  277. minimum {tt PP_value} received during the last {tt check_estimate} period
  278. (if there are at
  279. least {tt PP_estimation_length} single PP estimate received). Once {tt
  280.   make_estimate} has a {tt PP_estimate_value} it calls the PLM instproc {tt
  281.   choose_layer} which joins or drops layer(s) according to the current subscription
  282. level and to the {tt PP_estimate_value}. For details about the PLM instproc
  283. code{make_estimate}, refer to its code in nsf{tcl/plm/plm.tcl}.
  284. subsection{Detection of a Loss}
  285. Each time a loss is detected by an instance of the class PLMLossMonitor, a call to
  286. the Agent/LossMonitor/PLM instproc {tt log-loss} is triggered. The
  287. Agent/LossMonitor/PLM instproc {tt log-loss} 
  288. is empty. In fact, we define the {tt log-loss} instproc for the class
  289. PLMLossTrace. The PLMLossTrace instproc {tt log-loss} simply
  290. calls the PLM instproc {tt log-loss} which contains the PLM machinery in case
  291. of loss. In summary, {tt log-loss} only drops a layer when the loss rate
  292. exceeds 10% (this test is executed by the PLM instproc {tt
  293.   exeed_loss_thresh}). After a layer drop {tt log-loss} precludes any
  294. other layer drop due to loss for 500ms. For details about the PLM instproc {tt
  295.   log-loss}, refer to its code in nsf{tcl/plm/plm.tcl}. 
  296. subsection{Joining or Leaving a Layer}
  297. To join a layer the PLM instproc {tt add-layer} is called. This instproc
  298. calls the PLMLayer instproc {tt join-group} which calls the PLMLayer/ns instproc {tt
  299.   join-group}.
  300. To leave a layer the PLM instproc {tt drop-layer} is called. This instproc
  301. calls the PLMLayer instproc {tt leave-group} which calls the PLMLayer/ns instproc {tt
  302.   leave-group}.
  303. section{Commands at a Glance}
  304. Note: This section is a copy paste of the end of
  305. section~ref{sec:Configuration}. We add this section to preserve homogeneity with
  306. the ns manual.
  307. All the simulations for PLM should be set using the PLMTopology environment (as
  308. in the example script where we define a PLMTopology superclass called Scenario0). The
  309. user interface is (all the instproc can be found in nsf{tcl/plm/plm-topo.tcl}):
  310. begin{description}
  311. item[tt build_link a b d bw] creates a duplex link between node
  312.   code{a} and code{b} with a delay code{d} and a bandwidth code{bw}. If
  313.   either node does not exist, code{build_link} creates it.
  314. item[tt place_source n t] creates and places a PLM source at node code{n} and
  315.   starts it at time code{t}. code{place_source} returns code{addr} which
  316.   allows to attach receivers to this source.
  317. item[tt place_receiver n addr C nb] creates and places a PLM receiver at node
  318.   code{n} and attached it to the source which return the address code{addr}. The
  319.   check value for this PLM receiver is code{C}. An optional parameter code{nb}
  320.   allows to get an instance of the PLM receiver called code{PLMrcvr($nb)}. This
  321.   instance is only useful to get some specific statistics about this receiver
  322.   (mainly the number of packets received or lost). %$
  323. end{description}
  324. }