The version of draft-ietf-dccp-spec-13.txt used to generate this diff is
slightly different from the published version, in that we altered its
margins and whitespace formatting in order to obtain a closer
correspondence with the published RFC.
|
|
|
|
|
|
|
|
|
|
|
|
Network Working Group E. Kohler |
Internet Engineering Task Force Eddie Kohler |
Request for Comments: 4340 UCLA |
INTERNET-DRAFT UCLA |
Category: Standards Track M. Handley |
draft-ietf-dccp-spec-13.txt Mark Handley |
UCL |
Expires: 3 October 2006 UCL |
S. Floyd |
Sally Floyd |
ICIR |
|
March 2006 |
3 April 2006 |
|
|
|
|
Datagram Congestion Control Protocol (DCCP) |
|
|
|
Status of This Memo |
|
|
|
This document specifies an Internet standards track protocol for the |
By submitting this Internet-Draft, each author represents that any |
Internet community, and requests discussion and suggestions for |
applicable patent or other IPR claims of which he or she is aware |
improvements. Please refer to the current edition of the "Internet |
have been or will be disclosed, and any of which he or she becomes |
Official Protocol Standards" (STD 1) for the standardization state |
aware will be disclosed, in accordance with Section 6 of BCP 79. |
and status of this protocol. Distribution of this memo is unlimited. |
Internet-Drafts are working documents of the Internet Engineering |
|
Task Force (IETF), its areas, and its working groups. Note that |
Copyright Notice |
other groups may also distribute working documents as Internet- |
|
Drafts. |
Copyright (C) The Internet Society (2006). |
Internet-Drafts are draft documents valid for a maximum of six months |
|
and may be updated, replaced, or obsoleted by other documents at any |
Abstract |
time. It is inappropriate to use Internet-Drafts as reference |
|
material or to cite them other than as "work in progress." |
The Datagram Congestion Control Protocol (DCCP) is a transport |
The list of current Internet-Drafts can be accessed at |
protocol that provides bidirectional unicast connections of |
http://www.ietf.org/ietf/1id-abstracts.txt. |
congestion-controlled unreliable datagrams. DCCP is suitable for |
The list of Internet-Draft Shadow Directories can be accessed at |
|
http://www.ietf.org/shadow.html. |
|
This Internet-Draft will expire on 3 October 2006. |
applications that transfer fairly large amounts of data and that can |
applications that transfer fairly large amounts of data, but can |
benefit from control over the tradeoff between timeliness and |
|
reliability. |
|
|| TEXT DELETED || |
TO BE DELETED BY THE RFC EDITOR UPON PUBLICATION: |
|
Changes since draft-ietf-dccp-spec-08.txt: |
Table of Contents |
* Added minimum Sequence Window. |
|
* Init Cookie implementation sketch. |
|
* Include reasoning for ignoring options on DCCP-Data. |
|
* More Aggression Penalty explanation. |
|
* More explanation on Ack Vectors that report information on packets |
|
that haven't been sent. |
|
Changes since draft-ietf-dccp-spec-07.txt: |
|
* Many changes, not listed here, for WGLC. |
|
* The more stringent Sequence Number checks on DCCP-Sync and DCCP- |
|
SyncAck packets become SHOULD, not MAY. |
|
Changes since draft-ietf-dccp-spec-06.txt: |
|
* Change extended sequence numbers. Now 48-bit sequence numbers are |
|
MANDATORY, and all packet types except Data, Ack, and DataAck always |
|
use 48-bit sequence numbers. This change improves DCCP's robustness |
|
against blind attacks. |
|
* Removed empty Change options. |
|
* Allow preference list changes during feature negotiations (this |
|
seems easier to implement than the alternative). This required a new |
|
feature negotiation state, UNSTABLE. |
|
* Add Minimum Checksum Coverage feature. |
|
* Add Reset Congestion State option. |
|
* Simplify the implementation of CCID-specific option processing: no |
|
need to check whether the CCID feature is being negotiated. |
|
* Many more minor changes. |
|
Changes since draft-ietf-dccp-spec-05.txt: |
|
* Organization overhaul. |
|
* Add pseudocode for event processing. |
|
* Remove # NDP; replace with Ack Count. |
|
* Remove Identification, Challenge, ID Regime, and Connection Nonce. |
|
* Data Checksum (formerly Payload Checksum) uses a 32-bit CRC. |
|
* Switch location of non-negotiable features to clarify presentation; |
|
now the feature location controls its value. |
|
* Rename "value type" to "reconciliation rule". |
|
* Rename "Reset Reason" to "Reset Code". |
|
* Mobility ID becomes 128 bits long. |
|
* Add probabilities to Mobility ID discussion. |
|
* Add SyncAck. |
|
|
1. Introduction ....................................................5 |
1. Introduction ....................................................9 |
2. Design Rationale ................................................6 |
2. Design Rationale ...............................................10 |
3. Conventions and Terminology .....................................7 |
3. Conventions and Terminology ....................................11 |
3.1. Numbers and Fields .........................................7 |
3.1. Numbers and Fields ........................................11 |
3.2. Parts of a Connection ......................................8 |
3.2. Parts of a Connection .....................................12 |
3.3. Features ...................................................9 |
3.3. Features ..................................................12 |
3.4. Round-Trip Times ...........................................9 |
3.4. Round-Trip Times ..........................................13 |
3.5. Security Limitation ........................................9 |
3.5. Security Limitation .......................................13 |
3.6. Robustness Principle ......................................10 |
3.6. Robustness Principle ......................................13 |
4. Overview .......................................................10 |
4. Overview .......................................................13 |
4.1. Packet Types ..............................................10 |
4.1. Packet Types ..............................................14 |
4.2. Packet Sequencing .........................................11 |
4.2. Packet Sequencing .........................................15 |
4.3. States ....................................................12 |
4.3. States ....................................................16 |
4.4. Congestion Control Mechanisms .............................14 |
4.4. Congestion Control Mechanisms .............................17 |
|
4.5. Connection Features .......................................18 |
|
4.6. Differences From TCP ......................................19 |
|
4.7. Example Connection ........................................20 |
Kohler, et al. Standards Track [Page 1] |
5. Packet Formats .................................................22 |
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
5.1. Generic Header ............................................22 |
|
5.2. DCCP-Request Packets ......................................25 |
|
5.3. DCCP-Response Packets .....................................26 |
4.5. Connection Features .......................................15 |
5.4. DCCP-Data, DCCP-Ack, and DCCP-DataAck Packets .............27 |
4.6. Differences from TCP ......................................16 |
5.5. DCCP-CloseReq and DCCP-Close Packets ......................28 |
4.7. Example Connection ........................................17 |
5.6. DCCP-Reset Packets ........................................29 |
5. Packet Formats .................................................18 |
5.7. DCCP-Sync and DCCP-SyncAck Packets ........................32 |
5.1. Generic Header ............................................19 |
5.8. Options ...................................................33 |
5.2. DCCP-Request Packets ......................................22 |
5.8.1. Padding Option .....................................34 |
5.3. DCCP-Response Packets .....................................23 |
5.8.2. Mandatory Option ...................................35 |
5.4. DCCP-Data, DCCP-Ack, and DCCP-DataAck Packets .............23 |
6. Feature Negotiation ............................................35 |
5.5. DCCP-CloseReq and DCCP-Close Packets ......................25 |
6.1. Change Options ............................................36 |
5.6. DCCP-Reset Packets ........................................25 |
6.2. Confirm Options ...........................................36 |
5.7. DCCP-Sync and DCCP-SyncAck Packets ........................28 |
6.3. Reconciliation Rules ......................................37 |
5.8. Options ...................................................29 |
6.3.1. Server-Priority ....................................37 |
5.8.1. Padding Option .....................................31 |
6.3.2. Non-Negotiable .....................................37 |
5.8.2. Mandatory Option ...................................31 |
6.4. Feature Numbers ...........................................38 |
6. Feature Negotiation ............................................32 |
6.5. Feature Negotiation Examples ..............................39 |
6.1. Change Options ............................................32 |
6.6. Option Exchange ...........................................40 |
6.2. Confirm Options ...........................................33 |
6.6.1. Normal Exchange ....................................40 |
6.3. Reconciliation Rules ......................................33 |
6.6.2. Processing Received Options ........................41 |
6.3.1. Server-Priority ....................................33 |
6.6.3. Loss and Retransmission ............................43 |
6.3.2. Non-Negotiable .....................................34 |
6.6.4. Reordering .........................................44 |
6.4. Feature Numbers ...........................................34 |
6.6.5. Preference Changes .................................45 |
6.5. Sequence Number Handling Examples .........................35 |
6.6.6. Simultaneous Negotiation ...........................45 |
6.6. Option Exchange ...........................................36 |
6.6.7. Unknown Features ...................................45 |
6.6.1. Normal Exchange ....................................37 |
6.6.8. Invalid Options ....................................46 |
6.6.2. Processing Received Options ........................37 |
6.6.9. Mandatory Feature Negotiation ......................46 |
6.6.3. Loss and Retransmission ............................39 |
7. Sequence Numbers ...............................................47 |
6.6.4. Reordering .........................................40 |
7.1. Variables .................................................47 |
6.6.5. Preference Changes .................................41 |
7.2. Initial Sequence Numbers ..................................48 |
6.6.6. Simultaneous Negotiation ...........................41 |
7.3. Quiet Time ................................................49 |
6.6.7. Unknown Features ...................................41 |
7.4. Acknowledgement Numbers ...................................49 |
6.6.8. Invalid Options ....................................42 |
7.5. Validity and Synchronization ..............................50 |
6.6.9. Mandatory Feature Negotiation ......................43 |
7.5.1. Sequence and Acknowledgement Number Windows ........50 |
7. Sequence Numbers ...............................................43 |
7.5.2. Sequence Window Feature ............................51 |
7.1. Variables .................................................43 |
7.5.3. Sequence-Validity Rules ............................52 |
7.2. Initial Sequence Numbers ..................................44 |
7.5.4. Handling Sequence-Invalid Packets ..................53 |
7.3. Quiet Time ................................................45 |
7.5.5. Sequence Number Attacks ............................54 |
7.4. Acknowledgement Numbers ...................................46 |
7.5.6. Sequence Number Handling Examples ..................56 |
7.5. Validity and Synchronization ..............................46 |
7.6. Short Sequence Numbers ....................................57 |
7.5.1. Sequence and Acknowledgement Number Windows ........47 |
7.6.1. Allow Short Sequence Numbers Feature ...............57 |
7.5.2. Sequence Window Feature ............................48 |
7.6.2. When to Avoid Short Sequence Numbers ...............58 |
7.5.3. Sequence-Validity Rules ............................48 |
7.7. NDP Count and Detecting Application Loss ..................58 |
7.5.4. Handling Sequence-Invalid Packets ..................50 |
7.7.1. NDP Count Usage Notes ..............................59 |
7.5.5. Sequence Number Attacks ............................51 |
7.7.2. Send NDP Count Feature .............................60 |
7.5.6. Examples ...........................................53 |
8. Event Processing ...............................................60 |
7.6. Short Sequence Numbers ....................................54 |
8.1. Connection Establishment ..................................60 |
7.6.1. Allow Short Sequence Numbers Feature ...............54 |
8.1.1. Client Request .....................................60 |
7.6.2. When to Avoid Short Sequence Numbers ...............55 |
8.1.2. Service Codes ......................................61 |
7.7. NDP Count and Detecting Application Loss ..................55 |
8.1.3. Server Response ....................................63 |
|
8.1.4. Init Cookie Option .................................64 |
|
8.1.5. Handshake Completion ...............................65 |
|
8.2. Data Transfer .............................................66 |
Kohler, et al. Standards Track [Page 2] |
8.3. Termination ...............................................66 |
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
8.3.1. Abnormal Termination ...............................68 |
|
8.4. DCCP State Diagram ........................................68 |
|
8.5. Pseudocode ................................................69 |
7.7.1. NDP Count Usage Notes ..............................56 |
9. Checksums ......................................................73 |
7.7.2. Send NDP Count Feature .............................56 |
9.1. Header Checksum Field .....................................74 |
8. Event Processing ...............................................57 |
9.2. Header Checksum Coverage Field ............................75 |
8.1. Connection Establishment ..................................57 |
9.2.1. Minimum Checksum Coverage Feature ..................76 |
8.1.1. Client Request .....................................57 |
9.3. Data Checksum Option ......................................76 |
8.1.2. Service Codes ......................................58 |
9.3.1. Check Data Checksum Feature ........................77 |
8.1.3. Server Response ....................................60 |
9.3.2. Checksum Usage Notes ...............................78 |
8.1.4. Init Cookie Option .................................61 |
10. Congestion Control ............................................78 |
8.1.5. Handshake Completion ...............................62 |
10.1. TCP-like Congestion Control ..............................79 |
8.2. Data Transfer .............................................62 |
10.2. TFRC Congestion Control ..................................79 |
8.3. Termination ...............................................63 |
10.3. CCID-Specific Options, Features, and Reset Codes .........79 |
8.3.1. Abnormal Termination ...............................65 |
10.4. CCID Profile Requirements ................................82 |
8.4. DCCP State Diagram ........................................65 |
10.5. Congestion State .........................................82 |
8.5. Pseudocode ................................................66 |
11. Acknowledgements ..............................................83 |
9. Checksums ......................................................70 |
11.1. Acks of Acks and Unidirectional Connections ..............84 |
9.1. Header Checksum Field .....................................71 |
11.2. Ack Piggybacking .........................................85 |
9.2. Header Checksum Coverage Field ............................72 |
11.3. Ack Ratio Feature ........................................85 |
9.2.1. Minimum Checksum Coverage Feature ..................73 |
11.4. Ack Vector Options .......................................87 |
9.3. Data Checksum Option ......................................73 |
11.4.1. Ack Vector Consistency ............................89 |
9.3.1. Check Data Checksum Feature ........................74 |
11.4.2. Ack Vector Coverage ...............................91 |
9.3.2. Checksum Usage Notes ...............................75 |
11.5. Send Ack Vector Feature ..................................91 |
10. Congestion Control ............................................75 |
11.6. Slow Receiver Option .....................................92 |
10.1. TCP-like Congestion Control ..............................76 |
11.7. Data Dropped Option ......................................93 |
10.2. TFRC Congestion Control ..................................76 |
11.7.1. Data Dropped and Normal Congestion Response .......95 |
10.3. CCID-Specific Options, Features, and Reset Codes .........77 |
11.7.2. Particular Drop Codes .............................96 |
10.4. CCID Profile Requirements ................................79 |
12. Explicit Congestion Notification ..............................97 |
10.5. Congestion State .........................................79 |
12.1. ECN Incapable Feature ....................................97 |
11. Acknowledgements ..............................................80 |
12.2. ECN Nonces ...............................................98 |
11.1. Acks of Acks and Unidirectional Connections ..............81 |
12.3. Aggression Penalties .....................................99 |
11.2. Ack Piggybacking .........................................82 |
13. Timing Options ...............................................100 |
11.3. Ack Ratio Feature ........................................82 |
13.1. Timestamp Option ........................................100 |
11.4. Ack Vector Options .......................................84 |
13.2. Elapsed Time Option .....................................100 |
11.5. Send Ack Vector Feature ..................................89 |
13.3. Timestamp Echo Option ...................................101 |
11.6. Slow Receiver Option .....................................89 |
14. Maximum Packet Size ..........................................102 |
11.7. Data Dropped Option ......................................90 |
14.1. Measuring PMTU ..........................................103 |
11.7.1. Data Dropped and Normal Congestion Response .......93 |
14.2. Sender Behavior .........................................104 |
11.7.2. Particular Drop Codes .............................93 |
15. Forward Compatibility ........................................105 |
12. Explicit Congestion Notification ..............................94 |
16. Middlebox Considerations .....................................106 |
12.1. ECN Incapable Feature ....................................95 |
17. Relations to Other Specifications ............................107 |
12.2. ECN Nonces ...............................................95 |
17.1. RTP .....................................................107 |
12.3. Aggression Penalties .....................................97 |
17.2. Congestion Manager and Multiplexing .....................109 |
13. Timing Options ................................................97 |
18. Security Considerations ......................................109 |
13.1. Timestamp Option .........................................97 |
18.1. Security Considerations for Partial Checksums ...........110 |
13.2. Elapsed Time Option ......................................98 |
19. IANA Considerations ..........................................110 |
13.3. Timestamp Echo Option ....................................99 |
19.1. Packet Types Registry ...................................111 |
14. Maximum Packet Size ..........................................100 |
19.2. Reset Codes Registry ....................................111 |
14.1. Measuring PMTU ..........................................100 |
19.3. Option Types Registry ...................................111 |
14.2. Sender Behavior .........................................102 |
19.4. Feature Numbers Registry ................................112 |
|
19.5. Congestion Control Identifiers Registry .................112 |
|
19.6. Ack Vector States Registry ..............................112 |
|
19.7. Drop Codes Registry .....................................112 |
Kohler, et al. Standards Track [Page 3] |
19.8. Service Codes Registry ..................................113 |
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
19.9. Port Numbers Registry ...................................113 |
|
20. Thanks .......................................................115 |
|
A. Appendix: Ack Vector Implementation Notes .....................115 |
15. Forward Compatibility ........................................103 |
A.1. Packet Arrival ...........................................118 |
16. Middlebox Considerations .....................................103 |
A.1.1. New Packets .......................................118 |
17. Relations to Other Specifications ............................105 |
A.1.2. Old Packets .......................................119 |
17.1. RTP .....................................................105 |
A.2. Sending Acknowledgements .................................119 |
17.2. Congestion Manager and Multiplexing .....................106 |
A.3. Clearing State ...........................................120 |
18. Security Considerations ......................................107 |
A.4. Processing Acknowledgements ..............................121 |
18.1. Security Considerations for Partial Checksums ...........107 |
B. Appendix: Partial Checksumming Design Motivation ..............122 |
19. IANA Considerations ..........................................108 |
Normative References .............................................123 |
19.1. Packet Types Registry ...................................108 |
Informative References ...........................................124 |
19.2. Reset Codes Registry ....................................109 |
Authors' Addresses ...............................................126 |
19.3. Option Types Registry ...................................109 |
Full Copyright Statement .........................................127 |
19.4. Feature Numbers Registry ................................109 |
Intellectual Property ............................................127 |
19.5. Congestion Control Identifiers Registry .................110 |
|
19.6. Ack Vector States Registry ..............................110 |
|
19.7. Drop Codes Registry .....................................110 |
|
19.8. Service Codes Registry ..................................110 |
|
19.9. Port Numbers Registry ...................................111 |
|
20. Thanks .......................................................113 |
|
A. Appendix: Ack Vector Implementation Notes ....................114 |
|
A.1. Packet Arrival ..........................................116 |
|
A.1.1. New Packets ......................................116 |
|
A.1.2. Old Packets ......................................117 |
|
A.2. Sending Acknowledgements ................................118 |
|
A.3. Clearing State ..........................................118 |
|
A.4. Processing Acknowledgements .............................120 |
|
B. Appendix: Partial Checksumming Design Motivation .............120 |
|
Normative References .............................................122 |
|
Informative References ...........................................123 |
|
|
|
List of Tables |
|
|
|
Table 1: DCCP Packet Types . . . . . . . . . . . . . . . . . . . 21 |
Table 1: DCCP Packet Types ........................................24 |
Table 2: DCCP Reset Codes. . . . . . . . . . . . . . . . . . . . 28 |
Table 2: DCCP Reset Codes .........................................31 |
Table 3: DCCP Options. . . . . . . . . . . . . . . . . . . . . . 30 |
Table 3: DCCP Options .............................................33 |
Table 4: DCCP Feature Numbers. . . . . . . . . . . . . . . . . . 34 |
Table 4: DCCP Feature Numbers .....................................38 |
Table 5: DCCP Congestion Control Identifiers . . . . . . . . . . 75 |
Table 5: DCCP Congestion Control Identifiers ......................78 |
Table 6: DCCP Ack Vector States. . . . . . . . . . . . . . . . . 85 |
Table 6: DCCP Ack Vector States ...................................88 |
Table 7: DCCP Drop Codes . . . . . . . . . . . . . . . . . . . . 91 |
Table 7: DCCP Drop Codes ..........................................94 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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: |
provides: |
|
|
o Unreliable flows of datagrams, with acknowledgements. |
|
|
|
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]. |
(ECN) [RFC 3168] and the ECN Nonce [RFC 3540]. |
|
|
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 Path Maximum Transmission Unit (PMTU) discovery [RFC 1191]. |
|
|
o A choice of modular congestion control mechanisms. Two mechanisms |
|
are currently specified: TCP-like Congestion Control [RFC4341] and |
are currently specified, TCP-like Congestion Control [CCID 2 |
TFRC (TCP-Friendly Rate Control) Congestion Control [RFC4342]. |
PROFILE] and TFRC (TCP-Friendly Rate Control) Congestion Control |
DCCP is easily extensible to further forms of unicast congestion |
[CCID 3 PROFILE], but DCCP is easily extensible to further forms |
control. |
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, |
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 |
(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 |
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 |
Friendly Rate Control (TFRC) [RFC 3448], 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 API |
|
might not allow applications to set UDP packets as ECN capable, since |
might not allow applications to set UDP packets as ECN-capable, since |
the API could not guarantee that the application would properly |
the API could not guarantee the application would properly detect or |
detect or respond to congestion. DCCP kernel APIs will have no such |
respond to congestion. DCCP kernel APIs will have no such issues, |
issues, since DCCP implements congestion control itself. |
since DCCP implements congestion control itself. |
|
We chose not to require the use of the Congestion Manager [RFC 3124], |
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 |
|
control mechanisms or lend itself to the use of forms of TFRC where |
control mechanisms, or lend itself to the use of forms of TFRC where |
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 6] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
the state about past packet drops or marks is maintained at the |
|
receiver rather than at 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 |
controlled streams of unreliable datagrams. The congestion control |
control mechanisms currently approved for use with DCCP, which are |
mechanisms currently approved for use with DCCP, which are described |
described in separate Congestion Control ID Profiles [RFC4341, |
in separate Congestion Control ID Profiles [CCID 2 PROFILE, CCID 3 |
RFC4342], may cause problems for some applications, including high- |
PROFILE], may, however, cause problems for some applications, |
bandwidth interactive video. These applications should be able to |
including high-bandwidth interactive video. These applications |
use DCCP once suitable Congestion Control ID Profiles are |
should be able to use DCCP once suitable Congestion Control ID |
standardized. |
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]. |
document are to be interpreted as described in RFC 2119. |
|
|
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 |
Random numbers in DCCP are used for their security properties, and |
SHOULD be chosen according to the guidelines in RFC 4086. |
SHOULD be chosen according to the guidelines in RFC 1750. |
|
All operations on DCCP sequence numbers, and comparisons such as |
All operations on DCCP sequence numbers and comparisons such as |
"greater" and "greatest", use circular arithmetic modulo 2**48. This |
"greater" and "greatest" use circular arithmetic modulo 2**48. 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] |
circular arithmetic spaces, including TCP's sequence numbers [RFC |
and DNS's serial numbers [RFC1982]. Note that the common technique |
793] and DNS's serial numbers [RFC 1982]. Note that the common |
for implementing circular comparison using twos-complement |
technique for implementing circular comparison using two's-complement |
arithmetic, whereby A < B using circular arithmetic if and only if (A |
arithmetic, whereby A < B using circular arithmetic if and only if |
- B) < 0 using conventional twos-complement arithmetic, may be used |
(A - B) < 0 using conventional two's-complement arithmetic, may be |
for DCCP sequence numbers, provided that they are stored in the most |
used for DCCP sequence numbers, provided they are stored in the most |
significant 48 bits of 64-bit integers. |
|
|
|
|
|
|
|
|
|
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. |
senders, and MUST be ignored by receivers, unless otherwise |
This allows for future protocol extensions. In particular, DCCP |
specified. This is to allow for future protocol extensions. In |
processors MUST NOT reset a DCCP connection simply because a Reserved |
particular, DCCP processors MUST NOT reset a DCCP connection simply |
field has non-zero value [RFC3360]. |
because a Reserved field has non-zero value [RFC 3360]. |
|
|
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 |
be flowing in both directions simultaneously. Logically, however, a |
connection consists of two separate unidirectional connections, |
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- |
acknowledgements, respectively. For example, DCCP A is the HC-Sender |
Sender and DCCP B is the HC-Receiver in the A-to-B half-connection. |
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 |
available; this parameter should default to not less than |
seconds, a reasonably conservative round-trip time for Internet TCP |
0.2 seconds, a reasonably conservative round-trip time for Internet |
connections. Protocol behavior specified in terms of "round-trip |
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- |
[RFC 2401]; depending on the level of security required, application- |
level cryptography may also suffice. These issues are discussed |
|
further in Sections 18 and 7.5.5. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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]. |
accept from others" [RFC 793]. |
|
|
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 |
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 |
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. A DCCP-Request packet thus resembles a TCP SYN; but |
|
DCCP-Request is a packet type, not a flag, so there is no way to send |
DCCP-Request is a packet type, not a flag, so there's no way to send |
an unexpected combination, such as TCP's SYN+FIN+ACK+RST. |
an unexpected 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 12-byte 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 |
|
acknowledgements. |
|
|
|
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 |
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 |
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- |
out of sync after long bursts of loss; the DCCP-Sync and DCCP-SyncAck |
SyncAck packet types are used to recover (Section 7.5). |
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 |
retransmissions, and it doesn't make sense to have a TCP-style |
field doesn't make sense. DCCP's Acknowledgement Number field equals |
cumulative acknowledgement field. DCCP's Acknowledgement Number |
the greatest sequence number received, rather than the smallest |
field equals the greatest sequence number received, rather than the |
sequence number not received. Separate options indicate any |
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 |
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 signal |
|
that the connection is over, but the client must 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 |
endpoints need 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 |
Dropped packets and ECN [RFC 3168] 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]. |
some window, similar to a selective acknowledgement (SACK) [RFC |
|
2018]. |
CCID 3 provides TFRC Congestion Control, 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 |
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 14] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
using the receiver's estimate of the packet loss and mark rate. CCID |
using the receiver's estimate of the packet loss and mark rate. |
3 behaves somewhat differently from TCP in the short term; it is |
CCID 3 behaves somewhat differently from TCP in the short term, it 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 |
CCIDs 2 and 3 are fully defined in separate profile documents [CCID 2 |
[RFC4341, RFC4342]. |
PROFILE, CCID 3 PROFILE]. |
|
|
4.5. Connection Features |
|
|
|
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 |
There are four feature negotiation options in all: Change L, |
L, Change R, and Confirm R. The "L" options are sent by the feature |
Confirm L, Change R, and Confirm R. The "L" options are sent by the |
location, and the "R" options are sent by the feature remote. A |
feature location, and the "R" options are sent by the feature remote. |
Change R option says to the feature location, "change this feature |
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 |
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 |
second exchange, the client requests that the server use either |
3 or CCID 4, with 3 preferred; the server chooses 4 and supplies its |
CCID 3 or CCID 4, with 3 preferred; the server chooses 4 and supplies |
preference list, "4 2". |
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 |
4.6. Differences From TCP |
|
|
Differences between DCCP and TCP apart from those discussed so far |
|
include the following: |
include: |
|
|
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- |
were received; in CCID 3 (TFRC), it's about one ack per round-trip |
trip time, and acks must declare at minimum just the lengths of |
time, and acks must declare at minimum just the lengths of recent |
recent loss intervals. |
loss intervals. |
|
|
o Denial-of-service (DoS) protection. Several mechanisms help limit |
|
the amount of state that possibly misbehaving clients can force |
the amount of state possibly-misbehaving clients can force DCCP |
DCCP servers to maintain. An Init Cookie option, analogous to |
servers to maintain. An Init Cookie option, analogous to TCP's |
TCP's SYN Cookies [SYNCOOKIES], avoids SYN-flood-like attacks. |
SYN Cookies [SYNCOOKIES], avoids SYN-flood-like attacks. Only one |
Only one connection endpoint has to hold TIMEWAIT state; the |
connection endpoint need hold TIMEWAIT state; the DCCP-CloseReq |
DCCP-CloseReq packet, which may only be sent by the server, passes |
packet, which may only be sent by the server, passes that state to |
that state to the client. Various rate limits let servers avoid |
the client. Various rate limits let servers avoid attacks that |
attacks that might force extensive computation or packet |
might force extensive computation or packet generation. |
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, which the |
|
server may ignore. |
|
|
|
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 an Init Cookie that wraps up all this information and |
|
that must be returned by the client for the connection to |
which 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 the Init Cookie if there was one in |
|
the DCCP-Response. It may also continue feature negotiation. The |
|
client may piggyback an application-level request on its final |
|
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. |
5b. |
|
The client sends a DCCP-Close packet closing the connection. |
6b. The server sends a DCCP-Reset packet with Reset Code 1, "Closed", |
6b. |
and clears its connection state. |
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 |
7b. |
2MSL to allow any remaining packets to clear the network. |
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 12 |
|
bytes of the header have the same semantics for all currently defined |
bytes of the header have 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, |
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 on the endpoint that sent this packet, the Destination Port |
Port the relevant port on the other endpoint. When initiating a |
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. |
the same for DCCP. See Section 19.9 for more discussion. |
|
|
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 |
packets with reserved type MUST NOT be processed and they MUST NOT |
NOT be acknowledged as received. |
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 |
DataAck, and DCCP-Ack packets MAY set X to zero or one. All DCCP- |
DCCP-Request, DCCP-Response, DCCP-CloseReq, DCCP-Close, DCCP- |
Request, DCCP-Response, DCCP-CloseReq, DCCP-Close, DCCP-Reset, |
Reset, DCCP-Sync, and DCCP-SyncAck packets MUST set X to one; |
DCCP-Sync, and DCCP-SyncAck packets MUST set X to one; endpoints |
endpoints MUST ignore any such packets with X set to zero. High- |
MUST ignore any such packets with X set to zero. High-rate |
rate connections SHOULD set X to one on all packets to gain |
connections SHOULD set X to one on all packets to gain increased |
increased protection against wrapped sequence numbers and attacks. |
protection against wrapped sequence numbers and attacks. See |
See Section 7.6. |
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 |
any acknowledgeable packet so far. A packet is acknowledgeable if |
if and only if its header was successfully processed by the |
and only if its header was successfully processed by the receiver; |
receiver; Section 7.4 describes this further. Options such as |
Section 7.4 describes this further. Options such as Ack Vector |
Ack Vector (Section 11.4) combine with the Acknowledgement |
(Section 11.4) combine with the Acknowledgement Number to provide |
Number to provide precise information about which packets have |
precise information about which packets have arrived. |
arrived. |
Acknowledgement Numbers on DCCP-Sync and DCCP-SyncAck packets need |
|
not equal GSR. See Section 5.7. |
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 |
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 |
intends to use, and thus aiding middleboxes and reducing reliance |
globally well-known ports. See Section 8.1.2. |
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. |
packets. This is the second phase of the three-way handshake. DCCP- |
DCCP-Response packets MAY contain application data and MUST use |
Response packets MAY contain application data, and MUST use 48-bit |
48-bit sequence numbers (X=1). |
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 |
The central data transfer portion of every DCCP connection uses DCCP- |
DCCP-Data, DCCP-Ack, and DCCP-DataAck packets. These packets MAY use |
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 |
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. Acknowledgement information is piggybacked |
Acknowledgement Number: acknowledgement information is piggybacked on |
on a data packet. |
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 |
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 |
A valid packet arrived with unexpected type. For example, a DCCP- |
DCCP-Data packet with valid header checksum and sequence numbers |
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 |
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 or recover from half-open connections. Each valid |
bursts of loss, or 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 |
and DCCP-SyncAck packets. First, the packet corresponding to a DCCP- |
DCCP-Sync's Acknowledgement Number need not have been |
Sync's Acknowledgement Number need not have been acknowledgeable. |
acknowledgeable. Thus, receivers MUST NOT assume that a packet was |
Thus, receivers MUST NOT assume that a packet was processed simply |
processed simply because it appears in the Acknowledgement Number |
because it appears in the Acknowledgement Number field of a DCCP-Sync |
field of a DCCP-Sync packet. This differs from all other packet |
packet. This differs from all other packet types, where the |
types, where the Acknowledgement Number by definition corresponds to |
Acknowledgement Number by definition corresponds to an |
an acknowledgeable packet. Second, the Acknowledgement Number on any |
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. |
bytes, and must therefore be greater than or equal to two. |
|
|
Options are processed sequentially, starting at the first option in |
|
the packet header. Options with unknown types MUST be ignored. |
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 29] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
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. |
|
|
|
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-5 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- |
The table summarizes the most common restriction: when the DCCP-Data? |
Data? column value is N, the corresponding option MUST be ignored |
column value is N, the corresponding option MUST be ignored when |
when received on a DCCP-Data packet. (Section 7.5.5 describes why |
received on a DCCP-Data packet. (Section 7.5.5 describes why such |
such options are ignored as opposed to, say, causing a reset.) |
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 |
|
4 MUST be ignored, since all valid Data Checksum options have option |
|
length 6. |
|
|
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 30] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
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 |
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 did not understand the enclosed feature number; if the |
endpoint understood O, but chose not to perform the action O implies. |
endpoint understood O, but chose not to perform the action O implies; |
|
and so forth. |
Mandatory options MUST NOT be sent on DCCP-Data packets, and any |
|
Mandatory options received on DCCP-Data packets MUST be ignored. |
|
|
|
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 |
"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. |
|
|
|
|
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 31] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
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. |
contain at least one Value, and thus have length at least 4. |
|
|
+--------+--------+--------+--------+-------- |
|
Change L: |00100000| Length |Feature#| Value(s) ... |
|
+--------+--------+--------+--------+-------- |
|
Type=32 |
|
|
|
+--------+--------+--------+--------+-------- |
|
Change R: |00100010| Length |Feature#| Value(s) ... |
|
+--------+--------+--------+--------+-------- |
|
Type=34 |
|
|
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 32] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
6.2. Confirm Options |
|
|
|
Confirm L and Confirm R options complete feature negotiation and are |
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: |
All current DCCP features use one of two reconciliation rules, |
server-priority ("SP") and non-negotiable ("NN"). |
|
|
|
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. |
|
|
|
|
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 33] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
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. |
|
|
|
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 1 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 is |
|
server-priority, and NN is non-negotiable. |
server-priority and NN is non-negotiable. |
|
|
Initial Value The initial value for the feature. Every feature has |
|
a known initial value. |
|
|
|
|
|
|
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 34] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
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 |
that implements CCID 2 MUST support Ack Ratio and Send |
Send Ack Vector, for example. |
Ack Vector, for example. |
|
|
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 |
Client Server |
------ ------ |
------ ------ |
1a. Change R(CCID, 2 3 1) --> |
1a. Change R(CCID, 2 3 1) --> |
b. <-- Change L(CCID, 3 2 1) |
b. <-- Change L(CCID, 3 2 1) |
2a. <-- Confirm L(CCID, 3, 3 2 1) |
2a. <-- Confirm L(CCID, 3, 3 2 1) |
b. Confirm R(CCID, 3, 2 3 1) --> |
b. Confirm R(CCID, 3, 2 3 1) --> |
* agreement that CCID/Server = 3 * |
* agreement that CCID/Server = 3 * |
|
|
Here are the byte encodings of several Change and Confirm options. |
|
Each option is sent by DCCP A. |
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 35] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
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. |
|
|
|
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 strictly in increasing |
3. Feature negotiation options are processed in strictly increasing |
order by Sequence Number. |
|
|
|
|
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 36] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
The rest of this section describes the consequences of these rules in |
|
more detail. |
|
|
|
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. |
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 |
list, calculates the new value, and sends back a Confirm R or |
L option, respectively, informing its peer of the new value or that |
Confirm L option, respectively, informing its peer of the new value |
the feature was not understood. Every non-reordered Change option |
or that the feature was not understood. Every non-reordered Change |
MUST result in a corresponding Confirm option, and any packet |
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, as |
|
long as no two options refer to the same feature. Note, however, |
|
that a packet is allowed to contain one L option and one R option |
|
with the same feature number, since the two options actually refer to |
|
different features (F/A and F/B). |
|
|
|
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 |
CHANGING state when it first sends a Change for the feature, and |
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 37] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
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 |
changed its preference list, but has not yet transmitted a Change |
option with the new preference list. |
|
|
|
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 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 |
"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 |
|
|
|
|
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 38] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
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 |
|
|
|
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. |
|
|
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 39] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
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. (Endpoints that generate packets |
|
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 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 |
piggyback Change options on packets they would have sent anyway, or |
create new packets to carry the options. Any such new packets are |
create new packets to carry the options; any such 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 strictly in increasing order |
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 |
(Change and/or Confirm). This value is initialized to |
- 1. |
ISR - 1. |
|
|
FGSS Feature Greatest Sequence Number Sent: The greatest |
|
sequence number sent, considering only packets that |
|
contained one or more non-retransmitted Change options. |
|
(Retransmitted Change options MUST have exactly the same |
|
contents as previously transmitted options, so limited |
|
reordering can safely be tolerated.) This value 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. |
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 40] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
2. If a packet's Sequence Number is less than or equal to FGSR, if it |
2. If a packet's Sequence Number is less than or equal to FGSR, OR it |
has no Acknowledgement Number, OR if its Acknowledgement Number is |
has no Acknowledgement Number, OR its Acknowledgement Number is |
less than FGSS, then its Confirm options MUST be ignored. |
|
|
|
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 |
the same feature at the same time -- might lead to the negotiation |
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. |
|
|
|
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 |
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 41] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
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 |
value for any extension feature should 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 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 |
"Change L(Ack Ratio, 0)" option is never valid. Note that server- |
server-priority features do not have value limitations, since |
priority features do not have value limitations, since unknown |
unknown values are handled as a matter of course. |
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. |
|
|
|
o However, unexpected Confirm options -- that refer to unknown |
|
feature numbers, or that don't appear to be part of a current |
|
negotiation -- are considered valid, 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 |
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 42] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
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 |
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. |
|
|
|
There's no reason to mark Confirm options as Mandatory in this |
|
version of DCCP, since Confirm options are sent only in response to |
|
Change options and therefore can't mention potentially invalid values |
Change options and therefore can't mention potentially-invalid values |
or unexpected feature numbers. |
|
|
|
7. Sequence Numbers |
|
|
|
DCCP uses sequence numbers to arrange packets into sequence, to |
DCCP uses sequence numbers to arrange packets into sequence, detect |
detect losses and network duplicates, and to protect against |
losses and network duplicates, and protect against attackers, half- |
attackers, half-open connections, and the delivery of very old |
open connections, and the delivery of very old packets. Every packet |
packets. Every packet carries a Sequence Number; most packet types |
carries a Sequence Number; most packet types carry an Acknowledgement |
carry an Acknowledgement Number as well. |
Number as well. |
|
DCCP sequence numbers are packet-based. That is, the packets |
DCCP sequence numbers are packet based. That is, the packets |
|
generated by each endpoint have Sequence Numbers that increase by |
|
one, modulo 2^48, for every 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 detect network duplication, |
|
retransmissions, and acknowledgement loss; it is a significant |
retransmissions, and acknowledgement loss, and is a significant |
departure from TCP practice. |
|
|
|
7.1. Variables |
|
|
|
DCCP endpoints maintain a set of sequence number variables for each |
|
connection. |
|
|
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 43] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
ISS The Initial Sequence Number Sent by this endpoint. This |
|
equals the Sequence Number of the first DCCP-Request or |
equals the Sequence Number of the first DCCP-Request or DCCP- |
DCCP-Response sent. |
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. |
|
|
|
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 |
These problems are the same as problems faced by TCP, and DCCP |
implementations SHOULD use TCP's strategies to avoid them [RFC793, |
implementations SHOULD use TCP's strategies to avoid them [RFC 793, |
RFC1948]. The rest of this section explains these strategies in more |
RFC 1948]. The rest of this section explains these strategies in |
detail. |
more detail. |
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 44] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
To address the first problem, an implementation MUST ensure that the |
|
initial sequence number for a given <source address, source port, |
|
destination address, destination port> 4-tuple doesn't overlap with |
|
recent sequence numbers on previous connections with the same 4- |
recent sequence numbers on previous connections with the same |
tuple. ("Recent" means sent within 2 maximum segment lifetimes, or 4 |
4-tuple. ("Recent" means sent within 2 maximum segment lifetimes, or |
minutes.) The implementation MUST additionally ensure that the lower |
4 minutes.) The implementation MUST additionally ensure that the |
24 bits of the initial sequence number don't overlap with the lower |
lower 24 bits of the initial sequence number don't overlap with the |
24 bits of recent sequence numbers (unless the implementation plans |
lower 24 bits of recent sequence numbers (unless the implementation |
to avoid short sequence numbers; see Section 7.6). An implementation |
plans to avoid short sequence numbers; see Section 7.6). An |
that has state for a recent connection with the same 4-tuple can pick |
implementation that has state for a recent connection with the same |
a good initial sequence number explicitly. Otherwise, it could tie |
4-tuple can pick a good initial sequence number explicitly. |
initial sequence number selection to some clock, such as the 4- |
Otherwise, it could tie initial sequence number selection to some |
microsecond clock used by TCP [RFC793]. Two separate clocks may be |
clock, such as the 4-microsecond clock used by TCP [RFC 793]. Two |
required, one for the upper 24 bits and one for the lower 24 bits. |
separate clocks may be required, one for the upper 24 bits and one |
|
for the lower 24 bits. |
To address the second problem, an implementation MUST provide each |
|
4-tuple with an independent initial sequence number space. Then, |
4-tuple with an independent initial sequence number space. Then |
opening a connection doesn't provide any information about initial |
|
sequence numbers on other connections to the same host. RFC 1948 |
|
achieves this by adding a cryptographic hash of the 4-tuple and a |
|
secret to each initial sequence number. For the secret, RFC 1948 |
|
recommends a combination of some truly random data [RFC4086], an |
recommends a combination of some truly-random data [RFC 1750], an |
administratively installed passphrase, the endpoint's IP address, and |
administratively-installed passphrase, the endpoint's IP address, and |
the endpoint's boot time, but truly random data is sufficient. Care |
the endpoint's boot time, but truly-random data is sufficient. Care |
should be taken when the secret is changed; such a change alters all |
should be taken when changing the secret; such a change alters all |
initial sequence number spaces, which might make an initial sequence |
|
number for some 4-tuple equal a recently sent sequence number for the |
|
same 4-tuple. To avoid this problem, the endpoint might remember |
|
dead connection state for each 4-tuple or stay quiet for 2 maximum |
|
segment lifetimes around such a change. |
|
|
|
7.3. Quiet Time |
|
|
|
DCCP endpoints, like TCP endpoints, must take care before initiating |
|
connections when they boot. In particular, they MUST NOT send |
|
packets whose sequence numbers are close to the sequence numbers of |
|
packets lingering in the network from before the boot. The simplest |
|
way to enforce this rule is for DCCP endpoints to avoid sending any |
|
packets until one maximum segment lifetime (2 minutes) after boot. |
|
Other enforcement mechanisms include remembering recent sequence |
|
numbers across boots and reserving the upper 8 or so bits of initial |
numbers across boots, and reserving the upper 8 or so bits of initial |
sequence numbers for a persistent counter that decrements by two each |
|
boot. (The latter mechanism would require disallowing packets with |
|
short sequence numbers; see Section 7.6.1.) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 45] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
7.4. Acknowledgement Numbers |
|
|
|
Cumulative acknowledgements are meaningless in an unreliable |
|
protocol. Therefore, DCCP's Acknowledgement Number field has a |
|
different meaning from TCP's. |
different meaning than TCP's. |
|
|
A received packet is classified as acknowledgeable if and only if its |
|
header was successfully processed by the receiving DCCP. In terms of |
header was succesfully processed by the receiving DCCP. In terms of |
the pseudocode in Section 8.5, a received packet becomes |
|
acknowledgeable when the receiving endpoint reaches Step 8. This |
|
means, for example, that all acknowledgeable packets have valid |
|
header checksums and sequence numbers. The Acknowledgement Number |
|
MUST equal GSR, the Greatest Sequence Number Received on an |
|
acknowledgeable packet, for all packet types except DCCP-Sync and |
|
DCCP-SyncAck. |
|
|
|
"Acknowledgeable" does not refer to data processing. Even |
|
acknowledgeable packets may have their application data dropped, due |
|
to receive buffer overflow or corruption, for instance. Data Dropped |
|
options report these data losses when necessary, letting congestion |
|
control mechanisms distinguish between network losses and endpoint |
|
losses. This issue is discussed further in Sections 11.4 and 11.7. |
|
|
|
DCCP-Sync and DCCP-SyncAck packets' Acknowledgement Numbers differ as |
|
follows: The Acknowledgement Number on a DCCP-Sync packet corresponds |
|
to a received packet, but not necessarily to an acknowledgeable |
to a received packet, but not necessarily an acknowledgeable packet; |
packet; in particular, it might correspond to an out-of-sync packet |
in particular, it might correspond to an out-of-sync packet whose |
whose options were not processed. The Acknowledgement Number on a |
options were not processed. The Acknowledgement Number on a DCCP- |
DCCP-SyncAck packet always corresponds to an acknowledgeable DCCP- |
SyncAck packet always corresponds to an acknowledgeable DCCP-Sync |
Sync packet; it might be less than GSR in the presence of reordering. |
packet; it might be less than GSR in the presence of reordering. |
|
|
7.5. Validity and Synchronization |
|
|
|
Any DCCP endpoint might receive packets that are not actually part of |
|
the current connection. For instance, the network might deliver an |
|
old packet, an attacker might attempt to hijack a connection, or the |
|
other endpoint might crash, causing a half-open connection. |
|
|
|
DCCP, like TCP, uses sequence number checks to detect these cases. |
|
Packets whose Sequence and/or Acknowledgement Numbers are out of |
|
range are called sequence-invalid and are not processed normally. |
range are called sequence-invalid, and are not processed normally. |
|
|
Unlike TCP, DCCP requires a synchronization mechanism to recover from |
|
large bursts of loss. One endpoint might send so many packets during |
|
a burst of loss that when one of its packets finally got through, the |
|
other endpoint would label its Sequence Number as invalid. A |
|
handshake of DCCP-Sync and DCCP-SyncAck packets recovers from this |
|
case. |
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 46] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
7.5.1. Sequence and Acknowledgement Number Windows |
|
|
|
Each DCCP endpoint defines sequence validity windows that are subsets |
|
of the Sequence and Acknowledgement Number spaces. These windows |
|
correspond to packets the endpoint expects to receive in the next few |
|
round-trip times. The Sequence and Acknowledgement Number windows |
|
always contain GSR and GSS, respectively. The window widths are |
|
controlled by Sequence Window features for the two half- connections. |
controlled by Sequence Window features for the two half-connections. |
|
|
The Sequence Number validity window for packets from DCCP B is [SWL, |
|
SWH]. This window always contains GSR, the Greatest Sequence Number |
|
Received on a sequence-valid packet from DCCP B. It is W packets |
|
wide, where W is the value of the Sequence Window/B feature. One- |
|
fourth of the sequence window, rounded down, is less than or equal to |
|
GSR, and three-fourths is greater than GSR. (This asymmetric |
|
placement assumes that bursts of loss are more common in the network |
|
than significant reorderings.) |
than significant reordering.) |
|
|
invalid | valid Sequence Numbers | invalid |
|
<---------*|*===========*=======================*|*---------> |
|
GSR -|GSR + 1 - GSR GSR +|GSR + 1 + |
|
floor(W/4)|floor(W/4) ceil(3W/4)|ceil(3W/4) |
|
= SWL = SWH |
|
|
|
The Acknowledgement Number validity window for packets from DCCP B is |
|
[AWL, AWH]. The high end of the window, AWH, equals GSS, the |
|
Greatest Sequence Number Sent by DCCP A; the window is W' packets |
|
wide, where W' is the value of the Sequence Window/A feature. |
|
|
|
invalid | valid Acknowledgement Numbers | invalid |
|
<---------*|*===================================*|*---------> |
|
GSS - W'|GSS + 1 - W' GSS|GSS + 1 |
|
= AWL = AWH |
|
|
|
SWL and AWL are initially adjusted so that they are not less than the |
|
initial Sequence Numbers received and sent, respectively: |
|
|
|
SWL := max(GSR + 1 - floor(W/4), ISR), |
SWL := max(GSR + 1 - floor(W/4), ISR), |
AWL := max(GSS - W' + 1, ISS). |
AWL := max(GSS - W' + 1, ISS). |
|
|
These adjustments MUST be applied only at the beginning of the |
|
connection. (Long-lived connections may wrap sequence numbers so |
|
that they appear to be less than ISR or ISS; the adjustments MUST NOT |
|
be applied in that case.) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 47] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
7.5.2. Sequence Window Feature |
|
|
|
The Sequence Window/A feature determines the width of the Sequence |
|
Number validity window used by DCCP B and the width of the |
Number validity window used by DCCP B, and the width of the |
Acknowledgement Number validity window used by DCCP A. DCCP A sends |
|
a "Change L(Sequence Window, W)" option to notify DCCP B that the |
|
Sequence Window/A value is W. |
|
|
|
Sequence Window has feature number 3 and is non-negotiable. It takes |
Sequence Window has feature number 3, and is non-negotiable. It |
48-bit (6-byte) integer values, like DCCP sequence numbers. Change |
takes 48-bit (6-byte) integer values, like DCCP sequence numbers. |
and Confirm options for Sequence Window are therefore 9 bytes long. |
Change and Confirm options for Sequence Window are therefore 9 bytes |
New connections start with Sequence Window 100 for both endpoints. |
long. New connections start with Sequence Window 100 for both |
The minimum valid Sequence Window value is Wmin = 32. The maximum |
endpoints. The minimum valid Sequence Window value is Wmin = 32. |
valid Sequence Window value is Wmax = 2^46 - 1 = 70368744177663; |
The maximum valid Sequence Window value is Wmax = 2^46 - 1 = |
circular sequence number comparisons would stop working absent this |
70368744177663; circular sequence number comparisons would stop |
constraint. Change options suggesting Sequence Window values out of |
working absent this constraint. Change options suggesting Sequence |
this range are invalid and MUST be handled accordingly. |
Window values out of this range are invalid and MUST be handled |
|
accordingly. |
A proper Sequence Window/A value must reflect the number of packets |
|
DCCP A expects to be in flight. Only DCCP A can anticipate this |
|
number. Values that are too small increase the risk of the endpoints |
|
getting out sync after bursts of loss, and values that are much too |
|
small can prevent productive communication whether or not there is |
|
loss. On the other hand, too-large values increase the risk of |
|
connection hijacking; Section 7.5.5 quantifies this risk. One good |
|
guideline is for each endpoint to set Sequence Window to about five |
|
times the maximum number of packets it expects to send in a round- |
|
trip time. Endpoints SHOULD send Change L(Sequence Window) options, |
trip time. Endpoints SHOULD send Change L(Sequence Window) options |
as necessary, as the connection progresses. Also, an endpoint MUST |
as necessary as the connection progresses. Also, an endpoint MUST |
NOT persistently send more than its Sequence Window number of packets |
|
per round-trip time; that is, DCCP A MUST NOT persistently send more |
|
than Sequence Window/A packets per RTT. |
|
|
|
7.5.3. Sequence-Validity Rules |
|
|
|
Sequence-validity depends on the received packet's type. This table |
|
shows the sequence and acknowledgement number checks applied to each |
|
packet; a packet is sequence-valid if it passes both tests, and |
|
sequence-invalid if it does not. Many of the checks refer to the |
|
sequence and acknowledgement number validity windows [SWL, SWH] and |
|
[AWL, AWH] defined in Section 7.5.1. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 48] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
Acknowledgement Number |
|
Packet Type Sequence Number Check Check |
|
----------- --------------------- ---------------------- |
|
DCCP-Request SWL <= seqno <= SWH (*) N/A |
|
DCCP-Response SWL <= seqno <= SWH (*) AWL <= ackno <= AWH |
|
DCCP-Data SWL <= seqno <= SWH N/A |
|
DCCP-Ack SWL <= seqno <= SWH AWL <= ackno <= AWH |
|
DCCP-DataAck SWL <= seqno <= SWH AWL <= ackno <= AWH |
|
DCCP-CloseReq GSR < seqno <= SWH GAR <= ackno <= AWH |
|
DCCP-Close GSR < seqno <= SWH GAR <= ackno <= AWH |
|
DCCP-Reset GSR < seqno <= SWH GAR <= ackno <= AWH |
|
DCCP-Sync SWL <= seqno AWL <= ackno <= AWH |
|
DCCP-SyncAck SWL <= seqno AWL <= ackno <= AWH |
|
|
|
(*) Check not applied if connection is in LISTEN or REQUEST state. |
|
|
|
In general, packets are sequence-valid if their Sequence and |
|
Acknowledgement Numbers lie within the corresponding valid windows, |
|
[SWL, SWH] and [AWL, AWH]. The exceptions to this rule are as |
|
follows: |
|
|
|
o Since DCCP-CloseReq, DCCP-Close, and DCCP-Reset packets end a |
|
connection, they cannot have Sequence Numbers less than or equal |
|
to GSR, or Acknowledgement Numbers less than GAR. |
|
|
|
o DCCP-Sync and DCCP-SyncAck Sequence Numbers are not strongly |
|
checked. These packet types exist specifically to get the |
|
endpoints back into sync; checking their Sequence Numbers would |
|
eliminate their usefulness. |
|
|
|
The lenient checks on DCCP-Sync and DCCP-SyncAck packets allow |
|
continued operation after unusual events, such as endpoint crashes |
|
and large bursts of loss, but there's no need for leniency in the |
|
absence of unusual events -- that is, during ongoing successful |
|
communication. Therefore, DCCP implementations SHOULD use the |
|
following, more stringent checks for active connections, where a |
|
connection is considered active if it has received valid packets from |
|
the other endpoint within the last five round-trip times. |
|
|
|
Acknowledgement Number |
|
Packet Type Sequence Number Check Check |
|
----------- --------------------- ---------------------- |
|
DCCP-Sync SWL <= seqno <= SWH AWL <= ackno <= AWH |
|
DCCP-SyncAck SWL <= seqno <= SWH AWL <= ackno <= AWH |
|
|
|
Finally, an endpoint MAY apply the following more stringent checks to |
|
DCCP-CloseReq, DCCP-Close, and DCCP-Reset packets, further lowering |
|
the probability of successful blind attacks using those packet types. |
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 49] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
Since these checks can cause extra synchronization overhead and delay |
|
connection closing when packets are lost, they should be considered |
|
experimental. |
|
|
|
Acknowledgement Number |
|
Packet Type Sequence Number Check Check |
|
----------- --------------------- ---------------------- |
|
DCCP-CloseReq seqno == GSR + 1 GAR <= ackno <= AWH |
|
DCCP-Close seqno == GSR + 1 GAR <= ackno <= AWH |
|
DCCP-Reset seqno == GSR + 1 GAR <= ackno <= AWH |
|
|
|
Note that sequence-validity is only one of the validity checks |
|
applied to received packets. |
|
|
|
7.5.4. Handling Sequence-Invalid Packets |
|
|
|
Endpoints respond to received sequence-invalid packets as follows. |
Endpoints MUST ignore sequence-invalid DCCP-Sync and DCCP-SyncAck |
|
packets, and MUST respond to other sequence-invalid packets with |
o Any sequence-invalid DCCP-Sync and DCCP-SyncAck packet MUST be |
(possibly rate-limited) DCCP-Sync packets. Each such DCCP-Sync |
ignored. |
packet MUST use a new Sequence Number, and thus will increase GSS; |
|
GSR will not change, however, since the received packet was sequence- |
o A sequence-invalid DCCP-Reset packet MUST elicit a DCCP-Sync |
invalid. Each such DCCP-Sync packet's Acknowledgement Number MUST |
packet in response (subject to a possible rate limit). This |
equal GSR when the received sequence-invalid packet has type DCCP- |
response packet MUST use a new Sequence Number, and thus will |
Reset, and the received packet's Sequence Number otherwise. |
increase GSS; GSR will not change, however, since the received |
|
packet was sequence-invalid. The response packet's |
|
Acknowledgement Number MUST equal GSR. |
|
|
|
o Any other sequence-invalid packet MUST elicit a similar DCCP-Sync |
|
packet, except that the response packet's Acknowledgement Number |
|
MUST equal the sequence-invalid packet's Sequence Number. |
|
|
|
On receiving a sequence-valid DCCP-Sync packet, the peer endpoint |
|
(say, DCCP B) MUST update its GSR variable and reply with a DCCP- |
|
SyncAck packet. The DCCP-SyncAck packet's Acknowledgement Number |
|
will equal the DCCP-Sync's Sequence Number, but not necessarily its |
will equal the DCCP-Sync's Sequence Number, not necessarily GSR. |
GSR. Upon receiving this DCCP-SyncAck, which will be sequence-valid |
Upon receiving this DCCP-SyncAck, which will be sequence-valid since |
since it acknowledges the DCCP-Sync, DCCP A will update its GSR |
it acknowledges the DCCP-Sync, DCCP A will update its GSR variable, |
variable, and the endpoints will be back in sync. As an exception, |
and the endpoints will be back in sync. As an exception, if the peer |
if the peer endpoint is in the REQUEST state, it MUST respond with a |
endpoint is in the REQUEST state, it MUST respond with a DCCP-Reset |
DCCP-Reset instead of a DCCP-SyncAck. This serves to clean up DCCP |
instead of a DCCP-SyncAck. This serves to clean up DCCP A's half- |
A's half-open connection. |
open connection. |
|
|
To protect against denial-of-service attacks, DCCP implementations |
|
SHOULD impose a rate limit on DCCP-Syncs sent in response to |
|
sequence-invalid packets, such as not more than eight DCCP-Syncs per |
|
second. |
|
|
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 50] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
DCCP endpoints MUST NOT process sequence-invalid packets except, |
|
perhaps, by generating a DCCP-Sync. For instance, options MUST NOT |
|
be processed. An endpoint MAY temporarily preserve sequence-invalid |
but processed. An endpoint MAY temporarily preserve sequence-invalid |
packets in case they become valid later, however; this can reduce the |
|
impact of bursts of loss by delivering more packets to the |
|
application. In particular, an endpoint MAY preserve sequence- |
|
invalid packets for up to 2 round-trip times. If, within that time, |
|
the relevant sequence windows change so that the packets become |
|
sequence-valid, the endpoint MAY process them again. |
|
|
|
Note that sequence-invalid DCCP-Reset packets cause DCCP-Syncs to be |
|
generated. This is because endpoints in an unsynchronized state |
|
(CLOSED, REQUEST, and LISTEN) might not have enough information to |
|
generate a proper DCCP-Reset on the first try. For example, if a |
|
peer endpoint is in CLOSED state and receives a DCCP-Data packet, it |
|
cannot guess the right Sequence Number to use on the DCCP-Reset it |
|
generates (since the DCCP-Data packet has no Acknowledgement Number). |
|
The DCCP-Sync generated in response to this bad reset serves as a |
|
challenge, and contains enough information for the peer to generate a |
|
proper DCCP-Reset. However, the new DCCP-Reset may carry a different |
|
Reset Code than the original DCCP-Reset; probably the new Reset Code |
|
will be 3, "No Connection". The endpoint SHOULD use information from |
|
the original DCCP-Reset when possible. |
|
|
|
7.5.5. Sequence Number Attacks |
|
|
|
Sequence and Acknowledgement Numbers form DCCP's main line of defense |
|
against attackers. An attacker that cannot guess sequence numbers |
|
cannot easily manipulate or hijack a DCCP connection, and |
|
requirements like careful initial sequence number choice eliminate |
|
the most serious attacks. |
|
|
|
An attacker might still send many packets with randomly chosen |
|
Sequence and Acknowledgement Numbers, however. If one of those |
|
probes ends up sequence-valid, it may shut down the connection or |
|
otherwise cause problems. The easiest such attacks to execute are as |
otherwise cause problems. The easiest such attacks to execute are: |
follows: |
|
|
|
o Send DCCP-Data packets with random Sequence Numbers. If one of |
|
these packets hits the valid sequence number window, the attack |
|
packet's application data may be inserted into the data stream. |
|
|
|
o Send DCCP-Sync packets with random Sequence and Acknowledgement |
|
Numbers. If one of these packets hits the valid acknowledgement |
|
number window, the receiver will shift its sequence number window |
|
accordingly, getting out of sync with the correct endpoint -- |
|
perhaps permanently. |
|
|
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 51] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
The attacker has to guess both Source and Destination Ports for any |
|
of these attacks to succeed. Additionally, the connection would have |
|
to be inactive for the DCCP-Sync attack to succeed, assuming the |
|
victim implemented the more stringent checks for active connections |
|
recommended in Section 7.5.3. |
|
|
|
To quantify the probability of success, let N be the number of attack |
|
packets the attacker is willing to send, W be the relevant sequence |
|
window width, and L be the length of sequence numbers (24 or 48). |
|
The attacker's best strategy is to space the attack packets evenly |
|
over sequence space. Then the probability of hitting one sequence |
|
number window is P = WN/2^L. |
|
|
|
The success probability for a DCCP-Data attack using short sequence |
|
numbers thus equals P = WN/2^24. For W = 100, then, the attacker |
|
must send more than 83,000 packets to achieve a 50% chance of |
|
success. For reference, the easiest TCP attack -- sending a SYN with |
|
a random sequence number, which will cause a connection reset if it |
|
falls within the window -- has W = 8760 (a common default) and L = 32 |
falls within the window -- has W = 8760 (a common default) and L = |
and requires more than 245,000 packets to achieve a 50% chance of |
32, and requires more than 245,000 packets to achieve a 50% chance of |
success. |
|
|
|
A fast connection's W will generally be high, increasing the attack |
|
success probability for fixed N. If this probability gets |
|
uncomfortably high with L = 24, the endpoint SHOULD prevent the use |
|
of short sequence numbers by manipulating the Allow Short Sequence |
|
Numbers feature (see Section 7.6.1). The probability limit depends |
|
on the application, however. Some applications, such as those |
|
already designed to handle corruption, are quite resilient to data |
|
injection attacks. |
|
|
|
The DCCP-Sync attack has L = 48, since DCCP-Sync packets use long |
|
sequence numbers exclusively; in addition, the success probability is |
|
halved, since only half the Sequence Number space is valid. Attacks |
|
have a correspondingly smaller probability of success. For a large W |
|
of 2000 packets, then, the attacker must send more than 10^11 packets |
|
to achieve a 50% chance of success. |
|
|
|
Attacks involving DCCP-Ack, DCCP-DataAck, DCCP-CloseReq, DCCP-Close, |
|
and DCCP-Reset packets are more difficult, since Sequence and |
|
Acknowledgement Numbers must both be guessed. The probability of |
|
attack success for these packet types equals P = WXN/2^(2L), where W |
|
is the Sequence Number window, X is the Acknowledgement Number |
|
window, and N and L are as before. |
|
|
|
Since DCCP-Data attacks with short sequence numbers are relatively |
|
easy for attackers to execute, DCCP has been engineered to prevent |
|
these attacks from escalating to connection resets or other serious |
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 52] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
consequences. In particular, any options whose processing might |
|
cause the connection to be reset are ignored when they appear on |
|
DCCP-Data packets. |
|
|
|
7.5.6. Sequence Number Handling Examples |
|
|
|
In the following example, DCCP A and DCCP B recover from a large |
|
burst of loss that runs DCCP A's sequence numbers out of DCCP B's |
|
appropriate sequence number window. |
|
|
|
DCCP A DCCP B |
|
(GSS=1,GSR=10) (GSS=10,GSR=1) |
|
--> DCCP-Data(seq 2) XXX |
|
... |
|
--> DCCP-Data(seq 100) XXX |
|
--> DCCP-Data(seq 101) --> ??? |
|
seqno out of range; |
|
send Sync |
|
OK <-- DCCP-Sync(seq 11, ack 101) <-- |
|
(GSS=11,GSR=1) |
|
--> DCCP-SyncAck(seq 102, ack 11) --> OK |
|
(GSS=102,GSR=11) (GSS=11,GSR=102) |
|
|
|
In the next example, a DCCP connection recovers from a simple blind |
|
attack. |
|
|
|
DCCP A DCCP B |
|
(GSS=1,GSR=10) (GSS=10,GSR=1) |
|
*ATTACKER* --> DCCP-Data(seq 10^6) --> ??? |
|
seqno out of range; |
|
send Sync |
|
??? <-- DCCP-Sync(seq 11, ack 10^6) <-- |
|
ackno out of range; ignore |
|
(GSS=1,GSR=10) (GSS=11,GSR=1) |
|
|
|
The final example demonstrates recovery from a half-open connection. |
|
|
|
DCCP A DCCP B |
|
(GSS=1,GSR=10) (GSS=10,GSR=1) |
|
(Crash) |
|
CLOSED OPEN |
|
REQUEST --> DCCP-Request(seq 400) --> ??? |
|
!! <-- DCCP-Sync(seq 11, ack 400) <-- OPEN |
|
REQUEST --> DCCP-Reset(seq 401, ack 11) --> (Abort) |
|
REQUEST CLOSED |
|
REQUEST --> DCCP-Request(seq 402) --> ... |
|
|
|
|
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 53] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
7.6. Short Sequence Numbers |
|
|
|
DCCP sequence numbers are 48 bits long. This large sequence space |
|
protects DCCP connections against some blind attacks, such as the |
|
injection of DCCP-Resets into the connection. However, DCCP-Data, |
|
DCCP-Ack, and DCCP-DataAck packets, which make up the body of any |
|
DCCP connection, may reduce header space by transmitting only the |
|
lower 24 bits of the relevant Sequence and Acknowledgement Numbers. |
|
The receiving endpoint will extend these numbers to 48 bits using the |
|
following pseudocode: |
|
|
|
procedure Extend_Sequence_Number(S, REF) |
|
/* S is a 24-bit sequence number from the packet header. |
|
REF is the relevant 48-bit reference sequence number: |
|
GSS if S is an Acknowledgement Number, and GSR if S is a |
|
Sequence Number. */ |
|
Set REF_low := low 24 bits of REF |
|
Set REF_hi := high 24 bits of REF |
|
If REF_low (<) S /* circular comparison mod 2^24 */ |
|
and S |<| REF_low, /* conventional, non-circular |
and S |<| REF_low, /* conventional, non-circular |
comparison */ |
|
Return (((REF_hi + 1) mod 2^24) << 24) | S |
|
Otherwise, if S (<) REF_low and REF_low |<| S, |
|
Return (((REF_hi - 1) mod 2^24) << 24) | S |
|
Otherwise, |
|
Return (REF_hi << 24) | S |
|
|
|
The two different kinds of comparison in the if statements detect |
|
when the low-order bits of the sequence space have wrapped. (The |
|
circular comparison "REF_low (<) S" returns true if and only if (S - |
circular comparison "REF_low (<) S" returns true if and only if |
REF_low), calculated using two's-complement arithmetic and then |
(S - REF_low), calculated using two's-complement arithmetic and then |
represented as an unsigned number, is less than or equal to 2^23 (mod |
|
2^24).) When this happens, the high-order bits are incremented or |
|
decremented, as appropriate. |
|
|
|
7.6.1. Allow Short Sequence Numbers Feature |
|
|
|
Endpoints can require that all packets use long sequence numbers by |
|
setting the Allow Short Sequence Numbers feature to false. This can |
|
reduce the risk that data will be inappropriately injected into the |
|
connection. DCCP A sends a "Change R(Allow Short Seqnos, 0)" option |
|
to ask DCCP B to send only long sequence numbers. |
|
|
|
Allow Short Sequence Numbers has feature number 2 and is server- |
Allow Short Sequence Numbers has feature number 2, and is server- |
priority. It takes one-byte Boolean values. DCCP B MUST NOT send |
|
packets with short sequence numbers when Allow Short Seqnos/B is |
|
zero. Values of two or more are reserved. New connections start |
|
with Allow Short Sequence Numbers 1 for both endpoints. |
|
|
|
|
|
|
|
Kohler, et al. Standards Track [Page 54] |
|
|
|
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006 |
|
|
|
|
|
7.6.2. When to Avoid Short Sequence Numbers |
|
|
|
Short sequence numbers reduce the rate DCCP connections can safely |
|
achieve and increase the risks of certain kinds of attacks, including |
achieve, and increase the risks of certain kinds of attacks, |
blind data injection. Very-high-rate DCCP connections, and |
including blind data injection. Very-high-rate DCCP connections, and |
connections with large sequence windows (Section 7.5.2), SHOULD NOT |
|
use short sequence numbers on their data packets. The attack risk |
|
issues have been discussed in Section 7.5.5; we discuss the rate |
|
limitation issue here. |
|
|
|
The sequence-validity mechanism assumes that the network does not |
|
deliver extremely old data. In particular, it assumes that the |
|
network must have dropped any packet by the time the connection wraps |
|
around and uses its sequence number again. This constraint limits |
|
the maximum connection rate that can be safely achieved. Let MSL |
|
equal the maximum segment lifetime, P equal the average DCCP packet |
|
size in bits, and L equal the length of sequence numbers (24 or 48 |
|
bits). Then the maximum safe rate, in bits per second, is R = |
|
P*(2^L)/2MSL. |
|
|
|
For the default MSL of 2 minutes, 1500-byte DCCP packets, and short |
|
sequence numbers, the safe rate is therefore approximately 800 Mb/s. |
|
Although 2 minutes is a very large MSL for any networks that could |
|
sustain that rate with such small packets, long sequence numbers |
|
allow much higher rates under the same constraints: up to 14 petabits |
|
a second for 1500-byte packets and the default MSL. |
|
|
|
7.7. NDP Count and Detecting Application Loss |
|
|
|
DCCP's sequence numbers increment by one on every packet, including |
|
non-data packets (packets that don't carry application data). This |
|
makes DCCP sequence numbers suitable for detecting any network loss, |
|
but not for detecting the loss of application data. The NDP Count |
|
option reports the length of each burst of non-data packets. This |
|
lets the receiving DCCP reliably determine when a burst of loss |
|
included application data. |
|
|
|
+--------+--------+-------- ... --------+ |
|
|00100101| Length | NDP Count | |
|
+--------+--------+-------- ... --------+ |
|
Type=37 Len=3-5 (1-3 bytes) |
|
|
|
If a DCCP endpoint's Send NDP Count feature is one (see below), then |
|