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