<?xml version="1.0" encoding="ISO-8859-2"?>
<!DOCTYPE zprava SYSTEM "techrep.dtd">

<zprava cislo="18/2003" jazyk="en">

  <nazev>Performance Testing Tools</nazev>

  <autor>Jan Bartọ</autor>

  <datum>30/10/2003</datum>

  <h1 id="section1">Abstract</h1>

    <p>
	The report describes properties and abilities of software tools for
	performance testing. It also shows the tools comparison according to
	requirements for testing tools described in RFC 2544 (Benchmarking Terminology
	for Network Interconnection Devices).
    </p>



  <h1 id="section2">Introduction</h1>

    <p>
	This report is intended as a basic documentation for auxiliary utilities or
	programs that have been made for the purposes of evaluating transfer
	performance between one or more PCs in the role of traffic generators and
	another one on the receiving side. <a href="#section3">Section 3</a> describes
	requirements for software testing tools according to RFC 2544. Available tools for
	performance testing are catalogued by this document in <a href="#section4">
	section 4</a>. This section also shows the testing tools compatibility with
	RFC 2544 and the evaluation of IPv6 support. The summary of supported requirements for
	testing tools and IPv6 support can be seen in <a href="#section5">section 5</a>.
    </p>

  <h1 id="section3">Requirements for software performance testing tools according to RFC-2544</h1>

    <h2>User defined frame format</h2>

      <p>
	  Testing tool should be able to use test frame formats defined in RFC 2544 -
	  Appendix C: <i>Test Frame Formats</i>. These exact frame formats should be used
	  for specific protocol/media combination (ex. IP/Ethernet) and for testing
	  other media combinations as a template. The frame size should be variable,
	  so that we can determine a full characterization of the DUT (Device Under
	  Test) performance. It might be useful to know the DUT performance under a
	  number of conditions, so we need to place some special frames into a normal
	  test frames stream (ex. broadcast, management, routing update frames &ldots;).
	  These modifiers could have a significant impact on an ability of a router
	  to forward data frames. The testing tool should be able to use a random
	  destination address to simulate multiple streams of data.
      <br/>
	  For more details about recommended frame formats see Appendix C included
	  with RFC 2544.
      </p>

    <h2>Verifying received frames</h2>

      <p>
	  The receiver should discard any frames received during a test run that are
	  not actual forwarded test frames (ex. management frames, routing update
	  frames &ldots;). It should verify the length of received frames and report the
	  number of dropped, duplicated frames, frames that were received out of
	  order and the number of gaps in the received frame numbering sequence. The
	  testing tool should verify that the all of the routing updates (see above
	  in section User defined frame format) were processed by the DUT.
      </p>

    <h2>Bidirectional traffic</h2>

      <p>
	  Real network traffic is not in a single direction. To test the
	  bidirectional performance of a DUT, we need a testing tool, which can be
	  run with the same data rate in each direction. The sum of the data rates
	  should not exceed the theoretical limit for the media.
      </p>

    <h2>Setting inter-frame time gap</h2>

      <p>
	  All the tests should be performed with both steady state traffic and with
	  traffic consisting of repeated bursts of frames. Because of needs to
	  determine the minimum interval between bursts, which the DUT can process
	  with no frame loss, we need to set the inter-frame time gap between defined
	  frames (bursts).
      </p>

  <h1 id="section4">Tools</h1>

    <p> Each tool is defined as follows: </p>

    <p>
        <i>Description</i><br/>
	A description of the tools construction, and the implementation methodology
	of the tests.
    </p>

    <p>
      	<i>Automation</i><br/>
	What steps are required to complete the test? What human intervention is
	required?
    </p>

    <p>
	<i>Settings possibilities</i><br/>
	Summary of program settings possibilities.
    </p>

    <p>
	<i>Availability</i><br/>
	How do you retrieve this tool and get more information about it?
    </p>

    <p>
        <i>Required Environment</i><br/>
	Compilers, OS version, etc. required to build and/or run the associated
	tool.
    </p>

    <p>
	<i>RFC 2544 compatibility</i><br/>
	Summary of requirements to testing tools according to RFC 2544 as defined
	in <a href="#section3">section 3</a>.
    </p>

    <p>
	<i>References</i><br/>
	A list of publications relating to the tool, if any.
    </p>

    <h2 id="dbs">DBS 1.1.5</h2>

      <h3>Description</h3>

	<p>
	    DBS (Distributed Benchmark System) is aiming to give performance index with
	    multi-point configuration and also in order to measure changes of
	    throughput. It measures the performance of entire TCP functions in various
	    operational environments. DBS has the capability of both measuring and
	    analyzing TCP performance more in details. DBS is able to evaluate the
	    three TCP control mechanisms - flow control, retransmission control and
	    congestion avoidance control. The DBS can generate various situations where
	    the three controls are working together. The DBS can also generate UDP
	    traffic for more realistic benchmarking.
	</p>

  <obr src="disbench">DBS architecture</obr>

	<p>
	    The DBS is composed of three programs. Figure shows an overview of the DBS
	    System Structure. The <soubor>dbsc</soubor> is a control program to handle
			monitoring program launched on observed hosts. <soubor>dbsd</soubor> is a
			program for sending and receiving data among observed hosts. These two
			programs are used for actual benchmarking. The <soubor>dbs_view</soubor>
			is used for data analysis. The details of these programs are described below:
	</p>

	<h4><i>dbsc: </i> DBS controller (Controlling Host)</h4>

 	  <p>
	      The DBS controller is a program controlling the experiment of TCP/UDP data
	      transfer. Controller reads commands from a command file, then it asks the
	      DBS daemons to start data transfer experiments, and after receiving results
	      from the daemons, the DBS controller saves them into the local files.
  	  </p>

	<h4><i>dbsd: </i> DBS daemon (Measuring Host)</h4>

	  <p>
	      The DBS daemon is a daemon program that is launched on the experimental
	      hosts. It sends and receives network traffic according to the commands
	      instructed by the DBS controller.
	  </p>


	<h4><i>dbs_view: </i> DBS viewer</h4>

	  <p>
	      The DBS viewer is a program for analysis data which is gathered by the DBS
	      controller. It draws graphs to reveal the transitions of sequence numbers,
	      changes of throughput, changes of delay times or other performance indexes.
	  </p>

	  <p>
	      If measuring host has only one network interface card, traffic of
	      command/result and measured traffic are transferred on the same network.
	      This may influence the measurement results. To avoid this influence, DBS
	      controls command/result and measured traffic are not transferred at the
	      same time.
	  </p>

	  <p>
	      DBS implementation assumes that clocks on all the hosts participating to
	      the benchmark are synchronized.
  	  </p>

      <h3>Automation</h3>
	<p>
	    Commands of execution are driven by a command file. Format of the command
	    file is as follows. When multiple data streams are transferred in the same
	    test, many configurations should be written in the same file.
	</p>

	<pre>  # First Configuration
  {
    sender {'configurations of sender'; 'sending traffic pattern {s}';}
    receiver {'configurations of receiver';'receiving message pattern {s}';}
    'configuration of the connection';
  }

  # Second Configuration
  {
    sender {'configurations of sender'; 'sending traffic pattern {s}';}
    receiver {'configurations of receiver';'receiving message pattern {s}';}
   'configuration of the connection';
  }
  .
  .
  .
	</pre>

	<p> Format of <tt>'sending traffic pattern {s}'</tt> </p>

	<pre>
  pattern
  {
    data size, message size, interval, wait time;
    data size, message size, interval, wait time;
    . . . ;
  }
	</pre>

  <obr src="dbs">Patern parameters meaning</obr>

	<p>
	    The traffic is modeled as a sequence of data chunks called "frames". The
	    size of each frame may vary. Each frame may consist of several messages. A
	    single message is defined that it can be transferred in a single UDP
	    datagram. If a frame is longer than the UDP maximum transfer unit (64KB),
	    the frame is split into several messages. Between frames, there is a time
	    gap called "wait time" which implies the application overhead. The
	    preparation time of each frame can be treated as this wait time. Moreover,
	    this model controls the frame intervals. This frame interval can be used
	    for modeling of an application level rate control.
	</p>

	<p>Command File Sample</p>

	<pre>
