Tech-invite3GPPspaceIETFspace
96959493929190898887868584838281807978777675747372717069686766656463626160595857565554535251504948474645444342414039383736353433323130292827262524232221201918171615141312111009080706050403020100
in Index   Prev   Next

RFC 4340

Datagram Congestion Control Protocol (DCCP)

Pages: 129
Proposed Standard
Errata
Updated by:  5595559663356773
Part 2 of 5 – Pages 18 to 44
First   Prev   Next

Top   ToC   RFC4340 - Page 18   prevText

5. Packet Formats

The DCCP header can be from 12 to 1020 bytes long. The initial part of the header has the same semantics for all currently defined packet types. Following this comes any additional fixed-length fields required by the packet type, and then a variable-length list of options. The application data area follows the header. In some packet types, this area contains data for the application; in other packet types, its contents are ignored.
Top   ToC   RFC4340 - Page 19
      +---------------------------------------+  -.
      |            Generic Header             |   |
      +---------------------------------------+   |
      | Additional Fields (depending on type) |   +- DCCP Header
      +---------------------------------------+   |
      |          Options (optional)           |   |
      +=======================================+  -'
      |         Application Data Area         |
      +---------------------------------------+

5.1. Generic Header

The DCCP generic header takes different forms depending on the value of X, the Extended Sequence Numbers bit. If X is one, the Sequence Number field is 48 bits long, and the generic header takes 16 bytes, as follows. 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Dest Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data Offset | CCVal | CsCov | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | |X| | . | Res | Type |=| Reserved | Sequence Number (high bits) . | | |1| | . +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ . Sequence Number (low bits) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ If X is zero, only the low 24 bits of the Sequence Number are transmitted, and the generic header is 12 bytes long. 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Dest Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data Offset | CCVal | CsCov | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | |X| | | Res | Type |=| Sequence Number (low bits) | | | |0| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Top   ToC   RFC4340 - Page 20
   The generic header fields are defined as follows.

   Source and Destination Ports: 16 bits each
      These fields identify the connection, similar to the corresponding
      fields in TCP and UDP.  The Source Port represents the relevant
      port on the endpoint that sent this packet, and the Destination
      Port represents the relevant port on the other endpoint.  When
      initiating a connection, the client SHOULD choose its Source Port
      randomly to reduce the likelihood of attack.

      DCCP APIs should treat port numbers similarly to TCP and UDP port
      numbers.  For example, machines that distinguish between
      "privileged" and "unprivileged" ports for TCP and UDP should do
      the same for DCCP.

   Data Offset: 8 bits
      The offset from the start of the packet's DCCP header to the start
      of its application data area, in 32-bit words.  The receiver MUST
      ignore packets whose Data Offset is smaller than the minimum-sized
      header for the given Type or larger than the DCCP packet itself.

   CCVal: 4 bits
      Used by the HC-Sender CCID.  For example, the A-to-B CCID's
      sender, which is active at DCCP A, MAY send 4 bits of information
      per packet to its receiver by encoding that information in CCVal.
      The sender MUST set CCVal to zero unless its HC-Sender CCID
      specifies otherwise, and the receiver MUST ignore the CCVal field
      unless its HC-Receiver CCID specifies otherwise.

   Checksum Coverage (CsCov): 4 bits
      Checksum Coverage determines the parts of the packet that are
      covered by the Checksum field.  This always includes the DCCP
      header and options, but some or all of the application data may be
      excluded.  This can improve performance on noisy links for
      applications that can tolerate corruption.  See Section 9.

   Checksum: 16 bits
      The Internet checksum of the packet's DCCP header (including
      options), a network-layer pseudoheader, and, depending on Checksum
      Coverage, all, some, or none of the application data.  See Section
      9.

   Reserved (Res): 3 bits
      Senders MUST set this field to all zeroes on generated packets,
      and receivers MUST ignore its value.
Top   ToC   RFC4340 - Page 21
   Type: 4 bits
      The Type field specifies the type of the packet.  The following
      values are defined:

                         Type   Meaning
                         ----   -------
                           0    DCCP-Request
                           1    DCCP-Response
                           2    DCCP-Data
                           3    DCCP-Ack
                           4    DCCP-DataAck
                           5    DCCP-CloseReq
                           6    DCCP-Close
                           7    DCCP-Reset
                           8    DCCP-Sync
                           9    DCCP-SyncAck
                         10-15  Reserved

                     Table 1: DCCP Packet Types

      Receivers MUST ignore any packets with reserved type.  That is,
      packets with reserved type MUST NOT be processed, and they MUST
      NOT be acknowledged as received.

   Extended Sequence Numbers (X): 1 bit
      Set to one to indicate the use of an extended generic header with
      48-bit Sequence and Acknowledgement Numbers.  DCCP-Data, DCCP-
      DataAck, and DCCP-Ack packets MAY set X to zero or one.  All
      DCCP-Request, DCCP-Response, DCCP-CloseReq, DCCP-Close, DCCP-
      Reset, DCCP-Sync, and DCCP-SyncAck packets MUST set X to one;
      endpoints MUST ignore any such packets with X set to zero.  High-
      rate connections SHOULD set X to one on all packets to gain
      increased protection against wrapped sequence numbers and attacks.
      See Section 7.6.

   Sequence Number: 48 or 24 bits
      Identifies the packet uniquely in the sequence of all packets the
      source sent on this connection.  Sequence Number increases by one
      with every packet sent, including packets such as DCCP-Ack that
      carry no application data.  See Section 7.

   All currently defined packet types except DCCP-Request and DCCP-Data
   carry an Acknowledgement Number Subheader in the four or eight bytes
   immediately following the generic header.  When X=1, its format is:
