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

通讯编程

开发平台:

Visual C++

  1. chapter{Emulation}
  2. label{sec:emulation}
  3. This chapter describes the {em emulation} facility
  4. of ns.
  5. Emulation refers to the ability to introduce the
  6. simulator into a live network.
  7. Special objects within the simulator are capable
  8. of introducing live traffic into the simulator and
  9. injecting traffic from the simulator into the
  10. live network.
  11. textbf{Emulator caveats:}
  12. begin{itemize}
  13. item While the interfaces described below
  14. are not expected to change drastically,
  15. this facility is still under development and
  16. should be considered experimental and subject to change.
  17. item The facility described here has been
  18. developed under FreeBSD 2.2.5, and use on other systems
  19. has not been tested by the author.
  20. item Because of the currently limited portability of emulation, it
  21.  is only compiled into emph{nse}
  22. (build it with ``make nse''),
  23. not standard ns.
  24. end{itemize}
  25. section{Introduction}
  26. The emulation facility can be subdivided into
  27. two modes:
  28. begin{enumerate}
  29. item {sf opaque mode} -- live data treated as opaque data packets
  30. item {sf protocol mode} -- live data may be interpreted/generated by simulator
  31. end{enumerate}
  32. In opaque mode, the simulator
  33. treats network data as uninterpreted packets.
  34. In particular, real-world protocol fields
  35. are not directly manipulated by the simulator.
  36. In opaque mode, live data packets may be dropped, delayed, re-ordered, or
  37. duplicated, but because no protocol processing is performed,
  38. protocol-specific traffic manipulation scenarios (e.g. ``drop the TCP segment
  39. containing a retransmission of sequence number 23045'') may not be performed.
  40. In protocol mode, the simulator is able to interpret and/or generate
  41. live network traffic containing arbitrary field assignments.
  42. {bf To date (Mar 1998), only Opaque Mode is currently implemented}.
  43. The interface between the simulator and live network is provided by
  44. a collection of objects including {em tap agents} and {em network objects}.
  45. Tap agents embed live network data into simulated packets and
  46. vice-versa.
  47. Network objects are installed in tap agents and provide an entrypoint
  48. for the sending and receipt of live data.
  49. Both objects are described in the following sections.
  50. When using the emulation mode, a special version of the system
  51. scheduler is used: the {tt RealTime} scheduler.
  52. This scheduler uses the same underlying structure as the
  53. standard calendar-queue based scheduler, but ties the execution of
  54. events to real-time.
  55. It is described below.
  56. section{Real-Time Scheduler}
  57. The real-time scheduler implements a soft real-time scheduler
  58. which ties event execution within the simulator to real time.
  59. Provided sufficient CPU horsepower is available to keep up
  60. with arriving packets, the simulator virtual time should closely
  61. track real-time.
  62. If the simulator becomes too slow to keep up with elapsing real
  63. time, a warning is continually produced if the skew exceeds a
  64. pre-specified constant ``slop factor'' (currently 10ms).
  65. The main dispatch loop is found in the routine {tt RealTimeScheduler::run()},
  66. in the file {tt scheduler.cc}.
  67. It follows essentially the following algorithm:
  68. begin{itemize}
  69. item While simulator is not halted
  70. begin{itemize}
  71. item get current real time (``now'')
  72. item dispatch all pending simulator events prior to now
  73. item fetch next (future) event if there is one
  74. item delay until the next simulator event is ready or a Tcl event occurs
  75. item if a tcl event occured, re-insert next event in simulator event queue and continue
  76. item otherwise, dispatch simulator event, continue
  77. item if there was no future even, check for Tcl events and continue
  78. end{itemize}
  79. end{itemize}
  80. The real-time scheduler should always be used with the emulation facility.
  81. Failure to do so may easily result in the simulator running faster
  82. than real-time.
  83. In such cases, traffic passing through the simulated network will
  84. not be delayed by the proper amount of time.
  85. Enabling the real-time scheduler requires the
  86. following specification at the beginning of a simulation script:
  87. begin{program}
  88.     set ns [new Simulator]
  89.     $ns use-scheduler RealTime
  90. end{program}
  91. section{Tap Agents}
  92. The class {tt TapAgent} is a simple class derived from the base
  93. {tt Agent} class.
  94. As such, it is able to generate simulator packets containing
  95. arbitrarily-assigned values within the ns~common header.
  96. The tap agent handles the setting of the common header packet
  97. size field and the type field.  
  98. It uses the packet type {tt PT_LIVE} for packets injected
  99. into the simulator.
  100. Each tap agent can have at most one associated network object, although
  101. more than one tap agent may be instantiated on a single simulator node.
  102. paragraph{Configuration}
  103. Tap agents are able to send and receive packets to/from an
  104. associated {tt Network} object.
  105. Assuming a network object {tt $netobj} refers to a network
  106. object, a tap agent is configured using the {tt network} method:
  107. begin{verbatim}
  108.         set a0 [new Agent/Tap]
  109.         $a0 network $netobj
  110.         $a0 set fid_ 26
  111.         $a0 set prio_ 2
  112.         $ns connect $a0 $a1
  113. end{verbatim}
  114. Note that the configuration of the flow ID and priority are
  115. handled through the {tt Agent} base class.
  116. The purpose of setting the flow id field in the common header
  117. is to label packets belonging to particular flows of live data.
  118. Such packets can be differentially treated with respect
  119. to drops, reorderings, etc.
  120. The {tt connect} method instructs agent {tt $a0} to send
  121. its live traffic to the {tt $a1} agent via the current
  122. route through the simulated topology.
  123. section{Network Objects}
  124. label{sec:networkobj}
  125. Network objects provide access to a live network.
  126. There are several forms of network objects, depending on the
  127. protocol layer specified for access to the underlying network,
  128. in addition to the facilities provided by the host operating system.
  129. Use of some network objects requires special access
  130. privileges where noted.
  131. Generally, network objects provide an entrypoint into the live
  132. network at a particular protocol layer (e.g. link, raw IP, UDP, etc)
  133. and with a particular access mode (read-only, write-only, or read-write).
  134. Some network objects provide specialized facilities such as filtering
  135. or promiscuous access (i.e. the pcap/bpf network object)
  136. or group membership (i.e. UDP/IP multicast).
  137. The C++ class {tt Network} is provided as a base class from
  138. which specific network objects are derived.
  139. Three network objects are currently supported: pcap/bpf, raw IP,
  140. and UDP/IP.
  141. Each are described below.
  142. subsection{Pcap/BPF Network Objects}
  143. These objects provide an extended interface to the LBNL packet capture
  144. library (libpcap).
  145. (See {tt ftp://ftp.ee.lbl.gov/libpcap.tar.Z} for more info).
  146. This library provides the ability to capture link-layer frames
  147. in a promiscuous fashion from network interface drivers
  148. (i.e. a copy is made for those programs making use of libpcap).
  149. It also provides the ability to read and write packet trace
  150. files in the ``tcpdump'' format.
  151. The extended interface provided by ns~also allows for writing
  152. frames out to the network interface driver, provided the driver
  153. itself allows this action.
  154. Use of the library to capture or create live traffic may be protected;
  155. one generally requires at least read access to the system's packet filter
  156. facility which may need to be arranged through a system administrator.
  157. The packet capture library works on several UNIX-based platforms.
  158. It is optimized for use with the
  159. Berkeley Packet Filter (BPF)~cite{BPF93},
  160. and provides a filter compiler for the BPF pseudomachine machine code.
  161. On most systems supporting it,
  162. a kernel-resident BPF implementation processes the filter code, and 
  163. applies the resulting pattern matching instructions to received frames.
  164. Those frames matching the patterns are received through the BPF machinery;
  165. those not matching the pattern are otherwise unaffected.
  166. BPF also supports sending link-layer frames.
  167. This is generally not suggested, as an entire properly-formatted frame
  168. must be created prior to handing it off to BPF.
  169. This may be problematic with respect to assigning proper link-layer headers
  170. for next-hop destinations.
  171. It is generally preferable to use the raw IP network object for sending
  172. IP packets, as the system's routing function will be used to determine
  173. proper link-layer encapsulating headers.
  174. paragraph{Configuration}
  175. Pcap network objects may be configured as either associated with a
  176. live network or with a trace file.
  177. If associated with a live network, the particular network interface
  178. to be used may be specified, as well as an optional promiscuous flag.
  179. As with all network objects, they may be opened for reading or writing.
  180. Here is an example:
  181. begin{verbatim}
  182.      set me [exec hostname]
  183.      set pf1 [new Network/Pcap/Live]
  184.      $pf1 set promisc_ true
  185.      set intf [$pf1 open readonly]
  186.      puts "pf1 configured on interface $intf"
  187.      set filt "(ip src host foobar) and (not ether broadcast)"
  188.      set nbytes [$pf1 filter $filt]
  189.      puts "filter compiled to $nbytes bytes"
  190.      puts "drops: [$pf1 pdrops], pkts: [$pf1 pkts]"
  191. end{verbatim}
  192. This example first determines the name of the local system which
  193. will be used in constructing a BPF/libpcap filter predicate.
  194. The {tt new Network/Pcap/Live} call creates an instance of the
  195. pcap network object for capturing live traffic.
  196. The {tt promisc_} flag tells the packet filter whether it should
  197. configure the undelying interface in promiscuous mode (if it is supported).
  198. The {tt open} call activates the packet filter, and may be specified
  199. as {tt readonly}, {tt writeonly}, or {tt readwrite}.
  200. It returns the name of the network interface the filter is associated
  201. with.
  202. The {tt open} call takes an optional extra parameter (not illustrated)
  203. indicating the name of the interface to use in cases where a particular
  204. interface should be used on a multi-homed host.
  205. The {tt filter} method is used to create a BPF-compatible packet
  206. filter program which is loaded into the underlying BPF machinery.
  207. The {tt filter} method returns the number of bytes used by the
  208. filter predicate. 
  209. The {tt pdrops} and {tt pkts} methods are available for statistics
  210. collection.
  211. They report the number of packets dropped by the filter due to 
  212. buffer exhaustion and the
  213. total number of packets that arrived at the filter, respectively
  214. ({em not} the number of packets accepted by the filter).
  215. subsection{IP Network Objects}
  216. These objects provide raw access to the IP protocol, and allow
  217. the complete specification of IP packets (including header).
  218. The implementation makes use of a {em raw socket}.
  219. In most UNIX systems, access to such sockets requires super-user privileges.
  220. In addition, the interface to raw sockets is somewhat less standard than
  221. other types of sockets.
  222. The class {tt Network/IP} provides raw IP functionality plus a
  223. base class from
  224. which other network objects implementing higher-layer protocols
  225. are derived.
  226. paragraph{Configuration}
  227. The configuration of a raw IP network object is comparatively
  228. simple.
  229. The object is not associated with any particular physical network
  230. interface; the system's IP routing capability will be used to
  231. emit the specified datagram out whichever interface is required
  232. to reach the destination address contained in the header.
  233. Here is an example of configuring an IP object:
  234. begin{verbatim}
  235.     set ipnet [new Network/IP]
  236.     $ipnet open writeonly
  237.     ...
  238.     $ipnet close
  239. end{verbatim}
  240. The IP network object supports only the {tt open} and {tt close}
  241. methods.
  242. subsection{IP/UDP Network Objects}
  243. These objects provide access to the system's UDP implementation
  244. along with support for IP multicast group membership operations.
  245. {bf IN PROGRESS}
  246. section{An Example}
  247. The following code illustrates a small but complete
  248. simulation script for setting up an emulation test using BPF and
  249. IP network objects.
  250. It was run on a multi-homed machine, and the simulator essentially
  251. provides routing capability by reading frames from one interface,
  252. passing them through the simulated network, and writing them
  253. out via the raw IP network object:
  254. begin{program}
  255.         set me "10.0.1.1"
  256.         set ns [new Simulator]
  257.         $ns use-scheduler RealTime
  258.         #
  259.         # we want the test machine to have ip forwarding disabled, so
  260.         # check this (this is how to do so under FreeBSD at least)
  261.         #
  262.         set ipforw [exec sysctl -n net.inet.ip.forwarding]
  263.         if { $ipforw } {
  264.                 puts "can not run with ip forwarding enabled"
  265.                 exit 1
  266.         }
  267.         #
  268.         # allocate a BPF type network object and a raw-IP object
  269.         #
  270.         set bpf0 [new Network/Pcap/Live]
  271.         set bpf1 [new Network/Pcap/Live]
  272.         $bpf0 set promisc_ true
  273.         $bpf1 set promisc_ true
  274.         set ipnet [new Network/IP]
  275.         set nd0 [$bpf0 open readonly fxp0]
  276.         set nd1 [$bpf1 open readonly fxp1]
  277.         $ipnet open writeonly
  278.         #
  279.         # try to filter out weird stuff like netbios pkts, arp requests, dns,
  280.         # also, don't catch stuff to/from myself or broadcasted
  281.         #
  282.         set notme "(not ip host $me)"
  283.         set notbcast "(not ether broadcast)"
  284.         set ftp "and port ftp-data"
  285.         set f0len [$bpf0 filter "(ip dst host bit) and $notme and $notbcast"]
  286.         set f1len [$bpf1 filter "(ip src host bit) and $notme and $notbcast"]
  287.         puts "filter lengths: $f0len (bpf0), $f1len (bpf1)"
  288.         puts "dev $nd0 has address [$bpf0 linkaddr]"
  289.         puts "dev $nd1 has address [$bpf1 linkaddr]"
  290.         set a0 [new Agent/Tap]
  291.         set a1 [new Agent/Tap]
  292.         set a2 [new Agent/Tap]
  293.         puts "install nets into taps..."
  294.         $a0 network $bpf0
  295.         $a1 network $bpf1
  296.         $a2 network $ipnet
  297.         set node0 [$ns node]
  298.         set node1 [$ns node]
  299.         set node2 [$ns node]
  300.         $ns simplex-link $node0 $node2 10Mb 10ms DropTail
  301.         $ns simplex-link $node1 $node2 10Mb 10ms DropTail
  302.         $ns attach-agent $node0 $a0
  303.         $ns attach-agent $node1 $a1
  304.         $ns attach-agent $node2 $a2
  305.         $ns connect $a0 $a2
  306.         $ns connect $a1 $a2
  307.         puts "okey"
  308.         $ns run
  309. end{program}
  310. section{Commands at a glance}
  311. label{sec:emulationcommand}
  312. Following is a list of emulation related commands:
  313. begin{flushleft}
  314. code{$ns_ use-scheduler RealTime}\
  315. This command sets up the real-time scheduler. Note that a real-time scheduler
  316. should be used with any emulation facility. Otherwise it may result the simulated network
  317. running faster than real-time.
  318. code{set netob [new Network/<network-object-type>]}\
  319. This command creates an instance of a network object. Network objects are used
  320. to access a live network. Currently the types of network objects  available
  321. are Network/Pcap/Live, Network/IP and Network/IP/UDP. See section
  322. ref{sec:networkobj} for details on network objects.
  323. end{flushleft}
  324. endinput