home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1997 December / Internet_Info_CD-ROM_Walnut_Creek_December_1997.iso / rfc / rfc1185 < prev    next >
Text File  |  1991-04-21  |  48KB  |  1,179 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7. Network Working Group                                        V. Jacobson
  8. Request for Comments: 1185                                           LBL
  9.                                                                R. Braden
  10.                                                                      ISI
  11.                                                                 L. Zhang
  12.                                                                     PARC
  13.                                                             October 1990
  14.  
  15.  
  16.                    TCP Extension for High-Speed Paths
  17.  
  18. Status of This Memo
  19.  
  20.    This memo describes an Experimental Protocol extension to TCP for the
  21.    Internet community, and requests discussion and suggestions for
  22.    improvements.  Please refer to the current edition of the "IAB
  23.    Official Protocol Standards" for the standardization state and status
  24.    of this protocol.  Distribution of this memo is unlimited.
  25.  
  26. Summary
  27.  
  28.    This memo describes a small extension to TCP to support reliable
  29.    operation over very high-speed paths, using sender timestamps
  30.    transmitted using the TCP Echo option proposed in RFC-1072.
  31.  
  32. 1. INTRODUCTION
  33.  
  34.    TCP uses positive acknowledgments and retransmissions to provide
  35.    reliable end-to-end delivery over a full-duplex virtual circuit
  36.    called a connection [Postel81].  A connection is defined by its two
  37.    end points; each end point is a "socket", i.e., a (host,port) pair.
  38.    To protect against data corruption, TCP uses an end-to-end checksum.
  39.    Duplication and reordering are handled using a fine-grained sequence
  40.    number space, with each octet receiving a distinct sequence number.
  41.  
  42.    The TCP protocol [Postel81] was designed to operate reliably over
  43.    almost any transmission medium regardless of transmission rate,
  44.    delay, corruption, duplication, or reordering of segments.  In
  45.    practice, proper TCP implementations have demonstrated remarkable
  46.    robustness in adapting to a wide range of network characteristics.
  47.    For example, TCP implementations currently adapt to transfer rates in
  48.    the range of 100 bps to 10**7 bps and round-trip delays in the range
  49.    1 ms to 100 seconds.
  50.  
  51.    However, the introduction of fiber optics is resulting in ever-higher
  52.    transmission speeds, and the fastest paths are moving out of the
  53.    domain for which TCP was originally engineered.  This memo and RFC-
  54.    1072 [Jacobson88] propose modest extensions to TCP to extend the
  55.  
  56.  
  57.  
  58. Jacobson, Braden & Zhang                                        [Page 1]
  59.  
  60. RFC 1185               TCP over High-Speed Paths            October 1990
  61.  
  62.  
  63.    domain of its application to higher speeds.
  64.  
  65.    There is no one-line answer to the question: "How fast can TCP go?".
  66.    The issues are reliability and performance, and these depend upon the
  67.    round-trip delay and the maximum time that segments may be queued in
  68.    the Internet, as well as upon the transmission speed.  We must think
  69.    through these relationships very carefully if we are to successfully
  70.    extend TCP's domain.
  71.  
  72.    TCP performance depends not upon the transfer rate itself, but rather
  73.    upon the product of the transfer rate and the round-trip delay.  This
  74.    "bandwidth*delay product" measures the amount of data that would
  75.    "fill the pipe"; it is the buffer space required at sender and
  76.    receiver to obtain maximum throughput on the TCP connection over the
  77.    path.  RFC-1072 proposed a set of TCP extensions to improve TCP
  78.    efficiency for "LFNs" (long fat networks), i.e., networks with large
  79.    bandwidth*delay products.
  80.  
  81.    On the other hand, high transfer rate can threaten TCP reliability by
  82.    violating the assumptions behind the TCP mechanism for duplicate
  83.    detection and sequencing.  The present memo specifies a solution for
  84.    this problem, extending TCP reliability to transfer rates well beyond
  85.    the foreseeable upper limit of bandwidth.
  86.  
  87.    An especially serious kind of error may result from an accidental
  88.    reuse of TCP sequence numbers in data segments.  Suppose that an "old
  89.    duplicate segment", e.g., a duplicate data segment that was delayed
  90.    in Internet queues, was delivered to the receiver at the wrong moment
  91.    so that its sequence numbers fell somewhere within the current
  92.    window.  There would be no checksum failure to warn of the error, and
  93.    the result could be an undetected corruption of the data.  Reception
  94.    of an old duplicate ACK segment at the transmitter could be only
  95.    slightly less serious: it is likely to lock up the connection so that
  96.    no further progress can be made and a RST is required to
  97.    resynchronize the two ends.
  98.  
  99.    Duplication of sequence numbers might happen in either of two ways:
  100.  
  101.    (1)  Sequence number wrap-around on the current connection
  102.  
  103.         A TCP sequence number contains 32 bits.  At a high enough
  104.         transfer rate, the 32-bit sequence space may be "wrapped"
  105.         (cycled) within the time that a segment may be delayed in
  106.         queues.  Section 2 discusses this case and proposes a mechanism
  107.         to reject old duplicates on the current connection.
  108.  
  109.    (2)  Segment from an earlier connection incarnation
  110.  
  111.  
  112.  
  113.  
  114. Jacobson, Braden & Zhang                                        [Page 2]
  115.  
  116. RFC 1185               TCP over High-Speed Paths            October 1990
  117.  
  118.  
  119.         Suppose a connection terminates, either by a proper close
  120.         sequence or due to a host crash, and the same connection (i.e.,
  121.         using the same pair of sockets) is immediately reopened.  A
  122.         delayed segment from the terminated connection could fall within
  123.         the current window for the new incarnation and be accepted as
  124.         valid.  This case is discussed in Section 3.
  125.  
  126.    TCP reliability depends upon the existence of a bound on the lifetime
  127.    of a segment: the "Maximum Segment Lifetime" or MSL.  An MSL is
  128.    generally required by any reliable transport protocol, since every
  129.    sequence number field must be finite, and therefore any sequence
  130.    number may eventually be reused.  In the Internet protocol suite, the
  131.    MSL bound is enforced by an IP-layer mechanism, the "Time-to-Live" or
  132.    TTL field.
  133.  
  134.    Watson's Delta-T protocol [Watson81] includes network-layer
  135.    mechanisms for precise enforcement of an MSL.  In contrast, the IP
  136.    mechanism for MSL enforcement is loosely defined and even more
  137.    loosely implemented in the Internet.  Therefore, it is unwise to
  138.    depend upon active enforcement of MSL for TCP connections, and it is
  139.    unrealistic to imagine setting MSL's smaller than the current values
  140.    (e.g., 120 seconds specified for TCP).  The timestamp algorithm
  141.    described in the following section gives a way out of this dilemma
  142.    for high-speed networks.
  143.  
  144.  
  145. 2.  SEQUENCE NUMBER WRAP-AROUND
  146.  
  147.    2.1  Background
  148.  
  149.       Avoiding reuse of sequence numbers within the same connection is
  150.       simple in principle: enforce a segment lifetime shorter than the
  151.       time it takes to cycle the sequence space, whose size is
  152.       effectively 2**31.
  153.  
  154.       More specifically, if the maximum effective bandwidth at which TCP
  155.       is able to transmit over a particular path is B bytes per second,
  156.       then the following constraint must be satisfied for error-free
  157.       operation:
  158.  
  159.           2**31 / B  > MSL (secs)                                    [1]
  160.  
  161.       The following table shows the value for Twrap = 2**31/B in
  162.       seconds, for some important values of the bandwidth B:
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170. Jacobson, Braden & Zhang                                        [Page 3]
  171.  
  172. RFC 1185               TCP over High-Speed Paths            October 1990
  173.  
  174.  
  175.            Network       B*8          B         Twrap
  176.                       bits/sec   bytes/sec      secs
  177.            _______    _______      ______       ______
  178.  
  179.            ARPANET       56kbps       7KBps    3*10**5 (~3.6 days)
  180.  
  181.            DS1          1.5Mbps     190KBps    10**4 (~3 hours)
  182.  
  183.            Ethernet      10Mbps    1.25MBps    1700 (~30 mins)
  184.  
  185.            DS3           45Mbps     5.6MBps    380
  186.  
  187.            FDDI         100Mbps    12.5MBps    170
  188.  
  189.            Gigabit        1Gbps     125MBps    17
  190.  
  191.  
  192.       It is clear why wrap-around of the sequence space was not a
  193.       problem for 56kbps packet switching or even 10Mbps Ethernets.  On
  194.       the other hand, at DS3 and FDDI speeds, Twrap is comparable to the
  195.       2 minute MSL assumed by the TCP specification [Postel81].  Moving
  196.       towards gigabit speeds, Twrap becomes too small for reliable
  197.       enforcement by the Internet TTL mechanism.
  198.  
  199.       The 16-bit window field of TCP limits the effective bandwidth B to
  200.       2**16/RTT, where RTT is the round-trip time in seconds
  201.       [McKenzie89].  If the RTT is large enough, this limits B to a
  202.       value that meets the constraint [1] for a large MSL value.  For
  203.       example, consider a transcontinental backbone with an RTT of 60ms
  204.       (set by the laws of physics).  With the bandwidth*delay product
  205.       limited to 64KB by the TCP window size, B is then limited to
  206.       1.1MBps, no matter how high the theoretical transfer rate of the
  207.       path.  This corresponds to cycling the sequence number space in
  208.       Twrap= 2000 secs, which is safe in today's Internet.
  209.  
  210.       Based on this reasoning, an earlier RFC [McKenzie89] has cautioned
  211.       that expanding the TCP window space as proposed in RFC-1072 will
  212.       lead to sequence wrap-around and hence to possible data
  213.       corruption.  We believe that this is mis-identifying the culprit,
  214.       which is not the larger window but rather the high bandwidth.
  215.  
  216.            For example, consider a (very large) FDDI LAN with a diameter
  217.            of 10km.  Using the speed of light, we can compute the RTT
  218.            across the ring as (2*10**4)/(3*10**8) = 67 microseconds, and
  219.            the delay*bandwidth product is then 833 bytes.  A TCP
  220.            connection across this LAN using a window of only 833 bytes
  221.            will run at the full 100mbps and can wrap the sequence space
  222.            in about 3 minutes, very close to the MSL of TCP. Thus, high
  223.  
  224.  
  225.  
  226. Jacobson, Braden & Zhang                                        [Page 4]
  227.  
  228. RFC 1185               TCP over High-Speed Paths            October 1990
  229.  
  230.  
  231.            speed alone can cause a reliability problem with sequence
  232.            number wrap-around, even without extended windows.
  233.  
  234.       An "obvious" fix for the problem of cycling the sequence space is
  235.       to increase the size of the TCP sequence number field.  For
  236.       example, the sequence number field (and also the acknowledgment
  237.       field) could be expanded to 64 bits.  However, the proposals for
  238.       making such a change while maintaining compatibility with current
  239.       TCP have tended towards complexity and ugliness.
  240.  
  241.       This memo proposes a simple solution to the problem, using the TCP
  242.       echo options defined in RFC-1072.  Section 2.2 which follows
  243.       describes the original use of these options to carry timestamps in
  244.       order to measure RTT accurately.  Section 2.3 proposes a method of
  245.       using these same timestamps to reject old duplicate segments that
  246.       could corrupt an open TCP connection.  Section 3 discusses the
  247.       application of this mechanism to avoiding old duplicates from
  248.       previous incarnations.
  249.  
  250.    2.2  TCP Timestamps
  251.  
  252.       RFC-1072 defined two TCP options, Echo and Echo Reply.  Echo
  253.       carries a 32-bit number, and the receiver of the option must
  254.       return this same value to the source host in an Echo Reply option.
  255.  
  256.       RFC-1072 furthermore describes the use of these options to contain
  257.       32-bit timestamps, for measuring the RTT.  A TCP sending data
  258.       would include Echo options containing the current clock value.
  259.       The receiver would echo these timestamps in returning segments
  260.       (generally, ACK segments).  The difference between a timestamp
  261.       from an Echo Reply option and the current time would then measure
  262.       the RTT at the sender.
  263.  
  264.       This mechanism was designed to solve the following problem: almost
  265.       all TCP implementations base their RTT measurements on a sample of
  266.       only one packet per window.  If we look at RTT estimation as a
  267.       signal processing problem (which it is), a data signal at some
  268.       frequency (the packet rate) is being sampled at a lower frequency
  269.       (the window rate).  Unfortunately, this lower sampling frequency
  270.       violates Nyquist's criteria and may introduce "aliasing" artifacts
  271.       into the estimated RTT [Hamming77].
  272.  
  273.       A good RTT estimator with a conservative retransmission timeout
  274.       calculation can tolerate the aliasing when the sampling frequency
  275.       is "close" to the data frequency.   For example, with a window of
  276.       8 packets, the sample rate is 1/8 the data frequency -- less than
  277.       an order of magnitude different.  However, when the window is tens
  278.       or hundreds of packets, the RTT estimator may be seriously in
  279.  
  280.  
  281.  
  282. Jacobson, Braden & Zhang                                        [Page 5]
  283.  
  284. RFC 1185               TCP over High-Speed Paths            October 1990
  285.  
  286.  
  287.       error, resulting in spurious retransmissions.
  288.  
  289.       A solution to the aliasing problem that actually simplifies the
  290.       sender substantially (since the RTT code is typically the single
  291.       biggest protocol cost for TCP) is as follows: the will sender
  292.       place a timestamp in each segment and the receiver will reflect
  293.       these timestamps back in ACK segments.  Then a single subtract
  294.       gives the sender an accurate RTT measurement for every ACK segment
  295.       (which will correspond to every other data segment, with a
  296.       sensible receiver).  RFC-1072 defined a timestamp echo option for
  297.       this purpose.
  298.  
  299.       It is vitally important to use the timestamp echo option with big
  300.       windows; otherwise, the door is opened to some dangerous
  301.       instabilities due to aliasing.  Furthermore, the option is
  302.       probably useful for all TCP's, since it simplifies the sender.
  303.  
  304.    2.3  Avoiding Old Duplicate Segments
  305.  
  306.       Timestamps carried from sender to receiver in TCP Echo options can
  307.       also be used to prevent data corruption caused by sequence number
  308.       wrap-around, as this section describes.
  309.  
  310.       2.3.1  Basic Algorithm
  311.  
  312.          Assume that every received TCP segment contains a timestamp.
  313.          The basic idea is that a segment received with a timestamp that
  314.          is earlier than the timestamp of the most recently accepted
  315.          segment can be discarded as an old duplicate.  More
  316.          specifically, the following processing is to be performed on
  317.          normal incoming segments:
  318.  
  319.          R1)  If the timestamp in the arriving segment timestamp is less
  320.               than the timestamp of the most recently received in-
  321.               sequence segment, treat the arriving segment as not
  322.               acceptable:
  323.  
  324.                    If SEG.LEN > 0, send an acknowledgement in reply as
  325.                    specified in RFC-793 page 69, and drop the segment;
  326.                    otherwise, just silently drop the segment.*
  327.  
  328. _________________________
  329. *Sending an ACK segment in reply is not strictly necessary, since  the
  330. case  can  only  arise  when a later in-order segment has already been
  331. received.   However,  for  consistency  and  simplicity,  we   suggest
  332. treating  a  timestamp  failure  the  same  way  TCP  treats any other
  333. unacceptable segment.
  334.  
  335.  
  336.  
  337.  
  338. Jacobson, Braden & Zhang                                        [Page 6]
  339.  
  340. RFC 1185               TCP over High-Speed Paths            October 1990
  341.  
  342.  
  343.          R2)  If the segment is outside the window, reject it (normal
  344.               TCP processing)
  345.  
  346.          R3)  If an arriving segment is in-sequence (i.e, at the left
  347.               window edge), accept it normally and record its timestamp.
  348.  
  349.          R4)  Otherwise, treat the segment as a normal in-window, out-
  350.               of-sequence TCP segment (e.g., queue it for later delivery
  351.               to the user).
  352.  
  353.  
  354.          Steps R2-R4 are the normal TCP processing steps specified by
  355.          RFC-793, except that in R3 the latest timestamp is set from
  356.          each in-sequence segment that is accepted.  Thus, the latest
  357.          timestamp recorded at the receiver corresponds to the left edge
  358.          of the window and only advances when the left edge moves
  359.          [Jacobson88].
  360.  
  361.          It is important to note that the timestamp is checked only when
  362.          a segment first arrives at the receiver, regardless of whether
  363.          it is in-sequence or is queued.  Consider the following
  364.          example.
  365.  
  366.               Suppose the segment sequence: A.1, B.1, C.1, ..., Z.1 has
  367.               been sent, where the letter indicates the sequence number
  368.               and the digit represents the timestamp.  Suppose also that
  369.               segment B.1 has been lost.  The highest in-sequence
  370.               timestamp is 1 (from A.1), so C.1, ..., Z.1 are considered
  371.               acceptable and are queued.  When B is retransmitted as
  372.               segment B.2 (using the latest timestamp), it fills the
  373.               hole and causes all the segments through Z to be
  374.               acknowledged and passed to the user.  The timestamps of
  375.               the queued segments are *not* inspected again at this
  376.               time, since they have already been accepted.  When B.2 is
  377.               accepted, the receivers's current timestamp is set to 2.
  378.  
  379.          This rule is vital to allow reasonable performance under loss.
  380.          A full window of data is in transit at all times, and after a
  381.          loss a full window less one packet will show up out-of-sequence
  382.          to be queued at the receiver (e.g., up to ~2**30 bytes of
  383.          data); the timestamp option must not result in discarding this
  384.          data.
  385.  
  386.          In certain unlikely circumstances, the algorithm of rules R1-R4
  387.          could lead to discarding some segments unnecessarily, as shown
  388.          in the following example:
  389.  
  390.               Suppose again that segments: A.1, B.1, C.1, ..., Z.1 have
  391.  
  392.  
  393.  
  394. Jacobson, Braden & Zhang                                        [Page 7]
  395.  
  396. RFC 1185               TCP over High-Speed Paths            October 1990
  397.  
  398.  
  399.               been sent in sequence and that segment B.1 has been lost.
  400.               Furthermore, suppose delivery of some of C.1, ... Z.1 is
  401.               delayed until AFTER the retransmission B.2 arrives at the
  402.               receiver.  These delayed segments will be discarded
  403.               unnecessarily when they do arrive, since their timestamps
  404.               are now out of date.
  405.  
  406.          This case is very unlikely to occur.  If the retransmission was
  407.          triggered by a timeout, some of the segments C.1, ... Z.1 must
  408.          have been delayed longer than the RTO time.  This is presumably
  409.          an unlikely event, or there would be many spurious timeouts and
  410.          retransmissions.  If B's retransmission was triggered by the
  411.          "fast retransmit" algorithm, i.e., by duplicate ACK's, then the
  412.          queued segments that caused these ACK's must have been received
  413.          already.
  414.  
  415.          Even if a segment was delayed past the RTO, the selective
  416.          acknowledgment (SACK) facility of RFC-1072 will cause the
  417.          delayed packets to be retransmitted at the same time as B.2,
  418.          avoiding an extra RTT and therefore causing a very small
  419.          performance penalty.
  420.  
  421.          We know of no case with a significant probability of occurrence
  422.          in which timestamps will cause performance degradation by
  423.          unnecessarily discarding segments.
  424.  
  425.       2.3.2  Header Prediction
  426.  
  427.          "Header prediction" [Jacobson90] is a high-performance
  428.          transport protocol implementation technique that is is most
  429.          important for high-speed links.  This technique optimizes the
  430.          code for the most common case: receiving a segment correctly
  431.          and in order.  Using header prediction, the receiver asks the
  432.          question, "Is this segment the next in sequence?"  This
  433.          question can be answered in fewer machine instructions than the
  434.          question, "Is this segment within the window?"
  435.  
  436.          Adding header prediction to our timestamp procedure leads to
  437.          the following sequence for processing an arriving TCP segment:
  438.  
  439.          H1)  Check timestamp (same as step R1 above)
  440.  
  441.          H2)  Do header prediction: if segment is next in sequence and
  442.               if there are no special conditions requiring additional
  443.               processing, accept the segment, record its timestamp, and
  444.               skip H3.
  445.  
  446.          H3)  Process the segment normally, as specified in RFC-793.
  447.  
  448.  
  449.  
  450. Jacobson, Braden & Zhang                                        [Page 8]
  451.  
  452. RFC 1185               TCP over High-Speed Paths            October 1990
  453.  
  454.  
  455.               This includes dropping segments that are outside the
  456.               window and possibly sending acknowledgments, and queueing
  457.               in-window, out-of-sequence segments.
  458.  
  459.          However, the timestamp check in step H1 is very unlikely to
  460.          fail, and it is a relatively expensive operation since it
  461.          requires interval arithmetic on a finite field.  To perform
  462.          this check on every single segment seems like poor
  463.          implementation engineering, defeating the purpose of header
  464.          prediction.  Therefore, we suggest that an implementor
  465.          interchange H1 and H2, i.e., perform header prediction FIRST,
  466.          performing H1 and H3 only if header prediction fails.  We
  467.          believe that this change might gain 5-10% in performance on
  468.          high-speed networks.
  469.  
  470.          This reordering does raise a theoretical hazard: a segment from
  471.          2**32 bytes in the past may arrive at exactly the wrong time
  472.          and be accepted mistakenly by the header-prediction step.  We
  473.          make the following argument to show that the probability of
  474.          this failure is negligible.
  475.  
  476.               If all segments are equally likely to show up as old
  477.               duplicates, then the probability of an old duplicate
  478.               exactly matching the left window edge is the maximum
  479.               segment size (MSS) divided by the size of the sequence
  480.               space.  This ratio must be less than 2**-16, since MSS
  481.               must be < 2**16; for example, it will be (2**12)/(2**32) =
  482.               2**-20 for an FDDI link.  However, the older a segment is,
  483.               the less likely it is to be retained in the Internet, and
  484.               under any reasonable model of segment lifetime the
  485.               probability of an old duplicate exactly at the left window
  486.               edge must be much smaller than 2**16.
  487.  
  488.               The 16 bit TCP checksum also allows a basic unreliability
  489.               of one part in 2**16.  A protocol mechanism whose
  490.               reliability exceeds the reliability of the TCP checksum
  491.               should be considered "good enough", i.e., it won't
  492.               contribute significantly to the overall error rate.  We
  493.               therefore believe we can ignore the problem of an old
  494.               duplicate being accepted by doing header prediction before
  495.               checking the timestamp.
  496.  
  497.       2.3.3  Timestamp Frequency
  498.  
  499.          It is important to understand that the receiver algorithm for
  500.          timestamps does not involve clock synchronization with the
  501.          sender.  The sender's clock is used to stamp the segments, and
  502.          the sender uses this fact to measure RTT's.  However, the
  503.  
  504.  
  505.  
  506. Jacobson, Braden & Zhang                                        [Page 9]
  507.  
  508. RFC 1185               TCP over High-Speed Paths            October 1990
  509.  
  510.  
  511.          receiver treats the timestamp as simply a monotone-increasing
  512.          serial number, without any necessary connection to its clock.
  513.          From the receiver's viewpoint, the timestamp is acting as a
  514.          logical extension of the high-order bits of the sequence
  515.          number.
  516.  
  517.          However, the receiver algorithm dpes place some requirements on
  518.          the frequency of the timestamp "clock":
  519.  
  520.          (a)  Timestamp clock must not be "too slow".
  521.  
  522.               It must tick at least once for each 2**31 bytes sent.  In
  523.               fact, in order to be useful to the sender for round trip
  524.               timing, the clock should tick at least once per window's
  525.               worth of data, and even with the RFC-1072 window
  526.               extension, 2**31 bytes must be at least two windows.
  527.  
  528.               To make this more quantitative, any clock faster than 1
  529.               tick/sec will reject old duplicate segments for link
  530.               speeds of ~2 Gbps;  a 1ms clock will work up to link
  531.               speeds of 2 Tbps (10**12 bps!).
  532.  
  533.          (b)  Timestamp clock must not be "too fast".
  534.  
  535.               Its cycling time must be greater than MSL seconds.  Since
  536.               the clock (timestamp) is 32 bits and the worst-case MSL is
  537.               255 seconds, the maximum acceptable clock frequency is one
  538.               tick every 59 ns.
  539.  
  540.               However, since the sender is using the timestamp for RTT
  541.               calculations, the timestamp doesn't need to have much more
  542.               resolution than the granularity of the retransmit timer,
  543.               e.g., tens or hundreds of milliseconds.
  544.  
  545.          Thus, both limits are easily satisfied with a reasonable clock
  546.          rate in the range 1-100ms per tick.
  547.  
  548.          Using the timestamp option relaxes the requirements on MSL for
  549.          avoiding sequence number wrap-around.  For example, with a 1 ms
  550.          timestamp clock, the 32-bit timestamp will wrap its sign bit in
  551.          25 days.  Thus, it will reject old duplicates on the same
  552.          connection as long as MSL is 25 days or less.  This appears to
  553.          be a very safe figure.  If the timestamp has 10 ms resolution,
  554.          the MSL requirement is boosted to 250 days.  An MSL of 25 days
  555.          or longer can probably be assumed by the gateway system without
  556.          requiring precise MSL enforcement by the TTL value in the IP
  557.          layer.
  558.  
  559.  
  560.  
  561.  
  562. Jacobson, Braden & Zhang                                       [Page 10]
  563.  
  564. RFC 1185               TCP over High-Speed Paths            October 1990
  565.  
  566.  
  567. 3.  DUPLICATES FROM EARLIER INCARNATIONS OF CONNECTION
  568.  
  569.    We turn now to the second potential cause of old duplicate packet
  570.    errors: packets from an earlier incarnation of the same connection.
  571.    The appendix contains a review the mechanisms currently included in
  572.    TCP to handle this problem.  These mechanisms depend upon the
  573.    enforcement of a maximum segment lifetime (MSL) by the Internet
  574.    layer.
  575.  
  576.    The MSL required to prevent failures due to an earlier connection
  577.    incarnation does not depend (directly) upon the transfer rate.
  578.    However, the timestamp option used as described in Section 2 can
  579.    provide additional security against old duplicates from earlier
  580.    connections.  Furthermore, we will see that with the universal use of
  581.    the timestamp option, enforcement of a maximum segment lifetime would
  582.    no longer be required for reliable TCP operation.
  583.  
  584.    There are two cases to be considered (see the appendix for more
  585.    explanation):  (1) a system crashing (and losing connection state)
  586.    and restarting, and (2) the same connection being closed and reopened
  587.    without a loss of host state.  These will be described in the
  588.    following two sections.
  589.  
  590.    3.1  System Crash with Loss of State
  591.  
  592.       TCP's quiet time of one MSL upon system startup handles the loss
  593.       of connection state in a system crash/restart.  For an
  594.       explanation, see for example "When to Keep Quiet" in the TCP
  595.       protocol specification [Postel81].  The MSL that is required here
  596.       does not depend upon the transfer speed.  The current TCP MSL of 2
  597.       minutes seems acceptable as an operational compromise, as many
  598.       host systems take this long to boot after a crash.
  599.  
  600.       However, the timestamp option may be used to ease the MSL
  601.       requirements (or to provide additional security against data
  602.       corruption).  If timestamps are being used and if the timestamp
  603.       clock can be guaranteed to be monotonic over a system
  604.       crash/restart, i.e., if the first value of the sender's timestamp
  605.       clock after a crash/restart can be guaranteed to be greater than
  606.       the last value before the restart, then a quiet time will be
  607.       unnecessary.
  608.  
  609.       To dispense totally with the quiet time would seem to require that
  610.       the host clock be synchronized to a time source that is stable
  611.       over the crash/restart period, with an accuracy of one timestamp
  612.       clock tick or better.  Fortunately, we can back off from this
  613.       strict requirement.  Suppose that the clock is always re-
  614.       synchronized to within N timestamp clock ticks and that booting
  615.  
  616.  
  617.  
  618. Jacobson, Braden & Zhang                                       [Page 11]
  619.  
  620. RFC 1185               TCP over High-Speed Paths            October 1990
  621.  
  622.  
  623.       (extended with a quiet time, if necessary) takes more than N
  624.       ticks.  This will guarantee monotonicity of the timestamps, which
  625.       can then be used to reject old duplicates even without an enforced
  626.       MSL.
  627.  
  628.    3.2  Closing and Reopening a Connection
  629.  
  630.       When a TCP connection is closed, a delay of 2*MSL in TIME-WAIT
  631.       state ties up the socket pair for 4 minutes (see Section 3.5 of
  632.       [Postel81].  Applications built upon TCP that close one connection
  633.       and open a new one (e.g., an FTP data transfer connection using
  634.       Stream mode) must choose a new socket pair each time.  This delay
  635.       serves two different purposes:
  636.  
  637.       (a)  Implement the full-duplex reliable close handshake of TCP.
  638.  
  639.            The proper time to delay the final close step is not really
  640.            related to the MSL; it depends instead upon the RTO for the
  641.            FIN segments and therefore upon the RTT of the path.*
  642.            Although there is no formal upper-bound on RTT, common
  643.            network engineering practice makes an RTT greater than 1
  644.            minute very unlikely.  Thus, the 4 minute delay in TIME-WAIT
  645.            state works satisfactorily to provide a reliable full-duplex
  646.            TCP close.  Note again that this is independent of MSL
  647.            enforcement and network speed.
  648.  
  649.            The TIME-WAIT state could cause an indirect performance
  650.            problem if an application needed to repeatedly close one
  651.            connection and open another at a very high frequency, since
  652.            the number of available TCP ports on a host is less than
  653.            2**16.  However, high network speeds are not the major
  654.            contributor to this problem; the RTT is the limiting factor
  655.            in how quickly connections can be opened and closed.
  656.            Therefore, this problem will no worse at high transfer
  657.            speeds.
  658.  
  659.       (b)  Allow old duplicate segements to expire.
  660.  
  661.            Suppose that a host keeps a cache of the last timestamp
  662.            received from each remote host.  This can be used to reject
  663.            old duplicate segments from earlier incarnations of the
  664. _________________________
  665. *Note: It could be argued that the side that is sending  a  FIN  knows
  666. what  degree  of reliability it needs, and therefore it should be able
  667. to  determine  the  length  of  the  TIME-WAIT  delay  for  the  FIN's
  668. recipient.   This could be accomplished with an appropriate TCP option
  669. in FIN segments.
  670.  
  671.  
  672.  
  673.  
  674. Jacobson, Braden & Zhang                                       [Page 12]
  675.  
  676. RFC 1185               TCP over High-Speed Paths            October 1990
  677.  
  678.  
  679.            connection, if the timestamp clock can be guaranteed to have
  680.            ticked at least once since the old conennection was open.
  681.            This requires that the TIME-WAIT delay plus the RTT together
  682.            must be at least one tick of the sender's timestamp clock.
  683.  
  684.            Note that this is a variant on the mechanism proposed by
  685.            Garlick, Rom, and Postel (see the appendix), which required
  686.            each host to maintain connection records containing the
  687.            highest sequence numbers on every connection.  Using
  688.            timestamps instead, it is only necessary to keep one quantity
  689.            per remote host, regardless of the number of simultaneous
  690.            connections to that host.
  691.  
  692.       We conclude that if all hosts used the TCP timestamp algorithm
  693.       described in Section 2, enforcement of a maximum segment lifetime
  694.       would be unnecessary and the quiet time at system startup could be
  695.       shortened or removed.  In any case, the timestamp mechanism can
  696.       provide additional security against old duplicates from earlier
  697.       connection incarnations.   However, a 4 minute TIME-WAIT delay
  698.       (unrelated to MSL enforcement or network speed) must be retained
  699.       to provide the reliable close handshake of TCP.
  700.  
  701. 4. CONCLUSIONS
  702.  
  703.    We have presented a mechanism, based upon the TCP timestamp echo
  704.    option of RFC-1072, that will allow very high TCP transfer rates
  705.    without reliability problems due to old duplicate segments on the
  706.    same connection.  This mechanism also provides additional security
  707.    against intrusion of old duplicates from earlier incarnations of the
  708.    same connection.  If the timestamp mechanism were used by all hosts,
  709.    the quiet time at system startup could be eliminated and enforcement
  710.    of a maximum segment lifetime (MSL) would no longer be necessary.
  711.  
  712. REFERENCES
  713.  
  714.    [Cerf76]  Cerf, V., "TCP Resynchronization", Tech Note #79, Digital
  715.    Systems Lab, Stanford, January 1976.
  716.  
  717.    [Dalal74]  Dalal, Y., "More on Selecting Sequence Numbers", INWG
  718.    Protocol Note #4, October 1974.
  719.  
  720.    [Garlick77]  Garlick, L., R. Rom, and J. Postel, "Issues in Reliable
  721.    Host-to-Host Protocols", Proc. Second Berkeley Workshop on
  722.    Distributed Data Management and Computer Networks, May 1977.
  723.  
  724.    [Hamming77]  Hamming, R., "Digital Filters", ISBN 0-13-212571-4,
  725.    Prentice Hall, Englewood Cliffs, N.J., 1977.
  726.  
  727.  
  728.  
  729.  
  730. Jacobson, Braden & Zhang                                       [Page 13]
  731.  
  732. RFC 1185               TCP over High-Speed Paths            October 1990
  733.  
  734.  
  735.    [Jacobson88]  Jacobson, V., and R. Braden, "TCP Extensions for
  736.    Long-Delay Paths", RFC 1072, LBL and USC/Information Sciences
  737.    Institute, October 1988.
  738.  
  739.    [Jacobson90]  Jacobson, V., "4BSD Header Prediction", ACM Computer
  740.    Communication Review, April 1990.
  741.  
  742.    [McKenzie89]  McKenzie, A., "A Problem with the TCP Big Window
  743.    Option", RFC 1110, BBN STC, August 1989.
  744.  
  745.    [Postel81]  Postel, J., "Transmission Control Protocol", RFC 793,
  746.    DARPA, September 1981.
  747.  
  748.    [Tomlinson74]  Tomlinson, R., "Selecting Sequence Numbers", INWG
  749.    Protocol Note #2, September 1974.
  750.  
  751.    [Watson81]  Watson, R., "Timer-based Mechanisms in Reliable
  752.    Transport Protocol Connection Management", Computer Networks,
  753.    Vol. 5, 1981.
  754.  
  755.  
  756.  
  757.  
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764.  
  765.  
  766.  
  767.  
  768.  
  769.  
  770.  
  771.  
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786. Jacobson, Braden & Zhang                                       [Page 14]
  787.  
  788. RFC 1185               TCP over High-Speed Paths            October 1990
  789.  
  790.  
  791. APPENDIX -- Protection against Old Duplicates in TCP
  792.  
  793.    During the development of TCP, a great deal of effort was devoted to
  794.    the problem of protecting a TCP connection from segments left from
  795.    earlier incarnations of the same connection.  Several different
  796.    mechanisms were proposed for this purpose [Tomlinson74] [Dalal74]
  797.    [Cerf76] [Garlick77].
  798.  
  799.    The connection parameters that are required in this discussion are:
  800.  
  801.            Tc = Connection duration in seconds.
  802.  
  803.            Nc = Total number of bytes sent on connection.
  804.  
  805.            B = Effective bandwidth of connection = Nc/Tc.
  806.  
  807.    Tomlinson proposed a scheme with two parts: a clock-driven selection
  808.    of ISN (Initial Sequence Number) for a connection, and a
  809.    resynchronization procedure [Tomlinson74]. The clock-driven scheme
  810.    chooses:
  811.  
  812.       ISN = (integer(R*t)) mod 2**32                 [2]
  813.  
  814.    where t is the current time relative to an arbitrary origin, and R is
  815.    a constant.  R was intended to be chosen so that ISN will advance
  816.    faster than sequence numbers will be used up on the connection.
  817.    However, at high speeds this will not be true; the consequences of
  818.    this will be discussed below.
  819.  
  820.    The clock-driven choice of ISN in formula [2] guarantees freedom from
  821.    old duplicates matching a reopened connection if the original
  822.    connection was "short-lived" and "slow".  By "short-lived", we mean a
  823.    connection that stayed open for a time Tc less than the time to cycle
  824.    the ISN, i.e., Tc < 2**32/R seconds.  By "slow", we mean that the
  825.    effective transfer rate B is less than R.
  826.  
  827.    This is illustrated in Figure 1, where sequence numbers are plotted
  828.    against time.  The asterisks show the ISN lines from formula [2],
  829.    while the circles represent the trajectories of several short-lived
  830.    incarnations of the same connection, each terminating at the "x".
  831.  
  832.         Note: allowing rapid reuse of connections was believed to be an
  833.         important goal during the early TCP development.  This
  834.         requirement was driven by the hope that TCP would serve as a
  835.         basis for user-level transaction protocols as well as
  836.         connection-oriented protocols.  The paradigm discussed was the
  837.         "Christmas Tree" or "Kamikazee" segment that contained SYN and
  838.         FIN bits as well as data.  Enthusiasm for this was somewhat
  839.  
  840.  
  841.  
  842. Jacobson, Braden & Zhang                                       [Page 15]
  843.  
  844. RFC 1185               TCP over High-Speed Paths            October 1990
  845.  
  846.  
  847.         dampened when it was observed that the 3-way SYN handshake and
  848.         the FIN handshake mean that 5 packets are required for a minimum
  849.         exchange. Furthermore, the TIME-WAIT state delay implies that
  850.         the same connection really cannot be reopened immediately.  No
  851.         further work has been done in this area, although existing
  852.         applications (especially SMTP) often generate very short TCP
  853.         sessions.  The reuse problem is generally avoided by using a
  854.         different port pair for each connection.
  855.  
  856.  
  857.         |- 2**32       ISN             ISN
  858.         |              *               *
  859.         |             *               *
  860.         |            *               *
  861.         |           *x              *
  862.         |          o               *
  863.     ^   |         *               *
  864.     |   |        *  x            *
  865.         |       * o             *
  866.     S   |      *o              *
  867.     e   |     o               *
  868.     q   |    *               *
  869.         |   *               *
  870.     #   |  * x             *
  871.         | *o              *
  872.         |o_______________*____________
  873.                          ^         Time -->
  874.                        4.55hrs
  875.  
  876.  
  877.      Figure 1.  Clock-Driven ISN  avoiding duplication on
  878.                 short-Lived, slow connections.
  879.  
  880.  
  881.    However, clock-driven ISN selection does not protect against old
  882.    duplicate packets for a long-lived or fast connection:  the
  883.    connection may close (or crash) just as the ISN has cycled around and
  884.    reached the same value again.  If the connection is then reopened, a
  885.    datagram still in transit from the old connection may fall into the
  886.    current window.  This is illustrated by Figure 2 for a slow, long-
  887.    lived connection, and by Figures 3 and 4 for fast connections.  In
  888.    each case, the point "x" marks the place at which the original
  889.    connection closes or crashes.  The arrow in Figure 2 illustrates an
  890.    old duplicate segment.  Figure 3 shows a connection whose total byte
  891.    count Nc < 2**32, while Figure 4 concerns Nc >= 2**32.
  892.  
  893.    To prevent the duplication illustrated in Figure 2, Tomlinson
  894.    proposed to "resynchronize" the connection sequence numbers if they
  895.  
  896.  
  897.  
  898. Jacobson, Braden & Zhang                                       [Page 16]
  899.  
  900. RFC 1185               TCP over High-Speed Paths            October 1990
  901.  
  902.  
  903.    came within an MSL of the ISN.  Resynchronization might take the form
  904.    of a delay (point "y") or the choice of a new sequence number (point
  905.    "z").
  906.  
  907.         |- 2**32       ISN               ISN
  908.         |              *                 *
  909.         |             *                 *
  910.         |            *                 *
  911.         |           *                 *
  912.         |          *                 *
  913.     ^   |         *                 *
  914.     |   |        *                 *
  915.         |       *                 *
  916.     S   |      *                 *
  917.     e   |     *                x* y
  918.     q   |    *           o     *
  919.         |   *      o          *z
  920.     #   |  *o                *
  921.         | *                 *
  922.         |*_________________*____________
  923.                            ^         Time -->
  924.                           4.55hrs
  925.  
  926.         Figure 2.  Resynchronization to Avoid Duplication
  927.                    on Slow, Long-Lived Connection
  928.  
  929.  
  930.  
  931.         |- 2**32       ISN               ISN
  932.         |              *                 *
  933.         |       x   o *                 *
  934.         |            *                 *
  935.         |      o-->o*                 *
  936.         |          *                 *
  937.     ^   |     o   o                 *
  938.     |   |        *                 *
  939.         |    o  *                 *
  940.     S   |      *                 *
  941.     e   |   o *                 *
  942.     q   |    *                 *
  943.         |  o*                 *
  944.     #   |  *                 *
  945.         | o                 *
  946.         |*_________________*____________
  947.                            ^         Time -->
  948.                           4.55hrs
  949.  
  950.      Figure 3.  Duplication on Fast Connection: Nc < 2**32 bytes
  951.  
  952.  
  953.  
  954. Jacobson, Braden & Zhang                                       [Page 17]
  955.  
  956. RFC 1185               TCP over High-Speed Paths            October 1990
  957.  
  958.  
  959.         |- 2**32       ISN               ISN
  960.         |      o       *                 *
  961.         |           x *                 *
  962.         |            *                 *
  963.         |     o     *                 *
  964.         |          o                 *
  965.     ^   |         *                 *
  966.     |   |    o   *                 *
  967.         |       * o               *
  968.     S   |      *                *
  969.     e   |   o *                 *
  970.     q   |    *   o             *
  971.         |   *                 *
  972.     #   |  o                 *
  973.         | *     o           *
  974.         |*_________________*____________
  975.                            ^         Time -->
  976.                           4.55hrs
  977.  
  978.      Figure 4.  Duplication on Fast Connection: Nc > 2**32 bytes
  979.  
  980.    In summary, Figures 1-4 illustrated four possible failure modes for
  981.    old duplicate packets from an earlier incarnation.  We will call
  982.    these four modes F1 , F2, F3, and F4:
  983.  
  984.  
  985.    F1:  B < R, Tc < 4.55 hrs. (Figure 1)
  986.  
  987.    F2:  B < R, Tc >= 4.55 hrs. (Figure 2)
  988.  
  989.    F3:  B >= R, Nc < 2**32 (Figure 3)
  990.  
  991.    F4:  B >= R, Nc >= 2**32 (Figure 4)
  992.  
  993.  
  994.    Another limitation of clock-driven ISN selection should be mentioned.
  995.    Tomlinson assumed that the current time t in formula [2] is obtained
  996.    from a clock that is persistent over a system crash.  For his scheme
  997.    to work correctly, the clock must be restarted with an accuracy of
  998.    1/R seconds (e.g, 4 microseconds in the case of TCP).  While this may
  999.    be possible for some hosts and some crashes, in most cases there will
  1000.    be an uncertainty in the clock after a crash that ranges from a
  1001.    second to several minutes.
  1002.  
  1003.    As a result of this random clock offset after system
  1004.    reinitialization, there is a possibility that old segments sent
  1005.    before the crash may fall into the window of a new connection
  1006.    incarnation.  The solution to this problem that was adopted in the
  1007.  
  1008.  
  1009.  
  1010. Jacobson, Braden & Zhang                                       [Page 18]
  1011.  
  1012. RFC 1185               TCP over High-Speed Paths            October 1990
  1013.  
  1014.  
  1015.    final TCP spec is a "quiet time" of MSL seconds when the system is
  1016.    initialized [Postel81, p. 28].  No TCP connection can be opened until
  1017.    the expiration of this quiet time.
  1018.  
  1019.    A different approach was suggested by Garlick, Rom, and Postel
  1020.    [Garlick77].  Rather than using clock-driven ISN selection, they
  1021.    proposed to maintain connection records containing the last ISN used
  1022.    on every connection.  To immediately open a new incarnation of a
  1023.    connection, the ISN is taken to be greater than the last sequence
  1024.    number of the previous incarnation, so that the new incarnation will
  1025.    have unique sequence numbers.  To handle a system crash, they
  1026.    proposed a quiet time, i.e., a delay at system startup time to allow
  1027.    old duplicates to expire.  Note that the connection records need be
  1028.    kept only for MSL seconds; after that, no collision is possible, and
  1029.    a new connection can start with sequence number zero.
  1030.  
  1031.    The scheme finally adopted for TCP combines features of both these
  1032.    proposals.  TCP uses three mechanisms:
  1033.  
  1034.    (A)  ISN selection is clock-driven to handle short-lived connections.
  1035.         The parameter R =  250KBps, so that the ISN value cycles in
  1036.         2**32/R = 4.55 hours.
  1037.  
  1038.    (B)  (One end of) a closed connection is left in a "busy" state,
  1039.         known as "TIME-WAIT" state, for a time of 2*MSL.  TIME-WAIT
  1040.         state handles the proper close of a long-lived connection
  1041.         without resynchronization.  It also allows reliable completion
  1042.         of the full-duplex close handshake.
  1043.  
  1044.    (C)  There is a quiet time of one MSL at system startup.  This
  1045.         handles a crash of a long-lived connection and avoids time
  1046.         resynchronization problems in (A).
  1047.  
  1048.    Notice that (B) and (C) together are logically sufficient to prevent
  1049.    accidental reuse of sequence numbers from a different incarnation,
  1050.    for any of the failure modes F1-F4.  (A) is not logically necessary
  1051.    since the close delay (B) makes it impossible to reopen the same TCP
  1052.    connection immediately.  However, the use of (A) does give additional
  1053.    assurance in a common case, perhaps compensating for a host that has
  1054.    set its TIME-WAIT state delay too short.
  1055.  
  1056.    Some TCP implementations have permitted a connection in the TIME-WAIT
  1057.    state to be reopened immediately by the other side, thus short-
  1058.    circuiting mechanism (B).  Specifically, a new SYN for the same
  1059.    socket pair is accepted when the earlier incarnation is still in
  1060.    TIME-WAIT state.  Old duplicates in one direction can be avoided by
  1061.    choosing the ISN to be the next unused sequence number from the
  1062.    preceding connection (i.e., FIN+1); this is essentially an
  1063.  
  1064.  
  1065.  
  1066. Jacobson, Braden & Zhang                                       [Page 19]
  1067.  
  1068. RFC 1185               TCP over High-Speed Paths            October 1990
  1069.  
  1070.  
  1071.    application of the scheme of Garlick, Rom, and Postel, using the
  1072.    connection block in TIME-WAIT state as the connection record.
  1073.  
  1074.    However, the connection is still vulnerable to old duplicates in the
  1075.    other direction.  Mechanism (A) prevents trouble in mode F1, but
  1076.    failures can arise in F2, F3, or F4; of these, F2, on short, fast
  1077.    connections, is the most dangerous.
  1078.  
  1079.    Finally, we note TCP will operate reliably without any MSL-based
  1080.    mechanisms in the following restricted domain:
  1081.  
  1082.    *    Total data sent is less then 2**32 octets, and
  1083.  
  1084.    *    Effective sustained rate less than 250KBps, and
  1085.  
  1086.    *    Connection duration less than 4.55 hours.
  1087.  
  1088.    At the present time, the great majority of current TCP usage falls
  1089.    into this restricted domain.  The third component, connection
  1090.    duration, is the most commonly violated.
  1091.  
  1092. Security Considerations
  1093.  
  1094.    Security issues are not discussed in this memo.
  1095.  
  1096. Authors' Addresses
  1097.  
  1098.    Van Jacobson
  1099.    University of California
  1100.    Lawrence Berkeley Laboratory
  1101.    Mail Stop 46A
  1102.    Berkeley, CA 94720
  1103.  
  1104.    Phone: (415) 486-6411
  1105.    EMail: van@CSAM.LBL.GOV
  1106.  
  1107.  
  1108.    Bob Braden
  1109.    University of Southern California
  1110.    Information Sciences Institute
  1111.    4676 Admiralty Way
  1112.    Marina del Rey, CA 90292
  1113.  
  1114.    Phone: (213) 822-1511
  1115.    EMail: Braden@ISI.EDU
  1116.  
  1117.  
  1118.  
  1119.  
  1120.  
  1121.  
  1122. Jacobson, Braden & Zhang                                       [Page 20]
  1123.  
  1124. RFC 1185               TCP over High-Speed Paths            October 1990
  1125.  
  1126.  
  1127.    Lixia Zhang
  1128.    XEROX Palo Alto Research Center
  1129.    3333 Coyote Hill Road
  1130.    Palo Alto, CA 94304
  1131.  
  1132.    Phone: (415) 494-4415
  1133.    EMail: lixia@PARC.XEROX.COM
  1134.  
  1135.  
  1136.  
  1137.  
  1138.  
  1139.  
  1140.  
  1141.  
  1142.  
  1143.  
  1144.  
  1145.  
  1146.  
  1147.  
  1148.  
  1149.  
  1150.  
  1151.  
  1152.  
  1153.  
  1154.  
  1155.  
  1156.  
  1157.  
  1158.  
  1159.  
  1160.  
  1161.  
  1162.  
  1163.  
  1164.  
  1165.  
  1166.  
  1167.  
  1168.  
  1169.  
  1170.  
  1171.  
  1172.  
  1173.  
  1174.  
  1175.  
  1176.  
  1177.  
  1178. Jacobson, Braden & Zhang                                       [Page 21]
  1179.