# Sample file
  {
    sender {
      hostname = host1;
      port = 0;
      send_buff = 65535;
      recv_buff = 65535;
      mem_align = 2048;
      pattern {2048, 2048, 0.0, 0.0}
    }

    receiver {
      hostname = host2;
      port = 20001;
      recv_buff = 65535;
      send_buff = 65535;
      mem_align = 2048;
      pattern {2048, 2048, 0.0, 0.0}
    }

    file = test1;
    protocol = TCP;
    start_time = 0.0;
    end_time = 30;
    send_times = 2048;
  }
	</pre>

	<p>
	    See
            <adresa>http://www.kusa.ac.jp/~yukio-m/dbs/dbs_man.html</adresa> for more information
	    about constructing command file.
	</p>

      <h3>Settings possibilities</h3>

	<ul>
	<li>send/receive buffer size modification</li>
	<li>setting the TCP no delay option</li>
	<li>specify the starting time of data transfer for each connection</li>
	<li>specify frame size and inter-frame time gap</li>
	<li>specify test duration</li>
	<li>sending complicated traffic patterns</li>
	</ul>

	<p>
	    Through "tcp_trace" function, several TCP internal information such as
	    TCP/IP pseudo-headers, TCP congestion window size, round trip time,
	    retransmission timeout and other values in the TCB structure can be
	    obtained.
	</p>

      <h3>Availability</h3>

	<p>
	    See <a href="http://www.ai3.net/products/dbs">http://www.ai3.net/products/dbs</a> for details of precise OS versions
	    supported, and for download of the source code. Current implementation
	    supports BSDI BSD/OS, FreeBSD, NetBSD, Linux, mkLinux, SunOS, IRIX, Ultrix,
	    Digital UNIX, NEWS OS, HP-UX.
	</p>

      <h3>Required Environment</h3>

	<p> C language compiler, UNIX-style socket API support.	</p>

      <h3>RFC 2544 compatibility</h3>

	<p>
	    <i>User defined frame format</i><br/>
	    No Support
	</p>

	<p>
	   <i>Verifying received frames</i><br/>
	   Checks only sequence numbers of received frames.
	</p>

	<p>
	   <i>Bidirectional traffic</i><br/>
	   It could be made of two single traffics between specified hosts running at
           the same time in the opposite direction.
	</p>

	<p>
	   <i>Setting inter-frame time gap</i><br/>
	    Full Support
	</p>

      <h3>References</h3>

	<p>
	    Performance and Control of Network Systems, Proceedings of SPIE, Volume
	    3231, November 1997(English)
	<br/>
	    <a href="http://www.kusa.ac.jp/~yukio-m/papers/dbs_paper.ps">"DBS: a powerful
	    tool for TCP performance evaluations"</a>
	</p>

	<p>
	    Informating Processing Society of Japan, DPS, 95-DPS-71, July 1995
	    (Japanese)
	<br/>
	    <a href="http://www.kusa.ac.jp/~yukio-m/papers/dps9507.ps">"A proposal of DBS:
	    performance evaluation for TCP over multipoint connection"</a>
	</p>

	<p>
	    Internet Conference' 96, July 1996 (Japanese)
	<br/>
	    <a href="http://www.kusa.ac.jp/~yukio-m/papers/conf96.ps">"Design and
	    Implementation of DBS: a performance evaluation system for TCP"</a>
	</p>

	<p>
	    Master's Thesis, Graduate School of Information Science, Nara Institute of
	    Science and Technology, March 7, 1996 (Japanese)
	<br/>
	    <a href="http://www.kusa.ac.jp/~yukio-m/papers/mthesis.ps">"Design and
	    Implementation of DBS: a performance evaluation system for multi-point TCP
	    connections"</a><br/>
	    <a href="http://www.kusa.ac.jp/~yukio-m/papers/mthesis_digest.ps">"Digest of
	    Master's Thesis"</a>
	</p>

    <h2>IPerf 1.7.0</h2>

      <h3>Description</h3>

	<p>
	    IPerf is a ttcp like tool with considerable advantages over it. Using a
	    client-server model to determine maximum bandwidth you can also measure
	    delay jitter, packet loss, determine MTU, support TCP window size, run
	    tests by amount transferred or for a specified period of time. Server can
	    handle multiple simultaneous connections. Client can create UDP streams of
	    specified bandwidth. Client-server model can use for testing bidirectional
	    mode called "dual testing mode". IPerf uses representative streams to test
	    out how link layer compression affects your achievable bandwidth and prints
	    periodic intermediate bandwidth, jitter, and loss reports at specified
	    intervals. As one of the few also supports IPv6.
	</p>

      <h3>Automation</h3>

	<p>
	    It is command-line driven. Use the -D command line option to run the server
	    as a daemon and redirect the output to a file.
	<br/> E.g. <prikaz> iperf -s -D > iperfLog. </prikaz>
	</p>

	<p> Command line samples:</p>

	<pre>  node2> iperf -s -u -l 32k -w 128k -i 1 </pre>

	<ul>
	  <li>-s = run IPerf in server mode</li>
	  <li>-u = use UDP instead TCP</li>
	  <li>-l 32k = buffer length</li>
	  <li>-w 128k = largest receivable datagram size</li>
	  <li>-i 1 = interval time in seconds between periodic reports</li>
	</ul>

	<pre>  node1> iperf -c node2 -b 10m -l 32k -w 128k </pre>

	<ul>
	  <li>-c = run IPerf in client mode</li>
	  <li>node2 = server address</li>
	  <li>-b 10m = UDP bandwidth to send at, in bits/sec - 10Mbit/sec</li>
	</ul>

      <h3>Settings possibilities</h3>

	<ul>
	  <li>send/receive buffer size modification</li>
	  <li>specify TCP maximum segment size</li>
	  <li>setting the TCP No Delay option</li>
	  <li>UDP server provides multicast mode</li>
	  <li>bidirectional testing mode</li>
	  <li>tradeoff testing mode (request/response test)</li>
	  <li>setting the number of simultaneous connections to make to the server
	      	(requires thread support on both the client and server)</li>
	  <li>specify the type-of-service (as defined in RFC 1349) for outgoing
		packets</li>
	  <li>specify the time-to-live for outgoing multicast packets</li>
	  <li>use a representative stream (from file or stdin) to measure bandwidth</li>
	  <li>specify test duration</li>
	</ul>

      <h3>Availability</h3>

	<p>
	    Iperf is released as a distribution of the C++ source. Pre-compiled
	    binaries for selected operating systems are also available (Linux, FreeBSD,
	    IRIX, MacOS, MS Windows, OpenBSD, Solaris).
	</p>

	<p>
	    See <a href="http://dast.nlanr.net/Projects/Iperf/">http://dast.nlanr.net/Projects/Iperf/</a>
	    for more information about program, for details of precise OS versions supported, and for
	    download of the source code.
	</p>

      <h3>Required Environment</h3>

	<p> C++ non cross-compiler </p>

      <h3>RFC 2544 compatibility</h3>

	<p>
	  <i>User defined frame format</i><br/>
	  Iperf can specify only data content of UDP packet in frame definition.
	</p>

	<p>
	  <i>Verifying received frames</i><br/>
	  It determines packet loss only.
	</p>

	<p>
	  <i>Bidirectional traffic</i><br/>
	  Full Support
	</p>

	<p>
	  <i>Setting inter-frame time gap</i><br/>
	  No Support
	</p>

    <h2>NetPerf 2.2pl4</h2>

      <h3>Description</h3>

	<p>
	    NetPerf is a benchmark that can be used to measure the performance of many
	    different types of networking. It provides tests for both unidirectional
	    throughput and end-to-end latency. It also includes provisions for CPU utilization
	    measurement. Its primary focus is on bulk data transfer and
	    request/response performance using either TCP or UDP and the BSD Sockets
	    interface. There are optional tests available to measure the performance of
	    DLPI, Unix Domain Sockets, the Fore ATM API and the HP HiPPI LLA interface.
	</p>

	<p>
	    NetPerf is designed around the basic client-server model. There are two
	    programs - <soubor>netperf</soubor> and <soubor>netserver</soubor>.
			The first thing after running program is establishing a control connection.
			This connection is used to pass test configuration information and results
			to and from remote system. After this process is established new connection
			- measurement connection. The test is performed and the results are displayed.
			NetPerf places no traffic on the control connection while a test is in progress.
	</p>

	<p> NetPerf provides three types of transfers: </p>

	<p>
	    <i>Bulk Data Transfer</i> - also referred to as "stream" or "unidirectional
	    stream". This test measures how fast one system can send data to another
	    and/or how fast that other system can receive it.
	</p>

	<p>
	    <i>Request/Response Transfer</i> - request/response performance is quoted as
	    "transactions/sec" for a given request and response size. A transaction is
	    defined as the exchange of a single request and a single response.
	</p>

	<p>
	    <i>Connect/Request/Response</i> - instead of simply measuring the performance of
	    request/response in the same connection, it establishes a new connection
	    for each request/response pair.
	</p>

	<p>
	    NetPerf includes test which use a socket interface to IPv6, but the control
	    connection remains IPv4.
	</p>

      <h3>Automation</h3>

	<p>
	    Execution as child of inetd requires editing of <soubor>/etc/services</soubor> and
	    <soubor>/etc/inetd.conf</soubor>. To assist in measuring, script files are provided with the
	    NetPerf distribution (script for measuring stream performance, script for
	    measuring request/response performance ...).
	</p>

	<p> NetPerf is command-line driven. </p>

	<p> Command line samples: </p>

	<pre>  node1> netserver -p 20000 -n 2 </pre>

	<ul>
	  <li>-p = listen on the specified port</li>
	  <li>-n = number of CPU's in the system</li>
	</ul>

	<pre>  node2> netperf -t TCP_STREAM -H node1 -- -s 16384 -S 16K </pre>

	<ul>
	  <li>-t = test name to perform (script filename)</li>
	  <li>-H = name of the remote system</li>
	  <li>-s = local send and receive socket buffer size</li>
	  <li>-S = the same as -s, but for remote system</li>
	</ul>

      <h3>Settings possibilities</h3>

	<ul>
	  <li>send/receive buffer size modification of both systems (local/remote)</li>
	  <li>setting TCP No Delay option</li>
	  <li>setting the size of a burst of packets (used to pace the send rate
	      when is no flow control provided by the protocol being measured)</li>
	  <li>specify test duration</li>
	  <li>pre-fill buffers with data from file</li>
	  <li>CPU rate calibration</li>
	</ul>

      <h3>Availability</h3>

	<p>
	    See <a href="http://www.netperf.org/netperf/NetperfPage.html"> http://www.netperf.org/netperf/NetperfPage.html </a> for more details or email
	    Rick Jones (<adresa>raj@cup.hp.com</adresa>). Binaries are available here for HP/UX
	    Irix, Solaris, and Win32.
	</p>

      <h3>Required Environment</h3>

	<p> C language compiler, sockets. </p>

      <h3>RFC 2544 compatibility</h3>

	<p>
	    <i>User defined frame format</i><br/>
	    NetPerf can only specify data content of UDP packet in frame definition.
	</p>

	<p>
	    <i>Verifying received frames</i><br/>
	    No Support
	</p>

	<p>
	    <i>Bidirectional traffic</i><br/>
	    No Support
	</p>

	<p>
	    <i>Setting inter-frame time gap</i><br/>
	    Full Support
	</p>

    <h2>NetPIPE 3.3</h2>

      <h3>Description</h3>

	<p>
	    NetPIPE (Network Protocol Independent Performance Evaluator) is a protocol
	    independent performance tool for comparing different networks and
	    protocols. NetPIPE performs simple ping-pong tests, bouncing messages of
	    increasing size between two processes, whether across a network or within
	    an SMP system. Message sizes are chosen at regular intervals, and with
	    slight perturbations, to provide a complete test of the communication
	    system. Each data point involves many ping-pong tests to provide an
	    accurate timing. It also has an option to measure performance without cache
	    effects.
	</p>

	<p>
	    NetPIPE consists of two parts: a protocol independent driver, and a
	    protocol specific communication section. The communication section contains
	    the necessary functions to establish a connection, send and receive data,
	    and close a connection. This part is different for each protocol. However,
	    the interface between the driver and protocol module remains the same.
	    Therefore, the driver does not have to be altered in order to change
	    communication protocols.
	</p>

	<p>
	    NetPIPE is a variable time benchmark, which increases the transfer block
	    size from a single byte until transmission time exceeds 1 second. For each
	    block size c, three measurements are taken: c - p bytes, c bytes, and c + p
	    bytes, where p is a perturbation factor with a default value of 3. This
	    perturbation allows analysis of block sizes that are possibly slightly
	    smaller or larger than an internal network buffer.
	</p>

	<p>
	    NetPIPE uses a ping-pong transfer. This forces the network to transmit just
	    the data block without streaming other data blocks in with the message. The
	    result is the transfer time of a single block, thus providing the
	    information necessary to answer which block size is best, or what is the
	    throughput given a block of size k.
	</p>

	<p>
	    NetPIPE produces a file that contains the transfer time, throughput, block
	    size, and transfer time variance for each data point and is easily plotted
	    by any graphing package.
	</p>

	<p> Some typical uses: </p>

	<ul>
	  <li>Measuring the overhead of message-passing protocols.</li>
	  <li>Help in tuning the optimization parameters of message-passing libraries.</li>
	  <li>Identify dropouts in networking hardware.</li>
	  <li>Optimizing driver and OS parameters (socket buffer sizes, etc.).</li>
	</ul>

      <h3>Automation</h3>

	<p> NetPIPE is a command-line driven program. </p>

	<p> Command line samples:  </p>

	<pre>  node1> NPtcp -r -b 32768 -l 1 -u 1048576 </pre>

	<ul>
	  <li>-r = receiver</li>
	  <li>-b = send and receive TCP buffer sizes</li>
	  <li>-l = lower bound of block size</li>
	  <li>-u = upper bound of block size</li>
	</ul>

	<pre>  node2> NPtcp -t -h node1 [options] </pre>

	<ul>
	  <li>-t = transmitter</li>
	  <li>-h = remote host</li>
	</ul>

      <h3>Settings possibilities</h3>

	<ul>
	  <li>specify TCP send/receive buffer sizes</li>
	  <li>setting lower/upper bound of variable block size</li>
	  <li>specify increment step size</li>
	  <li>specify output filename</li>
	  <li>specify buffers alignment</li>
	  <li>specify buffer offset</li>
	  <li>setting stream option (default mode is "ping-pong")</li>
	</ul>

      <h3>Availability</h3>

	<p>
	    See <a href="http://www.scl.ameslab.gov/netpipe"> http://www.scl.ameslab.gov/netpipe </a> for more details. Binaries are not
	    available.
	</p>

	<p>
	    You can download the latest version <a href="http://www.scl.ameslab.gov/netpipe/code/NetPIPE_3.5.tar.gz"> NetPIPE_3.5.tar.gz </a>.
			Infiniband module for the Mellanox VAPI has been added, an integrity check option (-I) has
	    been incorporated, and problems with the streaming mode have been fixed.
	</p>

      <h3>Required Environment</h3>

	<p> C language compiler </p>

      <h3>RFC 2544 compatibility</h3>

	<p>
	    <i>User defined frame format</i><br/>
	    No Support
	</p>

	<p>
	    <i>Verifying received frames</i><br/>
	    No Support
	</p>

	<p>
	    <i>Bidirectional traffic</i><br/>
	    No Support
	</p>

	<p>
	    <i>Setting inter-frame time gap</i><br/>
	    No Support
	</p>

      <h3>References</h3>

	<p>
	    Quinn O. Snell, Armin R. Mikler, and John L. Gustafson:
			NetPIPE: A Network Protocol Independent Performance Evaluator, IASTED Conference Paper
	</p>

    <h2 id="netspec">NetSpec 3.0</h2>

      <h3>Description</h3>

	<p>
	    NetSpec is a network level end-to-end performance evaluation tool for
	    Network Experimentation and Measurement. It provides a fairly generic
	    framework that allows a user to control multiple processes across multiple
	    hosts from a central point of control. It uses a scripting language that
	    allows the user to define multiple traffic flows from/to multiple
	    computers. This allows an automatic and reproducible test to be performed.
 	</p>

	<p>
	    NetSpec exhibits many features like parallel and serial multiple
	    connections, a range of emulated traffic types (FTP, HTTP, MPEG, etc.) on
	    the higher levels, the most widely used transport protocols today, that is
	    TCP and UDP, three different traffic modes, scalability, and the ability to
	    collect system level information from the communicating systems as well as
	    intermediate network nodes.
	</p>

	<p> The following figure shows the basic NetSpec architecture. </p>

  <obr src="netspec1">NetSpec architecture</obr>

	<p>
	    The controller is a process that supports the user interface, which is
	    currently a file containing a description of an experiment using a simple
	    block structured language in which the connection is the basic unit for an
	    experiment and via the control daemon controls the daemons implementing the
	    test. For every connection in the experiment, the corresponding test
	    daemons are created. These test daemons send or receive data transferred
	    across the connection. Each daemon is responsible for its own report
	    generation after experiment execution is complete. The output report is
	    delivered to the controller via the control daemon for viewing by the user.
	</p>

	<p> NetSpec supports three basic traffic modes:	</p>

	<h4>Full Stream Mode</h4>

	  <p>
	      Also known as "full blast mode", it instructs the test daemons to
	      transmit data as fast as possible.
	  </p>

	<h4>Burst Mode</h4>

	  <p>
	      The hosts under test transmit data every some specific intervals,
	      specified by the burst period. The burst size and the burst period is
	      passed as a parameter by the user (in blocks/burst and bytes/block).
	      This mode is very useful in real world experiments where rate mismatches
	      might reduce the throughput dramatically.
	  </p>

	<h4>Queued Burst Mode</h4>

	  <p>
	      The hosts under test transmit data every some specific intervals,
	      specified by the burst period. This mode is a variation of the basic
	      burst algorithm and the burst size and burst period are passed as a
	      parameter by the user. The advantage of this algorithm is that
	      variations in available line rate will not cause it to miss blocks
	      generated by interrupts arriving before previous write completes. The
	      drawback is that characteristics of the traffic are influenced by the
	      queuing delay.
	  </p>

      <h3>Automation</h3>

	<p>
	    NetSpec consists of several daemon types that are started and controlled by
	    the main netspec daemon (<soubor>netspecd</soubor>). NetSpec uses a scripting
			language that allows the user to define multiple traffic flows from/to multiple
	    computers. This allows an automatic and reproducible test to be performed.
	</p>

	<p>A test would be started with: </p>

	<pre> Netspec script.name </pre>

	<p>
	    The script given below is of the most widely type used for a TCP point-topoint
	    connection. The first block specifies the characteristics of the
	    traffic source, while the second block specifies the characteristics of the
	    receiver host.
	</p>

	<p>  Script file sample</p>

	<pre>   1  cluster {
   2    test host1 {
   3      type = full (blocksize=32768, duration=30);
   4      protocol = tcp (window=32768);
   5      own = host1:20200;
   6      peer = host2:20200;
   7    }

   8    test host2 {
   9      type = sink (blocksize=32768, duration=30);
  10     protocol = tcp (window=32768);
  11     own = host2:20200;
  12     peer = host1:20200;
  13    }
  14  }
	</pre>

  <obr src="netspec2">Test setup with the invoked daemons over TCP</obr>

	<p>
	    In this particular example, the host with name host1 is the sender system
	    and the host with name host2 is the receiver system. The sender (line 2)
	    sends data in full stream (line 3) mode; it transmits 32768 bytes as fast
	    as possible for 30 seconds (duration of test). For this data transfer TCP
	    (line 4) is used in the transport layer with a window size of 32.7KB.
	</p>

	<p>
	    NetSpec can be installed in either of the two ways - inetd installation and
	    standalone installation.
	</p>

      <h3>Settings possibilities</h3>

	<ul>
	  <li>specify size of frames and inter-frame time gap in burst modes</li>
	  <li>setting traffic mode (full stream mode, burst mode or queued burst
	      mode)</li>
	  <li>specify type of connection (point-to-point, point-to-multipoint or
	      multipoint-to-point connections)</li>
	  <li>setting connection mode (serial, parallel or cluster)</li>
	  <li>specify test duration</li>
	  <li>specify protocol type</li>
	</ul>

      <h3>Availability</h3>

	<p>
	    See <a href="http://www.ittc.ku.edu/netspec"> http://www.ittc.ku.edu/netspec </a>
			for more details. NetSpec can run on a variety of platforms. The following
			binaries are available: Digital Unix, Solaris, Linux, SunOs, FreeBSD, Irix.
	</p>

	<p>
	    NetSpec manual can be found at <a href="http://www.ittc.ukans.edu/netspec/docs/NetSpecUser.pdf">
			http://www.ittc.ukans.edu/netspec/docs/NetSpecUser.pdf </a>
	</p>

      <h3>Required Environment</h3>

	<p>C language compiler</p>

      <h3>RFC 2544 compatibility</h3>

	<p>
	    <i>User defined frame format</i><br/>
	    No Support
	</p>

	<p>
	    <i>Verifying received frames</i><br/>
	    No Support
	</p>

	<p>
	    <i>Bidirectional traffic</i><br/>
	    It could be made of two single traffics between specified hosts running at
	    the same time in the opposite direction.
	</p>

	<p>
	    <i>Setting inter-frame time gap</i><br/>
	    Full Support
	</p>


    <h2>RUDE &amp; CRUDE 0.70</h2>

      <h3>Description</h3>

	<p>
	    RUDE (Real-time UDP Data Emitter) is a small and flexible program that
	    generates traffic to the network, which can be received and logged on the
	    other side of the network with the CRUDE (Collector for RUDE). These
	    programs can generate and measure only UDP traffic. To observe several
	    variables describing the utilization of hardware resources (CPU load,
	    number of interrupts etc.) can be used another free software package -
	    <soubor>atsar</soubor>. It can record in regular intervals the values of
			various system counters and parameters together with timestamps, for example
			the CPU load and number of interrupts generated by the network interface cards.
			The rude/crude distribution contains several example Perl scripts for basic
	    processing of the decoded crude output and computing jitter. Rude allows
	    definitions of a number of concurrent UDP flows with varying packet size
	    and rate. The TOS field in the IP header can also be set. Reordered and
	    duplicated packets may arrive with arbitrary delays, hence a bitmask with
	    32 bits describing the fate of the last 32 packets of the flow is kept.
	    Two types of generated flow are implemented - <i>constant</i> and <i>trace</i>.
			Constant flow means a constant-rate UDP flow, where the packet rate per
			second and packet size in bytes can be specified. The trace option gives a
			reference to a text file where the parameters of every single packet has to
			be given. The smallest time unit for flow definition is 1 ms.
	</p>

      <h3>Automation</h3>

	<p>
	    RUDE is driven by a script file, which is used to specify the generated
	    flows. Example of a simple script file follows:</p>

	<pre>
  START NOW
  ## FLOW 1: (flow ID = 25)
  ##
  ## Starts immediately at the specified START time with following parameters:
  ## 400 packets/second with 100 bytes/packet = 40kbytes/sec (1kbyte=1000bytes) (parameters after CONSTANT flow)
  ##
  ## Sets the TOS for this flow to LOW_DELAY (0x10)
  ##
  ## 9 seconds after that the flow is turned off...
  ##

  0000 25 ON 3001 10.1.1.1:10001 CONSTANT 400 100
  TOS 25 0x10
  9000 25 OFF

  ## FLOW 2: (flow ID = 1)
  ##
  ## This flow acts as specified in the TRACE configuration file.
  ##

  0000 1 ON 3002 10.1.1.1:10001 TRACE trace_file.txt
  9999 1 OFF
	</pre>

	<p>
	    Here, the flows 25 and 1 (second field in each row) are specified. The
	    numeric values at the beginning of the rows are time offsets related to a
	    predefined global origin when the flow is to be started or its parameters
	    modified. The destination IP address and port are defined as 10.1.1.1 and
	    10001, respectively, and the source port as 3001, respectively 3002. The
	    source IP address will be determined at run-time as the address of egress
	    interface. The second flow uses for packets definition the external file -
	    trace_file.txt.
	</p>

	<p>
	    The following command line samples shows, how to run the specified script
	    file.
	</p>

	<p>Command line samples:</p>

	<pre>  sender> rude -s sample.cfg </pre>

	<ul>
	  <li>-s &lt;script file&gt; = defines the script file to be used</li>
	</ul>

	<pre>  receiver> crude </pre>

      <h3>Settings possibilities</h3>

	<ul>
	  <li>control the length of the test</li>
	  <li>specify the type-of-service (TOS) for outgoing packets</li>
	  <li>plenty of flows definition</li>
	  <li>TRACE flow - definition of packet size and time gap between packets
	      (max. time resolution = 1 microsecond)</li>
	  <li>CONSTANT flow = constant bit rate traffic (you may change packet size
	      and packet rate)</li>
	  <li>calculate some statistics on-the-fly</li>
	  <li>setting the process real-time priority</li>
	  <li>some visualization and statistical analysis - using grude script</li>
	</ul>

      <h3>Availability</h3>

	<p>
	    For more details about installation and using RUDE/CRUDE see
	    <a href="http://rude.sourceforge.net"> http://rude.sourceforge.net.</a>
			On this website can be downloaded also the old releases of this utilities.
			The newest release can be found at <a href="http://gd.tuwien.ac.at/opsys/linux/sf/r/rude/">
			http://gd.tuwien.ac.at/opsys/linux/sf/r/rude/</a>.
	</p>

      <h3>Required Environment</h3>

	<p> C language compiler </p>

      <h3>RFC 2544 compatibility</h3>

	<p>
	    <i>User defined frame format</i><br/>
	    No Support
	</p>

	<p>
	    <i>Verifying received frames</i><br/>
	    No Support
	</p>

	<p>
	    <i>Bidirectional traffic</i><br/>
	    No Support
	</p>

	<p>
	    <i>Setting inter-frame time gap</i><br/>
	    Full Support
	</p>

      <h3>References</h3>

	<p>
	    Lhotka L.: Software tools for router performance testing, Technical Report
	    10/2001, CESNET, Prague, 2001.
	</p>

    <h2>TRENO (07/30/97)</h2>

      <h3>Description</h3>

	<p>
	    TRENO (Traceroute RENO) is a TCP throughput measurement tool, which is
	    based on sending UDP packets with low TTL in patterns that are controlled
	    at the user-level. Hosts and routers along the path to the final
	    destination will send back ICMP TTL Exceeded messages which have similar
	    characteristics to TCP ACK packets. TRENO also has an ICMP mode, which uses
	    ICMP ECHO Requests instead of low TTL UDP packets. In this mode, you only
	    get information about the final destination. The same sized packets are
	    sent in both directions, giving you some information about the return path
	    (request-response test). This allows to measure throughput independent of
	    the TCP implementation of end hosts.
	</p>

	<p> TRENO has some limitations: </p>

	<ul>
	  <li>Each hop should run for at least 10 seconds.</li>
	  <li>Some routers do not respond to the Treno probes as quickly as they
	      forward packets. So the results of the Treno test will not accurately
	      reflect the bandwidth at these hops.</li>
	  <li>The Treno Server is single threaded, so if someone else is running
	      tests you will need to wait until they complete their work.</li>
	</ul>

	<p> For more details about these limitations, see TRENO's homepage. </p>

      <h3>Automation</h3>

	<p>
	    Command-line driven. No "server" is required, and it only requires a single
	    argument of the machine to run the test to.
	</p>

	<p> Command line samples:</p>

	<pre>  sender> treno -p 10 hostname </pre>

	<ul>
	  <li>-p &lt; s &gt; = set the test duration </li>
	</ul>

      <h3>Settings possibilities </h3>

	<ul>
	  <li>specify test duration</li>
	  <li>specify the (initial) MTU</li>
	  <li>specify used mode (ICMP or UDP packets)</li>
	</ul>

      <h3>Availability</h3>

	<p>
	    See <a href="http://www.psc.edu/networking/treno_info.html">http://www.psc.edu/networking/treno_info.html</a>
			or e-mail Matt Mathis (<adresa>mathis@psc.edu</adresa>) or Jamshid Mahdavi (<adresa>mahdavi@psc.edu</adresa>).
	</p>

      <h3>Required Environment</h3>

	<p> C compiler, raw sockets. </p>

      <h3>RFC 2544 compatibility</h3>

	<p>
	    <i>User defined frame format</i><br/>
	    No Support
	</p>

	<p>
 	    <i>Verifying received frames</i><br/>
	    Checks only sequence numbers of received frames.
	</p>

	<p>
 	    <i>Bidirectional traffic</i><br/>
	    No Support
	</p>

	<p>
	    <i>Setting inter-frame time gap</i><br/>
	    No Support
	</p>

    <h2>TTCP6 Revision: 3.8</h2>

      <h3>Description</h3>

	<p>
	    Originally written to move files around, TTCP became the classic throughput
	    benchmark or load generator, with the addition of support for sourcing
	    to/from memory. It can also be used as a traffic absorber. It has spawned
	    many variants, recent ones include support for UDP, IPv6, data pattern
	    generation, page alignment, and even alignment offset control.
	</p>

      <h3>Automation</h3>

	<p>
	    It is the command-line driven tool. To use it, start the receiver on one
	    side of the path, then start the transmitter on the other side. The
	    transmitting side sends a specified number of TCP packets to the receiving
	    side. At the end of the test, the two sides display the number of bytes
	    transmitted and the time elapsed for the packets to pass from one end to
	    the other.
	</p>

	<p>Command line samples:</p>

	<pre>  receiver&gt; ttcp6 -r -s -v -n100 </pre>

	<ul>
	  <li>-s (ttcp6 -r) : sink (discard) all data from network</li>
	</ul>

	<pre>  sender&gt; ttcp6 -t -s -v -n100 host </pre>

	<ul>
	  <li>-s = (ttcp6 -t) : source a pattern to network</li>
	  <li>-v = verbose: print more statistics</li>
	  <li>-n = number of source buffers written to network</li>
	</ul>

      <h3>Settings possibilities</h3>

	<ul>
	  <li>send/receive buffer size modification</li>
	  <li>setting the TCP no delay option</li>
	  <li>using UDP instead of TCP</li>
	  <li>setting socket buffer size</li>
	</ul>

      <h3>Availability</h3>

	<p>
	    See <a href="ftp://ftp.arl.mil/pub/ttcp/">ftp://ftp.arl.mil/pub/ttcp/</a>
			which includes the most common variants available or e-mail ARL (<adresa>ftp@arl.mil</adresa>).
	</p>

	<p>
	    Download the latest version with IPv6 support from
			<a href="ftp://ftp.bieringer.de/pub/linux/IPv6/ttcp/ttcp+ipv6-3.tar.gz">
			ftp://ftp.bieringer.de/pub/linux/IPv6/ttcp/ttcp+ipv6-3.tar.gz</a>.
	</p>

      <h3>Required Environment</h3>

	<p> C compiler, BSD sockets. </p>

      <h3>RFC 2544 compatibility</h3>

	<p>
	    <i>User defined frame format</i><br/>
	    No Support
	</p>

	<p>
	    <i>Verifying received frames</i><br/>
	    No Support
	</p>

	<p>
 	    <i>Bidirectional traffic</i><br/>
	    No Support
	</p>

	<p>
	    <i>Setting inter-frame time gap</i><br/>
	    No Support
	</p>

  <h1 id="section5">Summary </h1>

    <h2>RFC 2544 compatibility </h2>

      <obr src="summary">Summary of RFC 2544 compatibility</obr>

    <h2>IPv6 support </h2>

      <obr src="IPv6Supp">Summary of IPv6 support</obr>

  <h1 id="section6">Conclusion </h1>

    <p>
	As we can see in the <a href="#section5">section 5</a> (Summary), none of the
	performance tools	listed above, supports all of the requirements mentioned in
	RFC 2544 and described in <a href="#section3">section 3</a>. Also IPv6 support
	is not an ordinary character.	Only three of these tools support IPv6 protocol.
    </p>

    <p>
	The <a href="#dbs">DBS</a> (Distributed Benchmark System) testing tool seems to
	be the best of these performance testing tools we have tested. This utility
	allows a user	to control multiple processes across multiple hosts from a central
	point of control. It uses a scripting language that allows the user to define
	multiple traffic flows from/to multiple computers. This allows an automatic
	test to be performed. It also supports definition of inter-frame time gap.
	Of course we have to modify this auxiliary utility, so it can fulfill all
	of necessary requirements. Verifying received frames is not well done. It
	checks only sequence numbers of received frames, so the complete
	verification of received frames as defined in <a href="#section3">section 3</a>
	have to be made. A possibility of sending user defined frame format should be
	appended to the	DBS utility too, because we need to generate special traffic.
	An alternative testing tool we can modify and use is <a href="#netspec">NetSpec</a>.
	The	conclusive factor is simplicity of modifying the source codes of these
	tools.
    </p>

    <seznamknih>

      <kniha id="1">
	Parker S., Schmechel C.:
	<i>Some Testing Tools for TCP Implementors</i><br/>
	RFC 2398, August 1998
      </kniha>

      <kniha id="2">
	Bradner S., McQuaid J.:
	<i>Benchmarking Methodology for Network Interconnect Devices</i><br/>
	RFC 2544, March 1999
      </kniha>

      <kniha id="3">
	Bradner S.:
	<i>Benchmarking Terminology for Network Interconnection Devices</i><br/>
	RFC 1242, July 1991.
      </kniha>

      <kniha id="4">
	<i>DBS WWW pages</i><br/>
	<a href="http://www.ai3.net/products/dbs">http://www.ai3.net/products/dbs</a>
      </kniha>

      <kniha id="5">
	<i>IPerf WWW pages</i><br/>
  <a href="	http://dast.nlanr.net/Projects/Iperf">http://dast.nlanr.net/Projects/Iperf</a>
      </kniha>

      <kniha id="6">
	<i>NetPerf WWW pages and NetPerf manual included in archive</i><br/>
	<a href="http://www.netperf.org/netperf/NetperfPage.html">
	http://www.netperf.org/netperf/NetperfPage.html</a>
      </kniha>

      <kniha id="7">
	<i>NetPIPE WWW pages</i><br/>
	<a href="http://www.scl.ameslab.gov/netpipe">http://www.scl.ameslab.gov/netpipe</a>
      </kniha>

      <kniha id="8">
	<i>NetSpec WWW pages</i><br/>
	<a href="http://www.ittc.ku.edu/netspec">http://www.ittc.ku.edu/netspec</a>
      </kniha>

      <kniha id="9">
	<i>NetSpec User Manual</i><br/>
	<a href="http://www.ittc.ukans.edu/netspec/docs/NetSpecUser.pdf">
	http://www.ittc.ukans.edu/netspec/docs/NetSpecUser.pdf</a>
      </kniha>

      <kniha id="10">
	<i>RUDE &amp; CRUDE WWW pages and the documentation added to the source code</i><br/>
	<a href="http://rude.sourceforge.net">http://rude.sourceforge.net</a>
      </kniha>

      <kniha id="11">
	<i>Treno WWW pages</i><br/>
	<a href="http://www.psc.edu/networking/treno_info.html">
	http://www.psc.edu/networking/treno_info.html</a>
      </kniha>

      <kniha id="12">
	<i>TTCP documentation added to source code</i><br/>
      </kniha>

    </seznamknih>

</zprava>
