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

通讯编程

开发平台:

Visual C++

  1. %
  2. % personal commentary:
  3. %        DRAFT DRAFT DRAFT
  4. %        - GNGUYEN
  5. %
  6. chapter{Error Model}
  7. label{chap:error_model}
  8. This chapter describes the implementation and configuration of error
  9. models, which introduces packet losses into a simulation. 
  10. In addition to the basic class ErrorModel described in details below, 
  11.   there are several other types of error modules not being 
  12.   completely documented yet,
  13.   which include:
  14.   begin{itemize}
  15.     item SRMErrorModel, PGMErrorModel: 
  16.       error model for SRM and PGM.
  17.     item ErrorModel/Trace: 
  18.       error model that reads a loss trace (instead of a math/computed model)
  19.     item MrouteErrorModel:
  20.       error model for multicast routing, now inherits from trace.
  21.     item ErrorModel/Periodic:
  22.       models periodic packet drops (drop every nth packet we see).
  23.       This model can be conveniently combined with a flow-based classifier
  24.       to achieve drops in particular flows
  25.     item SelectErrorModel:
  26.        for Selective packet drop.
  27.     item ErrorModel/TwoState:
  28.       Two-State:  error-free and error
  29.     item ErrorModel/TwoStateMarkov, ErrorModel/Expo, ErrorModel/Empirical:
  30.       inerit from ErrorModel/TwoState.
  31.     item ErrorModel/List:
  32.       specify a list of packets/bytes to drop,
  33.       which could be in any order.
  34.   end{itemize}
  35. Their definitions can be found in nsf{queue/errmodel.{cc, h}} and
  36.  nsf{tcl/lib/ns-errmodel.tcl, ns-default.tcl}.
  37. section{Implementation}
  38. The procedures and functions described in this section can be found in
  39. nsf{errmodel.{cc, h}}.
  40. Error model simulates link-level errors or loss by either marking the
  41. packet's error flag or dumping the packet to a drop target.  In
  42. simulations, errors can be generated from a simple model such as the
  43. packet error rate, or from more complicated statistical and empirical models.
  44. To support a wide variety of models, the unit of error can be specified
  45. in term of packet, bits, or time-based.
  46. The code{ErrorModel} class is derived from the code{Connector} base
  47. class.  As the result, it inherits some methods for hooking up objects
  48. such as code{target} and code{drop-target}.  If the drop target
  49. exists, it will received corrupted packets from code{ErrorModel}.
  50. Otherwise, code{ErrorModel} just marks the code{error_} flag of the
  51. packet's common header, thereby, allowing agents to handle the loss.
  52. The code{ErrorModel} also defines additional Tcl method code{unit} to
  53. specify the unit of error and code{ranvar} to specify the random
  54. variable for generating errors.  If not specified, the unit of error
  55. will be in packets, and the random variable will be uniform distributed
  56. from 0 to 1.  Below is a simple example of creating an error model with
  57. the packet error rate of 1 percent (0.01):
  58. begin{program}
  59.         # create a loss_module and set its packet error rate to 1 percent
  60.         set loss_module [new ErrorModel]
  61.         $loss_module set rate_ 0.01
  62.         # {cf optional:  set the unit and random variable}
  63.         $loss_module unit pkt            ; error unit: packets (the default);
  64.         $loss_module ranvar [new RandomVariable/Uniform]
  65.         # {cf set target for dropped packets}
  66.         $loss_module drop-target [new Agent/Null]
  67. end{program}
  68. In C++, the code{ErrorModel} contains both the mechanism and policy for
  69. dropping packets.  The packet dropping mechanism is handled by the
  70. code{recv} method, and packet corrupting policy is handled by the
  71. code{corrupt} method.
  72. begin{program}
  73.         enum ErrorUnit { EU_PKT=0, EU_BIT, EU_TIME };
  74.         class ErrorModel : public Connector {
  75.         public:
  76.                 ErrorModel();
  77.                 void recv(Packet*, Handler*);
  78.                 virtual int corrupt(Packet*);
  79.                 inline double rate() { return rate_; }
  80.         protected:
  81.                 int command(int argc, const char*const* argv);
  82.                 ErrorUnit eu_;          * error unit in pkt, bit, or time */
  83.                 RandomVariable* ranvar_;
  84.                 double rate_;
  85.         };
  86. end{program}
  87. The code{ErrorModel} only implements a simple policy based on a single
  88. error rate, either in packets of bits.  More sophisticated dropping
  89. policy can be implemented in C++ by deriving from code{ErrorModel} and
  90. redefining its code{corrupt} method.
  91. %{bf To be completed.}
  92. section{Configuration}
  93. The previous section talked about error model, in this section we
  94. discuss how to use error models in ns over either wired networks or
  95. wireless ones. 
  96. To use an error model for wired networks, at first it has to be
  97. inserted into a SimpleLink object. Because a SimpleLink is a composite
  98. object (Chapter ref{chap:links}), an error model can be inserted to
  99. many places. Currently we provide the following methods to insert an
  100. error module into three different places.
  101. begin{itemize}
  102. item Insert an error module in a SimpleLink BEFORE the queue module. 
  103.   This is provided by the following two OTcl methods: 
  104.   begin{alist}
  105.     SimpleLink::errormodule args & When an error model is given
  106.     as a parameter, it inserts the error module into the simple link,
  107.     right after the queue module, and set the drop-target of the error
  108.     model to be the drop trace object of the simple link. Note that
  109.     this requires the following configuration order:
  110. code{ns namtrace-all}
  111.   followed by link configurations, followed by error
  112.     model insertion. When no argument is given, it returns the current
  113.     error model in the link, if there's any. This method is defined in
  114.     ns/tcl/lib/ns-link.tcl \
  115.     Simulator::lossmodel tup{em} tup{src} tup{dst} & Call
  116.     SimpleLink::errormodule to insert the given error module into the
  117.     simple link (src, dst). It's simply a wrapper for the above
  118.     method. This method is defined in ns/tcl/lib/ns-lib.tcl. 
  119.   end{alist}
  120.   
  121. item Insert an error module in a SimpleLink AFTER the queue but
  122.   BEFORE the delay link.
  123.   This is provided by the following two methods:
  124.   begin{alist}
  125.     SimpleLink::insert-linkloss args & This method's behavior
  126.     is identical to that of code{SimpleLink::errormodule}, except
  127.     that it inserts an error module immediately after the queue
  128.     object. It's defined in ns/tcl/lib/ns-link.tcl \
  129.     Simulator::link-lossmodel tup{em} tup{src} tup{dst} &
  130.     This is a wrapper for code{SimpleLink::insert-linkloss}. It's
  131.     defined in ns/tcl/lib/ns-lib.tcl 
  132.   end{alist}
  133.   
  134.   The nam traces generated by error models inserted using these two
  135.   methods do not require special treatment and can be visualized using
  136.   an older version of nam. 
  137. item Insert an error module in a Link AFTER the delay link module. 
  138.   This can be done by code{Link::install-error}. 
  139.   Currently this API doesn't produce any trace. It only serves as a
  140.   placeholder for possible future extensions. 
  141. end{itemize}
  142. To add an error model over wireless networks, each node can insert 
  143. a given statistical error model either over outgoing or incoming wireless channels.
  144. Precisely, the instanciated error model would be stuck between mac and netif modules 
  145. depicted in Figure ref{fig:mobilenode-dsr}. For the outgoing link, the error module
  146. would be pointed by downtarget_ of the above mac module while for the incoming link 
  147. it would be linked by uptaget_ pointer of the below netif module. And in each case 
  148. the target_ of the error module points to either the netif or the mac respectively.  
  149. The difference of placing over the two different locations is that the outgoing causes
  150. all the receivers to receive the packet suffering the same degree of errors since the error is
  151. determined before wireless channel module copies the packet. On the other
  152. hand, the incoming error module lets each receiver get the packet corrupted with different
  153. degree of error since the error is independently computed in each error module.
  154. The insertion into the wireless protocol stack can be done by calling
  155. node-config command explained in Section~ref{sec:node:nodeconfig} with
  156. the two options IncomingErrrProc and OutgoingErrProc. We can use these two options 
  157. at the same time or each one separately.  The argument of the two option is the
  158. name of the global procedure which creates an error model object,
  159. feeds it with necessary initial values appropriate for the new error
  160. module, and finally returns the object pointer. The following shows a
  161. simple TCL example script to add an error module into the wireless
  162. protocol stack.
  163. begin{program}
  164. $ns node-config -IncomingErrProc UniformErr -OutgoingErrProc UniformErr
  165. proc UniformErr {} {
  166. set err [new ErrorModel]
  167. $err unit packet
  168. return $err
  169. }
  170. end{program}
  171. section{Multi-state error model}
  172. Contributed by Jianping Pan (jpan@bbcr.uwaterloo.ca).
  173. The multi-state error model implements time-based error state
  174. transitions. Transitions to the next  
  175. error state occur at the end of the duration of the current state. The
  176. next error state is then selected using the 
  177. transition state matrix.
  178. To create a multi-state error model, the following parameters should
  179. be supplied (as defined in ns/tcl/lib/ns-errmodel.tcl): 
  180. begin{itemize}
  181. item {tt states}: an array of states (error models).
  182. item {tt periods}: an array of state durations.
  183. item {tt trans}: the transition state model matrix.
  184. item {tt transunit}: one of {tt [pkt|byte|time]}.
  185. item {tt sttype}: type of state transitions to use: either {tt
  186.     time} or {tt pkt}.
  187. item {tt nstates}: number of states.
  188. item {tt start}: the start state.
  189. end{itemize}
  190. Here is a simple example script to create a multi-state error model:
  191. begin{program}
  192.         set tmp [new ErrorModel/Uniform 0 pkt]
  193.         set tmp1 [new ErrorModel/Uniform .9 pkt]
  194.         set tmp2 [new ErrorModel/Uniform .5 pkt]
  195.         # {cf Array of states (error models)}
  196.         set m_states [list $tmp $tmp1 $tmp2]
  197.         # {cf Durations for each of the states, tmp, tmp1 and tmp2, respectively}
  198.         set m_periods [list 0 .0075 .00375]
  199.         # {cf Transition state model matrix}
  200.         set m_transmx { {0.95 0.05 0}
  201.           {0   0   1}
  202.           {1   0   0} }
  203.         set m_trunit pkt
  204.         # {cf Use time-based transition}
  205.         set m_sttype time
  206.         set m_nstates 3
  207.         set m_nstart [lindex $m_states 0]
  208.         set em [new ErrorModel/MultiState $m_states $m_periods $m_transmx \
  209.                 $m_trunit $m_sttype $m_nstates $m_nstart]
  210. end{program} %$
  211. section{Commands at a glance}
  212. label{sec:errmodelcommand}
  213. The following is a list of error-model related commands commonly used in
  214. simulation scripts:
  215. begin{program}
  216. set em [new ErrorModel]
  217. $em unit pkt
  218. $em set rate_ 0.02
  219. $em ranvar [new RandomVariable/Uniform]
  220. $em drop-target [new Agent/Null]
  221. end{program}
  222. This is a simple example of how to create and configure an error model.
  223. The commands to place the error-model in a simple link will be shown next.
  224. begin{flushleft}
  225. code{$simplelink errormodule  <args>}\
  226. This commands inserts the error-model before the queue object in simple link.
  227. However in this case the error-model's drop-target points to the link's
  228. code{drophead_} element.
  229. code{$ns_ lossmodel <em> <src> <dst>}\
  230. This command places the error-model before the queue in a simplelink defined
  231. by the <src> and <dst> nodes. This is basically a wrapper for the above method.
  232. code{$simplelink insert-linkloss <args>}\
  233. This inserts a loss-module after the queue, but right before the delay code{link_}
  234. element in the simple link. This is because nam can visualize a packet drop
  235. only if the packet is on the link or in the queue. The error-module's
  236. drop-target points to the link's code{drophead_} element.
  237. code{$ns_ link-lossmodel <em> <src> <dst>}\
  238. This too is a wrapper method for insert-linkloss method described above.
  239. That is this inserts the error-module right after the queue element in a
  240. simple link (src-dst).
  241. end{flushleft}
  242. % Local Variables:
  243. % TeX-master: "everything"
  244. % LocalWords:
  245. % End