Top   ToC   RFC4340 - Page 22
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |           Reserved            |    Acknowledgement Number     .
      |                               |          (high bits)          .
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      .               Acknowledgement Number (low bits)               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   When X=0, only the low 24 bits of the Acknowledgement Number are
   transmitted, giving the Acknowledgement Number Subheader this format:

      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |   Reserved    |       Acknowledgement Number (low bits)       |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Reserved: 16 or 8 bits
      Senders MUST set this field to all zeroes on generated packets,
      and receivers MUST ignore its value.

   Acknowledgement Number: 48 or 24 bits
      Generally contains GSR, the Greatest Sequence Number Received on
      any acknowledgeable packet so far.  A packet is acknowledgeable
      if and only if its header was successfully processed by the
      receiver; Section 7.4 describes this further.  Options such as
      Ack Vector (Section 11.4) combine with the Acknowledgement
      Number to provide precise information about which packets have
      arrived.

      Acknowledgement Numbers on DCCP-Sync and DCCP-SyncAck packets
      need not equal GSR.  See Section 5.7.

5.2. DCCP-Request Packets

A client initiates a DCCP connection by sending a DCCP-Request packet. These packets MAY contain application data and MUST use 48-bit sequence numbers (X=1). 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / Generic DCCP Header with X=1 (16 bytes) / / with Type=0 (DCCP-Request) / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Service Code | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / Options and Padding / +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ / Application Data / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Top   ToC   RFC4340 - Page 23
   Service Code: 32 bits
      Describes the application-level service to which the client
      application wants to connect.  Service Codes are intended to
      provide information about which application protocol a connection
      intends to use, thus aiding middleboxes and reducing reliance on
      globally well-known ports.  See Section 8.1.2.

5.3. DCCP-Response Packets

The server responds to valid DCCP-Request packets with DCCP-Response packets. This is the second phase of the three-way handshake. DCCP-Response packets MAY contain application data and MUST use 48-bit sequence numbers (X=1). 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / Generic DCCP Header with X=1 (16 bytes) / / with Type=1 (DCCP-Response) / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / Acknowledgement Number Subheader (8 bytes) / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Service Code | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / Options and Padding / +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ / Application Data / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Acknowledgement Number: 48 bits Contains GSR. Since DCCP-Responses are only sent during connection initiation, this will always equal the Sequence Number on a received DCCP-Request. Service Code: 32 bits MUST equal the Service Code on the corresponding DCCP-Request.

5.4. DCCP-Data, DCCP-Ack, and DCCP-DataAck Packets

The central data transfer portion of every DCCP connection uses DCCP-Data, DCCP-Ack, and DCCP-DataAck packets. These packets MAY use 24-bit sequence numbers, depending on the value of the Allow Short Sequence Numbers feature (Section 7.6.1). DCCP-Data packets carry application data without acknowledgements.
Top   ToC   RFC4340 - Page 24
       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      /              Generic DCCP Header (16 or 12 bytes)             /
      /                    with Type=2 (DCCP-Data)                    /
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      /                      Options and Padding                      /
      +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
      /                       Application Data                        /
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   DCCP-Ack packets dispense with the data but contain an
   Acknowledgement Number.  They are used for pure acknowledgements.

       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      /              Generic DCCP Header (16 or 12 bytes)             /
      /                    with Type=3 (DCCP-Ack)                     /
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      /        Acknowledgement Number Subheader (8 or 4 bytes)        /
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      /                      Options and Padding                      /
      +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
      /                Application Data Area (Ignored)                /
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   DCCP-DataAck packets carry both application data and an
   Acknowledgement Number.  This piggybacks acknowledgement information
   on a data packet.

       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      /              Generic DCCP Header (16 or 12 bytes)             /
      /                  with Type=4 (DCCP-DataAck)                   /
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      /        Acknowledgement Number Subheader (8 or 4 bytes)        /
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      /                      Options and Padding                      /
      +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
      /                       Application Data                        /
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   A DCCP-Data or DCCP-DataAck packet may have a zero-length application
   data area, which indicates that the application sent a zero-length
   datagram.  This differs from DCCP-Request and DCCP-Response packets,
   where an empty application data area indicates the absence of
Top   ToC   RFC4340 - Page 25
   application data (not the presence of zero-length application data).
   The API SHOULD report any received zero-length datagrams to the
   receiving application.

   A DCCP-Ack packet MAY have a non-zero-length application data area,
   which essentially pads the DCCP-Ack to a desired length.  Receivers
   MUST ignore the content of the application data area in DCCP-Ack
   packets.

   DCCP-Ack and DCCP-DataAck packets often include additional
   acknowledgement options, such as Ack Vector, as required by the
   congestion control mechanism in use.

5.5. DCCP-CloseReq and DCCP-Close Packets

DCCP-CloseReq and DCCP-Close packets begin the handshake that normally terminates a connection. Either client or server may send a DCCP-Close packet, which will elicit a DCCP-Reset packet. Only the server can send a DCCP-CloseReq packet, which indicates that the server wants to close the connection but does not want to hold its TIMEWAIT state. Both packet types MUST use 48-bit sequence numbers (X=1). 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / Generic DCCP Header with X=1 (16 bytes) / / with Type=5 (DCCP-CloseReq) or 6 (DCCP-Close) / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / Acknowledgement Number Subheader (8 bytes) / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / Options and Padding / +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ / Application Data Area (Ignored) / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ As with DCCP-Ack packets, DCCP-CloseReq and DCCP-Close packets MAY have non-zero-length application data areas, whose contents receivers MUST ignore.

