home *** CD-ROM | disk | FTP | other *** search
/ ftp.ee.lbl.gov / 2014.05.ftp.ee.lbl.gov.tar / ftp.ee.lbl.gov / papers / sackIDv1.0.txt < prev    next >
Text File  |  1996-01-03  |  24KB  |  537 lines

  1. INTERNET-DRAFT
  2.  
  3.                         TCP Selective Acknowledgement Option
  4.  
  5.                         Matthew B. Mathis       Mathis@psc.edu
  6.                         Jamshid Mahdavi         Mahdavi@psc.edu
  7.                         Sally Floyd             floyd@ee.lbl.gov
  8.                         Allyn Romanow           allyn@eng.sun.com
  9.  
  10. Version: 1.0, Thu Jan  4 14:48:16 PST 1996
  11.      
  12.     This document is an Internet-Draft.  Internet-Drafts are working
  13.     documents of the Internet Engineering Task Force (IETF), its areas,
  14.     and its working groups.  Note that other groups may also distribute
  15.     working documents as Internet-Drafts.
  16.  
  17.     Internet-Drafts are draft documents valid for a maximum of six
  18.     months and may be updated, replaced, or obsoleted by other
  19.     documents at any time.  It is inappropriate to use Internet-
  20.     Drafts as reference material or to cite them other than as ``work in
  21.     progress.''
  22.  
  23.     To learn the current status of any Internet-Draft, please check
  24.     the ``1id-abstracts.txt'' listing contained in the Internet-
  25.     Drafts Shadow Directories on ftp.is.co.za (Africa),
  26.     nic.nordu.net (Europe), munnari.oz.au (Pacific Rim),
  27.     ds.internic.net (US East Coast), or ftp.isi.edu (US West Coast).
  28.  
  29. Abstract
  30.  
  31.     TCP may experience poor performance when multiple packets are lost
  32.     from one window of data.   With the limited information available
  33.     from cumulative acknowledgements, a TCP sender can only learn
  34.     about a single lost packet per round trip time.  An aggressive
  35.     sender could choose to retransmit packets early, but such
  36.     retransmitted segments may have already been successfully
  37.     received.
  38.  
  39.     A Selective Acknowledgement (SACK) mechanism, combined with a
  40.     selective repeat retransmission policy, can help to overcome these
  41.     limitations.  The receiving TCP sends back SACK packets to the
  42.     sender informing the sender of data that has been received. The
  43.     sender can then retransmit only the missing data segments.
  44.  
  45.     This draft proposes an implementation of SACK and discusses its
  46.     performance and related issues.
  47.  
  48. Acknowledgements:
  49.  
  50.     Much of the text in this document is taken directly from RFC1072
  51.     ``TCP Extensions for Long-Delay Paths'' by Bob Braden and Van
  52.     Jacobson.  The authors would like to thank Kevin Fall (LBNL),
  53.     Christian Huitema (Inria), Van Jacobson (LBNL), Greg Minshall
  54.     (Ipsilon), and Lixia Zhang (XEROX PARC and UCLA) for their review
  55.     and constructive comments.
  56.  
  57. 1.  Introduction
  58.  
  59.     Multiple packet losses from a window of data can have a
  60.     catastrophic effect on TCP throughput. TCP [Postel81] uses a
  61.     cumulative acknowledgment scheme in which received segments that
  62.     are not at the left edge of the receive window are not
  63.     acknowledged.  This forces the sender to either wait a roundtrip
  64.     time to find out about each lost packet, or to unnecessarily
  65.     retransmit segments which have been correctly received [Fall95].
  66.     With the cumulative acknowledgment scheme, multiple dropped
  67.     segments generally cause TCP to lose its ACK-based clock, reducing
  68.     overall throughput.
  69.  
  70.     Selective Acknowledgment (SACK) is a strategy which corrects this
  71.     behavior and restores full throughput in the face of multiple
  72.     dropped segments.  With selective acknowledgments, the data
  73.     receiver can inform the sender about all segments that have arrived
  74.     successfully, so the sender need retransmit only the segments that
  75.     have actually been lost.
  76.  
  77.     Several transport protocols, including NETBLT [Clark87], XTP
  78.     [Strayer92], RDP [Velten84], NADIR [Huitema81], 
  79.     and VMTP [Cheriton88] have used selective
  80.     acknowledgement.  There is some empirical evidence in favor of
  81.     selective acknowledgments -- simple experiments with RDP have shown
  82.     that disabling the selective acknowledgment facility greatly
  83.     increases the number of retransmitted segments over a lossy,
  84.     high-delay Internet path [Partridge87].  A recent simulation study
  85.     by Kevin Fall and Sally Floyd [Fall95], demonstrates the strength
  86.     of TCP with SACK over the non-SACK Tahoe and Reno TCP implementations.
  87.  
  88.     RFC1072 [VJ88] describes one possible implementation of SACK
  89.     options for TCP.  Unfortunately, it has never been deployed in the
  90.     Internet, as there was disagreement about how SACK options should
  91.     be used in conjunction with the TCP window shift option (initially
  92.     described RFC1072 and revised in Jacobson92).
  93.  
  94.     We propose slight modifications to the SACK options as proposed in
  95.     RFC1072.  Specifically, sending a selective acknowledgment for the
  96.     most recently received data reduces the need for long SACK
  97.     options [Keshav94, Mathis95].  In addition, sequence numbers are
  98.     now 32 bits. These two modifications represent the only changes to
  99.     the proposal in RFC1072.  They make SACK easier to implement and
  100.     address concerns about robustness.
  101.  
  102.     The selective acknowledgment extension uses two TCP options. The
  103.     first is an enabling option, "SACK-permitted", which may be sent in
  104.     a SYN segment to indicate that the SACK option can be used once the
  105.     connection is established.  The other is the SACK option itself,
  106.     which may be sent over an established connection once permission
  107.     has been given by SACK-permitted.
  108.  
  109.     The SACK option is to be included in a segment sent from a TCP that
  110.     is receiving data to the TCP that is sending that data; we will
  111.     refer to these TCP's as the data receiver and the data sender,
  112.     respectively.  We will consider a particular simplex data flow; any
  113.     data flowing in the reverse direction over the same connection can
  114.     be treated independently.
  115.  
  116. 2.  SACK-Permitted Option
  117.  
  118.     This two-byte option may be sent in a SYN by a TCP that has been
  119.     extended to receive (and presumably process) the SACK option once
  120.     the connection has opened.
  121.  
  122.     TCP Sack-Permitted Option: 
  123.  
  124.     Kind: 4
  125.  
  126.     +---------+---------+
  127.     | Kind=4  | Length=2|
  128.     +---------+---------+
  129.  
  130.     [We need to formally decide (in the BOF?) if we are going to reuse 
  131.     option numbers.]
  132.  
  133. 3.  SACK Option Format
  134.  
  135.     The SACK option is to be used to convey extended acknowledgment
  136.     information from the receiver to the sender over an established
  137.     TCP connection.  
  138.  
  139.     TCP SACK Option:
  140.  
  141.     Kind: 5
  142.  
  143.     Length: Variable
  144.  
  145.                       +--------+--------+
  146.                       | Kind=5 | Length |
  147.     +--------+--------+--------+--------+
  148.     |      Left Edge of 1st Block       |
  149.     +--------+--------+--------+--------+
  150.     |      Right Edge of 1st Block      |
  151.     +--------+--------+--------+--------+
  152.     |                                   |
  153.     /            . . .                  /
  154.     |                                   |
  155.     +--------+--------+--------+--------+
  156.     |      Left Edge of nth Block       |
  157.     +--------+--------+--------+--------+
  158.     |      Right Edge of nth Block      |
  159.     +--------+--------+--------+--------+
  160.  
  161.  
  162.  
  163.     The SACK option is to be sent by a data receiver to inform the
  164.     data sender of non-contiguous blocks of data that have been
  165.     received and queued.  The data receiver awaits the receipt of data
  166.     (perhaps by means of retransmissions) to fill the gaps in sequence
  167.     space between received blocks.  When missing segments are
  168.     received, the data receiver acknowledges the data normally by
  169.     advancing the left window edge in the Acknowledgment Number field
  170.     of the TCP header.  The SACK option does not change the meaning of
  171.     the Acknowledgment Number field, whose value will still specify
  172.     the left window edge, i.e., one byte beyond the last sequence
  173.     number of fully-received data.
  174.  
  175.     The SACK option provides additional information which the data
  176.     transmitter can use to optimize retransmissions.  The TCP data
  177.     receiver includes the SACK option in an acknowledgment segment
  178.     whenever it has data that is queued and unacknowledged.
  179.     The SACK option may be sent only when the TCP has received the
  180.     SACK-permitted option in the SYN segment for that connection.
  181.  
  182.     This option contains a list of some of the blocks of contiguous
  183.     sequence space occupied by data that has been received and queued
  184.     within the window.
  185.  
  186.     Each contiguous block of data queued at the data receiver is
  187.     defined in the SACK option by two 32-bit unsigned integers in
  188.     network byte order:
  189.  
  190.     *    Left Edge of Block
  191.  
  192.          This is the first sequence number of this block.  
  193.  
  194.     *    Right Edge of Block
  195.  
  196.          This is the sequence number immediately following the last 
  197.          sequence number of this block.
  198.  
  199.     Each block represents received bytes of data that are contiguous and
  200.     isolated; that is, the bytes just below the block, (Left Edge of
  201.     Block - 1), and just above the block, (Right Edge of Block), have
  202.     not been received.
  203.  
  204.     A SACK option that specifies n blocks will have a length of
  205.     8*n+2 bytes, so the 40 bytes available for TCP options can
  206.     specify a maximum of 4 blocks.  It is expected that SACK will
  207.     often be used in conjunction with the Timestamp option used for
  208.     RTTM [Jacobson92], which takes an additional 10 bytes (plus two
  209.     bytes of padding); thus a maximum of 3 SACK blocks will be 
  210.     allowed in this case.
  211.  
  212.     The SACK option is advisory, in that, while it notifies the data sender
  213.     that the data receiver has received the indicated segments, the
  214.     data receiver is permitted to later discard data which have been
  215.     reported in a SACK option.  A detailed discussion of the advisory
  216.     nature of the SACK option appears below, following the discussion
  217.     of the normal case.
  218.  
  219. 4.  Generating SACK Options:  Data Receiver Behavior
  220.  
  221.     If the data receiver has received a SACK-Permitted option on the
  222.     SYN for this connection, the data receiver MAY elect to generate
  223.     SACK options as described below.  If the data receiver generates
  224.     SACK options under any circumstance, it SHOULD generate them under
  225.     all permitted circumstances.  If the data receiver has not received
  226.     a SACK-Permitted option for a given connection, it MUST NOT send
  227.     SACK options on that connection.
  228.  
  229.     If sent at all, SACK options SHOULD be included in all ACKs which
  230.     do not ACK the highest sequence number in the data receiver's queue.
  231.     In this situation the network has lost or mis-ordered data, such
  232.     that the receiver holds non-contiguous data in its queue.  RFC
  233.     1122, Section 4.2.2.21, discusses the reasons for the receiver to 
  234.     send ACKs in response to additional segments received in this
  235.     state.  The receiver SHOULD send an ACK for every valid segment
  236.     that arrives containing new data, and each of these "duplicate"
  237.     ACKs SHOULD bear a SACK option.
  238.      
  239.     If the data receiver chooses to send a SACK option, the following
  240.     rules apply:
  241.  
  242.         * The first SACK block (i.e., the one immediately following the
  243.         kind and length fields in the option) MUST specify the
  244.         contiguous block of data containing the segment which triggered
  245.         this ACK, unless that segment advanced the Acknowledgment Number
  246.         field in the header.  This assures that the ACK with the SACK
  247.         option reflects the most recent state change at the data receiver.
  248.  
  249.     * The data receiver SHOULD include as many distinct SACK blocks
  250.     as possible in the SACK option.  Note that the maximum
  251.     available option space may not be sufficient to report all
  252.     blocks present in the receiver's queue.
  253.  
  254.         * The SACK option SHOULD be filled out by repeating the most
  255.         recently reported SACK blocks (based on first SACK blocks in
  256.         previous SACK options) that are not subsets of a SACK block
  257.         already included in the SACK option being constructed.  This
  258.         assures that in normal operation every SACK block is repeated
  259.         several times.  (At least three times for large-window TCP
  260.         implementations [RFC1323]).
  261.  
  262.     It is very important that the SACK option always reports
  263.     the block containing the most recently received segment, because
  264.     this provides the sender with the most up-to-date information
  265.     about the state of the network and the data receiver's queue.
  266.  
  267. 5.  Interpreting the SACK Option and Retransmission Strategy: 
  268.     Data Sender Behavior
  269.  
  270.     When receiving an ACK containing a SACK option, the data sender
  271.     SHOULD record the selective acknowledgement for future reference.
  272.     The data sender is assumed to have a retransmission queue
  273.     that contains the segments that have been transmitted but not yet
  274.     acknowledged, in sequence-number order.  If the data sender
  275.     performs re-packetization before retransmission, the block
  276.     boundaries in a SACK option that it receives may not fall on
  277.     boundaries of segments in the retransmission queue; however, this
  278.     does not pose a serious difficulty for the sender.
  279.  
  280.     One possible implementation of the sender's behavior is as
  281.     follows.  Let us suppose that for each segment in the
  282.     retransmission queue there is a (new) flag bit "RESEND", to be used
  283.     to indicate that this particular segment is on the list to be
  284.     retransmitted.  When a segment is first transmitted, it will be
  285.     entered into the retransmission queue with its RESEND bit off.
  286.  
  287.     When an acknowledgment segment arrives containing a SACK option,
  288.     the data sender will turn on the ACK'd bits for segments that
  289.     have been selectively acknowledged.  More specifically, for each
  290.     block in the SACK option, the data sender will turn on the
  291.     ACK'ed flags for all segments in the retransmission queue that are
  292.     wholly contained within that block.  This requires straightforward
  293.     sequence number comparisons.
  294.  
  295.     After the ACKed bit is turned on (as the result of processing a received
  296.     SACK option), the data sender will skip that segment during
  297.     any later retransmission.  Any segment that has the ACKed bit
  298.     turned off and is less than the highest ACKed segment is
  299.     available for retransmission.
  300.  
  301.     However, after a retransmit timeout all of the ACKed bits are
  302.     turned off.  A segment will not be dequeued and its buffer freed
  303.     until the left window edge is advanced over it.
  304.  
  305. 5.1  Congestion Control Issues 
  306.  
  307.     This document does not attempt to specify in detail the congestion
  308.     control algorithms for implementations of TCP with SACK.  However,
  309.     the congestion control algorithms present in the de facto standard
  310.     TCP implementations MUST be preserved [Stevens94].  In particular,
  311.     to preserve robustness in the presence of packets reordered by the
  312.     network, recovery is not triggered by a single ACK reporting
  313.     out-of-order packets at the receiver.  Further, during recovery the
  314.     data sender limits the number of segments sent in response to each
  315.     ACK.  Existing implementations limit the data sender to sending one
  316.     segment during Reno-style fast recovery, or to two segments during
  317.     slow-start [Jacobson88].  Other aspects of congestion control, such
  318.     as reducing the congestion window in response to congestion, must
  319.     similarly be preserved.
  320.  
  321.     The use of time-outs as a fall-back mechanism for detecting dropped
  322.     packets is unchanged by the SACK option.  Because the data receiver
  323.     is allowed to discard SACKed data, when a retransmit timeout
  324.     occurs the data sender MUST ignore prior SACK information in determining
  325.     which data to retransmit.
  326.  
  327.     Future research into congestion control algorithms may take
  328.     advantage of the additional information provided by SACK.  One such
  329.     area for future research concerns modifications to TCP for a
  330.     wireless or satellite environment where packet loss is not
  331.     necessarily an indication of congestion.
  332.  
  333. 6.  Efficiency and Worst Case Behavior
  334.  
  335.     If the return path carrying ACKs and SACK options were lossless,
  336.     one block per SACK option packet would always be sufficient.  Every
  337.     segment arriving while the data receiver holds discontinuous data
  338.     would cause the data receiver to send an ACK with a SACK option
  339.     containing the one altered block in the receiver's queue.  The data
  340.     sender is thus able to construct a precise replica of the
  341.     receiver's queue by taking the union of all the first SACK blocks.
  342.  
  343.     However, since the return path is not lossless, the SACK option is
  344.     defined to include more than one SACK block in a single packet.
  345.     The redundant blocks in the SACK option packet increase the
  346.     robustness of SACK delivery in the presence of lost ACKs.  For a
  347.     receiver that is also using the time stamp option [Jacobson92], the
  348.     SACK option has room to include three SACK blocks.  Thus each SACK
  349.     block will generally be repeated at least three times, in three
  350.     successive ACK packets.  However, if all of the ACK packets
  351.     reporting a particular SACK block are dropped, then the sender
  352.     might assume that the data in that SACK block has not been
  353.     received, and unnecessarily retransmit those segments.
  354.  
  355.     The worst-case conditions necessary for the sender to needlessly
  356.     retransmit data is discussed in more detail in a separate document
  357.     [Floyd96].  As is shown in that paper, the exposure of TCP with
  358.     SACK in regard to the unnecessary retransmission of packets is
  359.     strictly less than the exposure of current implementations of TCP.
  360.     In current implementations of TCP, the sender can unnecessarily
  361.     retransmit packets whenever multiple packets dropped from a single
  362.     window of data are followed by a slow-start.  In contrast, as is
  363.     shown in [Floyd96], the simplest condition that can cause
  364.     duplicated (needlessly retransmitted) data sent to the receiver for
  365.     TCP with SACK requires a sender congestion size of 11 packets and a
  366.     precise (and therefore rather improbable) sequence of 4 lost data
  367.     packets and 3 lost ACKs for that window of data.
  368.  
  369. 7.  SACK Option Examples
  370.  
  371.     The follow examples attempt to demonstrate the proper behavior of
  372.     SACK generation by the data receiver.  
  373.  
  374.     Assume the left window edge is 5000 and that the data transmitter
  375.     sends a burst of 8 segments, each containing 500 data bytes.
  376.  
  377.  
  378.          Case 1: The first 4 segments are received but the last 4 are
  379.          dropped.
  380.  
  381.          The data receiver will return a normal TCP ACK segment
  382.          acknowledging sequence number 7000, with no SACK option.
  383.  
  384.  
  385.          Case 2:  The first segment is dropped but the remaining 7 are
  386.          received.
  387.  
  388.     
  389.          Upon receiving each of the last seven packets, the data
  390.          receiver will return a TCP ACK segment that acknowledges
  391.          sequence number 5000 and contains a SACK option specifying
  392.          one block of queued data:
  393.  
  394.              Triggering    ACK      Left Edge   Right Edge
  395.              Segment
  396.  
  397.              5000         (lost)
  398.              5500         5000     5500       6000
  399.              6000         5000     5500       6500
  400.              6500         5000     5500       7000
  401.              7000         5000     5500       7500
  402.              7500         5000     5500       8000
  403.              8000         5000     5500       8500
  404.              8500         5000     5500       9000
  405.  
  406.  
  407.  
  408.          Case 3:  The 2nd, 4th, 6th, and 8th (last) segments are
  409.          dropped.
  410.  
  411.          The data receiver ACKs the first packet normally.  The
  412.          third, fifth, and seventh packets trigger SACK options as
  413.          follows: 
  414.  
  415.           Triggering  ACK    First Block   2nd Block     3rd Block
  416.           Segment            Left   Right  Left   Right  Left   Right  
  417.                              Edge   Edge   Edge   Edge   Edge   Edge   
  418.  
  419.           5000       5500
  420.           5500       (lost)
  421.           6000       5500    6000   6500
  422.           6500       (lost)
  423.           7000       5500    7000   7500   6000   6500
  424.           7500       (lost)
  425.           8000       5500    8000   8500   7000   7500   6000   6500
  426.           8500       (lost)
  427.  
  428.          Suppose at this point, the 4th packet is received out of
  429.          order.  (This could either be because the data was badly
  430.          misordered in the network, or because the 2nd packet was
  431.          retransmitted and lost).  At this point the data receiver has
  432.          only two SACK blocks to report.  The data receiver replies
  433.          with the following Selective Acknowledgement:
  434.  
  435.           Triggering  ACK    First Block   2nd Block     3rd Block
  436.           Segment            Left   Right  Left   Right  Left   Right  
  437.                              Edge   Edge   Edge   Edge   Edge   Edge   
  438.  
  439.           6500       5500    6000   7500   8000   8500
  440.  
  441.          Suppose at this point, the 2nd segment is received.  The
  442.          data receiver then replies with the following Selective
  443.          Acknowledgement:
  444.  
  445.           Triggering  ACK    First Block   2nd Block     3rd Block
  446.           Segment            Left   Right  Left   Right  Left   Right  
  447.                              Edge   Edge   Edge   Edge   Edge   Edge   
  448.  
  449.           5500       7500    8000   8500   
  450.  
  451. 8.  Data Receiver Reneging 
  452.  
  453.     Note that the data receiver is permitted to discard data in its
  454.     queue that has not been acknowledged to the data sender, even if
  455.     the data has already been reported in a SACK option.  Such
  456.     discarding of SACKed packets is discouraged, but may be used if the
  457.     receiver runs out of buffer space.  
  458.  
  459.     The data receiver MAY elect not to keep data which it has reported
  460.     in a SACK option.  In this case, the receiver SACK generation is
  461.     additionally qualified:
  462.  
  463.       * The first SACK block MUST reflect the newest segment.  Even
  464.       if the newest segment is going to be discarded and the receiver
  465.       has already discarded adjacent segments, the first SACK block
  466.       MUST report, at a minimum, the left and right edges of the
  467.       newest segment.
  468.  
  469.       * Except for the newest segment, all SACK blocks MUST NOT
  470.       report any old data which is no longer actually held by the
  471.       receiver.
  472.  
  473.     Since the data receiver may later discard data reported in a SACK
  474.     option, the sender MUST NOT discard data before it is acknowledged
  475.     by the Acknowledgment Number field in the TCP header.  
  476.  
  477. 9.  Security Considerations:     
  478.  
  479.     This document neither strengthens nor weakens TCP's current
  480.     security properties.
  481.  
  482. 10. Support
  483.  
  484.     Matt Mathis and Jamshid Mahdavi are supported by the National
  485.     Science Foundation Grant No. NCR-9415552.  Sally Floyd is supported
  486.     by the Director, Office of Energy Research, Scientific Computing
  487.     Staff, of the U.S. Department of Energy under Contract No.
  488.     DE-AC03-76F00098.  Allyn Romanow is supported by Sun Microsystems.
  489.  
  490. 11. REFERENCES
  491.  
  492.     [Cheriton88]  Cheriton, D., "VMTP: Versatile Message Transaction
  493.     Protocol", RFC 1045, Stanford University, February 1988.
  494.  
  495.     [Clark87] Clark, D., Lambert, M., and L. Zhang, "NETBLT: A Bulk
  496.     Data Transfer Protocol", RFC 998, MIT, March 1987.
  497.  
  498.     [Fall95]  Fall, K. and Floyd, S., "Comparisons of Tahoe, Reno,
  499.     and Sack TCP", ftp://ftp.ee.lbl.gov/papers/sacks.ps.Z, December 1995.
  500.  
  501.     [Floyd96]  Floyd, S.,  "Issues of TCP with SACK",
  502.     ftp://ftp.ee.lbl.gov/papers/issues_sa.ps.Z, January 1996.
  503.  
  504.     [Huitema81] Huitema, C., and Valet, I., An Experiment on High
  505.     Speed File Transfer using Satellite Links, 7th Data Communication
  506.     Symposium, Mexico, October 1981.
  507.  
  508.     [Jacobson88] Jacobson, V., "Congestion Avoidance and Control", to
  509.     be presented at SIGCOMM '88, Stanford, CA., August 1988.
  510.  
  511.     [Jacobson92] Jacobson, V., Braden, R., and Borman, D., TCP 
  512.     Extensions for High Performance, RFC 1323, May 1992.
  513.  
  514.     [Keshav94]  Keshav, presentation to the Internet End-to-End Research Group,
  515.     November 1994.
  516.  
  517.     [Mathis95]  Mathis, M., and Mahdavi, J., TCP Forward
  518.     Acknowledgement Option, presentation to the Internet End-to-End
  519.     Research Group, June 1995.
  520.  
  521.     [Partridge87]  Partridge, C., "Private Communication", February
  522.     1987.
  523.  
  524.     [Postel81]  Postel, J., "Transmission Control Protocol - DARPA
  525.     Internet Program Protocol Specification", RFC 793, DARPA,
  526.     September 1981.
  527.  
  528.     [Stevens94] Stevens, W., TCP/IP Illustrated, Volume 1: The
  529.     Protocols, Addison-Wesley, 1994.
  530.  
  531.     [Strayer92] Strayer, T., Dempsey, B., and Weaver, A., XTP -- the
  532.     xpress transfer protocol. Addison-Wesley Publishing Company,
  533.     1992.
  534.  
  535.     [Velten84] Velten, D., Hinden, R., and J. Sax, "Reliable Data
  536.     Protocol", RFC 908, BBN, July 1984.
  537.