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

通讯编程

开发平台:

Visual C++

  1. chapter{SCTP Agents}
  2. label{sec:sctpAgents}
  3.    This chapter describes the SCTP agents developed for ns~by the
  4.    Protocol Engineering Lab at the University of Delaware.  The SCTP
  5.    agents are all two-way agents, which means they are symmetric in the
  6.    sense that they represent both a sender and receiver. However,
  7.    bi-directional data has not yet been implemented. Each instance of an
  8.    SCTP agent is either a sender or receiver.
  9.    The SCTP agents are implemented in files matching the regular
  10.    expression nsf{em{sctp/sctp*.{cc, h}}}.
  11.    The SCTP agents currently supported are:
  12.    begin{itemize}itemsep0pt
  13.       item Agent/SCTP - RFC2960 + draft-ietf-tsvwg-sctpimpguide-09.txt
  14.        + draft-ietf-tsvwg-usctp-01.txt 
  15.       item Agent/SCTP/HbAfterRto - experimental extension (HEARTBEAT
  16.       after RTO)
  17.       item Agent/SCTP/MultipleFastRtx - experimental extension (UD PEL's
  18.       Multiple Fast Retransmit algorithm)
  19.       item Agent/SCTP/Timestamp - experimental extension (TIMESTAMP chunk)
  20.       item Agent/SCTP/MfrHbAfterRto - experimental extension that
  21.       combines MultipleFastRtx and HbAfterRto
  22.       item Agent/SCTP/MfrTimestamp - experimental extension that
  23.       combines MultipleFastRtx and Timestamp
  24.    end{itemize}
  25.    Section~ref{sec:baseSctp} provides a simple overview of the base SCTP
  26.    agent with details of configuration parameters and
  27.    commands. Section~ref{sec:sctpExtensions} describes the SCTP
  28.    extensions available. The details of the SCTP trace format used in
  29.    packet trace files are explained in
  30.    Section~ref{sec:sctpTracing}. Section~ref{sec:sctpApps} explains how
  31.    to use legacy applications with SCTP and how to write SCTP-aware
  32.    applications which exploit all SCTP's
  33.    features. Section~ref{sec:sctpExamples} provides examples scripts for
  34.    both singled homed and multihomed endpoints.
  35.    section{The Base SCTP Agent}
  36.    label{sec:baseSctp}
  37.       The base SCTP agent code{Agent/SCTP} supports the features in the
  38.       following sections of RFC2960, including modifications up to
  39.       draft-ietf-tsvwg-sctpimpguide-13.txt.
  40.       begin{itemize}itemsep0pt
  41.  item[5.1] Normal Establishment of an Association (rudimentary
  42.  handshake)
  43.  item[6.1] Transmission of DATA Chunks
  44.  item[6.2] Acknowledgment on Reception of DATA Chunks
  45.  item[6.3] Management Retransmission Timer
  46.  item[6.4] Multihomed SCTP Endpoints
  47.  item[6.5] Stream Identifier and Stream Sequence Number
  48.  item[6.6] Ordered and Unordered Delivery 
  49.  item[6.7] Report Gaps in Received DATA TSNs
  50.  item[7.2] SCTP Slow-Start and Congestion Avoidance
  51.  item[8.1] Endpoint Failure Detection
  52.  item[8.2] Path Failure Detection
  53.  item[8.3] Path Heartbeat (without upper layer control)
  54.       end{itemize}
  55.       This agent also supports the Partial Reliability extension as of
  56.       draft-ietf-tsvwg-usctp-01.txt.
  57.       paragraph{Association Establishment} The SCTP agent establishes an
  58.       association using a four-way handshake, but the handshake is kept
  59.       simple and does not strictly conform to RFC2960. The handshake does
  60.       not exchange tags, and the INIT and COOKIE-ECHO chunks are not used
  61.       to update the RTT.  Instead, RTT estimation begin with the first
  62.       DATA chunk.
  63.       paragraph{Association Shutdown} Currently, the SCTP agent does not
  64.       perform a proper shutdown. The association is abruptly terminated
  65.       when the simulated connection ends. A shutdown procedure may be
  66.       added in a future release.
  67.       paragraph{Multihoming} The underlying infrastructure of ns-2
  68.       does not support multiple interfaces for a single node. To get
  69.       around this limitation, our approach allows the general support for
  70.       logically multihoming nodes that have a multihomed transport layer,
  71.       such as SCTP. Each multihomed node is actually made up of more than
  72.       one node. As shown in Figure~ref{fig:multihomedNode}, a logically
  73.       multihomed node is made up of a single "core node" and multiple
  74.       "interface nodes", one for each simulated interface. The core node
  75.       is connected to each interface node via a uni-directional link
  76.       towards the interface node, but traffic never traverses these
  77.       links. These links are only in place for the core node to make
  78.       routing decisions. An SCTP agent simultaneously resides on all these
  79.       nodes (i.e., the core and interface nodes), but actual traffic only
  80.       goes to/from the interface nodes.  Whenever the SCTP agent needs to
  81.       send data to a destination and does not know which outgoing
  82.       interface to use, the agent firsts consults with the core node for a
  83.       route lookup. Then, the SCTP agent performs the send from the
  84.       appropriate interface node. Incoming data is received at one of the
  85.       interface nodes directly and passed up to the SCTP agent. This
  86.       solution is applicable to any transport protocol that requires
  87.       multihoming functionality in ns-2. Note: the user must configure
  88.       multihomed nodes using commands in Section~ref{sec:sctpCommands}
  89.       (an example is shown in Section~ref{sec:multihomedExample}).
  90.       begin{figure}[tb] 
  91. centerline{includegraphics{sctp-multihomedNode}}
  92. caption{Example of a Multihomed Node}
  93. label{fig:multihomedNode} 
  94.       end{figure}
  95.       paragraph{Packet Number vs TSN Numbering} While ns~starts numbering
  96.       packets at 0, the SCTP module starts numbering DATA chunk TSNs at 1
  97.       and assigns undefined TSN values (-1) to control chunks (ie, INIT,
  98.       SACK, HEARTBEAT, etc). The four packets exchanged during the
  99.       association establishment are counted in the packet enumeration, but
  100.       do not show up in graphs. This information is important when doing
  101.       things like specifying a drop list for the code{ErrorModel}
  102.       object. For example, packet 2 actually refers to the first SCTP
  103.       packet with DATA chunk(s).
  104.       subsection{Configuration Parameters}
  105.       label{sec:sctpConfig}
  106.  SCTP supports several configuration variables which are TCL
  107.  bindable. Each of the variables described in this subsection is
  108.  both a class variable and an instance variable.  Changing the
  109.  class variable changes the default value for all agents that are
  110.  created subsequently.  Changing the instance variable of a
  111.  particular agent only affects the values used by that agent.  For
  112.  example,
  113.  begin{program}
  114.  Agent/SCTP set pathMaxRetrans_ 5 ; Changes the class variable; 
  115.  $sctp set pathMaxRetrans_ 5 ; Changes pathMaxRetrans_ for the $sctp object only; 
  116.          end{program}
  117.  The default parameters for each SCTP agent are:
  118.  begin{program}
  119.  Agent/SCTP set debugMask_ 0 ; 32-bit mask for modular toggle debugging control (see explanation);
  120.  Agent/SCTP set debugFileIndex_ -1 ; specifies debugging output file (see explanation);
  121.  Agent/SCTP set associationMaxRetrans_ 10; RFC2960's Association.Max.Retrans;
  122.  Agent/SCTP set pathMaxRetrans_ 5 ; RFC2960's Path.Max.Retrans;
  123.  Agent/SCTP set changePrimaryThresh_ -1 ; change primary if error count exeeds thresh (default infinite);
  124.  Agent/SCTP set maxInitRetransmits_ 8 ; RFC2960's Max.Init.Retransmits;
  125.  Agent/SCTP set oneHeartbeatTimer_ 1 ; toggle HB timer for each dest vs one for all dests;
  126.  Agent/SCTP set heartbeatInterval_ 30 ; RFC2960's HB.interval in seconds;
  127.  Agent/SCTP set mtu_ 1500 ; MTU in bytes including IP header;
  128.  Agent/SCTP set initialRwnd_ 65536 ; initial receiver window in bytes (set on receiver side);
  129.  Agent/SCTP set initialSsthresh_ 65536 ; initial ssthresh value in bytes;
  130.  Agent/SCTP set initialCwnd_ 2 ; initial cwnd in multiple of (MTU - SCTP/IP headers);
  131.  Agent/SCTP set initialRto_ 3.0 ; default initial RTO = 3 secs;
  132.  Agent/SCTP set minRto_ 1.0    ; default min RTO = 1 sec;
  133.  Agent/SCTP set maxRto_ 60.0   ; default max RTO = 60 secs;
  134.  Agent/SCTP set fastRtxTrigger_ 4 ; 4 missing reports trigger fast rtx;
  135.  Agent/SCTP set numOutStreams_ 1 ; number of outgoing streams;
  136.  Agent/SCTP set numUnrelStreams_ 0 ; number of partially reliable streams (all grouped starting at stream 0);
  137.  Agent/SCTP set reliability_ 0 ; k-rtx value of all partially reliable streams;
  138.  Agent/SCTP set unordered_ 0 ; toggle all chunks are ordered/unordered;
  139.  Agent/SCTP set ipHeaderSize_ 20 ; IP header size;
  140.  Agent/SCTP set dataChunkSize_ 1468 ; includes data chunk header and restricted to 4 byte boundaries;
  141.  Agent/SCTP set useDelayedSacks_ 1 ; toggle on/off delayed sack algorithm (set on receiver side);
  142.  Agent/SCTP set sackDelay_ 0.200 ; rfc2960 recommends 200 ms;
  143.  Agent/SCTP set useMaxBurst_ 1 ; toggle on/off max burst;
  144.  Agent/SCTP set rtxToAlt_ 1 ; rtxs to which dest?  0 = same, 1 = alt, 2 = fast rtx to same + timeouts to alt;
  145.  Agent/SCTP set dormantAction_ 0 ; 0 = change dest, 1 = use primary, 2 = use last dest before dormant; 
  146.  Agent/SCTP set routeCalcDelay_ 0 ; time to calculate a route (see explanation);
  147.  Agent/SCTP set routeCacheLifetime_ 1.2 ; how long a route remains cached (see explanation);
  148.  Agent/SCTP set trace_all_ 0 ; toggle on/off print all variables on a trace event;
  149.  end{program}
  150.  The code{debugMask_} parameter is a 32-bit mask to turn on/off
  151.  debugging for particular functions. See
  152.  nsf{em{sctp/sctpDebug.h}} for the mappings of the bitmask. A -1
  153.  may be used to clear all bits, and 0 is used to turn off all
  154.  debugging. If code{debug_} (the standard ns~debug flag) is set to
  155.  1, then all the bits in code{debugMask_} are set. Note: ns~must
  156.  be compiled with code{-DDEBUG} for this option to work.
  157.  The code{debugFileIndex_} parameter is an integer to specify the
  158.  file used for debugging output by an SCTP agent. Each instance of
  159.  an SCTP agent can independently output debugging info to a
  160.  separate file. For example, the data sender can log debugging
  161.  output to one file, while the receiver logs to another file. If
  162.  code{debugFileIndex_} is set to 0, the file used will be named
  163.  {em debug.SctpAgent.0}. If -1 is used, the debug output is sent
  164.  to {em stderr}. To avoid confusion, two SCTP agents should not
  165.  send debug output to the same file. The default is -1.  Note:
  166.  ns~must be compiled with code{-DDEBUG} for this option to work.
  167.  The configuration parameters that deal with ordering and
  168.  reliability options may be overridden by an SCTP-aware
  169.  application (see Section~ref{sec:sctpApps}).
  170.  The code{routeCalcDelay_} and code{routeCacheLifetime_}
  171.  parameters are only used to optionally simulate overheads of
  172.  reactive routing protocols in MANETs without actually simulating
  173.  a MANET. (Do not use this feature if you are actually simulating
  174.  a MANET!) The default setting for code{routeCalcDelay_} is 0
  175.  seconds, which means that this feature is turned off. The default
  176.  setting for code{routeCacheLifetime_} is 1.2 seconds (ignored if
  177.  this feature is turned off), which is purposely set slightly
  178.  larger than the default min RTO to avoid a ``cache miss'' after a
  179.  single timeout event.
  180.       subsection{Commands}
  181.       label{sec:sctpCommands}
  182.  SCTP provides certain commands that can be used within TCL
  183.  scripts:
  184.  paragraph{trace} Tracks given variables. The variable (and associated
  185.  information) is printed every time the value changes. Takes 1
  186.  argument:
  187.     begin{itemize}
  188.        item[] code{cwnd_} Used to trace the cwnds of all
  189.        paths. 
  190.        item[] code{rto_} Used to trace the RTOs of all paths.
  191.        item[] code{errorCount_} Used to trace the error counters
  192.        of all paths.
  193.        item[] code{frCount_} Used to trace the number of times a
  194.        fast retransmit is invoked.
  195.        item[] code{mfrCount_} Used to trace the number of times
  196.        the multiple fast retransmit algorithm is invoked. This
  197.        trace variable can only be used with the MultipleFastRtx
  198.        extension agent. (See Section~ref{ssec:mfr})
  199.        item[] code{timeoutCount_} Used to trace the total number of
  200.        times a timeout has occurred on all paths.
  201.        item[] code{rcdCount_} Used to trace the total number of
  202.        times a route calculation delay (see
  203.        Section~ref{sec:sctpConfig}) has occurred on all paths.
  204.     end{itemize}
  205.  Note: the actual value of these trace variables have no
  206.  meaning. They are simply used to trace corresponding variables
  207.  for potentially multihomed endpoints. For example, if a sender's
  208.  peer endpoint has two destinations, the sender will maintain two
  209.  cwnds. The code{cwnd_} trace variable will trace both of these
  210.  cwnds together.
  211.  paragraph{print} Provides the sampling method of tracing. This
  212.  command simply prints a given variable (and associated
  213.  information) per call.  Takes 1 argument: one of the trace
  214.  variables presented above.
  215.  paragraph{set-multihome-core} Sets the core node for multihomed
  216.  endpoints. Takes 1 argument of type node. Mandatory for
  217.  multihomed endpoints and must not be set more than once per
  218.  endpoint.
  219.  paragraph{multihome-add-interface} Adds an interface to a multihomed
  220.  endpoint. Takes 2 arguments of type node. Argument 1 is the core
  221.  node of the multihomed endpoint. Argument 2 is the interface node
  222.  to be added. Mandatory for multihomed endpoints. All interfaces
  223.  must be added after set-multihome-core is called and before
  224.  multihome-attach-agent is called.
  225.  paragraph{multihome-attach-agent} Attaches an SCTP agent to a
  226.  multihomed endpoint. Takes 2 arguments. Argument 1 is the core
  227.  node. Argument 2 is the SCTP agent. Mandatory for multihomed
  228.  endpoints.
  229.  paragraph{set-primary-destination} Sets the interface node of the peer
  230.  endpoint as the primary destination. Takes 1 argument of type
  231.  node. Optional and may be set more than once per endpoint. If not
  232.  used, a primary destination is chosen automatically.
  233.  paragraph{force-source} Sets the interface node that packets will be
  234.  sent from. Takes 1 argument of type node. Optional and may be set
  235.  more than once per endpoint. If not used, routing will
  236.  automatically choose the source on a per packet basis.
  237.    section{Extensions}
  238.    label{sec:sctpExtensions}
  239.       subsection{HbAfterRto SCTP}
  240.  The HbAfterRto SCTP agent extends the current retransmission
  241.  policy. In addition to SCTP's current policy of retransmitting to
  242.  an alternate destination on a timeout, a heartbeat is sent
  243.  immediately to the destination on which a timeout occurred. Extra
  244.  heartbeats provide a mechanism for a sender to update an
  245.  alternate destination's RTT estimate more frequently, thus
  246.  resulting in a better RTT estimate on which to base the RTO
  247.  value.
  248.  For example, suppose a packet is lost in transit to the primary
  249.  destination, and later gets retransmitted to an alternate
  250.  destination. Also suppose that the retransmission times out. The
  251.  lost packet is retransmitted again to yet another alternate
  252.  destination (if one exists; otherwise, the primary). More
  253.  importantly, a heartbeat is also sent to the alternate
  254.  destination which timed out. If the heartbeat is successfully
  255.  acked, that destination acquires an additional RTT measurement to
  256.  help reduce its recently doubled RTO~cite{SCTP_CARO_2003e}.
  257.       subsection{MultipleFastRtx SCTP}
  258.       label{ssec:mfr}
  259.  The MultipleFastRtx SCTP agent attempts to minimize the number of
  260.  timeouts which occur. Without the Multiple Fast Retransmit
  261.  algorithm, SCTP may only Fast Retransmit a TSN once. If a Fast
  262.  Retransmitted TSN is lost, a timeout is necessary to retransmit
  263.  the TSN again. The Multiple Fast Retransmit algorithm allows the
  264.  same TSN to be Fast Retransmitted several times if
  265.  needed. Without the Multiple Fast Retransmit algorithm, a large
  266.  window of outstanding data may generate enough SACKs to
  267.  incorrectly trigger more than one Fast Retransmit of the same TSN
  268.  in a single RTT.  To avoid these spurious Fast Retransmits, the
  269.  Multiple Fast Retransmit algorithm introduces a {em
  270.  fastRtxRecover} state variable for each TSN Fast
  271.  Retransmitted. This variable stores the highest outstanding TSN
  272.  at the time a TSN is Fast Retransmitted. Then, only SACKs which
  273.  newly ack TSNs beyond {em fastRtxRecover} can increment the
  274.  missing report for the Fast Retransmitted TSN. If the missing
  275.  report threshold for the Fast Retransmitted TSN is reached again,
  276.  the sender has enough evidence that this TSN was lost and can be
  277.  Fast Retransmitted again~cite{SCTP_CARO_2003e}.
  278.       subsection{Timestamp SCTP}
  279.  The Timestamp SCTP agent introduces timestamps into each packet,
  280.  thus allowing a sender to disambiguate original transmissions
  281.  from retransmissions. By removing retransmission ambiguity,
  282.  Karn's algorithm can be eliminated, and successful
  283.  retransmissions on the alternate path can be used to update the
  284.  RTT estimate and keep the RTO value more accurate. With
  285.  timestamps, the sender has more samples for updating the RTT
  286.  estimate of alternate destination(s)~cite{SCTP_CARO_2003e}.
  287.       subsection{MfrHbAfterRto SCTP}
  288.          The MfrHbAfterRto SCTP agent combines the functionality of the
  289.          HbAfterRto and MultipleFastRtx SCTP agents.
  290.       subsection{MfrHbAfterRto SCTP}
  291.          The MfrTimestamp SCTP agent combines the functionality of the
  292.          Timestamp and MultipleFastRtx SCTP agents.
  293.    section{Tracing SCTP Dynamics}
  294.    label{sec:sctpTracing}
  295.       SCTP packets generated by one of the SCTP agents and destined for a
  296.       peer SCTP agent over a traced link (see section~ref{chap:trace})
  297.       will generate a trace file with lines of the form:
  298.       begin{verbatim}
  299.       + 0.5 1 4 sctp 56 -------I 0 1.0 4.0 1 -1 4 65535 65535
  300.       - 0.5 1 4 sctp 56 -------I 0 1.0 4.0 1 -1 4 65535 65535
  301.       r 0.700896 1 4 sctp 56 -------I 0 1.0 4.0 1 -1 4 65535 65535
  302.       + 0.700896 4 1 sctp 56 -------I 0 4.0 1.0 1 -1 5 65535 65535
  303.       - 0.700896 4 1 sctp 56 -------I 0 4.0 1.0 1 -1 5 65535 65535
  304.       r 0.901792 4 1 sctp 56 -------I 0 4.0 1.0 1 -1 5 65535 65535
  305.       + 0.901792 1 4 sctp 36 -------I 0 1.0 4.0 1 -1 6 65535 65535
  306.       - 0.901792 1 4 sctp 36 -------I 0 1.0 4.0 1 -1 6 65535 65535
  307.       r 1.102368 1 4 sctp 36 -------I 0 1.0 4.0 1 -1 6 65535 65535
  308.       + 1.102368 4 1 sctp 36 -------I 0 4.0 1.0 1 -1 7 65535 65535
  309.       - 1.102368 4 1 sctp 36 -------I 0 4.0 1.0 1 -1 7 65535 65535
  310.       r 1.302944 4 1 sctp 36 -------I 0 4.0 1.0 1 -1 7 65535 65535
  311.       + 1.302944 1 4 sctp 1500 -------D 0 1.0 4.0 1 1 8 0 0
  312.       - 1.302944 1 4 sctp 1500 -------D 0 1.0 4.0 1 1 8 0 0
  313.       + 1.302944 1 4 sctp 1500 -------D 0 1.0 4.0 1 2 9 0 1
  314.       - 1.326624 1 4 sctp 1500 -------D 0 1.0 4.0 1 2 9 0 1
  315.       r 1.526624 1 4 sctp 1500 -------D 0 1.0 4.0 1 1 8 0 0
  316.       r 1.550304 1 4 sctp 1500 -------D 0 1.0 4.0 1 2 9 0 1
  317.       + 1.550304 4 1 sctp 48 -------S 0 4.0 1.0 1 2 11 65535 65535
  318.       - 1.550304 4 1 sctp 48 -------S 0 4.0 1.0 1 2 11 65535 65535
  319.       r 1.751072 4 1 sctp 48 -------S 0 4.0 1.0 1 2 11 65535 65535
  320.       ...
  321.       + 19.302944 4 1 sctp 56 -------H 0 2.0 5.0 1 -1 336 65535 65535
  322.       - 19.302944 4 1 sctp 56 -------H 0 2.0 5.0 1 -1 336 65535 65535
  323.       r 19.303264 4 1 sctp 56 -------H 0 4.0 1.0 1 -1 322 65535 65535
  324.       + 19.303264 1 4 sctp 56 -------B 0 1.0 4.0 1 -1 337 65535 65535
  325.       - 19.327584 1 4 sctp 56 -------B 0 1.0 4.0 1 -1 337 65535 65535
  326.       r 19.52848 1 4 sctp 56 -------B 0 1.0 4.0 1 -1 337 65535 65535
  327.       end{verbatim}
  328.       When tracing SCTP, packets of type {sf sctp} are relevant.  Their
  329.       packet type, chunk type, packet size, TSN (CumAck point for SACK
  330.       chunks), stream ID, SSN, and arrival/depart/drop time are given by
  331.       field positions 5, 7 (flag position 8), 6, 12, 14, 15, and 2,
  332.       respectively. If a packet has more than one chunk, a line is printed
  333.       for each chunk. A future release should include a field to indicate
  334.       which chunk of the packet a line refers to (e.g., 2:3 could identify
  335.       the 2nd chunk of a packet which contains 3 chunks). Since control
  336.       chunks do not use TSNs, stream IDs, or SSNs, the trace lines for
  337.       these chunks use undefined numbers (-1 or 65535) for these fields.
  338.       The {sf +} indicates a packet arrival, {sf d} a drop, and {sf -}
  339.       a departure.
  340.       Flag position 8 of field 7 indicate the chunk type as follows. The
  341.       {sf I} flag indicates an association initiation control chunk
  342.       (INIT, INIT-ACK, COOKIE-ECHO, COOKIE-ACK). A future release should
  343.       use {sf I} for the INIT and INIT-ACK chunks, and {sf C} for the
  344.       COOKIE-ECHO and COOKIE-ACK chunks. The {sf D}, {sf S}, {sf H},
  345.       and {sf B} flags indicate a DATA chunk, a SACK, a HEARTBEAT chunk,
  346.       and a HEARTBEAT-ACK chunk.
  347.       A number of scripts process this file to produce graphical output or
  348.       statistical summaries (for example, see the {tt finish} procedure
  349.       in nsf{em{tcl/test/test-suite-sctp.tcl}}).
  350.    section{SCTP Applications}
  351.    label{sec:sctpApps}
  352.       SCTP supports legacy ns~applications, but they obviously cannot
  353.       completely exploit all SCTP's features. For these applications, the
  354.       TCL-bound SCTP configuration parameters can be used to set
  355.       reliability and ordering options. However, these options cannot be
  356.       controlled per message using these parameters. Only SCTP-aware
  357.       application can be written to do so. ns~applications wishing to
  358.       become SCTP-aware can use the sendmsg API as follows (see
  359.       nsf{em{apps/sctp_app1.{cc, h}}} as an example).
  360.       begin{enumerate}
  361.  item Create and fill an instance of the code{AppData_S}
  362.  structure (see nsf{em{sctp/sctp.h}}). The code{AppData_S}
  363.  structure has the following fields:
  364.  begin{itemize}
  365.     item[] code{usNumStreams} is the number of outgoing streams
  366.     to setup during negotiation. Although this field is passed
  367.     with every sendmsg call, it is only used during association
  368.     setup. Once the association is established, this field is
  369.     ignored.
  370.     item[] code{usNumUnreliable} is the number of outgoing
  371.     streams which are unreliable (now called partially
  372.     reliable). The sender simply sets the lowest outgoing stream
  373.     to unreliable/partially-reliable; the remaining ones are
  374.     reliable. This field is also only used during association
  375.     establishment.
  376.     item[] code{usStreamId} is the stream ID of a message.
  377.     item[] code{usReliability} is the reliability level (k-rtx
  378.     value) of a message. This field is ignored if the message is
  379.     sent on a reliable stream.
  380.     item[] code{eUnordered} is the unordered boolean flag for a
  381.     message.
  382.     item[] code{uiNumBytes} is the number of bytes in a message.
  383.  end{itemize}
  384.  item Pass this object as the second parameter in SCTP's sendmsg:
  385.  code{sctpAgent->sendmsg(numBytes, (char *)appData);}
  386.       end{enumerate}
  387.    section{Example Scripts}
  388.    label{sec:sctpExamples}
  389.       subsection{Singled Homed Example}
  390.  begin{program}
  391.  Trace set show_sctphdr_ 1 ; this needs to be set for tracing SCTP packets;
  392.  set ns [new Simulator]
  393.  set allchan [open all.tr w]
  394.  $ns trace-all $allchan
  395.  proc finish {} {
  396.     exit 0
  397.  }
  398.  set n0 [$ns node]
  399.  set n1 [$ns node]
  400.  $ns duplex-link $n0 $n1 .5Mb 200ms DropTail
  401.  # NOTE: The debug files (in this example, they would be debug.SctpAgent.0
  402.  #       and debug.SctpAgent.1) contain a lot of useful info. They can be 
  403.  #       used to trace every packet sent, received, and processed.
  404.  #
  405.  set sctp0 [new Agent/SCTP]
  406.  $ns attach-agent $n0 $sctp0
  407.  $sctp0 set debugMask_ 0x00303000 ; refer to sctpDebug.h for mask mappings;
  408.  $sctp0 set debugFileIndex_ 0
  409.  set trace_ch [open trace.sctp w]
  410.  $sctp0 set trace_all_ 0 ; do not trace all variables on one line;
  411.  $sctp0 trace cwnd_      ; trace cwnd for all destinations;
  412.  $sctp0 attach $trace_ch
  413.  set sctp1 [new Agent/SCTP]
  414.  $ns attach-agent $n1 $sctp1
  415.  $sctp1 set debugMask_ -1         ; use -1 to turn on all debugging;
  416.  $sctp1 set debugFileIndex_ 1
  417.  $ns connect $sctp0 $sctp1
  418.  set ftp0 [new Application/FTP]
  419.  $ftp0 attach-agent $sctp0
  420.  $ns at 0.5 "$ftp0 start"
  421.  $ns at 4.5 "$ftp0 stop"
  422.  $ns at 5.0 "finish"
  423.  $ns run
  424.  end{program}
  425.       subsection{Multihomed Example}
  426.       label{sec:multihomedExample}
  427.  begin{verbatim}
  428.  # This example demonstrates multihoming. Two SCTP endpoints, each
  429.  # with 2 interfaces, are directly connected between each pair of
  430.  # interfaces.  In the middle of the association, a change primary
  431.  # is done. Running nam helps to visualize the multihomed
  432.  # architecture.
  433.  #
  434.  #       host0_if0      O===========O    host1_if0
  435.  #                     /             
  436.  #       host0_core   O               O  host1_core
  437.  #                                  /
  438.  #       host0_if1      O===========O    host1_if1
  439.  end{verbatim}
  440.  begin{program}
  441.  Trace set show_sctphdr_ 1
  442.  set ns [new Simulator]
  443.  set nf [open sctp.nam w]
  444.  $ns namtrace-all $nf
  445.  set allchan [open all.tr w]
  446.  $ns trace-all $allchan
  447.  proc finish {} {
  448.     exec nam sctp.nam &
  449.     exit 0
  450.  }
  451.  set host0_core [$ns node]
  452.  set host0_if0 [$ns node]
  453.  set host0_if1 [$ns node]
  454.  $host0_core color Red
  455.  $host0_if0 color Red
  456.  $host0_if1 color Red
  457.  $ns multihome-add-interface $host0_core $host0_if0
  458.  $ns multihome-add-interface $host0_core $host0_if1
  459.  set host1_core [$ns node]
  460.  set host1_if0 [$ns node]
  461.  set host1_if1 [$ns node]
  462.  $host1_core color Blue
  463.  $host1_if0 color Blue
  464.  $host1_if1 color Blue
  465.  $ns multihome-add-interface $host1_core $host1_if0
  466.  $ns multihome-add-interface $host1_core $host1_if1
  467.  $ns duplex-link $host0_if0 $host1_if0 .5Mb 200ms DropTail
  468.  $ns duplex-link $host0_if1 $host1_if1 .5Mb 200ms DropTail
  469.  set sctp0 [new Agent/SCTP]
  470.  $ns multihome-attach-agent $host0_core $sctp0
  471.  set trace_ch [open trace.sctp w]
  472.  $sctp0 set trace_all_ 1           ; print all on a single trace event;
  473.  $sctp0 trace rto_
  474.  $sctp0 trace errorCount_
  475.  $sctp0 attach $trace_ch
  476.  set sctp1 [new Agent/SCTP]
  477.  $ns multihome-attach-agent $host1_core $sctp1
  478.  $ns connect $sctp0 $sctp1
  479.  set ftp0 [new Application/FTP]
  480.  $ftp0 attach-agent $sctp0
  481.  $sctp0 set-primary-destination $host1_if0 ; set primary before association starts;
  482.  $ns at 7.5 "$sctp0 set-primary-destination $host1_if1" ; change primary;
  483.  $ns at 7.5 "$sctp0 print cwnd_" ; print all dests' cwnds at time 7.5;
  484.  $ns at 0.5 "$ftp0 start"
  485.  $ns at 9.5 "$ftp0 stop"
  486.  $ns at 10.0 "finish"
  487.  $ns run
  488.  end{program}
  489. endinput