5.6. DCCP-Reset Packets

DCCP-Reset packets unconditionally shut down a connection. Connections normally terminate with a DCCP-Reset, but resets may be sent for other reasons, including bad port numbers, bad option behavior, incorrect ECN Nonce Echoes, and so forth. DCCP-Resets MUST use 48-bit sequence numbers (X=1).
Top   ToC   RFC4340 - Page 26
       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      /            Generic DCCP Header with X=1 (16 bytes)            /
      /                   with Type=7 (DCCP-Reset)                    /
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      /          Acknowledgement Number Subheader (8 bytes)           /
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Reset Code   |    Data 1     |    Data 2     |    Data 3     |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      /                      Options and Padding                      /
      +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
      /              Application Data Area (Error Text)               /
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   Reset Code: 8 bits
      Represents the reason that the sender reset the DCCP connection.

   Data 1, Data 2, and Data 3: 8 bits each
      The Data fields provide additional information about why the
      sender reset the DCCP connection.  The meanings of these fields
      depend on the value of Reset Code.

   Application Data Area: Error Text
      If present, Error Text is a human-readable text string encoded in
      Unicode UTF-8, and preferably in English, that describes the error
      in more detail.  For example, a DCCP-Reset with Reset Code 11,
      "Aggression Penalty", might contain Error Text such as "Aggression
      Penalty: Received 3 bad ECN Nonce Echoes, assuming misbehavior".

   The following Reset Codes are currently defined.  Unless otherwise
   specified, the Data 1, 2, and 3 fields MUST be set to 0 by the sender
   of the DCCP-Reset and ignored by its receiver.  Section references
   describe concrete situations that will cause each Reset Code to be
   generated; they are not meant to be exhaustive.

   0, "Unspecified"
      Indicates the absence of a meaningful Reset Code.  Use of Reset
      Code 0 is NOT RECOMMENDED: the sender should choose a Reset Code
      that more clearly defines why the connection is being reset.

   1, "Closed"
      Normal connection close.  See Section 8.3.

   2, "Aborted"
      The sending endpoint gave up on the connection because of lack of
      progress.  See Sections 8.1.1 and 8.1.5.
Top   ToC   RFC4340 - Page 27
   3, "No Connection"
      No connection exists.  See Section 8.3.1.

   4, "Packet Error"
      A valid packet arrived with unexpected type.  For example, a
      DCCP-Data packet with valid header checksum and sequence numbers
      arrived at a connection in the REQUEST state.  See Section 8.3.1.
      The Data 1 field equals the offending packet type as an eight-bit
      number; thus, an offending packet with Type 2 will result in a
      Data 1 value of 2.

   5, "Option Error"
      An option was erroneous, and the error was serious enough to
      warrant resetting the connection.  See Sections 6.6.7, 6.6.8, and
      11.4.  The Data 1 field equals the offending option type; Data 2
      and Data 3 equal the first two bytes of option data (or zero if
      the option had less than two bytes of data).

   6, "Mandatory Error"
      The sending endpoint could not process an option O that was
      immediately preceded by Mandatory.  The Data fields report the
      option type and data of option O, using the format of Reset Code
      5, "Option Error".  See Section 5.8.2.

   7, "Connection Refused"
      The Destination Port didn't correspond to a port open for
      listening.  Sent only in response to DCCP-Requests.  See Section
      8.1.3.

   8, "Bad Service Code"
      The Service Code didn't equal the service code attached to the
      Destination Port.  Sent only in response to DCCP-Requests.  See
      Section 8.1.3.

   9, "Too Busy"
      The server is too busy to accept new connections.  Sent only in
      response to DCCP-Requests.  See Section 8.1.3.

   10, "Bad Init Cookie"
      The Init Cookie echoed by the client was incorrect or missing.
      See Section 8.1.4.

   11, "Aggression Penalty"
      This endpoint has detected congestion control-related misbehavior
      on the part of the other endpoint.  See Section 12.3.
Top   ToC   RFC4340 - Page 28
   12-127, Reserved
      Receivers should treat these codes as they do Reset Code 0,
      "Unspecified".

   128-255, CCID-specific codes
      Semantics depend on the connection's CCIDs.  See Section 10.3.
      Receivers should treat unknown CCID-specific Reset Codes as they
      do Reset Code 0, "Unspecified".

   The following table summarizes this information.

          Reset
          Code   Name                    Data 1     Data 2 & 3
          -----  ----                    ------     ----------
            0    Unspecified               0            0
            1    Closed                    0            0
            2    Aborted                   0            0
            3    No Connection             0            0
            4    Packet Error           pkt type        0
            5    Option Error           option #   option data
            6    Mandatory Error        option #   option data
            7    Connection Refused        0            0
            8    Bad Service Code          0            0
            9    Too Busy                  0            0
           10    Bad Init Cookie           0            0
           11    Aggression Penalty        0            0
          12-127 Reserved
         128-255 CCID-specific codes

                        Table 2: DCCP Reset Codes

   Options on DCCP-Reset packets are processed before the connection is
   shut down.  This means that certain combinations of options,
   particularly involving Mandatory, may cause an endpoint to respond to
   a valid DCCP-Reset with another DCCP-Reset.  This cannot lead to a
   reset storm; since the first endpoint has already reset the
   connection, the second DCCP-Reset will be ignored.

