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

通讯编程

开发平台:

Visual C++

  1. chapter{Applications and transport agent API}
  2. label{chap:applications}
  3. Applications sit on top of transport agents in ns.  There are two basic types
  4. of applications:  traffic generators and simulated applications.  
  5. Figure~ref{fig:application} illustrates two examples of how applications
  6. are composed and attached to transport agents.  Transport agents are described
  7. in Part V (Transport).
  8. begin{figure}[tb] 
  9.   centerline{includegraphics{application}}
  10.   caption{Example of Application Composition}
  11.   label{fig:application} 
  12. end{figure}
  13. This chapter first describes the base clsref{Application}{../ns-2/app.h}. 
  14. Next, the transport API, through which applications request services from
  15. underlying transport agents, is described.  Finally, the current 
  16. implementations of traffic generators and sources are explained.  
  17. %There are currently two methods of traffic generation in ns.
  18. %One method uses the abstract
  19. %clsref{TrafficGenerator}{../ns-2/trafgen.h}
  20. %to generate inter-packet intervals and packet sizes.
  21. %Currently, classes derived
  22. %from TrafficGenerator are used in conjunction with the UDP_Agent
  23. %objects, which are responsible for actually allocating and
  24. %transmitting the generated packets (Section~ref{sec:trafgenclass}).
  25. %The second method of traffic generation uses the Source class.
  26. %Source objects generate traffic that is transported by TCPAgent objects
  27. %(Section~ref{sec:sourceobjects}).
  28. section{The class Application}
  29. label{sec:appclass}
  30. Application is a C++ class defined as follows:
  31. begin{program}
  32.         class Application : public TclObject {
  33.         public:
  34.                 Application();
  35.                 virtual void send(int nbytes);
  36.                 virtual void recv(int nbytes);
  37.                 virtual void resume();
  38.         protected:
  39.                 int command(int argc, const char*const* argv);
  40.                 virtual void start();
  41.                 virtual void stop();
  42.                 Agent *agent_;
  43.                 int enableRecv_;                // call OTcl recv or not
  44.                 int enableResume_;              // call OTcl resume or not
  45.         };
  46. end{program}
  47. Although objects of code{class Application} are not meant to be instantiated,
  48. we do not make it an abstract base class so that it is visible from OTcl level.
  49. The class provides basic prototypes for application behavior 
  50. (code{send(), recv(), resume(), start(), stop()}), a pointer to the 
  51. transport agent to which it is connected, and flags that indicate whether
  52. a OTcl-level upcall should be made for code{recv()} and 
  53. code{resume()} events.  
  54. section{The transport agent API}
  55. In real-world systems, applications typically access network services through
  56. an applications programming interface (API).  The most popular
  57. of these APIs is known as ``sockets.''  In ns, we mimic the behavior of the
  58. sockets API through a set of well-defined API functions.  These functions 
  59. are then mapped to the appropriate internal agent functions (e.g.,
  60. a call to code{send(numBytes)} causes TCP to increment its ``send buffer'' 
  61. by a corresponding number of bytes).
  62. This section describes how agents and applications are hooked together and
  63. communicate with one another via the API.
  64. subsection{Attaching transport agents to nodes}
  65. label{sec:attachagentnode}
  66. This step is typically done at OTcl level.  Agent management was also briefly
  67. discussed in Section ref{sec:node:node}.  
  68. begin{program}
  69.         set src [new Agent/TCP/FullTcp]
  70.         set sink [new Agent/TCP/FullTcp]
  71.         $ns_ attach-agent $node_(s1) $src
  72.         $ns_ attach-agent $node_(k1) $sink
  73.         $ns_ connect $src $sink
  74. end{program}
  75. The above code illustrates that in ns, agents are first attached to a node
  76. via code{attach-agent}.  Next, the code{connect} instproc sets each agent's
  77. destination target to the other.  Note that, in ns, code{connect()} has
  78. different semantics than in regular sockets.  In ns, code{connect()} simply
  79. establishes the destination address for an agent, but does not set up the
  80. connection.  As a result, the overlying application does not need to know
  81. its peer's address.  For TCPs that exchange SYN segments, the first call to 
  82. code{send()} will trigger the SYN exchange. 
  83. To detach an agent from a node, the instproc code{detach-agent} can be 
  84. used; this resets the target for the agent to a null agent.
  85. subsection{Attaching applications to agents}
  86. label{sec:attachappagent}
  87. After applications are instantiated, they must be connected to a transport
  88. agent.  The code{attach-agent} method can be used to attach an application
  89. to an agent, as follows:
  90. begin{program}
  91.         set ftp1 [new Application/FTP]
  92.         $ftp1 attach-agent $src
  93. end{program}
  94. The following shortcut accomplishes the same result:
  95. begin{program}
  96.         set ftp1 [$src attach-app FTP]
  97. end{program}
  98. The attach-agent method, which is also used by attach-app, is implemented in 
  99. C++.  It sets the code{agent_}
  100. pointer in code{class Application} to point to the transport agent, and then
  101. it calls code{attachApp()} in code{agent.cc} to set the code{app_} pointer
  102. to point back to the application.  By maintaining this binding only in C++,
  103. OTcl-level instvars pointers are avoided and consistency between OTcl and C++ 
  104. is guaranteed.  The OTcl-level command code{[$ftp1 agent]} can be used by 
  105. applications to obtain the handler for the transport agent.
  106. subsection{Using transport agents via system calls}
  107. label{sec:systemcalls}
  108. Once transport agents have been configured and applications attached, 
  109. applications can use transport 
  110. services via the following system calls.  These calls can be invoked at either
  111. OTcl or C++ level, thereby allowing applications to be coded in either C++ or
  112. OTcl.  These functions have been implemented as virtual functions in the base
  113. code{class Agent}, and can be redefined as needed by derived Agents. 
  114. begin{itemize}
  115. item code{send(int nbytes)}---Send nbytes of data to peer.  For TCP agents,
  116. if code{nbytes == -1}, this corresponds to an ``infinite'' send; i.e., the
  117. TCP agent will act as if its send buffer is continually replenished by the
  118. application.
  119. item code{sendmsg(int nbytes, const char* flags = 0)}---Identical to 
  120. code{send(int nbytes)}, except that it passes an additional string 
  121. code{flags}.  Currently one flag value, ``MSG_EOF,'' is defined; MSG_EOF
  122. specifies that this is the last batch of data that the application will 
  123. submit, and serves as an implied close (so that TCP can send FIN with data).
  124. item code{close()}---Requests the agent to close the connection (only 
  125. applicable for TCP).
  126. item code{listen()}---Requests the agent to listen for new connections
  127. (only applicable for Full TCP).
  128. item code{set_pkttype(int pkttype)}---This function sets the code{type_} 
  129. variable in the agent to code{pkttype}.  Packet types are defined in 
  130. code{packet.h}.  This function is used to override the transport layer 
  131. packet type for tracing purposes.  
  132. end{itemize}
  133. Note that certain calls are not applicable for certain agents; e.g., a call
  134. to fcn[]{close} a UDP connection results in a no-op.  Additional calls
  135. can be implemented in specialized agents, provided that they are made
  136. code{public} member functions. 
  137. subsection{Agent upcalls to applications}
  138. label{sec:upcalls}
  139. Since presently in ns~there is no actual data being passed between 
  140. applications, agents can instead announce to applications the occurrence of 
  141. certain events at the transport layer through ``upcalls.''  For example,
  142. applications can be notified of the arrival of a number of bytes of data;
  143. this information may aid the application in modelling real-world application
  144. behavior more closely.  Two basic ``upcalls'' have been implemented in 
  145. base code{class Application} and in the transport agents:
  146. begin{itemize} 
  147. item code{recv(int nbytes)}---Announces that code{nbytes} of data have been
  148. received by the agent.  For UDP agents, this signifies the arrival of
  149. a single packet.  For TCP agents, this signifies the ``delivery'' of an 
  150. amount of in-sequence data, which may be larger than that contained in a 
  151. single packet (due to the possibility of network reordering).
  152. item code{resume()}---This indicates to the application that the transport
  153. agent has sent out all of the data submitted to it up to that point in time.  
  154. For TCP, it does not indicate whether the data has been ACKed yet, only that
  155. it has been sent out for the first time. 
  156. end{itemize}
  157. The default behavior is as follows: 
  158. Depending on whether the application has been implemented in C++ or OTcl, these
  159. C++ functions 
  160. call a similarly named (code{recv, resume}) function in the application,
  161. if such methods have been defined.   
  162. Although strictly not a callback to applications, certain Agents have
  163. implemented a callback from C++ to OTcl-level that has been used by 
  164. applications such as HTTP simulators.  This callback method, code{done{}},
  165. is used in TCP agents.  In TCP, code{done{}} is called when a TCP sender 
  166. has received ACKs for all of its data and is now closed; it therefore can
  167. be used to simulate a blocked TCP connection.  The code{done{}}
  168. method was primarily used before this API was completed, but may still be
  169. useful for applications that do not want to use code{resume()}.
  170. To use code{done{}} for FullTcp, for example, you can try:
  171. begin{program}
  172.         set myagent [new Agent/TCP/FullTcp]
  173.         $myagent proc done { } {
  174.             ... code you want ...
  175.         }
  176. end{program}
  177. If you want all the FullTCP's to have the same code you could also do:
  178. begin{program}
  179.         Agent/TCP/FullTcp instproc done {} {
  180.             ... code you want ...
  181.         }
  182. end{program}
  183. By default, code{done{}} does nothing.
  184. subsection{An example}
  185. label{sec:syscallsexample}
  186. Here is an example of how the API is used to implement a simple application
  187. (FTP) on top of a FullTCP connection. 
  188. begin{program}
  189.         set src [new Agent/TCP/FullTcp]
  190.         set sink [new Agent/TCP/FullTcp]
  191.         $ns_ attach-agent $node_(s1) $src
  192.         $ns_ attach-agent $node_(k1) $sink
  193.         $ns_ connect $src $sink
  194.         # set up TCP-level connections
  195.         $sink listen; 
  196.         $src set window_ 100
  197.         set ftp1 [new Application/FTP]
  198.         $ftp1 attach-agent $src
  199.         $ns_ at 0.0 "$ftp1 start"
  200. end{program}
  201. In the configuration script, the first five lines of code allocates two new
  202. FullTcp agents, attaches them to the correct nodes, and "connects" them
  203. together (assigns the correct destination addresses to each agent).  The
  204. next two lines configure the TCP agents further, placing one of them in
  205. LISTEN mode.  Next, code{ftp1} is defined as a new FTP Application, and 
  206. the code{attach-agent} method is called in C++ (code{app.cc}).     
  207. The ftp1 application is started at time 0:
  208. begin{program}
  209.         Application/FTP instproc start {} {
  210.                [$self agent] send -1;   # Send indefinitely
  211.         }
  212. end{program}
  213. Alternatively, the FTP application could have been implemented in C++ as
  214. follows:
  215. begin{program}
  216.         void FTP::start()
  217.         {
  218.                 agent_->send(-1);    // Send indefinitely
  219.         }
  220. end{program}  
  221. Since the FTP application does not make use of callbacks, these functions
  222. are null in C++ and no OTcl callbacks are made. 
  223. section{The class TrafficGenerator}
  224. label{sec:trafgenclass}
  225. TrafficGenerator is an abstract C++ class defined as follows:
  226. begin{program}
  227.         class TrafficGenerator : public Application {
  228.         public:
  229.                 TrafficGenerator();
  230.                 virtual double next_interval(int &) = 0;
  231.                 virtual void init() {}
  232.                 virtual double interval() { return 0; }
  233.                 virtual int on() { return 0; }
  234.                 virtual void timeout();
  235.                 virtual void recv() {}
  236.                 virtual void resume() {}
  237.         protected:
  238.                 virtual void start();
  239.                 virtual void stop();
  240.                 double nextPkttime_;
  241.                 int size_;
  242.                 int running_;
  243.                 TrafficTimer timer_;
  244.         };
  245. end{program}
  246. The pure virtual function fcn[]{next_interval} returns the time until the
  247. next packet is created and also sets the size in bytes of the next
  248. packet.  The function fcn[]{start} calls fcn{init} and starts the 
  249. timer.  The function fcn[]{timeout} sends a packet and reschedules the
  250. next timeout.  The function fcn[]{stop} cancels any pending transmissions.
  251. Callbacks are typically not used for traffic generators, so these 
  252. functions (code{recv, resume}) are null.
  253. Currently, there are four C++ classes derived from the
  254. class TrafficGenerator:
  255. begin{enumerate}
  256. item code{EXPOO_Traffic}---generates traffic according to an
  257.   Exponential On/Off distribution.
  258.   Packets are sent at a fixed rate during on periods, and
  259.   no packets are sent during off periods.
  260.   Both on and off periods are taken from an exponential distribution.
  261.   Packets are constant size.
  262. item code{POO_Traffic}---generates traffic
  263.   according to a Pareto On/Off distribution.
  264.   This is identical to the Exponential On/Off distribution,
  265.   except the on and off periods are taken from a pareto distribution.
  266.   These sources can be used to generate aggregate traffic
  267.   that exhibits long range dependency.
  268. item code{CBR_Traffic}---generates traffic according to a deterministic rate.
  269.   Packets are constant size.  Optionally, some randomizing dither can be
  270.   enabled on the interpacket departure intervals. 
  271. item code{TrafficTrace}---generates traffic according to a trace file.
  272.   Each record in the trace file consists of 2 32-bit fields
  273.    in network (big-endian) byte order.
  274.   The first contains the time in microseconds
  275.   until the next packet is generated.
  276.   The second contains the length in bytes of the next packet.
  277. end{enumerate}
  278. These classes can be created from OTcl.  The OTcl classes names and
  279. associated parameters are given below:
  280. paragraph{Exponential On/Off}
  281. An Exponential On/Off object is embodied in the OTcl class
  282. Application/Traffic/Exponential.  The member variables that parameterize this
  283. object are:
  284. begin{alist}
  285. code{packetSize_} & the constant size of the packets generated\
  286. code{burst_time_} & the average ``on'' time for the generator\
  287. code{idle_time_} & the average ``off'' time for the generator\
  288. code{rate_} & the sending rate during ``on'' times\
  289. end{alist}
  290. Hence a new Exponential On/Off traffic generator can be created and 
  291. parameterized as follows:
  292. begin{program}
  293.         set e [new Application/Traffic/Exponential]
  294.         $e set packetSize_ 210
  295.         $e set burst_time_ 500ms
  296.         $e set idle_time_ 500ms
  297.         $e set rate_ 100k
  298. end{program}
  299. {bf NOTE:} The Exponential On/Off generator can be configured to behave
  300. as a {bf Poisson process} by setting the variable code{burst_time_} to code{0}
  301. and the variable code{rate_} to a very large value.  The C++ code
  302. guarantees that even if the burst time is zero, at least one packet is
  303. sent.  Additionally, the next interarrival time is the sum of the
  304. assumed packet transmission time (governed by the variable code{rate_}) and 
  305. the random variate corresponding to code{idle_time_}.  
  306. Therefore, to make the first term in the sum very small, make the burst
  307. rate very large so that the transmission time is negligible compared to
  308. the typical idle times.
  309. paragraph{Pareto On/Off}
  310. A Pareto On/Off object is embodied in the OTcl class Application/Traffic/Pareto.
  311. The member variables that parameterize this object are:
  312. begin{alist}
  313. code{packetSize_} & the constant size of the packets generated\
  314. code{burst_time_} & the average "on" time for the generator\
  315. code{idle_time_} & the average "off" time for the generator\
  316. code{rate_} & the sending rate during "on" times\
  317. code{shape_} & the "shape" parameter used by the pareto distribution\
  318. end{alist}
  319. A new Pareto On/Off traffic generator can be created as follows:
  320. begin{program}
  321.         set p [new Application/Traffic/Pareto]
  322.         $p set packetSize_ 210
  323.         $p set burst_time_ 500ms
  324.         $p set idle_time_ 500ms
  325.         $p set rate_ 200k
  326.         $p set shape_ 1.5
  327. end{program}
  328. paragraph{CBR}
  329. A CBR  object is embodied in the OTcl class
  330. Application/Traffic/CBR.  The member variables that parameterize this
  331. object are:  
  332. begin{alist}
  333. code{rate_} & the sending rate \
  334. code{interval_} & (Optional) interval between packets \
  335. code{packetSize_} & the constant size of the packets generated\
  336. code{random_} & flag indicating whether or not to introduce random ``noise'' 
  337. in the scheduled departure times (default is off)\
  338. code{maxpkts_} & the maximum number of packets to send (default is ((2^28))\
  339. end{alist}
  340. Hence a new CBR traffic generator can be created and parameterized
  341. as follows:
  342. begin{program}
  343.         set e [new Application/Traffic/CBR]
  344.         $e set packetSize_ 48
  345.         $e set rate_ 64Kb
  346.         $e set random_ 1
  347. end{program}
  348. The setting of a CBR object's code{rate_} and code{interval_} are mutually
  349. exclusive (the interval between packets is maintained as an interval 
  350. variable in C++,
  351. and some example ns~scripts specify an interval rather than a rate).  In
  352. a simulation, either a rate or an interval (but not both) should be 
  353. specified for a CBR object.  
  354. paragraph{Traffic Trace}
  355. A Traffic Trace object is instantiated by the OTcl class 
  356. Application/Traffic/Trace.
  357. The associated class Tracefile is used to enable multiple 
  358. Traffic/Trace objects to be associated with a single trace file.
  359. The Traffic/Trace class uses the method attach-tracefile to associate
  360. a Traffic/Trace object with a particular Tracefile object.
  361. The method filename of the Tracefile class associates a trace file
  362. with the Tracefile object.
  363. The following example shows how to create two Application/Traffic/Trace objects,
  364. each associated with the same trace file
  365. (called "example-trace" in this example).
  366. To avoid synchronization of the traffic generated,
  367. random starting places within the trace file are chosen for
  368. each Traffic/Trace object.
  369. begin{program}
  370.         set tfile [new Tracefile]
  371.         $tfile filename example-trace
  372.         set t1 [new Application/Traffic/Trace]
  373.         $t1 attach-tracefile $tfile
  374.         set t2 [new Application/Traffic/Trace]
  375.         $t2 attach-tracefile $tfile
  376. end{program}
  377. subsection{An example}
  378. The following code illustrates the basic steps to configure an Exponential
  379. traffic source over a UDP agent, for traffic flowing from node code{s1} to 
  380. node code{k1}:
  381. begin{program}
  382.         set src [new Agent/UDP]
  383.         set sink [new Agent/UDP]
  384.         $ns_ attach-agent $node_(s1) $src
  385.         $ns_ attach-agent $node_(k1) $sink
  386.         $ns_ connect $src $sink
  387.         set e [new Application/Traffic/Exponential]
  388.         $e attach-agent $src
  389.         $e set packetSize_ 210
  390.         $e set burst_time_ 500ms
  391.         $e set idle_time_ 500ms
  392.         $e set rate_ 100k
  393.         $ns_ at 0.0 "$e start"
  394. end{program}
  395. section{Simulated applications:  Telnet and FTP}
  396. label{sec:simapps}
  397.  
  398. There are currently two ``simulate application'' classes derived from 
  399. Application:
  400. Application/FTP and Application/Telnet.  These classes work by advancing the
  401. count of packets available to be sent by a TCP transport agent.
  402. The actual transmission of available packets is still controlled by TCP's flow 
  403. and congestion control algorithm.
  404.  
  405. paragraph{Application/FTP} 
  406. Application/FTP, implemented in OTcl, simulates bulk data transfer.  
  407. The following are methods of the Application/FTP class:
  408. begin{alist}
  409. code{attach-agent} & attaches an Application/FTP object to an agent.\ 
  410. code{start} & start the Application/FTP by calling the TCP agent's 
  411. code{send(-1)} function, which causes TCP to behave as if the application 
  412. were continuously sending new data.\
  413. code{stop} & stop sending.\ 
  414. code{produce n} &  set the counter of packets to be sent to $n$.\ 
  415. code{producemore n} &  increase the counter of packets to be sent by $n$. \
  416. code{send n} & similar to code{producemore}, but sends $n$ bytes instead of
  417. packets.  
  418. end{alist} 
  419. paragraph{Application/Telnet} 
  420. Application/Telnet objects generate packets in one of two ways.
  421. If the member variable code{interval_} is non-zero,
  422. then inter-packet times are chosen
  423. from an exponential distribution with average equal to code{interval_}.
  424. If code{interval_} is zero, then inter-arrival times are chosen
  425. according to the tcplib distribution (see tcplib-telnet.cc).
  426. The start method starts the packet generation process.
  427. section{Applications objects} 
  428. label{sec:appobjects} 
  429. An application object may be of two types, a traffic generator or a
  430. simulated application. Traffic generator objects generate traffic and can
  431. be of four types, namely, exponential, pareto, CBR and traffic trace. 
  432. begin{description} 
  433. item[Application/Traffic/Exponential objects]
  434. Exponential traffic objects generate On/Off traffic. During "on" periods,
  435. packets are generated at a constant burst rate. During "off" periods, no
  436. traffic is generated. Burst times and idle times are taken from
  437. exponential distributions. Configuration parameters are:  
  438. begin{description} 
  439. item[PacketSize_] constant size of packets generated.
  440. item[burst_time_] average on time for generator. 
  441. item[idle_time_] average off time for generator.  
  442. item[rate_] sending rate during on time.  
  443. end{description}
  444. item[Application/Traffic/Pareto] 
  445. Application/Traffic/Pareto objects generate On/Off traffic with burst
  446. times and idle times taken from pareto distributions. Configuration
  447. parameters are:
  448. begin{description}
  449. item[PacketSize_] constant size of packets generated.
  450. item[burst_time_] average on time for generator.
  451. item[idle_time_] average off time for generator.
  452. item[rate_] sending rate during on time.
  453. item[shape_] the shape parameter used by pareto distribution.
  454. end{description}
  455. item[Application/Traffic/CBR]
  456. CBR objects generate packets at a constant bit rate. 
  457. code{$cbr start}\
  458. Causes the source to start generating packets. 
  459. code{$cbr stop}\
  460. Causes the source to stop generating packets. 
  461. Configuration parameters are:
  462. begin{description}
  463. item[PacketSize_] constant size of packets generated. 
  464. item[rate_] sending rate.
  465. item[interval_] (optional) interval between packets.
  466. item[random_] whether or not to introduce random noise in the scheduled
  467. departure times. defualt is off.
  468. item[maxpkts_] maximum number of packets to send.
  469. end{description}
  470. item[Application/Traffic/Trace]
  471. Application/Traffic/Trace objects are used to generate traffic from a
  472. trace file. 
  473. code{$trace attach-tracefile tfile}\
  474. Attach the Tracefile object tfile to this trace. The Tracefile object
  475. specifies the trace file from which the traffic data is to be read.
  476. Multiple Application/Traffic/Trace objects can be attached
  477. to the same Tracefile object. A random starting place within the Tracefile
  478. is chosen for each Application/Traffic/Trace object. \
  479. There are no configuration parameters for this object. 
  480. end{description}
  481. A simulated application object can be of two types, Telnet and FTP.
  482. begin{description}
  483. item[Application/Telnet]
  484. TELNET objects produce individual packets with inter-arrival times as
  485. follows. If interval_ is non-zero, then inter-arrival times are chosen
  486. from an exponential distribution with average interval_. If interval_ is
  487. zero, then inter-arrival times are chosen using the "tcplib" telnet
  488. distribution. 
  489. code{$telnet start}\
  490. Causes the Application/Telnet object to start producing packets. 
  491. code{$telnet stop}\
  492. Causes the Application/Telnet object to stop producing packets. 
  493. code{$telnet attach <agent>}\
  494. Attaches a Telnet object to agent. 
  495. Configuration Parameters are:
  496. begin{description}
  497. item[interval_]
  498. The average inter-arrival time in seconds for packets generated by the
  499. Telnet object. 
  500. end{description}
  501. item[Application FTP]
  502. FTP objects produce bulk data for a TCP object to send. 
  503. code{$ftp start}\
  504. Causes the source to produce maxpkts_ packets. 
  505. code{$ftp produce <n>}\
  506. Causes the FTP object to produce n packets instantaneously. 
  507. code{$ftp stop}\
  508. Causes the attached TCP object to stop sending data. 
  509. code{$ftp attach agent}\
  510. Attaches a Application/FTP object to agent. 
  511. code{$ftp producemore <count>}\
  512. Causes the Application/FTP object to produce count more packets. 
  513. Configuration Parameters are:
  514. begin{description}
  515. item[maxpkts] The maximum number of packets generated by the source. 
  516. end{description}
  517. end{description}
  518. textsc{Tracefile objects}
  519. Tracefile objects are used to specify the trace file that is to be used
  520. for generating traffic (see Application/Traffic/Trace objects
  521. described earlier in this section). code{$tracefile} is an instance of
  522. the Tracefile Object. 
  523. code{$tracefile filename <trace-input>}\
  524. Set the filename from which the traffic trace data is to be read to
  525. trace-input. 
  526. There are no configuration parameters for this object. A trace file
  527. consists of any number of fixed length records. Each record consists of 2
  528. 32 bit fields. The first indicates the interval until the next packet is
  529. generated in microseconds. The second indicates the length of the next
  530. packet in bytes. 
  531. section{Commands at a glance}
  532. label{sec:appscommand}
  533. Following are some transport agent and application related commands
  534. commonly used in simulation scripts:
  535. begin{flushleft}
  536. begin{program}
  537. set tcp1 [new Agent/TCP]
  538. $ns_ attach-agent $node_(src) $tcp1
  539. set sink1 [new Agent/TCPSink]
  540. $ns_ attach-agent $node_(snk) $sink1
  541. $ns_ connect $tcp1 $sink1
  542. end{program}
  543. This creates a source tcp agent and a destination sink agent. Both the transport
  544. agents are attached to their resoective nodes. Finally an end-to-end connection
  545. is setup between the src and sink.
  546. begin{program}
  547. set ftp1 [new Application/FTP]
  548. $ftp1 attach-agent $agent
  549. end{program}
  550. or
  551. code{set ftp1 [$agent attach-app FTP]}
  552. Both the above commands achieve the same. An application (ftp in this example)
  553. is created and attached to the source agent. An application can be of two
  554. types, a traffic generator or a simulated application.
  555. Types of Traffic generators currently present are: 
  556. Application/Traffic/Exponential, Application/Traffic/Pareto,
  557. Application/Traffic/CBR, and Application/Traffic/Trace. See section ref{sec:trafgenclass}
  558. for details.
  559. Types of simulated applications currently implemented are:
  560. Application/FTP and Application/Telnet. See  section ref{sec:simapps} for
  561. details.
  562. end{flushleft}
  563. endinput