Network Working Group E. Kohler
Request for Comments: 4340 UCLA
Category: Standards Track M. Handley
UCL
S. Floyd
ICIR
March 2006
Datagram Congestion Control Protocol (DCCP)
Status of This Memo
This document specifies an Internet standards track protocol for the
Internet community, and requests discussion and suggestions for
improvements. Please refer to the current edition of the "Internet
Official Protocol Standards" (STD 1) for the standardization state
and status of this protocol. Distribution of this memo is unlimited.
Copyright Notice
Copyright (C) The Internet Society (2006).
Abstract
The Datagram Congestion Control Protocol (DCCP) is a transport
protocol that provides bidirectional unicast connections of
congestion-controlled unreliable datagrams. DCCP is suitable for
applications that transfer fairly large amounts of data and that can
benefit from control over the tradeoff between timeliness and
reliability.
Table of Contents
1. Introduction ....................................................5
2. Design Rationale ................................................6
3. Conventions and Terminology .....................................7
3.1. Numbers and Fields .........................................7
3.2. Parts of a Connection ......................................8
3.3. Features ...................................................9
3.4. Round-Trip Times ...........................................9
3.5. Security Limitation ........................................9
3.6. Robustness Principle ......................................10
4. Overview .......................................................10
4.1. Packet Types ..............................................10
4.2. Packet Sequencing .........................................11
4.3. States ....................................................12
4.4. Congestion Control Mechanisms .............................14
Kohler, et al. Standards Track [Page 1]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
4.5. Feature Negotiation Options ...............................15
4.6. Differences from TCP ......................................16
4.7. Example Connection ........................................17
5. Packet Formats .................................................18
5.1. Generic Header ............................................19
5.2. DCCP-Request Packets ......................................22
5.3. DCCP-Response Packets .....................................23
5.4. DCCP-Data, DCCP-Ack, and DCCP-DataAck Packets .............23
5.5. DCCP-CloseReq and DCCP-Close Packets ......................25
5.6. DCCP-Reset Packets ........................................25
5.7. DCCP-Sync and DCCP-SyncAck Packets ........................28
5.8. Options ...................................................29
5.8.1. Padding Option .....................................31
5.8.2. Mandatory Option ...................................31
6. Feature Negotiation ............................................32
6.1. Change Options ............................................32
6.2. Confirm Options ...........................................33
6.3. Reconciliation Rules ......................................33
6.3.1. Server-Priority ....................................34
6.3.2. Non-Negotiable .....................................34
6.4. Feature Numbers ...........................................35
6.5. Feature Negotiation Examples ..............................36
6.6. Option Exchange ...........................................37
6.6.1. Normal Exchange ....................................38
6.6.2. Processing Received Options ........................38
6.6.3. Loss and Retransmission ............................40
6.6.4. Reordering .........................................41
6.6.5. Preference Changes .................................42
6.6.6. Simultaneous Negotiation ...........................42
6.6.7. Unknown Features ...................................43
6.6.8. Invalid Options ....................................43
6.6.9. Mandatory Feature Negotiation ......................44
7. Sequence Numbers ...............................................44
7.1. Variables .................................................45
7.2. Initial Sequence Numbers ..................................45
7.3. Quiet Time ................................................46
7.4. Acknowledgement Numbers ...................................47
7.5. Validity and Synchronization ..............................47
7.5.1. Sequence and Acknowledgement Number Windows ........48
7.5.2. Sequence Window Feature ............................49
7.5.3. Sequence-Validity Rules ............................49
7.5.4. Handling Sequence-Invalid Packets ..................51
7.5.5. Sequence Number Attacks ............................52
7.5.6. Sequence Number Handling Examples ..................54
7.6. Short Sequence Numbers ....................................55
7.6.1. Allow Short Sequence Numbers Feature ...............55
7.6.2. When to Avoid Short Sequence Numbers ...............56
7.7. NDP Count and Detecting Application Loss ..................56
Kohler, et al. Standards Track [Page 2]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
7.7.1. NDP Count Usage Notes ..............................57
7.7.2. Send NDP Count Feature .............................57
8. Event Processing ...............................................58
8.1. Connection Establishment ..................................58
8.1.1. Client Request .....................................58
8.1.2. Service Codes ......................................59
8.1.3. Server Response ....................................61
8.1.4. Init Cookie Option .................................62
8.1.5. Handshake Completion ...............................63
8.2. Data Transfer .............................................63
8.3. Termination ...............................................64
8.3.1. Abnormal Termination ...............................66
8.4. DCCP State Diagram ........................................66
8.5. Pseudocode ................................................67
9. Checksums ......................................................72
9.1. Header Checksum Field .....................................73
9.2. Header Checksum Coverage Field ............................73
9.2.1. Minimum Checksum Coverage Feature ..................74
9.3. Data Checksum Option ......................................75
9.3.1. Check Data Checksum Feature ........................76
9.3.2. Checksum Usage Notes ...............................76
10. Congestion Control ............................................76
10.1. TCP-like Congestion Control ..............................77
10.2. TFRC Congestion Control ..................................78
10.3. CCID-Specific Options, Features, and Reset Codes .........78
10.4. CCID Profile Requirements ................................80
10.5. Congestion State .........................................81
11. Acknowledgements ..............................................81
11.1. Acks of Acks and Unidirectional Connections ..............82
11.2. Ack Piggybacking .........................................83
11.3. Ack Ratio Feature ........................................84
11.4. Ack Vector Options .......................................85
11.4.1. Ack Vector Consistency ............................88
11.4.2. Ack Vector Coverage ...............................89
11.5. Send Ack Vector Feature ..................................90
11.6. Slow Receiver Option .....................................90
11.7. Data Dropped Option ......................................91
11.7.1. Data Dropped and Normal Congestion Response .......94
11.7.2. Particular Drop Codes .............................95
12. Explicit Congestion Notification ..............................96
12.1. ECN Incapable Feature ....................................96
12.2. ECN Nonces ...............................................97
12.3. Aggression Penalties .....................................98
13. Timing Options ................................................99
13.1. Timestamp Option .........................................99
13.2. Elapsed Time Option ......................................99
13.3. Timestamp Echo Option ...................................100
14. Maximum Packet Size ..........................................101
Kohler, et al. Standards Track [Page 3]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
14.1. Measuring PMTU ..........................................102
14.2. Sender Behavior .........................................103
15. Forward Compatibility ........................................104
16. Middlebox Considerations .....................................105
17. Relations to Other Specifications ............................106
17.1. RTP .....................................................106
17.2. Congestion Manager and Multiplexing .....................108
18. Security Considerations ......................................108
18.1. Security Considerations for Partial Checksums ...........109
19. IANA Considerations ..........................................110
19.1. Packet Types Registry ...................................110
19.2. Reset Codes Registry ....................................110
19.3. Option Types Registry ...................................110
19.4. Feature Numbers Registry ................................111
19.5. Congestion Control Identifiers Registry .................111
19.6. Ack Vector States Registry ..............................111
19.7. Drop Codes Registry .....................................112
19.8. Service Codes Registry ..................................112
19.9. Port Numbers Registry ...................................112
20. Thanks .......................................................114
A. Appendix: Ack Vector Implementation Notes ....................116
A.1. Packet Arrival ..........................................118
A.1.1. New Packets ......................................118
A.1.2. Old Packets ......................................119
A.2. Sending Acknowledgements ................................120
A.3. Clearing State ..........................................120
A.4. Processing Acknowledgements .............................122
B. Appendix: Partial Checksumming Design Motivation .............123
Normative References .............................................124
Informative References ...........................................125
List of Tables
Table 1: DCCP Packet Types .......................................21
Table 2: DCCP Reset Codes ........................................28
Table 3: DCCP Options ............................................30
Table 4: DCCP Feature Numbers.....................................35
Table 5: DCCP Congestion Control Identifiers .....................77
Table 6: DCCP Ack Vector States ..................................86
Table 7: DCCP Drop Codes .........................................92
Kohler, et al. Standards Track [Page 4]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
1. Introduction
The Datagram Congestion Control Protocol (DCCP) is a transport
protocol that implements bidirectional, unicast connections of
congestion-controlled, unreliable datagrams. Specifically, DCCP
provides the following:
o Unreliable flows of datagrams.
o Reliable handshakes for connection setup and teardown.
o Reliable negotiation of options, including negotiation of a
suitable congestion control mechanism.
o Mechanisms allowing servers to avoid holding state for
unacknowledged connection attempts and already-finished
connections.
o Congestion control incorporating Explicit Congestion Notification
(ECN) [RFC3168] and the ECN Nonce [RFC3540].
o Acknowledgement mechanisms communicating packet loss and ECN
information. Acks are transmitted as reliably as the relevant
congestion control mechanism requires, possibly completely
reliably.
o Optional mechanisms that tell the sending application, with high
reliability, which data packets reached the receiver, and whether
those packets were ECN marked, corrupted, or dropped in the
receive buffer.
o Path Maximum Transmission Unit (PMTU) discovery [RFC1191].
o A choice of modular congestion control mechanisms. Two mechanisms
are currently specified: TCP-like Congestion Control [RFC4341] and
TCP-Friendly Rate Control (TFRC) [RFC4342]. DCCP is easily
extensible to further forms of unicast congestion control.
DCCP is intended for applications such as streaming media that can
benefit from control over the tradeoffs between delay and reliable
in-order delivery. TCP is not well suited for these applications,
since reliable in-order delivery and congestion control can cause
arbitrarily long delays. UDP avoids long delays, but UDP
applications that implement congestion control must do so on their
own. DCCP provides built-in congestion control, including ECN
Kohler, et al. Standards Track [Page 5]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
support, for unreliable datagram flows, avoiding the arbitrary delays
associated with TCP. It also implements reliable connection setup,
teardown, and feature negotiation.
2. Design Rationale
One DCCP design goal was to give most streaming UDP applications
little reason not to switch to DCCP, once it is deployed. To
facilitate this, DCCP was designed to have as little overhead as
possible, both in terms of the packet header size and in terms of the
state and CPU overhead required at end hosts. Only the minimal
necessary functionality was included in DCCP, leaving other
functionality, such as forward error correction (FEC), semi-
reliability, and multiple streams, to be layered on top of DCCP as
desired.
Different forms of conformant congestion control are appropriate for
different applications. For example, on-line games might want to
make quick use of any available bandwidth, while streaming media
might trade off this responsiveness for a steadier, less bursty rate.
(Sudden rate changes can cause unacceptable UI glitches such as
audible pauses or clicks in the playout stream.) DCCP thus allows
applications to choose from a set of congestion control mechanisms.
One alternative, TCP-like Congestion Control, halves the congestion
window in response to a packet drop or mark, as in TCP. Applications
using this congestion control mechanism will respond quickly to
changes in available bandwidth, but must tolerate the abrupt changes
in congestion window typical of TCP. A second alternative, TCP-
Friendly Rate Control (TFRC) [RFC3448], a form of equation-based
congestion control, minimizes abrupt changes in the sending rate
while maintaining longer-term fairness with TCP. Other alternatives
can be added as future congestion control mechanisms are
standardized.
DCCP also lets unreliable traffic safely use ECN. A UDP kernel
Application Programming Interface (API) might not allow applications
to set UDP packets as ECN capable, since the API could not guarantee
that the application would properly detect or respond to congestion.
DCCP kernel APIs will have no such issues, since DCCP implements
congestion control itself.
We chose not to require the use of the Congestion Manager [RFC3124],
which allows multiple concurrent streams between the same sender and
receiver to share congestion control. The current Congestion Manager
can only be used by applications that have their own end-to-end
feedback about packet losses, but this is not the case for many of
the applications currently using UDP. In addition, the current
Congestion Manager does not easily support multiple congestion
Kohler, et al. Standards Track [Page 6]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
control mechanisms or mechanisms where the state about past packet
drops or marks is maintained at the receiver rather than the sender.
DCCP should be able to make use of CM where desired by the
application, but we do not see any benefit in making the deployment
of DCCP contingent on the deployment of CM itself.
We intend for DCCP's protocol mechanisms, which are described in this
document, to suit any application desiring unicast congestion-
controlled streams of unreliable datagrams. However, the congestion
control mechanisms currently approved for use with DCCP, which are
described in separate Congestion Control ID Profiles [RFC4341,
RFC4342], may cause problems for some applications, including high-
bandwidth interactive video. These applications should be able to
use DCCP once suitable Congestion Control ID Profiles are
standardized.
3. Conventions and Terminology
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in [RFC2119].
3.1. Numbers and Fields
All multi-byte numerical quantities in DCCP, such as port numbers,
Sequence Numbers, and arguments to options, are transmitted in
network byte order (most significant byte first).
We occasionally refer to the "left" and "right" sides of a bit field.
"Left" means towards the most significant bit, and "right" means
towards the least significant bit.
Random numbers in DCCP are used for their security properties and
SHOULD be chosen according to the guidelines in [RFC4086].
All operations on DCCP sequence numbers use circular arithmetic
modulo 2^48, as do comparisons such as "greater" and "greatest".
This form of arithmetic preserves the relationships between sequence
numbers as they roll over from 2^48 - 1 to 0. Implementation
strategies for DCCP sequence numbers will resemble those for other
circular arithmetic spaces, including TCP's sequence numbers [RFC793]
and DNS's serial numbers [RFC1982]. It may make sense to store DCCP
sequence numbers in the most significant 48 bits of 64-bit integers
and set the least significant 16 bits to zero, since this supports a
common technique that implements circular comparison A < B by testing
whether (A - B) < 0 using conventional two's-complement arithmetic.
Kohler, et al. Standards Track [Page 7]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Reserved bitfields in DCCP packet headers MUST be set to zero by
senders and MUST be ignored by receivers, unless otherwise specified.
This allows for future protocol extensions. In particular, DCCP
processors MUST NOT reset a DCCP connection simply because a Reserved
field has non-zero value [RFC3360].
3.2. Parts of a Connection
Each DCCP connection runs between two hosts, which we often name DCCP
A and DCCP B. Each connection is actively initiated by one of the
hosts, which we call the client; the other, initially passive host is
called the server. The term "DCCP endpoint" is used to refer to
either of the two hosts explicitly named by the connection (the
client and the server). The term "DCCP processor" refers more
generally to any host that might need to process a DCCP header; this
includes the endpoints and any middleboxes on the path, such as
firewalls and network address translators.
DCCP connections are bidirectional: data may pass from either
endpoint to the other. This means that data and acknowledgements may
flow in both directions simultaneously. Logically, however, a DCCP
connection consists of two separate unidirectional connections,
called half-connections. Each half-connection consists of the
application data sent by one endpoint and the corresponding
acknowledgements sent by the other endpoint. We can illustrate this
as follows:
+--------+ A-to-B half-connection: +--------+
| | --> application data --> | |
| | <-- acknowledgements <-- | |
| DCCP A | | DCCP B |
| | B-to-A half-connection: | |
| | <-- application data <-- | |
+--------+ --> acknowledgements --> +--------+
Although they are logically distinct, in practice the half-
connections overlap; a DCCP-DataAck packet, for example, contains
application data relevant to one half-connection and acknowledgement
information relevant to the other.
In the context of a single half-connection, the terms "HC-Sender" and
"HC-Receiver" denote the endpoints sending application data and
acknowledgements, respectively. For example, DCCP A is the
HC-Sender and DCCP B is the HC-Receiver in the A-to-B
half-connection.
Kohler, et al. Standards Track [Page 8]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
3.3. Features
A DCCP feature is a connection attribute on whose value the two
endpoints agree. Many properties of a DCCP connection are controlled
by features, including the congestion control mechanisms in use on
the two half-connections. The endpoints achieve agreement through
the exchange of feature negotiation options in DCCP headers.
DCCP features are identified by a feature number and an endpoint.
The notation "F/X" represents the feature with feature number F
located at DCCP endpoint X. Each valid feature number thus
corresponds to two features, which are negotiated separately and need
not have the same value. The two endpoints know, and agree on, the
value of every valid feature. DCCP A is the "feature location" for
all features F/A, and the "feature remote" for all features F/B.
3.4. Round-Trip Times
DCCP round-trip time measurements are performed by congestion control
mechanisms; different mechanisms may measure round-trip time in
different ways, or not measure it at all. However, the main DCCP
protocol does use round-trip times occasionally, such as in the
initial values for certain timers. Each DCCP implementation thus
defines a default round-trip time for use when no estimate is
available. This parameter should default to not less than 0.2
seconds, a reasonably conservative round-trip time for Internet TCP
connections. Protocol behavior specified in terms of "round-trip
time" values actually refers to "a current round-trip time estimate
taken by some CCID, or, if no estimate is available, the default
round-trip time parameter".
The maximum segment lifetime, or MSL, is the maximum length of time a
packet can survive in the network. The DCCP MSL should equal that of
TCP, which is normally two minutes.
3.5. Security Limitation
DCCP provides no protection against attackers who can snoop on a
connection in progress, or who can guess valid sequence numbers in
other ways. Applications desiring stronger security should use IPsec
[RFC2401]; depending on the level of security required, application-
level cryptography may also suffice. These issues are discussed
further in Sections 7.5.5 and 18.
Kohler, et al. Standards Track [Page 9]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
3.6. Robustness Principle
DCCP implementations will follow TCP's "general principle of
robustness": "be conservative in what you do, be liberal in what you
accept from others" [RFC793].
4. Overview
DCCP's high-level connection dynamics echo those of TCP. Connections
progress through three phases: initiation, including a three-way
handshake; data transfer; and termination. Data can flow both ways
over the connection. An acknowledgement framework lets senders
discover how much data has been lost and thus avoid unfairly
congesting the network. Of course, DCCP provides unreliable datagram
semantics, not TCP's reliable bytestream semantics. The application
must package its data into explicit frames and must retransmit its
own data as necessary. It may be useful to think of DCCP as TCP
minus bytestream semantics and reliability, or as UDP plus congestion
control, handshakes, and acknowledgements.
4.1. Packet Types
Ten packet types implement DCCP's protocol functions. For example,
every new connection attempt begins with a DCCP-Request packet sent
by the client. In this way a DCCP-Request packet resembles a TCP
SYN, but since DCCP-Request is a packet type there is no way to send
an unexpected flag combination, such as TCP's SYN+FIN+ACK+RST.
Eight packet types occur during the progress of a typical connection,
shown here. Note the three-way handshakes during initiation and
termination.
Client Server
------ ------
(1) Initiation
DCCP-Request -->
<-- DCCP-Response
DCCP-Ack -->
(2) Data transfer
DCCP-Data, DCCP-Ack, DCCP-DataAck -->
<-- DCCP-Data, DCCP-Ack, DCCP-DataAck
(3) Termination
<-- DCCP-CloseReq
DCCP-Close -->
<-- DCCP-Reset
The two remaining packet types are used to resynchronize after bursts
of loss.
Kohler, et al. Standards Track [Page 10]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Every DCCP packet starts with a fixed-size generic header.
Particular packet types include additional fixed-size header data;
for example, DCCP-Acks include an Acknowledgement Number. DCCP
options and any application data follow the fixed-size header.
The packet types are as follows:
DCCP-Request
Sent by the client to initiate a connection (the first part of the
three-way initiation handshake).
DCCP-Response
Sent by the server in response to a DCCP-Request (the second part
of the three-way initiation handshake).
DCCP-Data
Used to transmit application data.
DCCP-Ack
Used to transmit pure acknowledgements.
DCCP-DataAck
Used to transmit application data with piggybacked acknowledgement
information.
DCCP-CloseReq
Sent by the server to request that the client close the
connection.
DCCP-Close
Used by the client or the server to close the connection; elicits
a DCCP-Reset in response.
DCCP-Reset
Used to terminate the connection, either normally or abnormally.
DCCP-Sync, DCCP-SyncAck
Used to resynchronize sequence numbers after large bursts of loss.
4.2. Packet Sequencing
Each DCCP packet carries a sequence number so that losses can be
detected and reported. Unlike TCP sequence numbers, which are byte-
based, DCCP sequence numbers increment by one per packet. For
example:
Kohler, et al. Standards Track [Page 11]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
DCCP A DCCP B
------ ------
DCCP-Data(seqno 1) -->
DCCP-Data(seqno 2) -->
<-- DCCP-Ack(seqno 10, ackno 2)
DCCP-DataAck(seqno 3, ackno 10) -->
<-- DCCP-Data(seqno 11)
Every DCCP packet increments the sequence number, whether or not it
contains application data. DCCP-Ack pure acknowledgements increment
the sequence number; for instance, DCCP B's second packet above uses
sequence number 11, since sequence number 10 was used for an
acknowledgement. This lets endpoints detect all packet loss,
including acknowledgement loss. It also means that endpoints can get
out of sync after long bursts of loss. The DCCP-Sync and DCCP-
SyncAck packet types are used to recover (Section 7.5).
Since DCCP provides unreliable semantics, there are no
retransmissions, and having a TCP-style cumulative acknowledgement
field doesn't make sense. DCCP's Acknowledgement Number field equals
the greatest sequence number received, rather than the smallest
sequence number not received. Separate options indicate any
intermediate sequence numbers that weren't received.
4.3. States
DCCP endpoints progress through different states during the course of
a connection, corresponding roughly to the three phases of
initiation, data transfer, and termination. The figure below shows
the typical progress through these states for a client and server.
Kohler, et al. Standards Track [Page 12]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Client Server
------ ------
(0) No connection
CLOSED LISTEN
(1) Initiation
REQUEST DCCP-Request -->
<-- DCCP-Response RESPOND
PARTOPEN DCCP-Ack or DCCP-DataAck -->
(2) Data transfer
OPEN <-- DCCP-Data, Ack, DataAck --> OPEN
(3) Termination
<-- DCCP-CloseReq CLOSEREQ
CLOSING DCCP-Close -->
<-- DCCP-Reset CLOSED
TIMEWAIT
CLOSED
The nine possible states are as follows. They are listed in
increasing order, so that "state >= CLOSEREQ" means the same as
"state = CLOSEREQ or state = CLOSING or state = TIMEWAIT". Section 8
describes the states in more detail.
CLOSED
Represents nonexistent connections.
LISTEN
Represents server sockets in the passive listening state. LISTEN
and CLOSED are not associated with any particular DCCP connection.
REQUEST
A client socket enters this state, from CLOSED, after sending a
DCCP-Request packet to try to initiate a connection.
RESPOND
A server socket enters this state, from LISTEN, after receiving a
DCCP-Request from a client.
PARTOPEN
A client socket enters this state, from REQUEST, after receiving a
DCCP-Response from the server. This state represents the third
phase of the three-way handshake. The client may send application
data in this state, but it MUST include an Acknowledgement Number
on all of its packets.
Kohler, et al. Standards Track [Page 13]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
OPEN
The central data transfer portion of a DCCP connection. Client
and server sockets enter this state from PARTOPEN and RESPOND,
respectively. Sometimes we speak of SERVER-OPEN and CLIENT-OPEN
states, corresponding to the server's OPEN state and the client's
OPEN state.
CLOSEREQ
A server socket enters this state, from SERVER-OPEN, to order the
client to close the connection and to hold TIMEWAIT state.
CLOSING
Server and client sockets can both enter this state to close the
connection.
TIMEWAIT
A server or client socket remains in this state for 2MSL (4
minutes) after the connection has been torn down, to prevent
mistakes due to the delivery of old packets. Only one of the
endpoints has to enter TIMEWAIT state (the other can enter CLOSED
state immediately), and a server can request its client to hold
TIMEWAIT state using the DCCP-CloseReq packet type.
4.4. Congestion Control Mechanisms
DCCP connections are congestion controlled, but unlike in TCP, DCCP
applications have a choice of congestion control mechanism. In fact,
the two half-connections can be governed by different mechanisms.
Mechanisms are denoted by one-byte congestion control identifiers, or
CCIDs. The endpoints negotiate their CCIDs during connection
initiation. Each CCID describes how the HC-Sender limits data packet
rates, how the HC-Receiver sends congestion feedback via
acknowledgements, and so forth. CCIDs 2 and 3 are currently defined;
CCIDs 0, 1, and 4-255 are reserved. Other CCIDs may be defined in
the future.
CCID 2 provides TCP-like Congestion Control, which is similar to that
of TCP. The sender maintains a congestion window and sends packets
until that window is full. Packets are acknowledged by the receiver.
Dropped packets and ECN [RFC3168] indicate congestion; the response
to congestion is to halve the congestion window. Acknowledgements in
CCID 2 contain the sequence numbers of all received packets within
some window, similar to a selective acknowledgement (SACK) [RFC2018].
CCID 3 provides TCP-Friendly Rate Control (TFRC), an equation-based
form of congestion control intended to respond to congestion more
smoothly than CCID 2. The sender maintains a transmit rate, which it
updates using the receiver's estimate of the packet loss and mark
Kohler, et al. Standards Track [Page 14]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
rate. CCID 3 behaves somewhat differently than TCP in the short
term, but is designed to operate fairly with TCP over the long term.
Section 10 describes DCCP's CCIDs in more detail. The behaviors of
CCIDs 2 and 3 are fully defined in separate profile documents
[RFC4341, RFC4342].
4.5. Feature Negotiation Options
DCCP endpoints use Change and Confirm options to negotiate and agree
on feature values. Feature negotiation will almost always happen on
the connection initiation handshake, but it can begin at any time.
There are four feature negotiation options in all: Change L, Confirm
L, Change R, and Confirm R. The "L" options are sent by the feature
location and the "R" options are sent by the feature remote. A
Change R option says to the feature location, "change this feature
value as follows". The feature location responds with Confirm L,
meaning, "I've changed it". Some features allow Change R options to
contain multiple values sorted in preference order. For example:
Client Server
------ ------
Change R(CCID, 2) -->
<-- Confirm L(CCID, 2)
* agreement that CCID/Server = 2 *
Change R(CCID, 3 4) -->
<-- Confirm L(CCID, 4, 4 2)
* agreement that CCID/Server = 4 *
Both exchanges negotiate the CCID/Server feature's value, which is
the CCID in use on the server-to-client half-connection. In the
second exchange, the client requests that the server use either CCID
3 or CCID 4, with 3 preferred; the server chooses 4 and supplies its
preference list, "4 2".
The Change L and Confirm R options are used for feature negotiations
initiated by the feature location. In the following example, the
server requests that CCID/Server be set to 3 or 2, with 3 preferred,
and the client agrees.
Kohler, et al. Standards Track [Page 15]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Client Server
------ ------
<-- Change L(CCID, 3 2)
Confirm R(CCID, 3, 3 2) -->
* agreement that CCID/Server = 3 *
Section 6 describes the feature negotiation options further,
including the retransmission strategies that make negotiation
reliable.
4.6. Differences from TCP
DCCP's differences from TCP apart from those discussed so far include
the following:
o Copious space for options (up to 1008 bytes or the PMTU).
o Different acknowledgement formats. The CCID for a connection
determines how much acknowledgement information needs to be
transmitted. For example, in CCID 2 (TCP-like), this is about one
ack per 2 packets, and each ack must declare exactly which packets
were received. In CCID 3 (TFRC), it is about one ack per round-
trip time, and acks must declare at minimum just the lengths of
recent loss intervals.
o Denial of Service (DoS) protection. Several mechanisms help limit
the amount of state that possibly-misbehaving clients can force
DCCP servers to maintain. An Init Cookie option analogous to
TCP's SYN Cookies [SYNCOOKIES] avoids SYN-flood-like attacks.
Only one connection endpoint has to hold TIMEWAIT state; the
DCCP-CloseReq packet, which may only be sent by the server, passes
that state to the client. Various rate limits let servers avoid
attacks that might force extensive computation or packet
generation.
o Distinguishing different kinds of loss. A Data Dropped option
(Section 11.7) lets an endpoint declare that a packet was dropped
because of corruption, because of receive buffer overflow, and so
on. This facilitates research into more appropriate rate-control
responses for these non-network-congestion losses (although
currently such losses will cause a congestion response).
o Acknowledgeability. In TCP, a packet may be acknowledged only
once the data is reliably queued for application delivery. This
does not make sense in DCCP, where an application might, for
example, request a drop-from-front receive buffer. A DCCP packet
may be acknowledged as soon as its header has been successfully
processed. Concretely, a packet becomes acknowledgeable at Step 8
Kohler, et al. Standards Track [Page 16]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
of Section 8.5's packet processing pseudocode. Acknowledgeability
does not guarantee data delivery, however: the Data Dropped option
may later report that the packet's application data was discarded.
o No receive window. DCCP is a congestion control protocol, not a
flow control protocol.
o No simultaneous open. Every connection has one client and one
server.
o No half-closed states. DCCP has no states corresponding to TCP's
FINWAIT and CLOSEWAIT, where one half-connection is explicitly
closed while the other is still active. The Data Dropped option's
Drop Code 1, Application Not Listening (Section 11.7), can achieve
a similar effect, however.
4.7. Example Connection
The progress of a typical DCCP connection is as follows. (This
description is informative, not normative.)
Client Server
------ ------
0. [CLOSED] [LISTEN]
1. DCCP-Request -->
2. <-- DCCP-Response
3. DCCP-Ack -->
4. DCCP-Data, DCCP-Ack, DCCP-DataAck -->
<-- DCCP-Data, DCCP-Ack, DCCP-DataAck
5. <-- DCCP-CloseReq
6. DCCP-Close -->
7. <-- DCCP-Reset
8. [TIMEWAIT]
1. The client sends the server a DCCP-Request packet specifying the
client and server ports, the service being requested, and any
features being negotiated, including the CCID that the client
would like the server to use. The client may optionally piggyback
an application request on the DCCP-Request packet. The server may
ignore this application request.
2. The server sends the client a DCCP-Response packet indicating that
it is willing to communicate with the client. This response
indicates any features and options that the server agrees to,
begins other feature negotiations as desired, and optionally
includes Init Cookies that wrap up all this information and that
must be returned by the client for the connection to complete.
Kohler, et al. Standards Track [Page 17]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
3. The client sends the server a DCCP-Ack packet that acknowledges
the DCCP-Response packet. This acknowledges the server's initial
sequence number and returns any Init Cookies in the DCCP-Response.
It may also continue feature negotiation. The client may
piggyback an application-level request on this ack, producing a
DCCP-DataAck packet.
4. The server and client then exchange DCCP-Data packets, DCCP-Ack
packets acknowledging that data, and, optionally, DCCP-DataAck
packets containing data with piggybacked acknowledgements. If the
client has no data to send, then the server will send DCCP-Data
and DCCP-DataAck packets, while the client will send DCCP-Acks
exclusively. (However, the client may not send DCCP-Data packets
before receiving at least one non-DCCP-Response packet from the
server.)
5. The server sends a DCCP-CloseReq packet requesting a close.
6. The client sends a DCCP-Close packet acknowledging the close.
7. The server sends a DCCP-Reset packet with Reset Code 1, "Closed",
and clears its connection state. DCCP-Resets are part of normal
connection termination; see Section 5.6.
8. The client receives the DCCP-Reset packet and holds state for two
maximum segment lifetimes, or 2MSL, to allow any remaining packets
to clear the network.
An alternative connection closedown sequence is initiated by the
client:
5b. The client sends a DCCP-Close packet closing the connection.
6b. The server sends a DCCP-Reset packet with Reset Code 1, "Closed",
and clears its connection state.
7b. The client receives the DCCP-Reset packet and holds state for
2MSL to allow any remaining packets to clear the network.
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.
Kohler, et al. Standards Track [Page 18]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
+---------------------------------------+ -.
| 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| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Kohler, et al. Standards Track [Page 19]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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.
Kohler, et al. Standards Track [Page 20]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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:
Kohler, et al. Standards Track [Page 21]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 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 /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Kohler, et al. Standards Track [Page 22]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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.
Kohler, et al. Standards Track [Page 23]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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
Kohler, et al. Standards Track [Page 24]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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).
Kohler, et al. Standards Track [Page 25]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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.
Kohler, et al. Standards Track [Page 26]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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.
Kohler, et al. Standards Track [Page 27]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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).
Kohler, et al. Standards Track [Page 28]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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
Kohler, et al. Standards Track [Page 29]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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
Kohler, et al. Standards Track [Page 30]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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.
Kohler, et al. Standards Track [Page 31]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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.
Kohler, et al. Standards Track [Page 32]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
+--------+--------+--------+--------+--------
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").
Kohler, et al. Standards Track [Page 33]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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.
Kohler, et al. Standards Track [Page 34]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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.
Kohler, et al. Standards Track [Page 35]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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.
Kohler, et al. Standards Track [Page 36]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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.
Kohler, et al. Standards Track [Page 37]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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.
Kohler, et al. Standards Track [Page 38]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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
Kohler, et al. Standards Track [Page 39]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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
Kohler, et al. Standards Track [Page 40]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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.
Kohler, et al. Standards Track [Page 41]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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.
Kohler, et al. Standards Track [Page 42]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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.
Kohler, et al. Standards Track [Page 43]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
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.
7. Sequence Numbers
DCCP uses sequence numbers to arrange packets into sequence, to
detect losses and network duplicates, and to protect against
attackers, half-open connections, and the delivery of very old
packets. Every packet carries a Sequence Number; most packet types
carry an Acknowledgement Number as well.
DCCP sequence numbers are packet based. That is, Sequence Numbers
generated by each endpoint increase by one, modulo 2^48, per packet.
Even DCCP-Ack and DCCP-Sync packets, and other packets that don't
carry user data, increment the Sequence Number. Since DCCP is an
unreliable protocol, there are no true retransmissions, but effective
retransmissions, such as retransmissions of DCCP-Request packets,
also increment the Sequence Number. This lets DCCP implementations
Kohler, et al. Standards Track [Page 44]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
detect network duplication, retransmissions, and acknowledgement
loss; it is a significant departure from TCP practice.
7.1. Variables
DCCP endpoints maintain a set of sequence number variables for each
connection.
ISS The Initial Sequence Number Sent by this endpoint. This
equals the Sequence Number of the first DCCP-Request or
DCCP-Response sent.
ISR The Initial Sequence Number Received from the other endpoint.
This equals the Sequence Number of the first DCCP-Request or
DCCP-Response received.
GSS The Greatest Sequence Number Sent by this endpoint. Here,
and elsewhere, "greatest" is measured in circular sequence
space.
GSR The Greatest Sequence Number Received from the other endpoint
on an acknowledgeable packet. (Section 7.4 defines this
term.)
GAR The Greatest Acknowledgement Number Received from the other
endpoint on an acknowledgeable packet that was not a DCCP-
Sync.
Some other variables are derived from these primitives.
SWL and SWH
(Sequence Number Window Low and High) The extremes of the
validity window for received packets' Sequence Numbers.
AWL and AWH
(Acknowledgement Number Window Low and High) The extremes of
the validity window for received packets' Acknowledgement
Numbers.
7.2. Initial Sequence Numbers
The endpoints' initial sequence numbers are set by the first DCCP-
Request and DCCP-Response packets sent. Initial sequence numbers
MUST be chosen to avoid two problems:
o delivery of old packets, where packets lingering in the network
from an old connection are delivered to a new connection with the
same addresses and port numbers; and
Kohler, et al. Standards Track [Page 45]
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
o sequence number attacks, where an attacker can guess the sequence
numbers that a future connection would use [M85].
These problems are the same as those faced by TCP, and DCCP
implementations SHOULD use TCP's strategies to avoid them [RFC793,
RFC1948]. The rest of this section explains these strategies in more
detail.
To address the first problem, an implementation MUST ensure that the
initial sequence number for a given