5.7. DCCP-Sync and DCCP-SyncAck Packets

DCCP-Sync packets help DCCP endpoints recover synchronization after bursts of loss and recover from half-open connections. Each valid received DCCP-Sync immediately elicits a DCCP-SyncAck. Both packet types MUST use 48-bit sequence numbers (X=1).
Top   ToC   RFC4340 - Page 29
       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      /            Generic DCCP Header with X=1 (16 bytes)            /
      /          with Type=8 (DCCP-Sync) or 9 (DCCP-SyncAck)          /
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      /          Acknowledgement Number Subheader (8 bytes)           /
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      /                      Options and Padding                      /
      +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
      /                Application Data Area (Ignored)                /
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   The Acknowledgement Number field has special semantics for DCCP-Sync
   and DCCP-SyncAck packets.  First, the packet corresponding to a
   DCCP-Sync's Acknowledgement Number need not have been
   acknowledgeable.  Thus, receivers MUST NOT assume that a packet was
   processed simply because it appears in the Acknowledgement Number
   field of a DCCP-Sync packet.  This differs from all other packet
   types, where the Acknowledgement Number by definition corresponds to
   an acknowledgeable packet.  Second, the Acknowledgement Number on any
   DCCP-SyncAck packet MUST correspond to the Sequence Number on an
   acknowledgeable DCCP-Sync packet.  In the presence of reordering,
   this might not equal GSR.

   As with DCCP-Ack packets, DCCP-Sync and DCCP-SyncAck packets MAY have
   non-zero-length application data areas, whose contents receivers MUST
   ignore.  Padded DCCP-Sync packets may be useful when performing Path
   MTU discovery; see Section 14.

5.8. Options

Any DCCP packet may contain options, which occupy space at the end of the DCCP header. Each option is a multiple of 8 bits in length. Individual options are not padded to multiples of 32 bits, and any option may begin on any byte boundary. However, the combination of all options MUST add up to a multiple of 32 bits; Padding options MUST be added as necessary to fill out option space to a word boundary. Any options present are included in the header checksum. The first byte of an option is the option type. Options with types 0 through 31 are single-byte options. Other options are followed by a byte indicating the option's length. This length value includes the two bytes of option-type and option-length as well as any option-data bytes; it must therefore be greater than or equal to two. Options MUST be processed sequentially, starting with the first option in the packet header. Options with unknown types MUST be
Top   ToC   RFC4340 - Page 30
   ignored.  Also, options with nonsensical lengths (length byte less
   than two or more than the remaining space in the options portion of
   the header) MUST be ignored, and any option space following an option
   with nonsensical length MUST likewise be ignored.  Unless otherwise
   specified, multiple occurrences of the same option MUST be processed
   independently; for some options, this will mean in practice that the
   last valid occurrence of an option takes precedence.

   The following options are currently defined:

               Option                           DCCP-  Section
       Type    Length     Meaning               Data?  Reference
       ----    ------     -------               -----  ---------
         0        1       Padding                 Y      5.8.1
         1        1       Mandatory               N      5.8.2
         2        1       Slow Receiver           Y      11.6
       3-31       1       Reserved
        32     variable   Change L                N      6.1
        33     variable   Confirm L               N      6.2
        34     variable   Change R                N      6.1
        35     variable   Confirm R               N      6.2
        36     variable   Init Cookie             N      8.1.4
        37       3-8      NDP Count               Y      7.7
        38     variable   Ack Vector [Nonce 0]    N      11.4
        39     variable   Ack Vector [Nonce 1]    N      11.4
        40     variable   Data Dropped            N      11.7
        41        6       Timestamp               Y      13.1
        42      6/8/10    Timestamp Echo          Y      13.3
        43       4/6      Elapsed Time            N      13.2
        44        6       Data Checksum           Y      9.3
       45-127  variable   Reserved
      128-255  variable   CCID-specific options   -      10.3

                        Table 3: DCCP Options

   Not all options are suitable for all packet types.  For example,
   since the Ack Vector option is interpreted relative to the
   Acknowledgement Number, it isn't suitable on DCCP-Request and DCCP-
   Data packets, which have no Acknowledgement Number.  If an option
   occurs on an unexpected packet type, it MUST generally be ignored;
   any such restrictions are mentioned in each option's description.
   The table summarizes the most common restriction: when the DCCP-
   Data? column value is N, the corresponding option MUST be ignored
   when received on a DCCP-Data packet.  (Section 7.5.5 describes why
   such options are ignored as opposed to, say, causing a reset.)

   Options with invalid values MUST be ignored unless otherwise
   specified.  For example, any Data Checksum option with option length
Top   ToC   RFC4340 - Page 31
   4 MUST be ignored, since all valid Data Checksum options have option
   length 6.

   This section describes two generic options, Padding and Mandatory.
   Other options are described later.

5.8.1. Padding Option

+--------+ |00000000| +--------+ Type=0 Padding is a single-byte "no-operation" option used to pad between or after options. If the length of a packet's other options is not a multiple of 32 bits, then Padding options are REQUIRED to pad out the options area to the length implied by Data Offset. Padding may also be used between options; for example, to align the beginning of a subsequent option on a 32-bit boundary. There is no guarantee that senders will use this option, so receivers must be prepared to process options even if they do not begin on a word boundary.

5.8.2. Mandatory Option

+--------+ |00000001| +--------+ Type=1 Mandatory is a single-byte option that marks the immediately following option as mandatory. Say that the immediately following option is O. Then the Mandatory option has no effect if the receiving DCCP endpoint understands and processes O. If the endpoint does not understand or process O, however, then it MUST reset the connection using Reset Code 6, "Mandatory Failure". For instance, the endpoint would reset the connection if it did not understand O's type; if it understood O's type, but not O's data; if O's data was invalid for O's type; if O was a feature negotiation option, and the endpoint did not understand the enclosed feature number; or if the endpoint understood O, but chose not to perform the action O implies. This list is not exhaustive and, in particular, individual option specifications may describe additional situations in which the endpoint should reset the connection and situations in which it should not. Mandatory options MUST NOT be sent on DCCP-Data packets, and any Mandatory options received on DCCP-Data packets MUST be ignored.
Top   ToC   RFC4340 - Page 32
   The connection is in error and should be reset with Reset Code 5,
   "Option Error", if option O is absent (Mandatory was the last byte of
   the option list), or if option O equals Mandatory.  However, the
   combination "Mandatory Padding" is valid, and MUST behave like two
   bytes of Padding.

   Section 6.6.9 describes the behavior of Mandatory feature negotiation
   options in more detail.

6. Feature Negotiation

Four DCCP options, Change L, Confirm L, Change R, and Confirm R, are used to negotiate feature values. Change options initiate a negotiation; Confirm options complete that negotiation. The "L" options are sent by the feature location, and the "R" options are sent by the feature remote. Change options are retransmitted to ensure reliability. All these options have the same format. The first byte of option data is the feature number, and the second and subsequent data bytes hold one or more feature values. The exact format of the feature value area depends on the feature type; see Section 6.3. +--------+--------+--------+--------+-------- | Type | Length |Feature#| Value(s) ... +--------+--------+--------+--------+-------- Together, the feature number and the option type ("L" or "R") uniquely identify the feature to which an option applies. The exact format of the Value(s) area depends on the feature number. Feature negotiation options MUST NOT be sent on DCCP-Data packets, and any feature negotiation options received on DCCP-Data packets MUST be ignored.

6.1. Change Options

Change L and Change R options initiate feature negotiation. The option to use depends on the relevant feature's location: To start a negotiation for feature F/A, DCCP A will send a Change L option; to start a negotiation for F/B, it will send a Change R option. Change options are retransmitted until some response is received. They contain at least one Value, and thus have a length of at least 4.
Top   ToC   RFC4340 - Page 33
              +--------+--------+--------+--------+--------
   Change L:  |00100000| Length |Feature#| Value(s) ...
              +--------+--------+--------+--------+--------
               Type=32

              +--------+--------+--------+--------+--------
   Change R:  |00100010| Length |Feature#| Value(s) ...
              +--------+--------+--------+--------+--------
               Type=34

6.2. Confirm Options

Confirm L and Confirm R options complete feature negotiation and are sent in response to Change R and Change L options, respectively. Confirm options MUST NOT be generated except in response to Change options. Confirm options need not be retransmitted, since Change options are retransmitted as necessary. The first byte of the Confirm option contains the feature number from the corresponding Change. Following this is the selected Value, and then possibly the sender's preference list. +--------+--------+--------+--------+-------- Confirm L: |00100001| Length |Feature#| Value(s) ... +--------+--------+--------+--------+-------- Type=33 +--------+--------+--------+--------+-------- Confirm R: |00100011| Length |Feature#| Value(s) ... +--------+--------+--------+--------+-------- Type=35 If an endpoint receives an invalid Change option -- with an unknown feature number, or an invalid value -- it will respond with an empty Confirm option containing the problematic feature number, but no value. Such options have length 3.

6.3. Reconciliation Rules

Reconciliation rules determine how the two sets of preferences for a given feature are resolved into a unique result. The reconciliation rule depends only on the feature number. Each reconciliation rule must have the property that the result is uniquely determined given the contents of Change options sent by the two endpoints. All current DCCP features use one of two reconciliation rules: server-priority ("SP") and non-negotiable ("NN").
Top   ToC   RFC4340 - Page 34

6.3.1. Server-Priority

The feature value is a fixed-length byte string (length determined by the feature number). Each Change option contains a list of values ordered by preference, with the most preferred value coming first. Each Confirm option contains the confirmed value, followed by the confirmer's preference list. Thus, the feature's current value will generally appear twice in Confirm options' data, once as the current value and once in the confirmer's preference list. To reconcile the preference lists, select the first entry in the server's list that also occurs in the client's list. If there is no shared entry, the feature's value MUST NOT change, and the Confirm option will confirm the feature's previous value (unless the Change option was Mandatory; see Section 6.6.9).

6.3.2. Non-Negotiable

The feature value is a byte string. Each option contains exactly one feature value. The feature location signals a new value by sending a Change L option. The feature remote MUST accept any valid value, responding with a Confirm R option containing the new value, and it MUST send empty Confirm R options in response to invalid values (unless the Change L option was Mandatory; see Section 6.6.9). Change R and Confirm L options MUST NOT be sent for non-negotiable features; see Section 6.6.8. Non-negotiable features use the feature negotiation mechanism to achieve reliability.
Top   ToC   RFC4340 - Page 35

6.4. Feature Numbers

This document defines the following feature numbers. Rec'n Initial Section Number Meaning Rule Value Req'd Reference ------ ------- ----- ----- ----- --------- 0 Reserved 1 Congestion Control ID (CCID) SP 2 Y 10 2 Allow Short Seqnos SP 0 Y 7.6.1 3 Sequence Window NN 100 Y 7.5.2 4 ECN Incapable SP 0 N 12.1 5 Ack Ratio NN 2 N 11.3 6 Send Ack Vector SP 0 N 11.5 7 Send NDP Count SP 0 N 7.7.2 8 Minimum Checksum Coverage SP 0 N 9.2.1 9 Check Data Checksum SP 0 N 9.3.1 10-127 Reserved 128-255 CCID-specific features 10.3 Table 4: DCCP Feature Numbers Rec'n Rule The reconciliation rule used for the feature. SP means server-priority, NN means non-negotiable. Initial Value The initial value for the feature. Every feature has a known initial value. Req'd This column is "Y" if and only if every DCCP implementation MUST understand the feature. If it is "N", then the feature behaves like an extension (see Section 15), and it is safe to respond to Change options for the feature with empty Confirm options. Of course, a CCID might require the feature; a DCCP that implements CCID 2 MUST support Ack Ratio and Send Ack Vector, for example.
Top   ToC   RFC4340 - Page 36

6.5. Feature Negotiation Examples

Here are three example feature negotiations for features located at the server, the first two for the Congestion Control ID feature, the last for the Ack Ratio. Client Server ------ ------ 1. Change R(CCID, 2 3 1) --> ("2 3 1" is client's preference list) 2. <-- Confirm L(CCID, 3, 3 2 1) (3 is the negotiated value; "3 2 1" is server's pref list) * agreement that CCID/Server = 3 * 1. XXX <-- Change L(CCID, 3 2 1) 2. Retransmission: <-- Change L(CCID, 3 2 1) 3. Confirm R(CCID, 3, 2 3 1) --> * agreement that CCID/Server = 3 * 1. <-- Change L(Ack Ratio, 3) 2. Confirm R(Ack Ratio, 3) --> * agreement that Ack Ratio/Server = 3 * This example shows a simultaneous negotiation. Client Server ------ ------ 1a. Change R(CCID, 2 3 1) --> b. <-- Change L(CCID, 3 2 1) 2a. <-- Confirm L(CCID, 3, 3 2 1) b. Confirm R(CCID, 3, 2 3 1) --> * agreement that CCID/Server = 3 * Here are the byte encodings of several Change and Confirm options. Each option is sent by DCCP A. Change L(CCID, 2 3) = 32,5,1,2,3 DCCP B should change CCID/A's value (feature number 1, a server- priority feature); DCCP A's preferred values are 2 and 3, in that preference order.
Top   ToC   RFC4340 - Page 37
   Change L(Sequence Window, 1024) = 32,9,3,0,0,0,0,4,0
      DCCP B should change Sequence Window/A's value (feature number 3,
      a non-negotiable feature) to the 6-byte string 0,0,0,0,4,0 (the
      value 1024).

   Confirm L(CCID, 2, 2 3) = 33,6,1,2,2,3
      DCCP A has changed CCID/A's value to 2; its preferred values are 2
      and 3, in that preference order.

   Empty Confirm L(126) = 33,3,126
      DCCP A doesn't implement feature number 126, or DCCP B's proposed
      value for feature 126/A was invalid.

   Change R(CCID, 3 2) = 34,5,1,3,2
      DCCP B should change CCID/B's value; DCCP A's preferred values are
      3 and 2, in that preference order.

   Confirm R(CCID, 2, 3 2) = 35,6,1,2,3,2
      DCCP A has changed CCID/B's value to 2; its preferred values were
      3 and 2, in that preference order.

   Confirm R(Sequence Window, 1024) = 35,9,3,0,0,0,0,4,0
      DCCP A has changed Sequence Window/B's value to the 6-byte string
      0,0,0,0,4,0 (the value 1024).

   Empty Confirm R(126) = 35,3,126
      DCCP A doesn't implement feature number 126, or DCCP B's proposed
      value for feature 126/B was invalid.

6.6. Option Exchange

A few basic rules govern feature negotiation option exchange. 1. Every non-reordered Change option gets a Confirm option in response. 2. Change options are retransmitted until a response for the latest Change is received. 3. Feature negotiation options are processed in strictly-increasing order by Sequence Number. The rest of this section describes the consequences of these rules in more detail.
Top   ToC   RFC4340 - Page 38

6.6.1. Normal Exchange

Change options are generated when a DCCP endpoint wants to change the value of some feature. Generally, this will happen at the beginning of a connection, although it may happen at any time. We say the endpoint "generates" or "sends" a Change L or Change R option, but of course the option must be attached to a packet. The endpoint may attach the option to a packet it would have generated anyway (such as a DCCP-Request), or it may create a "feature negotiation packet", often a DCCP-Ack or DCCP-Sync, just to carry the option. Feature negotiation packets are controlled by the relevant congestion control mechanism. For example, DCCP A may send a DCCP-Ack or DCCP-Sync for feature negotiation only if the B-to-A CCID would allow sending a DCCP-Ack. In addition, an endpoint SHOULD generate at most one feature negotiation packet per round-trip time. On receiving a Change L or Change R option, a DCCP endpoint examines the included preference list, reconciles that with its own preference list, calculates the new value, and sends back a Confirm R or Confirm L option, respectively, informing its peer of the new value or that the feature was not understood. Every non-reordered Change option MUST result in a corresponding Confirm option, and any packet including a Confirm option MUST carry an Acknowledgement Number. (Section 6.6.4 describes how Change reordering is detected and handled.) Generated Confirm options may be attached to packets that would have been sent anyway (such as DCCP-Response or DCCP-SyncAck) or to new feature negotiation packets, as described above. The Change-sending endpoint MUST wait to receive a corresponding Confirm option before changing its stored feature value. The Confirm-sending endpoint changes its stored feature value as soon as it sends the Confirm. A packet MAY contain more than one feature negotiation option, possibly including two options that refer to the same feature; as usual, the options are processed sequentially.

6.6.2. Processing Received Options

DCCP endpoints exist in one of three states relative to each feature. STABLE is the normal state, where the endpoint knows the feature's value and thinks the other endpoint agrees. An endpoint enters the CHANGING state when it first sends a Change for the feature and returns to STABLE once it receives a corresponding Confirm. The final state, UNSTABLE, indicates that an endpoint in CHANGING state changed its preference list but has not yet transmitted a Change option with the new preference list.
Top   ToC   RFC4340 - Page 39
   Feature state transitions at a feature location are implemented
   according to this diagram.  The diagram ignores sequence number and
   option validity issues; these are handled explicitly in the
   pseudocode that follows.

                                                          timeout/
 rcv Confirm R      app/protocol evt : snd Change L       rcv non-ack
 : ignore      +---------------------------------------+  : snd Change L
      +----+   |                                       |  +----+
      |    v   |                   rcv Change R        v  |    v
   +------------+  rcv Confirm R   : calc new value, +------------+
   |            |  : accept value    snd Confirm L   |            |
   |   STABLE   |<-----------------------------------|  CHANGING  |
   |            |        rcv empty Confirm R         |            |
   +------------+        : revert to old value       +------------+
       |    ^                                            |    ^
       +----+                                  pref list |    | snd
 rcv Change R                                  changes   |    | Change L
 : calc new value, snd Confirm L                         v    |
                                                     +------------+
                                                 +---|            |
                            rcv Confirm/Change R |   |  UNSTABLE  |
                            : ignore             +-->|            |
                                                     +------------+

   Feature locations SHOULD use the following pseudocode, which
   corresponds to the state diagram, to react to each feature
   negotiation option on each valid non-Data packet received.  The
   pseudocode refers to "P.seqno" and "P.ackno", which are properties of
   the packet; "O.type" and "O.len", which are properties of the option;
   "FGSR" and "FGSS", which are properties of the connection and handle
   reordering as described in Section 6.6.4; "F.state", which is the
   feature's state (STABLE, CHANGING, or UNSTABLE); and "F.value", which
   is the feature's value.

   First, check for unknown features (Section 6.6.7);
      If F is unknown,
         If the option was Mandatory,   /* Section 6.6.9 */
            Reset connection and return
         Otherwise, if O.type == Change R,
            Send Empty Confirm L on a future packet

         Return

   Second, check for reordering (Section 6.6.4);
      If F.state == UNSTABLE or P.seqno <= FGSR
              or (O.type == Confirm R and P.ackno < FGSS),
         Ignore option and return
Top   ToC   RFC4340 - Page 40
   Third, process Change R options;
      If O.type == Change R,
         If the option's value is valid,   /* Section 6.6.8 */
            Calculate new value
            Send Confirm L on a future packet
            Set F.state := STABLE
         Otherwise, if the option was Mandatory,
            Reset connection and return
         Otherwise,
            Send Empty Confirm L on a future packet
            /* Remain in existing state.  If that's CHANGING, this
               endpoint will retransmit its Change L option later. */

   Fourth, process Confirm R options (but only in CHANGING state).
      If F.state == CHANGING and O.type == Confirm R,
         If O.len > 3,   /* nonempty */
            If the option's value is valid,
               Set F.value := new value
            Otherwise,
               Reset connection and return
         Set F.state := STABLE

   Versions of this diagram and pseudocode are also used by feature
   remotes; simply switch the "L"s and "R"s, so that the relevant
   options are Change R and Confirm L.

6.6.3. Loss and Retransmission

Packets containing Change and Confirm options might be lost or delayed by the network. Therefore, Change options are repeatedly transmitted to achieve reliability. We refer to this as "retransmission", although of course there are no packet-level retransmissions in DCCP: a Change option that is sent again will be sent on a new packet with a new sequence number. A CHANGING endpoint transmits another Change option once it realizes that it has not heard back from the other endpoint. The new Change option need not contain the same payload as the original; reordering protection will ensure that agreement is reached based on the most recently transmitted option. A CHANGING endpoint MUST continue retransmitting Change options until it gets some response or the connection terminates. Endpoints SHOULD use an exponential-backoff timer to decide when to retransmit Change options. (Packets generated specifically for feature negotiation MUST use such a timer.) The timer interval is initially set to not less than one round-trip time, and should back
Top   ToC   RFC4340 - Page 41
   off to not less than 64 seconds.  The backoff protects against
   delayed agreement due to the reordering protection algorithms
   described in the next section.  Again, endpoints may piggyback Change
   options on packets they would have sent anyway or create new packets
   to carry the options.  Any new packets are controlled by the relevant
   congestion-control mechanism.

   Confirm options are never retransmitted, but the Confirm-sending
   endpoint MUST generate a Confirm option after every non-reordered
   Change.

6.6.4. Reordering

Reordering might cause packets containing Change and Confirm options to arrive in an unexpected order. Endpoints MUST ignore feature negotiation options that do not arrive in strictly-increasing order by Sequence Number. The rest of this section presents two algorithms that fulfill this requirement. The first algorithm introduces two sequence number variables that each endpoint maintains for the connection. FGSR Feature Greatest Sequence Number Received: The greatest sequence number received, considering only valid packets that contained one or more feature negotiation options (Change and/or Confirm). This value is initialized to ISR - 1. FGSS Feature Greatest Sequence Number Sent: The greatest sequence number sent, considering only packets that contained one or more new Change options. A Change option is new if and only if it was generated during a transition from the STABLE or UNSTABLE state to the CHANGING state; Change options generated within the CHANGING state are retransmissions and MUST have exactly the same contents as previously transmitted options, allowing tolerance for reordering. FGSS is initialized to ISS. Each endpoint checks two conditions on sequence numbers to decide whether to process received feature negotiation options. 1. If a packet's Sequence Number is less than or equal to FGSR, then its Change options MUST be ignored. 2. If a packet's Sequence Number is less than or equal to FGSR, if it has no Acknowledgement Number, OR if its Acknowledgement Number is less than FGSS, then its Confirm options MUST be ignored.
Top   ToC   RFC4340 - Page 42
   Alternatively, an endpoint MAY maintain separate FGSR and FGSS values
   for every feature.  FGSR(F/X) would equal the greatest sequence
   number received, considering only packets that contained Change or
   Confirm options applying to feature F/X; FGSS(F/X) would be defined
   similarly.  This algorithm requires more state, but is slightly more
   forgiving to multiple overlapped feature negotiations.  Either
   algorithm MAY be used; the first algorithm, with connection-wide FGSR
   and FGSS variables, is RECOMMENDED.

   One consequence of these rules is that a CHANGING endpoint will
   ignore any Confirm option that does not acknowledge the latest Change
   option sent.  This ensures that agreement, once achieved, used the
   most recent available information about the endpoints' preferences.

6.6.5. Preference Changes

Endpoints are allowed to change their preference lists at any time. However, an endpoint that changes its preference list while in the CHANGING state MUST transition to the UNSTABLE state. It will transition back to CHANGING once it has transmitted a Change option with the new preference list. This ensures that agreement is based on active preference lists. Without the UNSTABLE state, simultaneous negotiation -- where the endpoints began independent negotiations for the same feature at the same time -- might lead to the negotiation's terminating with the endpoints thinking the feature had different values.

6.6.6. Simultaneous Negotiation

The two endpoints might simultaneously open negotiation for the same feature, after which an endpoint in the CHANGING state will receive a Change option for the same feature. Such received Change options can act as responses to the original Change options. The CHANGING endpoint MUST examine the received Change's preference list, reconcile that with its own preference list (as expressed in its generated Change options), and generate the corresponding Confirm option. It can then transition to the STABLE state.
Top   ToC   RFC4340 - Page 43

6.6.7. Unknown Features

Endpoints may receive Change options referring to feature numbers they do not understand -- for instance, when an extended DCCP converses with a non-extended DCCP. Endpoints MUST respond to unknown Change options with Empty Confirm options (that is, Confirm options containing no data), which inform the CHANGING endpoint that the feature was not understood. However, if the Change option was Mandatory, the connection MUST be reset; see Section 6.6.9. On receiving an empty Confirm option for some feature, the CHANGING endpoint MUST transition back to the STABLE state, leaving the feature's value unchanged. Section 15 suggests that the default value for any extension feature correspond to "extension not available". Some features are required to be understood by all DCCPs (see Section 6.4). The CHANGING endpoint SHOULD reset the connection (with Reset Code 5, "Option Error") if it receives an empty Confirm option for such a feature. Since Confirm options are generated only in response to Change options, an endpoint should never receive a Confirm option referring to a feature number it does not understand. Nevertheless, endpoints MUST ignore any such options they receive.

6.6.8. Invalid Options

A DCCP endpoint might receive a Change or Confirm option for a known feature that lists one or more values that it does not understand. Some, but not all, such options are invalid, depending on the relevant reconciliation rule (Section 6.3). For instance: o All features have length limitations, and options with invalid lengths are invalid. For example, the Ack Ratio feature takes 16-bit values, so valid "Confirm R(Ack Ratio)" options have option length 5. o Some non-negotiable features have value limitations. The Ack Ratio feature takes two-byte, non-zero integer values, so a "Change L(Ack Ratio, 0)" option is never valid. Note that server-priority features do not have value limitations, since unknown values are handled as a matter of course. o Any Confirm option that selects the wrong value, based on the two preference lists and the relevant reconciliation rule, is invalid.
Top   ToC   RFC4340 - Page 44
   However, unexpected Confirm options -- that refer to unknown feature
   numbers, or that don't appear to be part of a current negotiation --
   are not invalid, although they are ignored by the receiver.

   An endpoint receiving an invalid Change option MUST respond with the
   corresponding empty Confirm option.  An endpoint receiving an invalid
   Confirm option MUST reset the connection, with Reset Code 5, "Option
   Error".

6.6.9. Mandatory Feature Negotiation

Change options may be preceded by Mandatory options (Section 5.8.2). Mandatory Change options are processed like normal Change options except that the following failure cases will cause the receiver to reset the connection with Reset Code 6, "Mandatory Failure", rather than send a Confirm option. The connection MUST be reset if: o the Change option's feature number was not understood; o the Change option's value was invalid, and the receiver would normally have sent an empty Confirm option in response; or o for server-priority features, there was no shared entry in the two endpoints' preference lists. Other failure cases do not cause connection reset; in particular, reordering protection may cause a Mandatory Change option to be ignored without resetting the connection. Confirm options behave identically and have the same reset conditions whether or not they are Mandatory.


(page 44 continued on part 3)

Next Section