| |
| |
| |
| |
| |
| |
| Network Working Group R. Stewart, Ed. |
| Request for Comments: 4960 September 2007 |
| Obsoletes: 2960, 3309 |
| Category: Standards Track |
| |
| |
| Stream Control Transmission Protocol |
| |
| Status of This Memo |
| |
| This document specifies an Internet standards track protocol for the |
| Internet community, and requests discussion and suggestions for |
| improvements. Please refer to the current edition of the "Internet |
| Official Protocol Standards" (STD 1) for the standardization state |
| and status of this protocol. Distribution of this memo is unlimited. |
| |
| Abstract |
| |
| This document obsoletes RFC 2960 and RFC 3309. It describes the |
| Stream Control Transmission Protocol (SCTP). SCTP is designed to |
| transport Public Switched Telephone Network (PSTN) signaling messages |
| over IP networks, but is capable of broader applications. |
| |
| SCTP is a reliable transport protocol operating on top of a |
| connectionless packet network such as IP. It offers the following |
| services to its users: |
| |
| -- acknowledged error-free non-duplicated transfer of user data, |
| |
| -- data fragmentation to conform to discovered path MTU size, |
| |
| -- sequenced delivery of user messages within multiple streams, with |
| an option for order-of-arrival delivery of individual user |
| messages, |
| |
| -- optional bundling of multiple user messages into a single SCTP |
| packet, and |
| |
| -- network-level fault tolerance through supporting of multi-homing |
| at either or both ends of an association. |
| |
| The design of SCTP includes appropriate congestion avoidance behavior |
| and resistance to flooding and masquerade attacks. |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 1] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Table of Contents |
| |
| 1. Introduction ....................................................5 |
| 1.1. Motivation .................................................5 |
| 1.2. Architectural View of SCTP .................................6 |
| 1.3. Key Terms ..................................................6 |
| 1.4. Abbreviations .............................................10 |
| 1.5. Functional View of SCTP ...................................10 |
| 1.5.1. Association Startup and Takedown ...................11 |
| 1.5.2. Sequenced Delivery within Streams ..................12 |
| 1.5.3. User Data Fragmentation ............................12 |
| 1.5.4. Acknowledgement and Congestion Avoidance ...........12 |
| 1.5.5. Chunk Bundling .....................................13 |
| 1.5.6. Packet Validation ..................................13 |
| 1.5.7. Path Management ....................................13 |
| 1.6. Serial Number Arithmetic ..................................14 |
| 1.7. Changes from RFC 2960 .....................................15 |
| 2. Conventions ....................................................15 |
| 3. SCTP Packet Format .............................................15 |
| 3.1. SCTP Common Header Field Descriptions .....................16 |
| 3.2. Chunk Field Descriptions ..................................17 |
| 3.2.1. Optional/Variable-Length Parameter Format ..........19 |
| 3.2.2. Reporting of Unrecognized Parameters ...............21 |
| 3.3. SCTP Chunk Definitions ....................................21 |
| 3.3.1. Payload Data (DATA) (0) ............................22 |
| 3.3.2. Initiation (INIT) (1) ..............................24 |
| 3.3.2.1. Optional/Variable-Length |
| Parameters in INIT ........................27 |
| 3.3.3. Initiation Acknowledgement (INIT ACK) (2) ..........30 |
| 3.3.3.1. Optional or Variable-Length Parameters ....33 |
| 3.3.4. Selective Acknowledgement (SACK) (3) ...............34 |
| 3.3.5. Heartbeat Request (HEARTBEAT) (4) ..................38 |
| 3.3.6. Heartbeat Acknowledgement (HEARTBEAT ACK) (5) ......39 |
| 3.3.7. Abort Association (ABORT) (6) ......................40 |
| 3.3.8. Shutdown Association (SHUTDOWN) (7) ................41 |
| 3.3.9. Shutdown Acknowledgement (SHUTDOWN ACK) (8) ........41 |
| 3.3.10. Operation Error (ERROR) (9) .......................42 |
| 3.3.10.1. Invalid Stream Identifier (1) ............44 |
| 3.3.10.2. Missing Mandatory Parameter (2) ..........44 |
| 3.3.10.3. Stale Cookie Error (3) ...................45 |
| 3.3.10.4. Out of Resource (4) ......................45 |
| 3.3.10.5. Unresolvable Address (5) .................46 |
| 3.3.10.6. Unrecognized Chunk Type (6) ..............46 |
| 3.3.10.7. Invalid Mandatory Parameter (7) ..........47 |
| 3.3.10.8. Unrecognized Parameters (8) ..............47 |
| 3.3.10.9. No User Data (9) .........................48 |
| 3.3.10.10. Cookie Received While Shutting |
| Down (10) ...............................48 |
| |
| |
| |
| Stewart Standards Track [Page 2] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 3.3.10.11. Restart of an Association with |
| New Addresses (11) ......................49 |
| 3.3.10.12. User-Initiated Abort (12) ...............49 |
| 3.3.10.13. Protocol Violation (13) .................50 |
| 3.3.11. Cookie Echo (COOKIE ECHO) (10) ....................50 |
| 3.3.12. Cookie Acknowledgement (COOKIE ACK) (11) ..........51 |
| 3.3.13. Shutdown Complete (SHUTDOWN COMPLETE) (14) ........51 |
| 4. SCTP Association State Diagram .................................52 |
| 5. Association Initialization .....................................56 |
| 5.1. Normal Establishment of an Association ....................56 |
| 5.1.1. Handle Stream Parameters ...........................58 |
| 5.1.2. Handle Address Parameters ..........................58 |
| 5.1.3. Generating State Cookie ............................61 |
| 5.1.4. State Cookie Processing ............................62 |
| 5.1.5. State Cookie Authentication ........................62 |
| 5.1.6. An Example of Normal Association Establishment .....64 |
| 5.2. Handle Duplicate or Unexpected INIT, INIT ACK, |
| COOKIE ECHO, and ..........................................65 |
| 5.2.1. INIT Received in COOKIE-WAIT or |
| COOKIE-ECHOED State (Item B) .......................66 |
| 5.2.2. Unexpected INIT in States Other than |
| CLOSED, COOKIE-ECHOED, .............................66 |
| 5.2.3. Unexpected INIT ACK ................................67 |
| 5.2.4. Handle a COOKIE ECHO when a TCB Exists .............67 |
| 5.2.4.1. An Example of a Association Restart .......69 |
| 5.2.5. Handle Duplicate COOKIE-ACK. .......................71 |
| 5.2.6. Handle Stale COOKIE Error ..........................71 |
| 5.3. Other Initialization Issues ...............................72 |
| 5.3.1. Selection of Tag Value .............................72 |
| 5.4. Path Verification .........................................72 |
| 6. User Data Transfer .............................................73 |
| 6.1. Transmission of DATA Chunks ...............................75 |
| 6.2. Acknowledgement on Reception of DATA Chunks ...............78 |
| 6.2.1. Processing a Received SACK .........................81 |
| 6.3. Management of Retransmission Timer ........................83 |
| 6.3.1. RTO Calculation ....................................83 |
| 6.3.2. Retransmission Timer Rules .........................85 |
| 6.3.3. Handle T3-rtx Expiration ...........................86 |
| 6.4. Multi-Homed SCTP Endpoints ................................87 |
| 6.4.1. Failover from an Inactive Destination Address ......88 |
| 6.5. Stream Identifier and Stream Sequence Number ..............88 |
| 6.6. Ordered and Unordered Delivery ............................88 |
| 6.7. Report Gaps in Received DATA TSNs .........................89 |
| 6.8. CRC32c Checksum Calculation ...............................90 |
| 6.9. Fragmentation and Reassembly ..............................91 |
| 6.10. Bundling .................................................92 |
| 7. Congestion Control .............................................93 |
| 7.1. SCTP Differences from TCP Congestion Control ..............94 |
| |
| |
| |
| Stewart Standards Track [Page 3] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 7.2. SCTP Slow-Start and Congestion Avoidance ..................95 |
| 7.2.1. Slow-Start .........................................96 |
| 7.2.2. Congestion Avoidance ...............................97 |
| 7.2.3. Congestion Control .................................98 |
| 7.2.4. Fast Retransmit on Gap Reports .....................98 |
| 7.3. Path MTU Discovery .......................................100 |
| 8. Fault Management ..............................................100 |
| 8.1. Endpoint Failure Detection ...............................100 |
| 8.2. Path Failure Detection ...................................101 |
| 8.3. Path Heartbeat ...........................................102 |
| 8.4. Handle "Out of the Blue" Packets .........................104 |
| 8.5. Verification Tag .........................................105 |
| 8.5.1. Exceptions in Verification Tag Rules ..............105 |
| 9. Termination of Association ....................................106 |
| 9.1. Abort of an Association ..................................107 |
| 9.2. Shutdown of an Association ...............................107 |
| 10. Interface with Upper Layer ...................................110 |
| 10.1. ULP-to-SCTP .............................................110 |
| 10.2. SCTP-to-ULP .............................................120 |
| 11. Security Considerations ......................................123 |
| 11.1. Security Objectives .....................................123 |
| 11.2. SCTP Responses to Potential Threats .....................124 |
| 11.2.1. Countering Insider Attacks .......................124 |
| 11.2.2. Protecting against Data Corruption in the |
| Network ..........................................124 |
| 11.2.3. Protecting Confidentiality .......................124 |
| 11.2.4. Protecting against Blind |
| Denial-of-Service Attacks ........................125 |
| 11.2.4.1. Flooding ................................125 |
| 11.2.4.2. Blind Masquerade ........................126 |
| 11.2.4.3. Improper Monopolization of Services .....127 |
| 11.3. SCTP Interactions with Firewalls ........................127 |
| 11.4. Protection of Non-SCTP-Capable Hosts ....................128 |
| 12. Network Management Considerations ............................128 |
| 13. Recommended Transmission Control Block (TCB) Parameters ......129 |
| 13.1. Parameters Necessary for the SCTP Instance ..............129 |
| 13.2. Parameters Necessary per Association (i.e., the TCB) ....129 |
| 13.3. Per Transport Address Data ..............................131 |
| 13.4. General Parameters Needed ...............................132 |
| 14. IANA Considerations ..........................................132 |
| 14.1. IETF-defined Chunk Extension ............................132 |
| 14.2. IETF-Defined Chunk Parameter Extension ..................133 |
| 14.3. IETF-Defined Additional Error Causes ....................133 |
| 14.4. Payload Protocol Identifiers ............................134 |
| 14.5. Port Numbers Registry ...................................134 |
| 15. Suggested SCTP Protocol Parameter Values .....................136 |
| 16. Acknowledgements .............................................137 |
| Appendix A. Explicit Congestion Notification .....................139 |
| |
| |
| |
| Stewart Standards Track [Page 4] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Appendix B. CRC32c Checksum Calculation ..........................140 |
| Appendix C. ICMP Handling ........................................142 |
| References .......................................................149 |
| Normative References ..........................................149 |
| Informative References ........................................150 |
| |
| 1. Introduction |
| |
| This section explains the reasoning behind the development of the |
| Stream Control Transmission Protocol (SCTP), the services it offers, |
| and the basic concepts needed to understand the detailed description |
| of the protocol. |
| |
| This document obsoletes [RFC2960] and [RFC3309]. |
| |
| 1.1. Motivation |
| |
| TCP [RFC0793] has performed immense service as the primary means of |
| reliable data transfer in IP networks. However, an increasing number |
| of recent applications have found TCP too limiting, and have |
| incorporated their own reliable data transfer protocol on top of UDP |
| [RFC0768]. The limitations that users have wished to bypass include |
| the following: |
| |
| -- TCP provides both reliable data transfer and strict order-of- |
| transmission delivery of data. Some applications need reliable |
| transfer without sequence maintenance, while others would be |
| satisfied with partial ordering of the data. In both of these |
| cases, the head-of-line blocking offered by TCP causes unnecessary |
| delay. |
| |
| -- The stream-oriented nature of TCP is often an inconvenience. |
| Applications must add their own record marking to delineate their |
| messages, and must make explicit use of the push facility to |
| ensure that a complete message is transferred in a reasonable |
| time. |
| |
| -- The limited scope of TCP sockets complicates the task of providing |
| highly-available data transfer capability using multi-homed hosts. |
| |
| -- TCP is relatively vulnerable to denial-of-service attacks, such as |
| SYN attacks. |
| |
| Transport of PSTN signaling across the IP network is an application |
| for which all of these limitations of TCP are relevant. While this |
| application directly motivated the development of SCTP, other |
| applications may find SCTP a good match to their requirements. |
| |
| |
| |
| |
| Stewart Standards Track [Page 5] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 1.2. Architectural View of SCTP |
| |
| SCTP is viewed as a layer between the SCTP user application ("SCTP |
| user" for short) and a connectionless packet network service such as |
| IP. The remainder of this document assumes SCTP runs on top of IP. |
| The basic service offered by SCTP is the reliable transfer of user |
| messages between peer SCTP users. It performs this service within |
| the context of an association between two SCTP endpoints. Section 10 |
| of this document sketches the API that should exist at the boundary |
| between the SCTP and the SCTP user layers. |
| |
| SCTP is connection-oriented in nature, but the SCTP association is a |
| broader concept than the TCP connection. SCTP provides the means for |
| each SCTP endpoint (Section 1.3) to provide the other endpoint |
| (during association startup) with a list of transport addresses |
| (i.e., multiple IP addresses in combination with an SCTP port) |
| through which that endpoint can be reached and from which it will |
| originate SCTP packets. The association spans transfers over all of |
| the possible source/destination combinations that may be generated |
| from each endpoint's lists. |
| |
| _____________ _____________ |
| | SCTP User | | SCTP User | |
| | Application | | Application | |
| |-------------| |-------------| |
| | SCTP | | SCTP | |
| | Transport | | Transport | |
| | Service | | Service | |
| |-------------| |-------------| |
| | |One or more ---- One or more| | |
| | IP Network |IP address \/ IP address| IP Network | |
| | Service |appearances /\ appearances| Service | |
| |_____________| ---- |_____________| |
| |
| SCTP Node A |<-------- Network transport ------->| SCTP Node B |
| |
| Figure 1: An SCTP Association |
| |
| 1.3. Key Terms |
| |
| Some of the language used to describe SCTP has been introduced in the |
| previous sections. This section provides a consolidated list of the |
| key terms and their definitions. |
| |
| o Active destination transport address: A transport address on a |
| peer endpoint that a transmitting endpoint considers available for |
| receiving user messages. |
| |
| |
| |
| |
| Stewart Standards Track [Page 6] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| o Bundling: An optional multiplexing operation, whereby more than |
| one user message may be carried in the same SCTP packet. Each |
| user message occupies its own DATA chunk. |
| |
| o Chunk: A unit of information within an SCTP packet, consisting of |
| a chunk header and chunk-specific content. |
| |
| o Congestion window (cwnd): An SCTP variable that limits the data, |
| in number of bytes, a sender can send to a particular destination |
| transport address before receiving an acknowledgement. |
| |
| o Cumulative TSN Ack Point: The TSN of the last DATA chunk |
| acknowledged via the Cumulative TSN Ack field of a SACK. |
| |
| o Idle destination address: An address that has not had user |
| messages sent to it within some length of time, normally the |
| HEARTBEAT interval or greater. |
| |
| o Inactive destination transport address: An address that is |
| considered inactive due to errors and unavailable to transport |
| user messages. |
| |
| o Message = user message: Data submitted to SCTP by the Upper Layer |
| Protocol (ULP). |
| |
| o Message Authentication Code (MAC): An integrity check mechanism |
| based on cryptographic hash functions using a secret key. |
| Typically, message authentication codes are used between two |
| parties that share a secret key in order to validate information |
| transmitted between these parties. In SCTP, it is used by an |
| endpoint to validate the State Cookie information that is returned |
| from the peer in the COOKIE ECHO chunk. The term "MAC" has |
| different meanings in different contexts. SCTP uses this term |
| with the same meaning as in [RFC2104]. |
| |
| o Network Byte Order: Most significant byte first, a.k.a., big |
| endian. |
| |
| o Ordered Message: A user message that is delivered in order with |
| respect to all previous user messages sent within the stream on |
| which the message was sent. |
| |
| o Outstanding TSN (at an SCTP endpoint): A TSN (and the associated |
| DATA chunk) that has been sent by the endpoint but for which it |
| has not yet received an acknowledgement. |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 7] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| o Path: The route taken by the SCTP packets sent by one SCTP |
| endpoint to a specific destination transport address of its peer |
| SCTP endpoint. Sending to different destination transport |
| addresses does not necessarily guarantee getting separate paths. |
| |
| o Primary Path: The primary path is the destination and source |
| address that will be put into a packet outbound to the peer |
| endpoint by default. The definition includes the source address |
| since an implementation MAY wish to specify both destination and |
| source address to better control the return path taken by reply |
| chunks and on which interface the packet is transmitted when the |
| data sender is multi-homed. |
| |
| o Receiver Window (rwnd): An SCTP variable a data sender uses to |
| store the most recently calculated receiver window of its peer, in |
| number of bytes. This gives the sender an indication of the space |
| available in the receiver's inbound buffer. |
| |
| o SCTP association: A protocol relationship between SCTP endpoints, |
| composed of the two SCTP endpoints and protocol state information |
| including Verification Tags and the currently active set of |
| Transmission Sequence Numbers (TSNs), etc. An association can be |
| uniquely identified by the transport addresses used by the |
| endpoints in the association. Two SCTP endpoints MUST NOT have |
| more than one SCTP association between them at any given time. |
| |
| o SCTP endpoint: The logical sender/receiver of SCTP packets. On a |
| multi-homed host, an SCTP endpoint is represented to its peers as |
| a combination of a set of eligible destination transport addresses |
| to which SCTP packets can be sent and a set of eligible source |
| transport addresses from which SCTP packets can be received. All |
| transport addresses used by an SCTP endpoint must use the same |
| port number, but can use multiple IP addresses. A transport |
| address used by an SCTP endpoint must not be used by another SCTP |
| endpoint. In other words, a transport address is unique to an |
| SCTP endpoint. |
| |
| o SCTP packet (or packet): The unit of data delivery across the |
| interface between SCTP and the connectionless packet network |
| (e.g., IP). An SCTP packet includes the common SCTP header, |
| possible SCTP control chunks, and user data encapsulated within |
| SCTP DATA chunks. |
| |
| o SCTP user application (SCTP user): The logical higher-layer |
| application entity which uses the services of SCTP, also called |
| the Upper-Layer Protocol (ULP). |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 8] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| o Slow-Start Threshold (ssthresh): An SCTP variable. This is the |
| threshold that the endpoint will use to determine whether to |
| perform slow start or congestion avoidance on a particular |
| destination transport address. Ssthresh is in number of bytes. |
| |
| o Stream: A unidirectional logical channel established from one to |
| another associated SCTP endpoint, within which all user messages |
| are delivered in sequence except for those submitted to the |
| unordered delivery service. |
| |
| Note: The relationship between stream numbers in opposite directions |
| is strictly a matter of how the applications use them. It is the |
| responsibility of the SCTP user to create and manage these |
| correlations if they are so desired. |
| |
| o Stream Sequence Number: A 16-bit sequence number used internally |
| by SCTP to ensure sequenced delivery of the user messages within a |
| given stream. One Stream Sequence Number is attached to each user |
| message. |
| |
| o Tie-Tags: Two 32-bit random numbers that together make a 64-bit |
| nonce. These tags are used within a State Cookie and TCB so that |
| a newly restarting association can be linked to the original |
| association within the endpoint that did not restart and yet not |
| reveal the true Verification Tags of an existing association. |
| |
| o Transmission Control Block (TCB): An internal data structure |
| created by an SCTP endpoint for each of its existing SCTP |
| associations to other SCTP endpoints. TCB contains all the status |
| and operational information for the endpoint to maintain and |
| manage the corresponding association. |
| |
| o Transmission Sequence Number (TSN): A 32-bit sequence number used |
| internally by SCTP. One TSN is attached to each chunk containing |
| user data to permit the receiving SCTP endpoint to acknowledge its |
| receipt and detect duplicate deliveries. |
| |
| o Transport address: A transport address is traditionally defined by |
| a network-layer address, a transport-layer protocol, and a |
| transport-layer port number. In the case of SCTP running over IP, |
| a transport address is defined by the combination of an IP address |
| and an SCTP port number (where SCTP is the transport protocol). |
| |
| o Unacknowledged TSN (at an SCTP endpoint): A TSN (and the |
| associated DATA chunk) that has been received by the endpoint but |
| for which an acknowledgement has not yet been sent. Or in the |
| opposite case, for a packet that has been sent but no |
| acknowledgement has been received. |
| |
| |
| |
| Stewart Standards Track [Page 9] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| o Unordered Message: Unordered messages are "unordered" with respect |
| to any other message; this includes both other unordered messages |
| as well as other ordered messages. An unordered message might be |
| delivered prior to or later than ordered messages sent on the same |
| stream. |
| |
| o User message: The unit of data delivery across the interface |
| between SCTP and its user. |
| |
| o Verification Tag: A 32-bit unsigned integer that is randomly |
| generated. The Verification Tag provides a key that allows a |
| receiver to verify that the SCTP packet belongs to the current |
| association and is not an old or stale packet from a previous |
| association. |
| |
| 1.4. Abbreviations |
| |
| MAC - Message Authentication Code [RFC2104] |
| |
| RTO - Retransmission Timeout |
| |
| RTT - Round-Trip Time |
| |
| RTTVAR - Round-Trip Time Variation |
| |
| SCTP - Stream Control Transmission Protocol |
| |
| SRTT - Smoothed RTT |
| |
| TCB - Transmission Control Block |
| |
| TLV - Type-Length-Value coding format |
| |
| TSN - Transmission Sequence Number |
| |
| ULP - Upper-Layer Protocol |
| |
| 1.5. Functional View of SCTP |
| |
| The SCTP transport service can be decomposed into a number of |
| functions. These are depicted in Figure 2 and explained in the |
| remainder of this section. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 10] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| SCTP User Application |
| |
| ----------------------------------------------------- |
| _____________ ____________________ |
| | | | Sequenced Delivery | |
| | Association | | within Streams | |
| | | |____________________| |
| | Startup | |
| | | ____________________________ |
| | and | | User Data Fragmentation | |
| | | |____________________________| |
| | Takedown | |
| | | ____________________________ |
| | | | Acknowledgement | |
| | | | and | |
| | | | Congestion Avoidance | |
| | | |____________________________| |
| | | |
| | | ____________________________ |
| | | | Chunk Bundling | |
| | | |____________________________| |
| | | |
| | | ________________________________ |
| | | | Packet Validation | |
| | | |________________________________| |
| | | |
| | | ________________________________ |
| | | | Path Management | |
| |_____________| |________________________________| |
| |
| Figure 2: Functional View of the SCTP Transport Service |
| |
| 1.5.1. Association Startup and Takedown |
| |
| An association is initiated by a request from the SCTP user (see the |
| description of the ASSOCIATE (or SEND) primitive in Section 10). |
| |
| A cookie mechanism, similar to one described by Karn and Simpson in |
| [RFC2522], is employed during the initialization to provide |
| protection against synchronization attacks. The cookie mechanism |
| uses a four-way handshake, the last two legs of which are allowed to |
| carry user data for fast setup. The startup sequence is described in |
| Section 5 of this document. |
| |
| SCTP provides for graceful close (i.e., shutdown) of an active |
| association on request from the SCTP user. See the description of |
| the SHUTDOWN primitive in Section 10. SCTP also allows ungraceful |
| close (i.e., abort), either on request from the user (ABORT |
| |
| |
| |
| Stewart Standards Track [Page 11] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| primitive) or as a result of an error condition detected within the |
| SCTP layer. Section 9 describes both the graceful and the ungraceful |
| close procedures. |
| |
| SCTP does not support a half-open state (like TCP) wherein one side |
| may continue sending data while the other end is closed. When either |
| endpoint performs a shutdown, the association on each peer will stop |
| accepting new data from its user and only deliver data in queue at |
| the time of the graceful close (see Section 9). |
| |
| 1.5.2. Sequenced Delivery within Streams |
| |
| The term "stream" is used in SCTP to refer to a sequence of user |
| messages that are to be delivered to the upper-layer protocol in |
| order with respect to other messages within the same stream. This is |
| in contrast to its usage in TCP, where it refers to a sequence of |
| bytes (in this document, a byte is assumed to be 8 bits). |
| |
| The SCTP user can specify at association startup time the number of |
| streams to be supported by the association. This number is |
| negotiated with the remote end (see Section 5.1.1). User messages |
| are associated with stream numbers (SEND, RECEIVE primitives, Section |
| 10). Internally, SCTP assigns a Stream Sequence Number to each |
| message passed to it by the SCTP user. On the receiving side, SCTP |
| ensures that messages are delivered to the SCTP user in sequence |
| within a given stream. However, while one stream may be blocked |
| waiting for the next in-sequence user message, delivery from other |
| streams may proceed. |
| |
| SCTP provides a mechanism for bypassing the sequenced delivery |
| service. User messages sent using this mechanism are delivered to |
| the SCTP user as soon as they are received. |
| |
| 1.5.3. User Data Fragmentation |
| |
| When needed, SCTP fragments user messages to ensure that the SCTP |
| packet passed to the lower layer conforms to the path MTU. On |
| receipt, fragments are reassembled into complete messages before |
| being passed to the SCTP user. |
| |
| 1.5.4. Acknowledgement and Congestion Avoidance |
| |
| SCTP assigns a Transmission Sequence Number (TSN) to each user data |
| fragment or unfragmented message. The TSN is independent of any |
| Stream Sequence Number assigned at the stream level. The receiving |
| end acknowledges all TSNs received, even if there are gaps in the |
| sequence. In this way, reliable delivery is kept functionally |
| separate from sequenced stream delivery. |
| |
| |
| |
| Stewart Standards Track [Page 12] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| The acknowledgement and congestion avoidance function is responsible |
| for packet retransmission when timely acknowledgement has not been |
| received. Packet retransmission is conditioned by congestion |
| avoidance procedures similar to those used for TCP. See Section 6 |
| and Section 7 for a detailed description of the protocol procedures |
| associated with this function. |
| |
| 1.5.5. Chunk Bundling |
| |
| As described in Section 3, the SCTP packet as delivered to the lower |
| layer consists of a common header followed by one or more chunks. |
| Each chunk may contain either user data or SCTP control information. |
| The SCTP user has the option to request bundling of more than one |
| user message into a single SCTP packet. The chunk bundling function |
| of SCTP is responsible for assembly of the complete SCTP packet and |
| its disassembly at the receiving end. |
| |
| During times of congestion, an SCTP implementation MAY still perform |
| bundling even if the user has requested that SCTP not bundle. The |
| user's disabling of bundling only affects SCTP implementations that |
| may delay a small period of time before transmission (to attempt to |
| encourage bundling). When the user layer disables bundling, this |
| small delay is prohibited but not bundling that is performed during |
| congestion or retransmission. |
| |
| 1.5.6. Packet Validation |
| |
| A mandatory Verification Tag field and a 32-bit checksum field (see |
| Appendix B for a description of the CRC32c checksum) are included in |
| the SCTP common header. The Verification Tag value is chosen by each |
| end of the association during association startup. Packets received |
| without the expected Verification Tag value are discarded, as a |
| protection against blind masquerade attacks and against stale SCTP |
| packets from a previous association. The CRC32c checksum should be |
| set by the sender of each SCTP packet to provide additional |
| protection against data corruption in the network. The receiver of |
| an SCTP packet with an invalid CRC32c checksum silently discards the |
| packet. |
| |
| 1.5.7. Path Management |
| |
| The sending SCTP user is able to manipulate the set of transport |
| addresses used as destinations for SCTP packets through the |
| primitives described in Section 10. The SCTP path management |
| function chooses the destination transport address for each outgoing |
| SCTP packet based on the SCTP user's instructions and the currently |
| perceived reachability status of the eligible destination set. The |
| path management function monitors reachability through heartbeats |
| |
| |
| |
| Stewart Standards Track [Page 13] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| when other packet traffic is inadequate to provide this information |
| and advises the SCTP user when reachability of any far-end transport |
| address changes. The path management function is also responsible |
| for reporting the eligible set of local transport addresses to the |
| far end during association startup, and for reporting the transport |
| addresses returned from the far end to the SCTP user. |
| |
| At association startup, a primary path is defined for each SCTP |
| endpoint, and is used for normal sending of SCTP packets. |
| |
| On the receiving end, the path management is responsible for |
| verifying the existence of a valid SCTP association to which the |
| inbound SCTP packet belongs before passing it for further processing. |
| |
| Note: Path Management and Packet Validation are done at the same |
| time, so although described separately above, in reality they cannot |
| be performed as separate items. |
| |
| 1.6. Serial Number Arithmetic |
| |
| It is essential to remember that the actual Transmission Sequence |
| Number space is finite, though very large. This space ranges from 0 |
| to 2**32 - 1. Since the space is finite, all arithmetic dealing with |
| Transmission Sequence Numbers must be performed modulo 2**32. This |
| unsigned arithmetic preserves the relationship of sequence numbers as |
| they cycle from 2**32 - 1 to 0 again. There are some subtleties to |
| computer modulo arithmetic, so great care should be taken in |
| programming the comparison of such values. When referring to TSNs, |
| the symbol "=<" means "less than or equal"(modulo 2**32). |
| |
| Comparisons and arithmetic on TSNs in this document SHOULD use Serial |
| Number Arithmetic as defined in [RFC1982] where SERIAL_BITS = 32. |
| |
| An endpoint SHOULD NOT transmit a DATA chunk with a TSN that is more |
| than 2**31 - 1 above the beginning TSN of its current send window. |
| Doing so will cause problems in comparing TSNs. |
| |
| Transmission Sequence Numbers wrap around when they reach 2**32 - 1. |
| That is, the next TSN a DATA chunk MUST use after transmitting TSN = |
| 2*32 - 1 is TSN = 0. |
| |
| Any arithmetic done on Stream Sequence Numbers SHOULD use Serial |
| Number Arithmetic as defined in [RFC1982] where SERIAL_BITS = 16. |
| All other arithmetic and comparisons in this document use normal |
| arithmetic. |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 14] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 1.7. Changes from RFC 2960 |
| |
| SCTP was originally defined in [RFC2960], which this document |
| obsoletes. Readers interested in the details of the various changes |
| that this document incorporates are asked to consult [RFC4460]. |
| |
| 2. Conventions |
| |
| 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 RFC 2119 [RFC2119]. |
| |
| 3. SCTP Packet Format |
| |
| An SCTP packet is composed of a common header and chunks. A chunk |
| contains either control information or user data. |
| |
| The SCTP packet format is shown below: |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Common Header | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Chunk #1 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | ... | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Chunk #n | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Multiple chunks can be bundled into one SCTP packet up to the MTU |
| size, except for the INIT, INIT ACK, and SHUTDOWN COMPLETE chunks. |
| These chunks MUST NOT be bundled with any other chunk in a packet. |
| See Section 6.10 for more details on chunk bundling. |
| |
| If a user data message doesn't fit into one SCTP packet it can be |
| fragmented into multiple chunks using the procedure defined in |
| Section 6.9. |
| |
| All integer fields in an SCTP packet MUST be transmitted in network |
| byte order, unless otherwise stated. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 15] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 3.1. SCTP Common Header Field Descriptions |
| |
| SCTP Common Header Format |
| |
| 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 Number | Destination Port Number | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Verification Tag | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Checksum | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Source Port Number: 16 bits (unsigned integer) |
| |
| This is the SCTP sender's port number. It can be used by the |
| receiver in combination with the source IP address, the SCTP |
| destination port, and possibly the destination IP address to |
| identify the association to which this packet belongs. The port |
| number 0 MUST NOT be used. |
| |
| Destination Port Number: 16 bits (unsigned integer) |
| |
| This is the SCTP port number to which this packet is destined. |
| The receiving host will use this port number to de-multiplex the |
| SCTP packet to the correct receiving endpoint/application. The |
| port number 0 MUST NOT be used. |
| |
| Verification Tag: 32 bits (unsigned integer) |
| |
| The receiver of this packet uses the Verification Tag to validate |
| the sender of this SCTP packet. On transmit, the value of this |
| Verification Tag MUST be set to the value of the Initiate Tag |
| received from the peer endpoint during the association |
| initialization, with the following exceptions: |
| |
| - A packet containing an INIT chunk MUST have a zero Verification |
| Tag. |
| |
| - A packet containing a SHUTDOWN COMPLETE chunk with the T bit |
| set MUST have the Verification Tag copied from the packet with |
| the SHUTDOWN ACK chunk. |
| |
| - A packet containing an ABORT chunk may have the verification |
| tag copied from the packet that caused the ABORT to be sent. |
| For details see Section 8.4 and Section 8.5. |
| |
| |
| |
| |
| Stewart Standards Track [Page 16] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| An INIT chunk MUST be the only chunk in the SCTP packet carrying it. |
| |
| Checksum: 32 bits (unsigned integer) |
| |
| This field contains the checksum of this SCTP packet. Its |
| calculation is discussed in Section 6.8. SCTP uses the CRC32c |
| algorithm as described in Appendix B for calculating the checksum. |
| |
| 3.2. Chunk Field Descriptions |
| |
| The figure below illustrates the field format for the chunks to be |
| transmitted in the SCTP packet. Each chunk is formatted with a Chunk |
| Type field, a chunk-specific Flag field, a Chunk Length field, and a |
| Value field. |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Chunk Type | Chunk Flags | Chunk Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| \ \ |
| / Chunk Value / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Chunk Type: 8 bits (unsigned integer) |
| |
| This field identifies the type of information contained in the |
| Chunk Value field. It takes a value from 0 to 254. The value of |
| 255 is reserved for future use as an extension field. |
| |
| The values of Chunk Types are defined as follows: |
| |
| ID Value Chunk Type |
| ----- ---------- |
| 0 - Payload Data (DATA) |
| 1 - Initiation (INIT) |
| 2 - Initiation Acknowledgement (INIT ACK) |
| 3 - Selective Acknowledgement (SACK) |
| 4 - Heartbeat Request (HEARTBEAT) |
| 5 - Heartbeat Acknowledgement (HEARTBEAT ACK) |
| 6 - Abort (ABORT) |
| 7 - Shutdown (SHUTDOWN) |
| 8 - Shutdown Acknowledgement (SHUTDOWN ACK) |
| 9 - Operation Error (ERROR) |
| 10 - State Cookie (COOKIE ECHO) |
| 11 - Cookie Acknowledgement (COOKIE ACK) |
| |
| |
| |
| |
| Stewart Standards Track [Page 17] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 12 - Reserved for Explicit Congestion Notification Echo |
| (ECNE) |
| 13 - Reserved for Congestion Window Reduced (CWR) |
| 14 - Shutdown Complete (SHUTDOWN COMPLETE) |
| 15 to 62 - available |
| 63 - reserved for IETF-defined Chunk Extensions |
| 64 to 126 - available |
| 127 - reserved for IETF-defined Chunk Extensions |
| 128 to 190 - available |
| 191 - reserved for IETF-defined Chunk Extensions |
| 192 to 254 - available |
| 255 - reserved for IETF-defined Chunk Extensions |
| |
| Chunk Types are encoded such that the highest-order 2 bits specify |
| the action that must be taken if the processing endpoint does not |
| recognize the Chunk Type. |
| |
| 00 - Stop processing this SCTP packet and discard it, do not |
| process any further chunks within it. |
| |
| 01 - Stop processing this SCTP packet and discard it, do not |
| process any further chunks within it, and report the |
| unrecognized chunk in an 'Unrecognized Chunk Type'. |
| |
| 10 - Skip this chunk and continue processing. |
| |
| 11 - Skip this chunk and continue processing, but report in an |
| ERROR chunk using the 'Unrecognized Chunk Type' cause of |
| error. |
| |
| Note: The ECNE and CWR chunk types are reserved for future use of |
| Explicit Congestion Notification (ECN); see Appendix A. |
| |
| Chunk Flags: 8 bits |
| |
| The usage of these bits depends on the Chunk type as given by the |
| Chunk Type field. Unless otherwise specified, they are set to 0 |
| on transmit and are ignored on receipt. |
| |
| Chunk Length: 16 bits (unsigned integer) |
| |
| This value represents the size of the chunk in bytes, including |
| the Chunk Type, Chunk Flags, Chunk Length, and Chunk Value fields. |
| Therefore, if the Chunk Value field is zero-length, the Length |
| field will be set to 4. The Chunk Length field does not count any |
| chunk padding. |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 18] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Chunks (including Type, Length, and Value fields) are padded out |
| by the sender with all zero bytes to be a multiple of 4 bytes |
| long. This padding MUST NOT be more than 3 bytes in total. The |
| Chunk Length value does not include terminating padding of the |
| chunk. However, it does include padding of any variable-length |
| parameter except the last parameter in the chunk. The receiver |
| MUST ignore the padding. |
| |
| Note: A robust implementation should accept the chunk whether or |
| not the final padding has been included in the Chunk Length. |
| |
| Chunk Value: variable length |
| |
| The Chunk Value field contains the actual information to be |
| transferred in the chunk. The usage and format of this field is |
| dependent on the Chunk Type. |
| |
| The total length of a chunk (including Type, Length, and Value |
| fields) MUST be a multiple of 4 bytes. If the length of the chunk is |
| not a multiple of 4 bytes, the sender MUST pad the chunk with all |
| zero bytes, and this padding is not included in the Chunk Length |
| field. The sender MUST NOT pad with more than 3 bytes. The receiver |
| MUST ignore the padding bytes. |
| |
| SCTP-defined chunks are described in detail in Section 3.3. The |
| guidelines for IETF-defined chunk extensions can be found in Section |
| 14.1 of this document. |
| |
| 3.2.1. Optional/Variable-Length Parameter Format |
| |
| Chunk values of SCTP control chunks consist of a chunk-type-specific |
| header of required fields, followed by zero or more parameters. The |
| optional and variable-length parameters contained in a chunk are |
| defined in a Type-Length-Value format as shown below. |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Parameter Type | Parameter Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| \ \ |
| / Parameter Value / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 19] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Chunk Parameter Type: 16 bits (unsigned integer) |
| |
| The Type field is a 16-bit identifier of the type of parameter. |
| It takes a value of 0 to 65534. |
| |
| The value of 65535 is reserved for IETF-defined extensions. |
| Values other than those defined in specific SCTP chunk |
| descriptions are reserved for use by IETF. |
| |
| Chunk Parameter Length: 16 bits (unsigned integer) |
| |
| The Parameter Length field contains the size of the parameter in |
| bytes, including the Parameter Type, Parameter Length, and |
| Parameter Value fields. Thus, a parameter with a zero-length |
| Parameter Value field would have a Length field of 4. The |
| Parameter Length does not include any padding bytes. |
| |
| Chunk Parameter Value: variable length |
| |
| The Parameter Value field contains the actual information to be |
| transferred in the parameter. |
| |
| The total length of a parameter (including Type, Parameter Length, |
| and Value fields) MUST be a multiple of 4 bytes. If the length of |
| the parameter is not a multiple of 4 bytes, the sender pads the |
| parameter at the end (i.e., after the Parameter Value field) with |
| all zero bytes. The length of the padding is not included in the |
| Parameter Length field. A sender MUST NOT pad with more than 3 |
| bytes. The receiver MUST ignore the padding bytes. |
| |
| The Parameter Types are encoded such that the highest-order 2 bits |
| specify the action that must be taken if the processing endpoint |
| does not recognize the Parameter Type. |
| |
| 00 - Stop processing this parameter; do not process any further |
| parameters within this chunk. |
| |
| 01 - Stop processing this parameter, do not process any further |
| parameters within this chunk, and report the unrecognized |
| parameter in an 'Unrecognized Parameter', as described in |
| Section 3.2.2. |
| |
| 10 - Skip this parameter and continue processing. |
| |
| 11 - Skip this parameter and continue processing but report the |
| unrecognized parameter in an 'Unrecognized Parameter', as |
| described in Section 3.2.2. |
| |
| |
| |
| |
| Stewart Standards Track [Page 20] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Please note that in all four cases, an INIT ACK or COOKIE ECHO chunk |
| is sent. In the 00 or 01 case, the processing of the parameters |
| after the unknown parameter is canceled, but no processing already |
| done is rolled back. |
| |
| The actual SCTP parameters are defined in the specific SCTP chunk |
| sections. The rules for IETF-defined parameter extensions are |
| defined in Section 14.2. Note that a parameter type MUST be unique |
| across all chunks. For example, the parameter type '5' is used to |
| represent an IPv4 address (see Section 3.3.2.1). The value '5' then |
| is reserved across all chunks to represent an IPv4 address and MUST |
| NOT be reused with a different meaning in any other chunk. |
| |
| 3.2.2. Reporting of Unrecognized Parameters |
| |
| If the receiver of an INIT chunk detects unrecognized parameters and |
| has to report them according to Section 3.2.1, it MUST put the |
| 'Unrecognized Parameter' parameter(s) in the INIT ACK chunk sent in |
| response to the INIT chunk. Note that if the receiver of the INIT |
| chunk is NOT going to establish an association (e.g., due to lack of |
| resources), an 'Unrecognized Parameter' would NOT be included with |
| any ABORT being sent to the sender of the INIT. |
| |
| If the receiver of an INIT ACK chunk detects unrecognized parameters |
| and has to report them according to Section 3.2.1, it SHOULD bundle |
| the ERROR chunk containing the 'Unrecognized Parameters' error cause |
| with the COOKIE ECHO chunk sent in response to the INIT ACK chunk. |
| If the receiver of the INIT ACK cannot bundle the COOKIE ECHO chunk |
| with the ERROR chunk, the ERROR chunk MAY be sent separately but not |
| before the COOKIE ACK has been received. |
| |
| Note: Any time a COOKIE ECHO is sent in a packet, it MUST be the |
| first chunk. |
| |
| 3.3. SCTP Chunk Definitions |
| |
| This section defines the format of the different SCTP chunk types. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 21] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 3.3.1. Payload Data (DATA) (0) |
| |
| The following format MUST be used for the DATA chunk: |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type = 0 | Reserved|U|B|E| Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | TSN | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Stream Identifier S | Stream Sequence Number n | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Payload Protocol Identifier | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| \ \ |
| / User Data (seq n of Stream S) / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Reserved: 5 bits |
| |
| Should be set to all '0's and ignored by the receiver. |
| |
| U bit: 1 bit |
| |
| The (U)nordered bit, if set to '1', indicates that this is an |
| unordered DATA chunk, and there is no Stream Sequence Number |
| assigned to this DATA chunk. Therefore, the receiver MUST ignore |
| the Stream Sequence Number field. |
| |
| After reassembly (if necessary), unordered DATA chunks MUST be |
| dispatched to the upper layer by the receiver without any attempt |
| to reorder. |
| |
| If an unordered user message is fragmented, each fragment of the |
| message MUST have its U bit set to '1'. |
| |
| B bit: 1 bit |
| |
| The (B)eginning fragment bit, if set, indicates the first fragment |
| of a user message. |
| |
| E bit: 1 bit |
| |
| The (E)nding fragment bit, if set, indicates the last fragment of |
| a user message. |
| |
| |
| |
| |
| Stewart Standards Track [Page 22] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| An unfragmented user message shall have both the B and E bits set to |
| '1'. Setting both B and E bits to '0' indicates a middle fragment of |
| a multi-fragment user message, as summarized in the following table: |
| |
| B E Description |
| ============================================================ |
| | 1 0 | First piece of a fragmented user message | |
| +----------------------------------------------------------+ |
| | 0 0 | Middle piece of a fragmented user message | |
| +----------------------------------------------------------+ |
| | 0 1 | Last piece of a fragmented user message | |
| +----------------------------------------------------------+ |
| | 1 1 | Unfragmented message | |
| ============================================================ |
| | Table 1: Fragment Description Flags | |
| ============================================================ |
| |
| When a user message is fragmented into multiple chunks, the TSNs are |
| used by the receiver to reassemble the message. This means that the |
| TSNs for each fragment of a fragmented user message MUST be strictly |
| sequential. |
| |
| Length: 16 bits (unsigned integer) |
| |
| This field indicates the length of the DATA chunk in bytes from |
| the beginning of the type field to the end of the User Data field |
| excluding any padding. A DATA chunk with one byte of user data |
| will have Length set to 17 (indicating 17 bytes). |
| |
| A DATA chunk with a User Data field of length L will have the |
| Length field set to (16 + L) (indicating 16+L bytes) where L MUST |
| be greater than 0. |
| |
| TSN: 32 bits (unsigned integer) |
| |
| This value represents the TSN for this DATA chunk. The valid |
| range of TSN is from 0 to 4294967295 (2**32 - 1). TSN wraps back |
| to 0 after reaching 4294967295. |
| |
| Stream Identifier S: 16 bits (unsigned integer) |
| |
| Identifies the stream to which the following user data belongs. |
| |
| Stream Sequence Number n: 16 bits (unsigned integer) |
| |
| This value represents the Stream Sequence Number of the following |
| user data within the stream S. Valid range is 0 to 65535. |
| |
| |
| |
| |
| Stewart Standards Track [Page 23] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| When a user message is fragmented by SCTP for transport, the same |
| Stream Sequence Number MUST be carried in each of the fragments of |
| the message. |
| |
| Payload Protocol Identifier: 32 bits (unsigned integer) |
| |
| This value represents an application (or upper layer) specified |
| protocol identifier. This value is passed to SCTP by its upper |
| layer and sent to its peer. This identifier is not used by SCTP |
| but can be used by certain network entities, as well as by the |
| peer application, to identify the type of information being |
| carried in this DATA chunk. This field must be sent even in |
| fragmented DATA chunks (to make sure it is available for agents in |
| the middle of the network). Note that this field is NOT touched |
| by an SCTP implementation; therefore, its byte order is NOT |
| necessarily big endian. The upper layer is responsible for any |
| byte order conversions to this field. |
| |
| The value 0 indicates that no application identifier is specified |
| by the upper layer for this payload data. |
| |
| User Data: variable length |
| |
| This is the payload user data. The implementation MUST pad the |
| end of the data to a 4-byte boundary with all-zero bytes. Any |
| padding MUST NOT be included in the Length field. A sender MUST |
| never add more than 3 bytes of padding. |
| |
| 3.3.2. Initiation (INIT) (1) |
| |
| This chunk is used to initiate an SCTP association between two |
| endpoints. The format of the INIT chunk is shown below: |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 24] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type = 1 | Chunk Flags | Chunk Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Initiate Tag | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Advertised Receiver Window Credit (a_rwnd) | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Number of Outbound Streams | Number of Inbound Streams | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Initial TSN | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| \ \ |
| / Optional/Variable-Length Parameters / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| The INIT chunk contains the following parameters. Unless otherwise |
| noted, each parameter MUST only be included once in the INIT chunk. |
| |
| Fixed Parameters Status |
| ---------------------------------------------- |
| Initiate Tag Mandatory |
| Advertised Receiver Window Credit Mandatory |
| Number of Outbound Streams Mandatory |
| Number of Inbound Streams Mandatory |
| Initial TSN Mandatory |
| |
| Variable Parameters Status Type Value |
| ------------------------------------------------------------- |
| IPv4 Address (Note 1) Optional 5 IPv6 Address |
| (Note 1) Optional 6 Cookie Preservative |
| Optional 9 Reserved for ECN Capable (Note 2) Optional |
| 32768 (0x8000) Host Name Address (Note 3) Optional |
| 11 Supported Address Types (Note 4) Optional 12 |
| |
| Note 1: The INIT chunks can contain multiple addresses that can be |
| IPv4 and/or IPv6 in any combination. |
| |
| Note 2: The ECN Capable field is reserved for future use of Explicit |
| Congestion Notification. |
| |
| Note 3: An INIT chunk MUST NOT contain more than one Host Name |
| Address parameter. Moreover, the sender of the INIT MUST NOT combine |
| any other address types with the Host Name Address in the INIT. The |
| receiver of INIT MUST ignore any other address types if the Host Name |
| Address parameter is present in the received INIT chunk. |
| |
| |
| |
| Stewart Standards Track [Page 25] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Note 4: This parameter, when present, specifies all the address types |
| the sending endpoint can support. The absence of this parameter |
| indicates that the sending endpoint can support any address type. |
| |
| IMPLEMENTATION NOTE: If an INIT chunk is received with known |
| parameters that are not optional parameters of the INIT chunk, then |
| the receiver SHOULD process the INIT chunk and send back an INIT ACK. |
| The receiver of the INIT chunk MAY bundle an ERROR chunk with the |
| COOKIE ACK chunk later. However, restrictive implementations MAY |
| send back an ABORT chunk in response to the INIT chunk. |
| |
| The Chunk Flags field in INIT is reserved, and all bits in it should |
| be set to 0 by the sender and ignored by the receiver. The sequence |
| of parameters within an INIT can be processed in any order. |
| |
| Initiate Tag: 32 bits (unsigned integer) |
| |
| The receiver of the INIT (the responding end) records the value of |
| the Initiate Tag parameter. This value MUST be placed into the |
| Verification Tag field of every SCTP packet that the receiver of |
| the INIT transmits within this association. |
| |
| The Initiate Tag is allowed to have any value except 0. See |
| Section 5.3.1 for more on the selection of the tag value. |
| |
| If the value of the Initiate Tag in a received INIT chunk is found |
| to be 0, the receiver MUST treat it as an error and close the |
| association by transmitting an ABORT. |
| |
| Advertised Receiver Window Credit (a_rwnd): 32 bits (unsigned |
| integer) |
| |
| This value represents the dedicated buffer space, in number of |
| bytes, the sender of the INIT has reserved in association with |
| this window. During the life of the association, this buffer |
| space SHOULD NOT be lessened (i.e., dedicated buffers taken away |
| from this association); however, an endpoint MAY change the value |
| of a_rwnd it sends in SACK chunks. |
| |
| Number of Outbound Streams (OS): 16 bits (unsigned integer) |
| |
| Defines the number of outbound streams the sender of this INIT |
| chunk wishes to create in this association. The value of 0 MUST |
| NOT be used. |
| |
| Note: A receiver of an INIT with the OS value set to 0 SHOULD |
| abort the association. |
| |
| |
| |
| |
| Stewart Standards Track [Page 26] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Number of Inbound Streams (MIS): 16 bits (unsigned integer) |
| |
| Defines the maximum number of streams the sender of this INIT |
| chunk allows the peer end to create in this association. The |
| value 0 MUST NOT be used. |
| |
| Note: There is no negotiation of the actual number of streams but |
| instead the two endpoints will use the min(requested, offered). |
| See Section 5.1.1 for details. |
| |
| Note: A receiver of an INIT with the MIS value of 0 SHOULD abort |
| the association. |
| |
| Initial TSN (I-TSN): 32 bits (unsigned integer) |
| |
| Defines the initial TSN that the sender will use. The valid range |
| is from 0 to 4294967295. This field MAY be set to the value of |
| the Initiate Tag field. |
| |
| 3.3.2.1. Optional/Variable-Length Parameters in INIT |
| |
| The following parameters follow the Type-Length-Value format as |
| defined in Section 3.2.1. Any Type-Length-Value fields MUST come |
| after the fixed-length fields defined in the previous section. |
| |
| IPv4 Address Parameter (5) |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type = 5 | Length = 8 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | IPv4 Address | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| IPv4 Address: 32 bits (unsigned integer) |
| |
| Contains an IPv4 address of the sending endpoint. It is binary |
| encoded. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 27] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| IPv6 Address Parameter (6) |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type = 6 | Length = 20 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | | |
| | IPv6 Address | |
| | | |
| | | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| IPv6 Address: 128 bits (unsigned integer) |
| |
| Contains an IPv6 [RFC2460] address of the sending endpoint. It is |
| binary encoded. |
| |
| Note: A sender MUST NOT use an IPv4-mapped IPv6 address [RFC4291], |
| but should instead use an IPv4 Address parameter for an IPv4 |
| address. |
| |
| Combined with the Source Port Number in the SCTP common header, |
| the value passed in an IPv4 or IPv6 Address parameter indicates a |
| transport address the sender of the INIT will support for the |
| association being initiated. That is, during the life time of |
| this association, this IP address can appear in the source address |
| field of an IP datagram sent from the sender of the INIT, and can |
| be used as a destination address of an IP datagram sent from the |
| receiver of the INIT. |
| |
| More than one IP Address parameter can be included in an INIT |
| chunk when the INIT sender is multi-homed. Moreover, a multi- |
| homed endpoint may have access to different types of network; |
| thus, more than one address type can be present in one INIT chunk, |
| i.e., IPv4 and IPv6 addresses are allowed in the same INIT chunk. |
| |
| If the INIT contains at least one IP Address parameter, then the |
| source address of the IP datagram containing the INIT chunk and |
| any additional address(es) provided within the INIT can be used as |
| destinations by the endpoint receiving the INIT. If the INIT does |
| not contain any IP Address parameters, the endpoint receiving the |
| INIT MUST use the source address associated with the received IP |
| datagram as its sole destination address for the association. |
| |
| Note that not using any IP Address parameters in the INIT and INIT |
| ACK is an alternative to make an association more likely to work |
| across a NAT box. |
| |
| |
| |
| Stewart Standards Track [Page 28] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Cookie Preservative (9) |
| |
| The sender of the INIT shall use this parameter to suggest to the |
| receiver of the INIT for a longer life-span of the State Cookie. |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type = 9 | Length = 8 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Suggested Cookie Life-Span Increment (msec.) | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Suggested Cookie Life-Span Increment: 32 bits (unsigned integer) |
| |
| This parameter indicates to the receiver how much increment in |
| milliseconds the sender wishes the receiver to add to its default |
| cookie life-span. |
| |
| This optional parameter should be added to the INIT chunk by the |
| sender when it reattempts establishing an association with a peer |
| to which its previous attempt of establishing the association |
| failed due to a stale cookie operation error. The receiver MAY |
| choose to ignore the suggested cookie life-span increase for its |
| own security reasons. |
| |
| Host Name Address (11) |
| |
| The sender of INIT uses this parameter to pass its Host Name (in |
| place of its IP addresses) to its peer. The peer is responsible for |
| resolving the name. Using this parameter might make it more likely |
| for the association to work across a NAT box. |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type = 11 | Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| / Host Name / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Host Name: variable length |
| |
| This field contains a host name in "host name syntax" per RFC 1123 |
| Section 2.1 [RFC1123]. The method for resolving the host name is |
| out of scope of SCTP. |
| |
| |
| |
| |
| Stewart Standards Track [Page 29] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Note: At least one null terminator is included in the Host Name |
| string and must be included in the length. |
| |
| Supported Address Types (12) |
| |
| The sender of INIT uses this parameter to list all the address types |
| it can support. |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type = 12 | Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Address Type #1 | Address Type #2 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | ...... | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+ |
| |
| Address Type: 16 bits (unsigned integer) |
| |
| This is filled with the type value of the corresponding address |
| TLV (e.g., IPv4 = 5, IPv6 = 6, Host name = 11). |
| |
| 3.3.3. Initiation Acknowledgement (INIT ACK) (2) |
| |
| The INIT ACK chunk is used to acknowledge the initiation of an SCTP |
| association. |
| |
| The parameter part of INIT ACK is formatted similarly to the INIT |
| chunk. It uses two extra variable parameters: The State Cookie and |
| the Unrecognized Parameter: |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 30] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| The format of the INIT ACK chunk is shown below: |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type = 2 | Chunk Flags | Chunk Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Initiate Tag | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Advertised Receiver Window Credit | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Number of Outbound Streams | Number of Inbound Streams | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Initial TSN | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| \ \ |
| / Optional/Variable-Length Parameters / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Initiate Tag: 32 bits (unsigned integer) |
| |
| The receiver of the INIT ACK records the value of the Initiate Tag |
| parameter. This value MUST be placed into the Verification Tag |
| field of every SCTP packet that the INIT ACK receiver transmits |
| within this association. |
| |
| The Initiate Tag MUST NOT take the value 0. See Section 5.3.1 for |
| more on the selection of the Initiate Tag value. |
| |
| If the value of the Initiate Tag in a received INIT ACK chunk is |
| found to be 0, the receiver MUST destroy the association |
| discarding its TCB. The receiver MAY send an ABORT for debugging |
| purpose. |
| |
| Advertised Receiver Window Credit (a_rwnd): 32 bits (unsigned |
| integer) |
| |
| This value represents the dedicated buffer space, in number of |
| bytes, the sender of the INIT ACK has reserved in association with |
| this window. During the life of the association, this buffer |
| space SHOULD NOT be lessened (i.e., dedicated buffers taken away |
| from this association). |
| |
| Number of Outbound Streams (OS): 16 bits (unsigned integer) |
| |
| Defines the number of outbound streams the sender of this INIT ACK |
| chunk wishes to create in this association. The value of 0 MUST |
| |
| |
| |
| Stewart Standards Track [Page 31] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| NOT be used, and the value MUST NOT be greater than the MIS value |
| sent in the INIT chunk. |
| |
| Note: A receiver of an INIT ACK with the OS value set to 0 SHOULD |
| destroy the association discarding its TCB. |
| |
| Number of Inbound Streams (MIS): 16 bits (unsigned integer) |
| |
| Defines the maximum number of streams the sender of this INIT ACK |
| chunk allows the peer end to create in this association. The |
| value 0 MUST NOT be used. |
| |
| Note: There is no negotiation of the actual number of streams but |
| instead the two endpoints will use the min(requested, offered). |
| See Section 5.1.1 for details. |
| |
| Note: A receiver of an INIT ACK with the MIS value set to 0 SHOULD |
| destroy the association discarding its TCB. |
| |
| Initial TSN (I-TSN): 32 bits (unsigned integer) |
| |
| Defines the initial TSN that the INIT ACK sender will use. The |
| valid range is from 0 to 4294967295. This field MAY be set to the |
| value of the Initiate Tag field. |
| |
| Fixed Parameters Status |
| ---------------------------------------------- |
| Initiate Tag Mandatory |
| Advertised Receiver Window Credit Mandatory |
| Number of Outbound Streams Mandatory |
| Number of Inbound Streams Mandatory |
| Initial TSN Mandatory |
| |
| Variable Parameters Status Type Value |
| ------------------------------------------------------------- |
| State Cookie Mandatory 7 |
| IPv4 Address (Note 1) Optional 5 |
| IPv6 Address (Note 1) Optional 6 |
| Unrecognized Parameter Optional 8 |
| Reserved for ECN Capable (Note 2) Optional 32768 (0x8000) |
| Host Name Address (Note 3) Optional 11 |
| |
| Note 1: The INIT ACK chunks can contain any number of IP address |
| parameters that can be IPv4 and/or IPv6 in any combination. |
| |
| Note 2: The ECN Capable field is reserved for future use of Explicit |
| Congestion Notification. |
| |
| |
| |
| |
| Stewart Standards Track [Page 32] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Note 3: The INIT ACK chunks MUST NOT contain more than one Host Name |
| Address parameter. Moreover, the sender of the INIT ACK MUST NOT |
| combine any other address types with the Host Name Address in the |
| INIT ACK. The receiver of the INIT ACK MUST ignore any other address |
| types if the Host Name Address parameter is present. |
| |
| IMPLEMENTATION NOTE: An implementation MUST be prepared to receive an |
| INIT ACK that is quite large (more than 1500 bytes) due to the |
| variable size of the State Cookie AND the variable address list. For |
| example if a responder to the INIT has 1000 IPv4 addresses it wishes |
| to send, it would need at least 8,000 bytes to encode this in the |
| INIT ACK. |
| |
| IMPLEMENTATION NOTE: If an INIT ACK chunk is received with known |
| parameters that are not optional parameters of the INIT ACK chunk, |
| then the receiver SHOULD process the INIT ACK chunk and send back a |
| COOKIE ECHO. The receiver of the INIT ACK chunk MAY bundle an ERROR |
| chunk with the COOKIE ECHO chunk. However, restrictive |
| implementations MAY send back an ABORT chunk in response to the INIT |
| ACK chunk. |
| |
| In combination with the Source Port carried in the SCTP common |
| header, each IP Address parameter in the INIT ACK indicates to the |
| receiver of the INIT ACK a valid transport address supported by the |
| sender of the INIT ACK for the life time of the association being |
| initiated. |
| |
| If the INIT ACK contains at least one IP Address parameter, then the |
| source address of the IP datagram containing the INIT ACK and any |
| additional address(es) provided within the INIT ACK may be used as |
| destinations by the receiver of the INIT ACK. If the INIT ACK does |
| not contain any IP Address parameters, the receiver of the INIT ACK |
| MUST use the source address associated with the received IP datagram |
| as its sole destination address for the association. |
| |
| The State Cookie and Unrecognized Parameters use the Type-Length- |
| Value format as defined in Section 3.2.1 and are described below. |
| The other fields are defined the same as their counterparts in the |
| INIT chunk. |
| |
| 3.3.3.1. Optional or Variable-Length Parameters |
| |
| State Cookie |
| |
| Parameter Type Value: 7 |
| |
| Parameter Length: Variable size, depending on size of Cookie. |
| |
| |
| |
| |
| Stewart Standards Track [Page 33] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Parameter Value: |
| |
| This parameter value MUST contain all the necessary state and |
| parameter information required for the sender of this INIT ACK to |
| create the association, along with a Message Authentication Code |
| (MAC). See Section 5.1.3 for details on State Cookie definition. |
| |
| Unrecognized Parameter: |
| |
| Parameter Type Value: 8 |
| |
| Parameter Length: Variable size. |
| |
| Parameter Value: |
| |
| This parameter is returned to the originator of the INIT chunk |
| when the INIT contains an unrecognized parameter that has a value |
| that indicates it should be reported to the sender. This |
| parameter value field will contain unrecognized parameters copied |
| from the INIT chunk complete with Parameter Type, Length, and |
| Value fields. |
| |
| 3.3.4. Selective Acknowledgement (SACK) (3) |
| |
| This chunk is sent to the peer endpoint to acknowledge received DATA |
| chunks and to inform the peer endpoint of gaps in the received |
| subsequences of DATA chunks as represented by their TSNs. |
| |
| The SACK MUST contain the Cumulative TSN Ack, Advertised Receiver |
| Window Credit (a_rwnd), Number of Gap Ack Blocks, and Number of |
| Duplicate TSNs fields. |
| |
| By definition, the value of the Cumulative TSN Ack parameter is the |
| last TSN received before a break in the sequence of received TSNs |
| occurs; the next TSN value following this one has not yet been |
| received at the endpoint sending the SACK. This parameter therefore |
| acknowledges receipt of all TSNs less than or equal to its value. |
| |
| The handling of a_rwnd by the receiver of the SACK is discussed in |
| detail in Section 6.2.1. |
| |
| The SACK also contains zero or more Gap Ack Blocks. Each Gap Ack |
| Block acknowledges a subsequence of TSNs received following a break |
| in the sequence of received TSNs. By definition, all TSNs |
| acknowledged by Gap Ack Blocks are greater than the value of the |
| Cumulative TSN Ack. |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 34] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type = 3 |Chunk Flags | Chunk Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Cumulative TSN Ack | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Advertised Receiver Window Credit (a_rwnd) | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Number of Gap Ack Blocks = N | Number of Duplicate TSNs = X | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Gap Ack Block #1 Start | Gap Ack Block #1 End | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| / / |
| \ ... \ |
| / / |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Gap Ack Block #N Start | Gap Ack Block #N End | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Duplicate TSN 1 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| / / |
| \ ... \ |
| / / |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Duplicate TSN X | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Chunk Flags: 8 bits |
| |
| Set to all '0's on transmit and ignored on receipt. |
| |
| Cumulative TSN Ack: 32 bits (unsigned integer) |
| |
| This parameter contains the TSN of the last DATA chunk received in |
| sequence before a gap. In the case where no DATA chunk has been |
| received, this value is set to the peer's Initial TSN minus one. |
| |
| Advertised Receiver Window Credit (a_rwnd): 32 bits (unsigned |
| integer) |
| |
| This field indicates the updated receive buffer space in bytes of |
| the sender of this SACK; see Section 6.2.1 for details. |
| |
| Number of Gap Ack Blocks: 16 bits (unsigned integer) |
| |
| Indicates the number of Gap Ack Blocks included in this SACK. |
| |
| |
| |
| |
| Stewart Standards Track [Page 35] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Number of Duplicate TSNs: 16 bit |
| |
| This field contains the number of duplicate TSNs the endpoint has |
| received. Each duplicate TSN is listed following the Gap Ack |
| Block list. |
| |
| Gap Ack Blocks: |
| |
| These fields contain the Gap Ack Blocks. They are repeated for |
| each Gap Ack Block up to the number of Gap Ack Blocks defined in |
| the Number of Gap Ack Blocks field. All DATA chunks with TSNs |
| greater than or equal to (Cumulative TSN Ack + Gap Ack Block |
| Start) and less than or equal to (Cumulative TSN Ack + Gap Ack |
| Block End) of each Gap Ack Block are assumed to have been received |
| correctly. |
| |
| Gap Ack Block Start: 16 bits (unsigned integer) |
| |
| Indicates the Start offset TSN for this Gap Ack Block. To |
| calculate the actual TSN number the Cumulative TSN Ack is added to |
| this offset number. This calculated TSN identifies the first TSN |
| in this Gap Ack Block that has been received. |
| |
| Gap Ack Block End: 16 bits (unsigned integer) |
| |
| Indicates the End offset TSN for this Gap Ack Block. To calculate |
| the actual TSN number, the Cumulative TSN Ack is added to this |
| offset number. This calculated TSN identifies the TSN of the last |
| DATA chunk received in this Gap Ack Block. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 36] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| For example, assume that the receiver has the following DATA chunks |
| newly arrived at the time when it decides to send a Selective ACK, |
| |
| ---------- |
| | TSN=17 | |
| ---------- |
| | | <- still missing |
| ---------- |
| | TSN=15 | |
| ---------- |
| | TSN=14 | |
| ---------- |
| | | <- still missing |
| ---------- |
| | TSN=12 | |
| ---------- |
| | TSN=11 | |
| ---------- |
| | TSN=10 | |
| ---------- |
| |
| then the parameter part of the SACK MUST be constructed as follows |
| (assuming the new a_rwnd is set to 4660 by the sender): |
| |
| +--------------------------------+ |
| | Cumulative TSN Ack = 12 | |
| +--------------------------------+ |
| | a_rwnd = 4660 | |
| +----------------+---------------+ |
| | num of block=2 | num of dup=0 | |
| +----------------+---------------+ |
| |block #1 strt=2 |block #1 end=3 | |
| +----------------+---------------+ |
| |block #2 strt=5 |block #2 end=5 | |
| +----------------+---------------+ |
| |
| Duplicate TSN: 32 bits (unsigned integer) |
| |
| Indicates the number of times a TSN was received in duplicate |
| since the last SACK was sent. Every time a receiver gets a |
| duplicate TSN (before sending the SACK), it adds it to the list of |
| duplicates. The duplicate count is reinitialized to zero after |
| sending each SACK. |
| |
| For example, if a receiver were to get the TSN 19 three times it |
| would list 19 twice in the outbound SACK. After sending the SACK, if |
| it received yet one more TSN 19 it would list 19 as a duplicate once |
| in the next outgoing SACK. |
| |
| |
| |
| Stewart Standards Track [Page 37] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 3.3.5. Heartbeat Request (HEARTBEAT) (4) |
| |
| An endpoint should send this chunk to its peer endpoint to probe the |
| reachability of a particular destination transport address defined in |
| the present association. |
| |
| The parameter field contains the Heartbeat Information, which is a |
| variable-length opaque data structure understood only by the sender. |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type = 4 | Chunk Flags | Heartbeat Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| \ \ |
| / Heartbeat Information TLV (Variable-Length) / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Chunk Flags: 8 bits |
| |
| Set to 0 on transmit and ignored on receipt. |
| |
| Heartbeat Length: 16 bits (unsigned integer) |
| |
| Set to the size of the chunk in bytes, including the chunk header |
| and the Heartbeat Information field. |
| |
| Heartbeat Information: variable length |
| |
| Defined as a variable-length parameter using the format described |
| in Section 3.2.1, i.e.: |
| |
| Variable Parameters Status Type Value |
| ------------------------------------------------------------- |
| Heartbeat Info Mandatory 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Heartbeat Info Type=1 | HB Info Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| / Sender-Specific Heartbeat Info / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| The Sender-Specific Heartbeat Info field should normally include |
| information about the sender's current time when this HEARTBEAT |
| |
| |
| |
| Stewart Standards Track [Page 38] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| chunk is sent and the destination transport address to which this |
| HEARTBEAT is sent (see Section 8.3). This information is simply |
| reflected back by the receiver in the HEARTBEAT ACK message (see |
| Section 3.3.6). Note also that the HEARTBEAT message is both for |
| reachability checking and for path verification (see Section 5.4). |
| When a HEARTBEAT chunk is being used for path verification |
| purposes, it MUST hold a 64-bit random nonce. |
| |
| 3.3.6. Heartbeat Acknowledgement (HEARTBEAT ACK) (5) |
| |
| An endpoint should send this chunk to its peer endpoint as a response |
| to a HEARTBEAT chunk (see Section 8.3). A HEARTBEAT ACK is always |
| sent to the source IP address of the IP datagram containing the |
| HEARTBEAT chunk to which this ack is responding. |
| |
| The parameter field contains a variable-length opaque data structure. |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type = 5 | Chunk Flags | Heartbeat Ack Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| \ \ |
| / Heartbeat Information TLV (Variable-Length) / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Chunk Flags: 8 bits |
| |
| Set to 0 on transmit and ignored on receipt. |
| |
| Heartbeat Ack Length: 16 bits (unsigned integer) |
| |
| Set to the size of the chunk in bytes, including the chunk header |
| and the Heartbeat Information field. |
| |
| Heartbeat Information: variable length |
| |
| This field MUST contain the Heartbeat Information parameter of the |
| Heartbeat Request to which this Heartbeat Acknowledgement is |
| responding. |
| |
| Variable Parameters Status Type Value |
| ------------------------------------------------------------- |
| Heartbeat Info Mandatory 1 |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 39] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 3.3.7. Abort Association (ABORT) (6) |
| |
| The ABORT chunk is sent to the peer of an association to close the |
| association. The ABORT chunk may contain Cause Parameters to inform |
| the receiver about the reason of the abort. DATA chunks MUST NOT be |
| bundled with ABORT. Control chunks (except for INIT, INIT ACK, and |
| SHUTDOWN COMPLETE) MAY be bundled with an ABORT, but they MUST be |
| placed before the ABORT in the SCTP packet or they will be ignored by |
| the receiver. |
| |
| If an endpoint receives an ABORT with a format error or no TCB is |
| found, it MUST silently discard it. Moreover, under any |
| circumstances, an endpoint that receives an ABORT MUST NOT respond to |
| that ABORT by sending an ABORT of its own. |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type = 6 |Reserved |T| Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| \ \ |
| / zero or more Error Causes / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Chunk Flags: 8 bits |
| |
| Reserved: 7 bits |
| |
| Set to 0 on transmit and ignored on receipt. |
| |
| T bit: 1 bit |
| |
| The T bit is set to 0 if the sender filled in the Verification Tag |
| expected by the peer. If the Verification Tag is reflected, the T |
| bit MUST be set to 1. Reflecting means that the sent Verification |
| Tag is the same as the received one. |
| |
| Note: Special rules apply to this chunk for verification; please |
| see Section 8.5.1 for details. |
| |
| Length: 16 bits (unsigned integer) |
| |
| Set to the size of the chunk in bytes, including the chunk header |
| and all the Error Cause fields present. |
| |
| See Section 3.3.10 for Error Cause definitions. |
| |
| |
| |
| |
| Stewart Standards Track [Page 40] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 3.3.8. Shutdown Association (SHUTDOWN) (7) |
| |
| An endpoint in an association MUST use this chunk to initiate a |
| graceful close of the association with its peer. This chunk has the |
| following format. |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type = 7 | Chunk Flags | Length = 8 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Cumulative TSN Ack | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Chunk Flags: 8 bits |
| |
| Set to 0 on transmit and ignored on receipt. |
| |
| Length: 16 bits (unsigned integer) |
| |
| Indicates the length of the parameter. Set to 8. |
| |
| Cumulative TSN Ack: 32 bits (unsigned integer) |
| |
| This parameter contains the TSN of the last chunk received in |
| sequence before any gaps. |
| |
| Note: Since the SHUTDOWN message does not contain Gap Ack Blocks, |
| it cannot be used to acknowledge TSNs received out of order. In a |
| SACK, lack of Gap Ack Blocks that were previously included |
| indicates that the data receiver reneged on the associated DATA |
| chunks. Since SHUTDOWN does not contain Gap Ack Blocks, the |
| receiver of the SHUTDOWN shouldn't interpret the lack of a Gap Ack |
| Block as a renege. (See Section 6.2 for information on reneging.) |
| |
| 3.3.9. Shutdown Acknowledgement (SHUTDOWN ACK) (8) |
| |
| This chunk MUST be used to acknowledge the receipt of the SHUTDOWN |
| chunk at the completion of the shutdown process; see Section 9.2 for |
| details. |
| |
| The SHUTDOWN ACK chunk has no parameters. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 41] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type = 8 |Chunk Flags | Length = 4 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Chunk Flags: 8 bits |
| |
| Set to 0 on transmit and ignored on receipt. |
| |
| 3.3.10. Operation Error (ERROR) (9) |
| |
| An endpoint sends this chunk to its peer endpoint to notify it of |
| certain error conditions. It contains one or more error causes. An |
| Operation Error is not considered fatal in and of itself, but may be |
| used with an ABORT chunk to report a fatal condition. It has the |
| following parameters: |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type = 9 | Chunk Flags | Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| \ \ |
| / one or more Error Causes / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Chunk Flags: 8 bits |
| |
| Set to 0 on transmit and ignored on receipt. |
| |
| Length: 16 bits (unsigned integer) |
| |
| Set to the size of the chunk in bytes, including the chunk header |
| and all the Error Cause fields present. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 42] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Error causes are defined as variable-length parameters using the |
| format described in Section 3.2.1, that is: |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Cause Code | Cause Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| / Cause-Specific Information / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Cause Code: 16 bits (unsigned integer) |
| |
| Defines the type of error conditions being reported. |
| |
| Cause Code |
| Value Cause Code |
| --------- ---------------- |
| 1 Invalid Stream Identifier |
| 2 Missing Mandatory Parameter |
| 3 Stale Cookie Error |
| 4 Out of Resource |
| 5 Unresolvable Address |
| 6 Unrecognized Chunk Type |
| 7 Invalid Mandatory Parameter |
| 8 Unrecognized Parameters |
| 9 No User Data |
| 10 Cookie Received While Shutting Down |
| 11 Restart of an Association with New Addresses |
| 12 User Initiated Abort |
| 13 Protocol Violation |
| |
| Cause Length: 16 bits (unsigned integer) |
| |
| Set to the size of the parameter in bytes, including the Cause |
| Code, Cause Length, and Cause-Specific Information fields. |
| |
| Cause-Specific Information: variable length |
| |
| This field carries the details of the error condition. |
| |
| Section 3.3.10.1 - Section 3.3.10.13 define error causes for SCTP. |
| Guidelines for the IETF to define new error cause values are |
| discussed in Section 14.3. |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 43] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 3.3.10.1. Invalid Stream Identifier (1) |
| |
| Cause of error |
| --------------- |
| |
| Invalid Stream Identifier: Indicates endpoint received a DATA chunk |
| sent to a nonexistent stream. |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Cause Code=1 | Cause Length=8 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Stream Identifier | (Reserved) | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Stream Identifier: 16 bits (unsigned integer) |
| |
| Contains the Stream Identifier of the DATA chunk received in |
| error. |
| |
| Reserved: 16 bits |
| |
| This field is reserved. It is set to all 0's on transmit and |
| ignored on receipt. |
| |
| 3.3.10.2. Missing Mandatory Parameter (2) |
| |
| Cause of error |
| --------------- |
| |
| Missing Mandatory Parameter: Indicates that one or more mandatory TLV |
| parameters are missing in a received INIT or INIT ACK. |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Cause Code=2 | Cause Length=8+N*2 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Number of missing params=N | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Missing Param Type #1 | Missing Param Type #2 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Missing Param Type #N-1 | Missing Param Type #N | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Number of Missing params: 32 bits (unsigned integer) |
| |
| This field contains the number of parameters contained in the |
| Cause-Specific Information field. |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 44] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Missing Param Type: 16 bits (unsigned integer) |
| |
| Each field will contain the missing mandatory parameter number. |
| |
| 3.3.10.3. Stale Cookie Error (3) |
| |
| Cause of error |
| -------------- |
| |
| Stale Cookie Error: Indicates the receipt of a valid State Cookie |
| that has expired. |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Cause Code=3 | Cause Length=8 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Measure of Staleness (usec.) | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Measure of Staleness: 32 bits (unsigned integer) |
| |
| This field contains the difference, in microseconds, between the |
| current time and the time the State Cookie expired. |
| |
| The sender of this error cause MAY choose to report how long past |
| expiration the State Cookie is by including a non-zero value in |
| the Measure of Staleness field. If the sender does not wish to |
| provide this information, it should set the Measure of Staleness |
| field to the value of zero. |
| |
| 3.3.10.4. Out of Resource (4) |
| |
| Cause of error |
| --------------- |
| |
| Out of Resource: Indicates that the sender is out of resource. This |
| is usually sent in combination with or within an ABORT. |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Cause Code=4 | Cause Length=4 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 45] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 3.3.10.5. Unresolvable Address (5) |
| |
| Cause of error |
| --------------- |
| |
| Unresolvable Address: Indicates that the sender is not able to |
| resolve the specified address parameter (e.g., type of address is not |
| supported by the sender). This is usually sent in combination with |
| or within an ABORT. |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Cause Code=5 | Cause Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| / Unresolvable Address / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Unresolvable Address: variable length |
| |
| The Unresolvable Address field contains the complete Type, Length, |
| and Value of the address parameter (or Host Name parameter) that |
| contains the unresolvable address or host name. |
| |
| 3.3.10.6. Unrecognized Chunk Type (6) |
| |
| Cause of error |
| --------------- |
| |
| Unrecognized Chunk Type: This error cause is returned to the |
| originator of the chunk if the receiver does not understand the chunk |
| and the upper bits of the 'Chunk Type' are set to 01 or 11. |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Cause Code=6 | Cause Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| / Unrecognized Chunk / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Unrecognized Chunk: variable length |
| |
| The Unrecognized Chunk field contains the unrecognized chunk from |
| the SCTP packet complete with Chunk Type, Chunk Flags, and Chunk |
| Length. |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 46] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 3.3.10.7. Invalid Mandatory Parameter (7) |
| |
| Cause of error |
| --------------- |
| |
| Invalid Mandatory Parameter: This error cause is returned to the |
| originator of an INIT or INIT ACK chunk when one of the mandatory |
| parameters is set to an invalid value. |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Cause Code=7 | Cause Length=4 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| 3.3.10.8. Unrecognized Parameters (8) |
| |
| Cause of error |
| --------------- |
| |
| Unrecognized Parameters: This error cause is returned to the |
| originator of the INIT ACK chunk if the receiver does not recognize |
| one or more Optional TLV parameters in the INIT ACK chunk. |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Cause Code=8 | Cause Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| / Unrecognized Parameters / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Unrecognized Parameters: variable length |
| |
| The Unrecognized Parameters field contains the unrecognized |
| parameters copied from the INIT ACK chunk complete with TLV. This |
| error cause is normally contained in an ERROR chunk bundled with |
| the COOKIE ECHO chunk when responding to the INIT ACK, when the |
| sender of the COOKIE ECHO chunk wishes to report unrecognized |
| parameters. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 47] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 3.3.10.9. No User Data (9) |
| |
| Cause of error |
| --------------- |
| |
| No User Data: This error cause is returned to the originator of a |
| |
| DATA chunk if a received DATA chunk has no user data. |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Cause Code=9 | Cause Length=8 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| / TSN value / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| TSN value: 32 bits (unsigned integer) |
| |
| The TSN value field contains the TSN of the DATA chunk received |
| with no user data field. |
| |
| This cause code is normally returned in an ABORT chunk (see |
| Section 6.2). |
| |
| 3.3.10.10. Cookie Received While Shutting Down (10) |
| |
| Cause of error |
| --------------- |
| |
| Cookie Received While Shutting Down: A COOKIE ECHO was received while |
| the endpoint was in the SHUTDOWN-ACK-SENT state. This error is |
| usually returned in an ERROR chunk bundled with the retransmitted |
| SHUTDOWN ACK. |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Cause Code=10 | Cause Length=4 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 48] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 3.3.10.11. Restart of an Association with New Addresses (11) |
| |
| Cause of error |
| -------------- |
| |
| Restart of an association with new addresses: An INIT was received on |
| an existing association. But the INIT added addresses to the |
| association that were previously NOT part of the association. The |
| new addresses are listed in the error code. This ERROR is normally |
| sent as part of an ABORT refusing the INIT (see Section 5.2). |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Cause Code=11 | Cause Length=Variable | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| / New Address TLVs / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Note: Each New Address TLV is an exact copy of the TLV that was found |
| in the INIT chunk that was new, including the Parameter Type and the |
| Parameter Length. |
| |
| 3.3.10.12. User-Initiated Abort (12) |
| |
| Cause of error |
| -------------- |
| |
| This error cause MAY be included in ABORT chunks that are sent |
| because of an upper-layer request. The upper layer can specify an |
| Upper Layer Abort Reason that is transported by SCTP transparently |
| and MAY be delivered to the upper-layer protocol at the peer. |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Cause Code=12 | Cause Length=Variable | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| / Upper Layer Abort Reason / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 49] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 3.3.10.13. Protocol Violation (13) |
| |
| Cause of error |
| -------------- |
| |
| This error cause MAY be included in ABORT chunks that are sent |
| because an SCTP endpoint detects a protocol violation of the peer |
| that is not covered by the error causes described in Section 3.3.10.1 |
| to Section 3.3.10.12. An implementation MAY provide additional |
| information specifying what kind of protocol violation has been |
| detected. |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Cause Code=13 | Cause Length=Variable | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| / Additional Information / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| 3.3.11. Cookie Echo (COOKIE ECHO) (10) |
| |
| This chunk is used only during the initialization of an association. |
| It is sent by the initiator of an association to its peer to complete |
| the initialization process. This chunk MUST precede any DATA chunk |
| sent within the association, but MAY be bundled with one or more DATA |
| chunks in the same 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type = 10 |Chunk Flags | Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| / Cookie / |
| \ \ |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Chunk Flags: 8 bit |
| |
| Set to 0 on transmit and ignored on receipt. |
| |
| Length: 16 bits (unsigned integer) |
| |
| Set to the size of the chunk in bytes, including the 4 bytes of |
| the chunk header and the size of the cookie. |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 50] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Cookie: variable size |
| |
| This field must contain the exact cookie received in the State |
| Cookie parameter from the previous INIT ACK. |
| |
| An implementation SHOULD make the cookie as small as possible to |
| ensure interoperability. |
| |
| Note: A Cookie Echo does NOT contain a State Cookie parameter; |
| instead, the data within the State Cookie's Parameter Value |
| becomes the data within the Cookie Echo's Chunk Value. This |
| allows an implementation to change only the first 2 bytes of the |
| State Cookie parameter to become a COOKIE ECHO chunk. |
| |
| 3.3.12. Cookie Acknowledgement (COOKIE ACK) (11) |
| |
| This chunk is used only during the initialization of an association. |
| It is used to acknowledge the receipt of a COOKIE ECHO chunk. This |
| chunk MUST precede any DATA or SACK chunk sent within the |
| association, but MAY be bundled with one or more DATA chunks or SACK |
| chunk's in the same SCTP 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type = 11 |Chunk Flags | Length = 4 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Chunk Flags: 8 bits |
| |
| Set to 0 on transmit and ignored on receipt. |
| |
| 3.3.13. Shutdown Complete (SHUTDOWN COMPLETE) (14) |
| |
| This chunk MUST be used to acknowledge the receipt of the SHUTDOWN |
| ACK chunk at the completion of the shutdown process; see Section 9.2 |
| for details. |
| |
| The SHUTDOWN COMPLETE chunk has no parameters. |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type = 14 |Reserved |T| Length = 4 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Chunk Flags: 8 bits |
| |
| |
| |
| |
| Stewart Standards Track [Page 51] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Reserved: 7 bits |
| |
| Set to 0 on transmit and ignored on receipt. |
| |
| T bit: 1 bit |
| |
| The T bit is set to 0 if the sender filled in the Verification Tag |
| expected by the peer. If the Verification Tag is reflected, the T |
| bit MUST be set to 1. Reflecting means that the sent Verification |
| Tag is the same as the received one. |
| |
| Note: Special rules apply to this chunk for verification, please see |
| Section 8.5.1 for details. |
| |
| 4. SCTP Association State Diagram |
| |
| During the life time of an SCTP association, the SCTP endpoint's |
| association progresses from one state to another in response to |
| various events. The events that may potentially advance an |
| association's state include: |
| |
| o SCTP user primitive calls, e.g., [ASSOCIATE], [SHUTDOWN], [ABORT], |
| |
| o Reception of INIT, COOKIE ECHO, ABORT, SHUTDOWN, etc., control |
| chunks, or |
| |
| o Some timeout events. |
| |
| The state diagram in the figures below illustrates state changes, |
| together with the causing events and resulting actions. Note that |
| some of the error conditions are not shown in the state diagram. |
| Full descriptions of all special cases are found in the text. |
| |
| Note: Chunk names are given in all capital letters, while parameter |
| names have the first letter capitalized, e.g., COOKIE ECHO chunk type |
| vs. State Cookie parameter. If more than one event/message can occur |
| that causes a state transition, it is labeled (A), (B), etc. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 52] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| ----- -------- (from any state) |
| / \ / rcv ABORT [ABORT] |
| rcv INIT | | | ---------- or ---------- |
| --------------- | v v delete TCB snd ABORT |
| generate Cookie \ +---------+ delete TCB |
| snd INIT ACK ---| CLOSED | |
| +---------+ |
| / \ [ASSOCIATE] |
| / \ --------------- |
| | | create TCB |
| | | snd INIT |
| | | strt init timer |
| rcv valid | | |
| COOKIE ECHO | v |
| (1) ---------------- | +------------+ |
| create TCB | | COOKIE-WAIT| (2) |
| snd COOKIE ACK | +------------+ |
| | | |
| | | rcv INIT ACK |
| | | ----------------- |
| | | snd COOKIE ECHO |
| | | stop init timer |
| | | strt cookie timer |
| | v |
| | +--------------+ |
| | | COOKIE-ECHOED| (3) |
| | +--------------+ |
| | | |
| | | rcv COOKIE ACK |
| | | ----------------- |
| | | stop cookie timer |
| v v |
| +---------------+ |
| | ESTABLISHED | |
| +---------------+ |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 53] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| (from the ESTABLISHED state only) |
| | |
| | |
| /--------+--------\ |
| [SHUTDOWN] / \ |
| -------------------| | |
| check outstanding | | |
| DATA chunks | | |
| v | |
| +---------+ | |
| |SHUTDOWN-| | rcv SHUTDOWN |
| |PENDING | |------------------ |
| +---------+ | check outstanding |
| | | DATA chunks |
| No more outstanding | | |
| ---------------------| | |
| snd SHUTDOWN | | |
| strt shutdown timer | | |
| v v |
| +---------+ +-----------+ |
| (4) |SHUTDOWN-| | SHUTDOWN- | (5,6) |
| |SENT | | RECEIVED | |
| +---------+ +-----------+ |
| | \ | |
| (A) rcv SHUTDOWN ACK | \ | |
| ----------------------| \ | |
| stop shutdown timer | \rcv:SHUTDOWN | |
| send SHUTDOWN COMPLETE| \ (B) | |
| delete TCB | \ | |
| | \ | No more outstanding |
| | \ |----------------- |
| | \ | send SHUTDOWN ACK |
| (B)rcv SHUTDOWN | \ | strt shutdown timer |
| ----------------------| \ | |
| send SHUTDOWN ACK | \ | |
| start shutdown timer | \ | |
| move to SHUTDOWN- | \ | |
| ACK-SENT | | | |
| | v | |
| | +-----------+ |
| | | SHUTDOWN- | (7) |
| | | ACK-SENT | |
| | +----------+- |
| | | (C)rcv SHUTDOWN COMPLETE |
| | |----------------- |
| | | stop shutdown timer |
| | | delete TCB |
| | | |
| |
| |
| |
| Stewart Standards Track [Page 54] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| | | (D)rcv SHUTDOWN ACK |
| | |-------------- |
| | | stop shutdown timer |
| | | send SHUTDOWN COMPLETE |
| | | delete TCB |
| | | |
| \ +---------+ / |
| \-->| CLOSED |<--/ |
| +---------+ |
| |
| Figure 3: State Transition Diagram of SCTP |
| |
| Notes: |
| |
| 1) If the State Cookie in the received COOKIE ECHO is invalid (i.e., |
| failed to pass the integrity check), the receiver MUST silently |
| discard the packet. Or, if the received State Cookie is expired |
| (see Section 5.1.5), the receiver MUST send back an ERROR chunk. |
| In either case, the receiver stays in the CLOSED state. |
| |
| 2) If the T1-init timer expires, the endpoint MUST retransmit INIT |
| and restart the T1-init timer without changing state. This MUST |
| be repeated up to 'Max.Init.Retransmits' times. After that, the |
| endpoint MUST abort the initialization process and report the |
| error to the SCTP user. |
| |
| 3) If the T1-cookie timer expires, the endpoint MUST retransmit |
| COOKIE ECHO and restart the T1-cookie timer without changing |
| state. This MUST be repeated up to 'Max.Init.Retransmits' times. |
| After that, the endpoint MUST abort the initialization process |
| and report the error to the SCTP user. |
| |
| 4) In the SHUTDOWN-SENT state, the endpoint MUST acknowledge any |
| received DATA chunks without delay. |
| |
| 5) In the SHUTDOWN-RECEIVED state, the endpoint MUST NOT accept any |
| new send requests from its SCTP user. |
| |
| 6) In the SHUTDOWN-RECEIVED state, the endpoint MUST transmit or |
| retransmit data and leave this state when all data in queue is |
| transmitted. |
| |
| 7) In the SHUTDOWN-ACK-SENT state, the endpoint MUST NOT accept any |
| new send requests from its SCTP user. |
| |
| The CLOSED state is used to indicate that an association is not |
| created (i.e., doesn't exist). |
| |
| |
| |
| |
| Stewart Standards Track [Page 55] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 5. Association Initialization |
| |
| Before the first data transmission can take place from one SCTP |
| endpoint ("A") to another SCTP endpoint ("Z"), the two endpoints must |
| complete an initialization process in order to set up an SCTP |
| association between them. |
| |
| The SCTP user at an endpoint should use the ASSOCIATE primitive to |
| initialize an SCTP association to another SCTP endpoint. |
| |
| IMPLEMENTATION NOTE: From an SCTP user's point of view, an |
| association may be implicitly opened, without an ASSOCIATE primitive |
| (see Section 10.1 B) being invoked, by the initiating endpoint's |
| sending of the first user data to the destination endpoint. The |
| initiating SCTP will assume default values for all mandatory and |
| optional parameters for the INIT/INIT ACK. |
| |
| Once the association is established, unidirectional streams are open |
| for data transfer on both ends (see Section 5.1.1). |
| |
| 5.1. Normal Establishment of an Association |
| |
| The initialization process consists of the following steps (assuming |
| that SCTP endpoint "A" tries to set up an association with SCTP |
| endpoint "Z" and "Z" accepts the new association): |
| |
| A) "A" first sends an INIT chunk to "Z". In the INIT, "A" must |
| provide its Verification Tag (Tag_A) in the Initiate Tag field. |
| Tag_A SHOULD be a random number in the range of 1 to 4294967295 |
| (see Section 5.3.1 for Tag value selection). After sending the |
| INIT, "A" starts the T1-init timer and enters the COOKIE-WAIT |
| state. |
| |
| B) "Z" shall respond immediately with an INIT ACK chunk. The |
| destination IP address of the INIT ACK MUST be set to the source |
| IP address of the INIT to which this INIT ACK is responding. In |
| the response, besides filling in other parameters, "Z" must set |
| the Verification Tag field to Tag_A, and also provide its own |
| Verification Tag (Tag_Z) in the Initiate Tag field. |
| |
| Moreover, "Z" MUST generate and send along with the INIT ACK a |
| State Cookie. See Section 5.1.3 for State Cookie generation. |
| |
| Note: After sending out INIT ACK with the State Cookie parameter, |
| "Z" MUST NOT allocate any resources or keep any states for the new |
| association. Otherwise, "Z" will be vulnerable to resource |
| attacks. |
| |
| |
| |
| |
| Stewart Standards Track [Page 56] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| C) Upon reception of the INIT ACK from "Z", "A" shall stop the T1- |
| init timer and leave the COOKIE-WAIT state. "A" shall then send |
| the State Cookie received in the INIT ACK chunk in a COOKIE ECHO |
| chunk, start the T1-cookie timer, and enter the COOKIE-ECHOED |
| state. |
| |
| Note: The COOKIE ECHO chunk can be bundled with any pending |
| outbound DATA chunks, but it MUST be the first chunk in the packet |
| and until the COOKIE ACK is returned the sender MUST NOT send any |
| other packets to the peer. |
| |
| D) Upon reception of the COOKIE ECHO chunk, endpoint "Z" will reply |
| with a COOKIE ACK chunk after building a TCB and moving to the |
| ESTABLISHED state. A COOKIE ACK chunk may be bundled with any |
| pending DATA chunks (and/or SACK chunks), but the COOKIE ACK chunk |
| MUST be the first chunk in the packet. |
| |
| IMPLEMENTATION NOTE: An implementation may choose to send the |
| Communication Up notification to the SCTP user upon reception of a |
| valid COOKIE ECHO chunk. |
| |
| E) Upon reception of the COOKIE ACK, endpoint "A" will move from the |
| COOKIE-ECHOED state to the ESTABLISHED state, stopping the T1- |
| cookie timer. It may also notify its ULP about the successful |
| establishment of the association with a Communication Up |
| notification (see Section 10). |
| |
| An INIT or INIT ACK chunk MUST NOT be bundled with any other chunk. |
| They MUST be the only chunks present in the SCTP packets that carry |
| them. |
| |
| An endpoint MUST send the INIT ACK to the IP address from which it |
| received the INIT. |
| |
| Note: T1-init timer and T1-cookie timer shall follow the same rules |
| given in Section 6.3. |
| |
| If an endpoint receives an INIT, INIT ACK, or COOKIE ECHO chunk but |
| decides not to establish the new association due to missing mandatory |
| parameters in the received INIT or INIT ACK, invalid parameter |
| values, or lack of local resources, it SHOULD respond with an ABORT |
| chunk. It SHOULD also specify the cause of abort, such as the type |
| of the missing mandatory parameters, etc., by including the error |
| cause parameters with the ABORT chunk. The Verification Tag field in |
| the common header of the outbound SCTP packet containing the ABORT |
| chunk MUST be set to the Initiate Tag value of the peer. |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 57] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Note that a COOKIE ECHO chunk that does NOT pass the integrity check |
| is NOT considered an 'invalid parameter' and requires special |
| handling; see Section 5.1.5. |
| |
| After the reception of the first DATA chunk in an association the |
| endpoint MUST immediately respond with a SACK to acknowledge the DATA |
| chunk. Subsequent acknowledgements should be done as described in |
| Section 6.2. |
| |
| When the TCB is created, each endpoint MUST set its internal |
| Cumulative TSN Ack Point to the value of its transmitted Initial TSN |
| minus one. |
| |
| IMPLEMENTATION NOTE: The IP addresses and SCTP port are generally |
| used as the key to find the TCB within an SCTP instance. |
| |
| 5.1.1. Handle Stream Parameters |
| |
| In the INIT and INIT ACK chunks, the sender of the chunk MUST |
| indicate the number of outbound streams (OSs) it wishes to have in |
| the association, as well as the maximum inbound streams (MISs) it |
| will accept from the other endpoint. |
| |
| After receiving the stream configuration information from the other |
| side, each endpoint MUST perform the following check: If the peer's |
| MIS is less than the endpoint's OS, meaning that the peer is |
| incapable of supporting all the outbound streams the endpoint wants |
| to configure, the endpoint MUST use MIS outbound streams and MAY |
| report any shortage to the upper layer. The upper layer can then |
| choose to abort the association if the resource shortage is |
| unacceptable. |
| |
| After the association is initialized, the valid outbound stream |
| identifier range for either endpoint shall be 0 to min(local OS, |
| remote MIS)-1. |
| |
| 5.1.2. Handle Address Parameters |
| |
| During the association initialization, an endpoint shall use the |
| following rules to discover and collect the destination transport |
| address(es) of its peer. |
| |
| A) If there are no address parameters present in the received INIT or |
| INIT ACK chunk, the endpoint shall take the source IP address from |
| which the chunk arrives and record it, in combination with the |
| SCTP source port number, as the only destination transport address |
| for this peer. |
| |
| |
| |
| |
| Stewart Standards Track [Page 58] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| B) If there is a Host Name parameter present in the received INIT or |
| INIT ACK chunk, the endpoint shall resolve that host name to a |
| list of IP address(es) and derive the transport address(es) of |
| this peer by combining the resolved IP address(es) with the SCTP |
| source port. |
| |
| The endpoint MUST ignore any other IP Address parameters if they |
| are also present in the received INIT or INIT ACK chunk. |
| |
| The time at which the receiver of an INIT resolves the host name |
| has potential security implications to SCTP. If the receiver of |
| an INIT resolves the host name upon the reception of the chunk, |
| and the mechanism the receiver uses to resolve the host name |
| involves potential long delay (e.g., DNS query), the receiver may |
| open itself up to resource attacks for the period of time while it |
| is waiting for the name resolution results before it can build the |
| State Cookie and release local resources. |
| |
| Therefore, in cases where the name translation involves potential |
| long delay, the receiver of the INIT MUST postpone the name |
| resolution till the reception of the COOKIE ECHO chunk from the |
| peer. In such a case, the receiver of the INIT SHOULD build the |
| State Cookie using the received Host Name (instead of destination |
| transport addresses) and send the INIT ACK to the source IP |
| address from which the INIT was received. |
| |
| The receiver of an INIT ACK shall always immediately attempt to |
| resolve the name upon the reception of the chunk. |
| |
| The receiver of the INIT or INIT ACK MUST NOT send user data |
| (piggy-backed or stand-alone) to its peer until the host name is |
| successfully resolved. |
| |
| If the name resolution is not successful, the endpoint MUST |
| immediately send an ABORT with "Unresolvable Address" error cause |
| to its peer. The ABORT shall be sent to the source IP address |
| from which the last peer packet was received. |
| |
| C) If there are only IPv4/IPv6 addresses present in the received INIT |
| or INIT ACK chunk, the receiver MUST derive and record all the |
| transport addresses from the received chunk AND the source IP |
| address that sent the INIT or INIT ACK. The transport addresses |
| are derived by the combination of SCTP source port (from the |
| common header) and the IP Address parameter(s) carried in the INIT |
| or INIT ACK chunk and the source IP address of the IP datagram. |
| The receiver should use only these transport addresses as |
| destination transport addresses when sending subsequent packets to |
| its peer. |
| |
| |
| |
| Stewart Standards Track [Page 59] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| D) An INIT or INIT ACK chunk MUST be treated as belonging to an |
| already established association (or one in the process of being |
| established) if the use of any of the valid address parameters |
| contained within the chunk would identify an existing TCB. |
| |
| IMPLEMENTATION NOTE: In some cases (e.g., when the implementation |
| doesn't control the source IP address that is used for transmitting), |
| an endpoint might need to include in its INIT or INIT ACK all |
| possible IP addresses from which packets to the peer could be |
| transmitted. |
| |
| After all transport addresses are derived from the INIT or INIT ACK |
| chunk using the above rules, the endpoint shall select one of the |
| transport addresses as the initial primary path. |
| |
| Note: The INIT ACK MUST be sent to the source address of the INIT. |
| |
| The sender of INIT may include a 'Supported Address Types' parameter |
| in the INIT to indicate what types of address are acceptable. When |
| this parameter is present, the receiver of INIT (initiate) MUST |
| either use one of the address types indicated in the Supported |
| Address Types parameter when responding to the INIT, or abort the |
| association with an "Unresolvable Address" error cause if it is |
| unwilling or incapable of using any of the address types indicated by |
| its peer. |
| |
| IMPLEMENTATION NOTE: In the case that the receiver of an INIT ACK |
| fails to resolve the address parameter due to an unsupported type, it |
| can abort the initiation process and then attempt a reinitiation by |
| using a 'Supported Address Types' parameter in the new INIT to |
| indicate what types of address it prefers. |
| |
| IMPLEMENTATION NOTE: If an SCTP endpoint that only supports either |
| IPv4 or IPv6 receives IPv4 and IPv6 addresses in an INIT or INIT ACK |
| chunk from its peer, it MUST use all the addresses belonging to the |
| supported address family. The other addresses MAY be ignored. The |
| endpoint SHOULD NOT respond with any kind of error indication. |
| |
| IMPLEMENTATION NOTE: If an SCTP endpoint lists in the 'Supported |
| Address Types' parameter either IPv4 or IPv6, but uses the other |
| family for sending the packet containing the INIT chunk, or if it |
| also lists addresses of the other family in the INIT chunk, then the |
| address family that is not listed in the 'Supported Address Types' |
| parameter SHOULD also be considered as supported by the receiver of |
| the INIT chunk. The receiver of the INIT chunk SHOULD NOT respond |
| with any kind of error indication. |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 60] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 5.1.3. Generating State Cookie |
| |
| When sending an INIT ACK as a response to an INIT chunk, the sender |
| of INIT ACK creates a State Cookie and sends it in the State Cookie |
| parameter of the INIT ACK. Inside this State Cookie, the sender |
| should include a MAC (see [RFC2104] for an example), a timestamp on |
| when the State Cookie is created, and the lifespan of the State |
| Cookie, along with all the information necessary for it to establish |
| the association. |
| |
| The following steps SHOULD be taken to generate the State Cookie: |
| |
| 1) Create an association TCB using information from both the |
| received INIT and the outgoing INIT ACK chunk, |
| |
| 2) In the TCB, set the creation time to the current time of day, and |
| the lifespan to the protocol parameter 'Valid.Cookie.Life' (see |
| Section 15), |
| |
| 3) From the TCB, identify and collect the minimal subset of |
| information needed to re-create the TCB, and generate a MAC using |
| this subset of information and a secret key (see [RFC2104] for an |
| example of generating a MAC), and |
| |
| 4) Generate the State Cookie by combining this subset of information |
| and the resultant MAC. |
| |
| After sending the INIT ACK with the State Cookie parameter, the |
| sender SHOULD delete the TCB and any other local resource related to |
| the new association, so as to prevent resource attacks. |
| |
| The hashing method used to generate the MAC is strictly a private |
| matter for the receiver of the INIT chunk. The use of a MAC is |
| mandatory to prevent denial-of-service attacks. The secret key |
| SHOULD be random ([RFC4086] provides some information on randomness |
| guidelines); it SHOULD be changed reasonably frequently, and the |
| timestamp in the State Cookie MAY be used to determine which key |
| should be used to verify the MAC. |
| |
| An implementation SHOULD make the cookie as small as possible to |
| ensure interoperability. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 61] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 5.1.4. State Cookie Processing |
| |
| When an endpoint (in the COOKIE-WAIT state) receives an INIT ACK |
| chunk with a State Cookie parameter, it MUST immediately send a |
| COOKIE ECHO chunk to its peer with the received State Cookie. The |
| sender MAY also add any pending DATA chunks to the packet after the |
| COOKIE ECHO chunk. |
| |
| The endpoint shall also start the T1-cookie timer after sending out |
| the COOKIE ECHO chunk. If the timer expires, the endpoint shall |
| retransmit the COOKIE ECHO chunk and restart the T1-cookie timer. |
| This is repeated until either a COOKIE ACK is received or |
| 'Max.Init.Retransmits' (see Section 15) is reached causing the peer |
| endpoint to be marked unreachable (and thus the association enters |
| the CLOSED state). |
| |
| 5.1.5. State Cookie Authentication |
| |
| When an endpoint receives a COOKIE ECHO chunk from another endpoint |
| with which it has no association, it shall take the following |
| actions: |
| |
| 1) Compute a MAC using the TCB data carried in the State Cookie and |
| the secret key (note the timestamp in the State Cookie MAY be |
| used to determine which secret key to use). [RFC2104] can be |
| used as a guideline for generating the MAC, |
| |
| 2) Authenticate the State Cookie as one that it previously generated |
| by comparing the computed MAC against the one carried in the |
| State Cookie. If this comparison fails, the SCTP packet, |
| including the COOKIE ECHO and any DATA chunks, should be silently |
| discarded, |
| |
| 3) Compare the port numbers and the Verification Tag contained |
| within the COOKIE ECHO chunk to the actual port numbers and the |
| Verification Tag within the SCTP common header of the received |
| packet. If these values do not match, the packet MUST be |
| silently discarded. |
| |
| 4) Compare the creation timestamp in the State Cookie to the current |
| local time. If the elapsed time is longer than the lifespan |
| carried in the State Cookie, then the packet, including the |
| COOKIE ECHO and any attached DATA chunks, SHOULD be discarded, |
| and the endpoint MUST transmit an ERROR chunk with a "Stale |
| Cookie" error cause to the peer endpoint. |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 62] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 5) If the State Cookie is valid, create an association to the sender |
| of the COOKIE ECHO chunk with the information in the TCB data |
| carried in the COOKIE ECHO and enter the ESTABLISHED state. |
| |
| 6) Send a COOKIE ACK chunk to the peer acknowledging receipt of the |
| COOKIE ECHO. The COOKIE ACK MAY be bundled with an outbound DATA |
| chunk or SACK chunk; however, the COOKIE ACK MUST be the first |
| chunk in the SCTP packet. |
| |
| 7) Immediately acknowledge any DATA chunk bundled with the COOKIE |
| ECHO with a SACK (subsequent DATA chunk acknowledgement should |
| follow the rules defined in Section 6.2). As mentioned in step |
| 6, if the SACK is bundled with the COOKIE ACK, the COOKIE ACK |
| MUST appear first in the SCTP packet. |
| |
| If a COOKIE ECHO is received from an endpoint with which the receiver |
| of the COOKIE ECHO has an existing association, the procedures in |
| Section 5.2 should be followed. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 63] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 5.1.6. An Example of Normal Association Establishment |
| |
| In the following example, "A" initiates the association and then |
| sends a user message to "Z", then "Z" sends two user messages to "A" |
| later (assuming no bundling or fragmentation occurs): |
| |
| Endpoint A Endpoint Z |
| {app sets association with Z} |
| (build TCB) |
| INIT [I-Tag=Tag_A |
| & other info] ------\ |
| (Start T1-init timer) \ |
| (Enter COOKIE-WAIT state) \---> (compose temp TCB and Cookie_Z) |
| /-- INIT ACK [Veri Tag=Tag_A, |
| / I-Tag=Tag_Z, |
| (Cancel T1-init timer) <------/ Cookie_Z, & other info] |
| (destroy temp TCB) |
| COOKIE ECHO [Cookie_Z] ------\ |
| (Start T1-init timer) \ |
| (Enter COOKIE-ECHOED state) \---> (build TCB enter ESTABLISHED |
| state) |
| /---- COOKIE-ACK |
| / |
| (Cancel T1-init timer, <-----/ |
| Enter ESTABLISHED state) |
| {app sends 1st user data; strm 0} |
| DATA [TSN=initial TSN_A |
| Strm=0,Seq=0 & user data]--\ |
| (Start T3-rtx timer) \ |
| \-> |
| /----- SACK [TSN Ack=init |
| / TSN_A,Block=0] |
| (Cancel T3-rtx timer) <------/ |
| ... |
| {app sends 2 messages;strm 0} |
| /---- DATA |
| / [TSN=init TSN_Z |
| <--/ Strm=0,Seq=0 & user data 1] |
| SACK [TSN Ack=init TSN_Z, /---- DATA |
| Block=0] --------\ / [TSN=init TSN_Z +1, |
| \/ Strm=0,Seq=1 & user data 2] |
| <------/\ |
| \ |
| \------> |
| |
| Figure 4: INITIATION Example |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 64] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| If the T1-init timer expires at "A" after the INIT or COOKIE ECHO |
| chunks are sent, the same INIT or COOKIE ECHO chunk with the same |
| Initiate Tag (i.e., Tag_A) or State Cookie shall be retransmitted and |
| the timer restarted. This shall be repeated Max.Init.Retransmits |
| times before "A" considers "Z" unreachable and reports the failure to |
| its upper layer (and thus the association enters the CLOSED state). |
| |
| When retransmitting the INIT, the endpoint MUST follow the rules |
| defined in Section 6.3 to determine the proper timer value. |
| |
| 5.2. Handle Duplicate or Unexpected INIT, INIT ACK, COOKIE ECHO, and |
| COOKIE ACK |
| |
| During the life time of an association (in one of the possible |
| states), an endpoint may receive from its peer endpoint one of the |
| setup chunks (INIT, INIT ACK, COOKIE ECHO, and COOKIE ACK). The |
| receiver shall treat such a setup chunk as a duplicate and process it |
| as described in this section. |
| |
| Note: An endpoint will not receive the chunk unless the chunk was |
| sent to an SCTP transport address and is from an SCTP transport |
| address associated with this endpoint. Therefore, the endpoint |
| processes such a chunk as part of its current association. |
| |
| The following scenarios can cause duplicated or unexpected chunks: |
| |
| A) The peer has crashed without being detected, restarted itself, and |
| sent out a new INIT chunk trying to restore the association, |
| |
| B) Both sides are trying to initialize the association at about the |
| same time, |
| |
| C) The chunk is from a stale packet that was used to establish the |
| present association or a past association that is no longer in |
| existence, |
| |
| D) The chunk is a false packet generated by an attacker, or |
| |
| E) The peer never received the COOKIE ACK and is retransmitting its |
| COOKIE ECHO. |
| |
| The rules in the following sections shall be applied in order to |
| identify and correctly handle these cases. |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 65] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 5.2.1. INIT Received in COOKIE-WAIT or COOKIE-ECHOED State (Item B) |
| |
| This usually indicates an initialization collision, i.e., each |
| endpoint is attempting, at about the same time, to establish an |
| association with the other endpoint. |
| |
| Upon receipt of an INIT in the COOKIE-WAIT state, an endpoint MUST |
| respond with an INIT ACK using the same parameters it sent in its |
| original INIT chunk (including its Initiate Tag, unchanged). When |
| responding, the endpoint MUST send the INIT ACK back to the same |
| address that the original INIT (sent by this endpoint) was sent. |
| |
| Upon receipt of an INIT in the COOKIE-ECHOED state, an endpoint MUST |
| respond with an INIT ACK using the same parameters it sent in its |
| original INIT chunk (including its Initiate Tag, unchanged), provided |
| that no NEW address has been added to the forming association. If |
| the INIT message indicates that a new address has been added to the |
| association, then the entire INIT MUST be discarded, and NO changes |
| should be made to the existing association. An ABORT SHOULD be sent |
| in response that MAY include the error 'Restart of an association |
| with new addresses'. The error SHOULD list the addresses that were |
| added to the restarting association. |
| |
| When responding in either state (COOKIE-WAIT or COOKIE-ECHOED) with |
| an INIT ACK, the original parameters are combined with those from the |
| newly received INIT chunk. The endpoint shall also generate a State |
| Cookie with the INIT ACK. The endpoint uses the parameters sent in |
| its INIT to calculate the State Cookie. |
| |
| After that, the endpoint MUST NOT change its state, the T1-init timer |
| shall be left running, and the corresponding TCB MUST NOT be |
| destroyed. The normal procedures for handling State Cookies when a |
| TCB exists will resolve the duplicate INITs to a single association. |
| |
| For an endpoint that is in the COOKIE-ECHOED state, it MUST populate |
| its Tie-Tags within both the association TCB and inside the State |
| Cookie (see Section 5.2.2 for a description of the Tie-Tags). |
| |
| 5.2.2. Unexpected INIT in States Other than CLOSED, COOKIE-ECHOED, |
| COOKIE-WAIT, and SHUTDOWN-ACK-SENT |
| |
| Unless otherwise stated, upon receipt of an unexpected INIT for this |
| association, the endpoint shall generate an INIT ACK with a State |
| Cookie. Before responding, the endpoint MUST check to see if the |
| unexpected INIT adds new addresses to the association. If new |
| addresses are added to the association, the endpoint MUST respond |
| with an ABORT, copying the 'Initiate Tag' of the unexpected INIT into |
| the 'Verification Tag' of the outbound packet carrying the ABORT. In |
| |
| |
| |
| Stewart Standards Track [Page 66] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| the ABORT response, the cause of error MAY be set to 'restart of an |
| association with new addresses'. The error SHOULD list the addresses |
| that were added to the restarting association. If no new addresses |
| are added, when responding to the INIT in the outbound INIT ACK, the |
| endpoint MUST copy its current Tie-Tags to a reserved place within |
| the State Cookie and the association's TCB. We shall refer to these |
| locations inside the cookie as the Peer's-Tie-Tag and the Local-Tie- |
| Tag. We will refer to the copy within an association's TCB as the |
| Local Tag and Peer's Tag. The outbound SCTP packet containing this |
| INIT ACK MUST carry a Verification Tag value equal to the Initiate |
| Tag found in the unexpected INIT. And the INIT ACK MUST contain a |
| new Initiate Tag (randomly generated; see Section 5.3.1). Other |
| parameters for the endpoint SHOULD be copied from the existing |
| parameters of the association (e.g., number of outbound streams) into |
| the INIT ACK and cookie. |
| |
| After sending out the INIT ACK or ABORT, the endpoint shall take no |
| further actions; i.e., the existing association, including its |
| current state, and the corresponding TCB MUST NOT be changed. |
| |
| Note: Only when a TCB exists and the association is not in a COOKIE- |
| WAIT or SHUTDOWN-ACK-SENT state are the Tie-Tags populated with a |
| value other than 0. For a normal association INIT (i.e., the |
| endpoint is in the CLOSED state), the Tie-Tags MUST be set to 0 |
| (indicating that no previous TCB existed). |
| |
| 5.2.3. Unexpected INIT ACK |
| |
| If an INIT ACK is received by an endpoint in any state other than the |
| COOKIE-WAIT state, the endpoint should discard the INIT ACK chunk. |
| An unexpected INIT ACK usually indicates the processing of an old or |
| duplicated INIT chunk. |
| |
| 5.2.4. Handle a COOKIE ECHO when a TCB Exists |
| |
| When a COOKIE ECHO chunk is received by an endpoint in any state for |
| an existing association (i.e., not in the CLOSED state) the following |
| rules shall be applied: |
| |
| 1) Compute a MAC as described in step 1 of Section 5.1.5, |
| |
| 2) Authenticate the State Cookie as described in step 2 of Section |
| 5.1.5 (this is case C or D above). |
| |
| 3) Compare the timestamp in the State Cookie to the current time. |
| If the State Cookie is older than the lifespan carried in the |
| State Cookie and the Verification Tags contained in the State |
| Cookie do not match the current association's Verification Tags, |
| |
| |
| |
| Stewart Standards Track [Page 67] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| the packet, including the COOKIE ECHO and any DATA chunks, should |
| be discarded. The endpoint also MUST transmit an ERROR chunk |
| with a "Stale Cookie" error cause to the peer endpoint (this is |
| case C or D in Section 5.2). |
| |
| If both Verification Tags in the State Cookie match the |
| Verification Tags of the current association, consider the State |
| Cookie valid (this is case E in Section 5.2) even if the lifespan |
| is exceeded. |
| |
| 4) If the State Cookie proves to be valid, unpack the TCB into a |
| temporary TCB. |
| |
| 5) Refer to Table 2 to determine the correct action to be taken. |
| |
| +------------+------------+---------------+--------------+-------------+ |
| | Local Tag | Peer's Tag | Local-Tie-Tag |Peer's-Tie-Tag| Action/ | |
| | | | | | Description | |
| +------------+------------+---------------+--------------+-------------+ |
| | X | X | M | M | (A) | |
| +------------+------------+---------------+--------------+-------------+ |
| | M | X | A | A | (B) | |
| +------------+------------+---------------+--------------+-------------+ |
| | M | 0 | A | A | (B) | |
| +------------+------------+---------------+--------------+-------------+ |
| | X | M | 0 | 0 | (C) | |
| +------------+------------+---------------+--------------+-------------+ |
| | M | M | A | A | (D) | |
| +======================================================================+ |
| | Table 2: Handling of a COOKIE ECHO when a TCB Exists | |
| +======================================================================+ |
| |
| Legend: |
| |
| X - Tag does not match the existing TCB. |
| M - Tag matches the existing TCB. |
| 0 - No Tie-Tag in cookie (unknown). |
| A - All cases, i.e., M, X, or 0. |
| |
| Note: For any case not shown in Table 2, the cookie should be |
| silently discarded. |
| |
| Action |
| |
| A) In this case, the peer may have restarted. When the endpoint |
| recognizes this potential 'restart', the existing session is |
| treated the same as if it received an ABORT followed by a new |
| COOKIE ECHO with the following exceptions: |
| |
| |
| |
| Stewart Standards Track [Page 68] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| - Any SCTP DATA chunks MAY be retained (this is an |
| implementation-specific option). |
| |
| - A notification of RESTART SHOULD be sent to the ULP instead of |
| a "COMMUNICATION LOST" notification. |
| |
| All the congestion control parameters (e.g., cwnd, ssthresh) |
| related to this peer MUST be reset to their initial values (see |
| Section 6.2.1). |
| |
| After this, the endpoint shall enter the ESTABLISHED state. |
| |
| If the endpoint is in the SHUTDOWN-ACK-SENT state and recognizes |
| that the peer has restarted (Action A), it MUST NOT set up a new |
| association but instead resend the SHUTDOWN ACK and send an ERROR |
| chunk with a "Cookie Received While Shutting Down" error cause to |
| its peer. |
| |
| B) In this case, both sides may be attempting to start an association |
| at about the same time, but the peer endpoint started its INIT |
| after responding to the local endpoint's INIT. Thus, it may have |
| picked a new Verification Tag, not being aware of the previous tag |
| it had sent this endpoint. The endpoint should stay in or enter |
| the ESTABLISHED state, but it MUST update its peer's Verification |
| Tag from the State Cookie, stop any init or cookie timers that may |
| be running, and send a COOKIE ACK. |
| |
| C) In this case, the local endpoint's cookie has arrived late. |
| Before it arrived, the local endpoint sent an INIT and received an |
| INIT ACK and finally sent a COOKIE ECHO with the peer's same tag |
| but a new tag of its own. The cookie should be silently |
| discarded. The endpoint SHOULD NOT change states and should leave |
| any timers running. |
| |
| D) When both local and remote tags match, the endpoint should enter |
| the ESTABLISHED state, if it is in the COOKIE-ECHOED state. It |
| should stop any cookie timer that may be running and send a COOKIE |
| ACK. |
| |
| Note: The "peer's Verification Tag" is the tag received in the |
| Initiate Tag field of the INIT or INIT ACK chunk. |
| |
| 5.2.4.1. An Example of a Association Restart |
| |
| In the following example, "A" initiates the association after a |
| restart has occurred. Endpoint "Z" had no knowledge of the restart |
| until the exchange (i.e., Heartbeats had not yet detected the failure |
| of "A") (assuming no bundling or fragmentation occurs): |
| |
| |
| |
| Stewart Standards Track [Page 69] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Endpoint A Endpoint Z |
| <-------------- Association is established----------------------> |
| Tag=Tag_A Tag=Tag_Z |
| <---------------------------------------------------------------> |
| {A crashes and restarts} |
| {app sets up a association with Z} |
| (build TCB) |
| INIT [I-Tag=Tag_A' |
| & other info] --------\ |
| (Start T1-init timer) \ |
| (Enter COOKIE-WAIT state) \---> (find an existing TCB |
| compose temp TCB and Cookie_Z |
| with Tie-Tags to previous |
| association) |
| /--- INIT ACK [Veri Tag=Tag_A', |
| / I-Tag=Tag_Z', |
| (Cancel T1-init timer) <------/ Cookie_Z[TieTags= |
| Tag_A,Tag_Z |
| & other info] |
| (destroy temp TCB,leave original |
| in place) |
| COOKIE ECHO [Veri=Tag_Z', |
| Cookie_Z |
| Tie=Tag_A, |
| Tag_Z]----------\ |
| (Start T1-init timer) \ |
| (Enter COOKIE-ECHOED state) \---> (Find existing association, |
| Tie-Tags match old tags, |
| Tags do not match, i.e., |
| case X X M M above, |
| Announce Restart to ULP |
| and reset association). |
| /---- COOKIE ACK |
| (Cancel T1-init timer, <------/ |
| Enter ESTABLISHED state) |
| {app sends 1st user data; strm 0} |
| DATA [TSN=initial TSN_A |
| Strm=0,Seq=0 & user data]--\ |
| (Start T3-rtx timer) \ |
| \-> |
| /--- SACK [TSN Ack=init TSN_A,Block=0] |
| (Cancel T3-rtx timer) <------/ |
| |
| Figure 5: A Restart Example |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 70] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 5.2.5. Handle Duplicate COOKIE-ACK. |
| |
| At any state other than COOKIE-ECHOED, an endpoint should silently |
| discard a received COOKIE ACK chunk. |
| |
| 5.2.6. Handle Stale COOKIE Error |
| |
| Receipt of an ERROR chunk with a "Stale Cookie" error cause indicates |
| one of a number of possible events: |
| |
| A) The association failed to completely setup before the State Cookie |
| issued by the sender was processed. |
| |
| B) An old State Cookie was processed after setup completed. |
| |
| C) An old State Cookie is received from someone that the receiver is |
| not interested in having an association with and the ABORT chunk |
| was lost. |
| |
| When processing an ERROR chunk with a "Stale Cookie" error cause an |
| endpoint should first examine if an association is in the process of |
| being set up, i.e., the association is in the COOKIE-ECHOED state. |
| In all cases, if the association is not in the COOKIE-ECHOED state, |
| the ERROR chunk should be silently discarded. |
| |
| If the association is in the COOKIE-ECHOED state, the endpoint may |
| elect one of the following three alternatives. |
| |
| 1) Send a new INIT chunk to the endpoint to generate a new State |
| Cookie and reattempt the setup procedure. |
| |
| 2) Discard the TCB and report to the upper layer the inability to |
| set up the association. |
| |
| 3) Send a new INIT chunk to the endpoint, adding a Cookie |
| Preservative parameter requesting an extension to the life time |
| of the State Cookie. When calculating the time extension, an |
| implementation SHOULD use the RTT information measured based on |
| the previous COOKIE ECHO / ERROR exchange, and should add no more |
| than 1 second beyond the measured RTT, due to long State Cookie |
| life times making the endpoint more subject to a replay attack. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 71] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 5.3. Other Initialization Issues |
| |
| 5.3.1. Selection of Tag Value |
| |
| Initiate Tag values should be selected from the range of 1 to 2**32 - |
| 1. It is very important that the Initiate Tag value be randomized to |
| help protect against "man in the middle" and "sequence number" |
| attacks. The methods described in [RFC4086] can be used for the |
| Initiate Tag randomization. Careful selection of Initiate Tags is |
| also necessary to prevent old duplicate packets from previous |
| associations being mistakenly processed as belonging to the current |
| association. |
| |
| Moreover, the Verification Tag value used by either endpoint in a |
| given association MUST NOT change during the life time of an |
| association. A new Verification Tag value MUST be used each time the |
| endpoint tears down and then reestablishes an association to the same |
| peer. |
| |
| 5.4. Path Verification |
| |
| During association establishment, the two peers exchange a list of |
| addresses. In the predominant case, these lists accurately represent |
| the addresses owned by each peer. However, it is possible that a |
| misbehaving peer may supply addresses that it does not own. To |
| prevent this, the following rules are applied to all addresses of the |
| new association: |
| |
| 1) Any address passed to the sender of the INIT by its upper layer |
| is automatically considered to be CONFIRMED. |
| |
| 2) For the receiver of the COOKIE ECHO, the only CONFIRMED address |
| is the one to which the INIT-ACK was sent. |
| |
| 3) All other addresses not covered by rules 1 and 2 are considered |
| UNCONFIRMED and are subject to probing for verification. |
| |
| To probe an address for verification, an endpoint will send |
| HEARTBEATs including a 64-bit random nonce and a path indicator (to |
| identify the address that the HEARTBEAT is sent to) within the |
| HEARTBEAT parameter. |
| |
| Upon receipt of the HEARTBEAT ACK, a verification is made that the |
| nonce included in the HEARTBEAT parameter is the one sent to the |
| address indicated inside the HEARTBEAT parameter. When this match |
| occurs, the address that the original HEARTBEAT was sent to is now |
| considered CONFIRMED and available for normal data transfer. |
| |
| |
| |
| |
| Stewart Standards Track [Page 72] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| These probing procedures are started when an association moves to the |
| ESTABLISHED state and are ended when all paths are confirmed. |
| |
| In each RTO, a probe may be sent on an active UNCONFIRMED path in an |
| attempt to move it to the CONFIRMED state. If during this probing |
| the path becomes inactive, this rate is lowered to the normal |
| HEARTBEAT rate. At the expiration of the RTO timer, the error |
| counter of any path that was probed but not CONFIRMED is incremented |
| by one and subjected to path failure detection, as defined in Section |
| 8.2. When probing UNCONFIRMED addresses, however, the association |
| overall error count is NOT incremented. |
| |
| The number of HEARTBEATS sent at each RTO SHOULD be limited by the |
| HB.Max.Burst parameter. It is an implementation decision as to how |
| to distribute HEARTBEATS to the peer's addresses for path |
| verification. |
| |
| Whenever a path is confirmed, an indication MAY be given to the upper |
| layer. |
| |
| An endpoint MUST NOT send any chunks to an UNCONFIRMED address, with |
| the following exceptions: |
| |
| - A HEARTBEAT including a nonce MAY be sent to an UNCONFIRMED |
| address. |
| |
| - A HEARTBEAT ACK MAY be sent to an UNCONFIRMED address. |
| |
| - A COOKIE ACK MAY be sent to an UNCONFIRMED address, but it MUST be |
| bundled with a HEARTBEAT including a nonce. An implementation |
| that does NOT support bundling MUST NOT send a COOKIE ACK to an |
| UNCONFIRMED address. |
| |
| - A COOKIE ECHO MAY be sent to an UNCONFIRMED address, but it MUST |
| be bundled with a HEARTBEAT including a nonce, and the packet MUST |
| NOT exceed the path MTU. If the implementation does NOT support |
| bundling or if the bundled COOKIE ECHO plus HEARTBEAT (including |
| nonce) would exceed the path MTU, then the implementation MUST NOT |
| send a COOKIE ECHO to an UNCONFIRMED address. |
| |
| 6. User Data Transfer |
| |
| Data transmission MUST only happen in the ESTABLISHED, SHUTDOWN- |
| PENDING, and SHUTDOWN-RECEIVED states. The only exception to this is |
| that DATA chunks are allowed to be bundled with an outbound COOKIE |
| ECHO chunk when in the COOKIE-WAIT state. |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 73] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| DATA chunks MUST only be received according to the rules below in |
| ESTABLISHED, SHUTDOWN-PENDING, and SHUTDOWN-SENT. A DATA chunk |
| received in CLOSED is out of the blue and SHOULD be handled per |
| Section 8.4. A DATA chunk received in any other state SHOULD be |
| discarded. |
| |
| A SACK MUST be processed in ESTABLISHED, SHUTDOWN-PENDING, and |
| SHUTDOWN-RECEIVED. An incoming SACK MAY be processed in COOKIE- |
| ECHOED. A SACK in the CLOSED state is out of the blue and SHOULD be |
| processed according to the rules in Section 8.4. A SACK chunk |
| received in any other state SHOULD be discarded. |
| |
| An SCTP receiver MUST be able to receive a minimum of 1500 bytes in |
| one SCTP packet. This means that an SCTP endpoint MUST NOT indicate |
| less than 1500 bytes in its initial a_rwnd sent in the INIT or INIT |
| ACK. |
| |
| For transmission efficiency, SCTP defines mechanisms for bundling of |
| small user messages and fragmentation of large user messages. The |
| following diagram depicts the flow of user messages through SCTP. |
| |
| In this section, the term "data sender" refers to the endpoint that |
| transmits a DATA chunk and the term "data receiver" refers to the |
| endpoint that receives a DATA chunk. A data receiver will transmit |
| SACK chunks. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 74] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| +--------------------------+ |
| | User Messages | |
| +--------------------------+ |
| SCTP user ^ | |
| ==================|==|======================================= |
| | v (1) |
| +------------------+ +--------------------+ |
| | SCTP DATA Chunks | |SCTP Control Chunks | |
| +------------------+ +--------------------+ |
| ^ | ^ | |
| | v (2) | v (2) |
| +--------------------------+ |
| | SCTP packets | |
| +--------------------------+ |
| SCTP ^ | |
| ===========================|==|=========================== |
| | v |
| Connectionless Packet Transfer Service (e.g., IP) |
| |
| Notes: |
| |
| 1) When converting user messages into DATA chunks, an endpoint |
| will fragment user messages larger than the current association |
| path MTU into multiple DATA chunks. The data receiver will |
| normally reassemble the fragmented message from DATA chunks |
| before delivery to the user (see Section 6.9 for details). |
| |
| 2) Multiple DATA and control chunks may be bundled by the sender |
| into a single SCTP packet for transmission, as long as the |
| final size of the packet does not exceed the current path MTU. |
| The receiver will unbundle the packet back into the original |
| chunks. Control chunks MUST come before DATA chunks in the |
| packet. |
| |
| Figure 6: Illustration of User Data Transfer |
| |
| The fragmentation and bundling mechanisms, as detailed in Section 6.9 |
| and Section 6.10, are OPTIONAL to implement by the data sender, but |
| they MUST be implemented by the data receiver, i.e., an endpoint MUST |
| properly receive and process bundled or fragmented data. |
| |
| 6.1. Transmission of DATA Chunks |
| |
| This document is specified as if there is a single retransmission |
| timer per destination transport address, but implementations MAY have |
| a retransmission timer for each DATA chunk. |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 75] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| The following general rules MUST be applied by the data sender for |
| transmission and/or retransmission of outbound DATA chunks: |
| |
| A) At any given time, the data sender MUST NOT transmit new data to |
| any destination transport address if its peer's rwnd indicates |
| that the peer has no buffer space (i.e., rwnd is 0; see Section |
| 6.2.1). However, regardless of the value of rwnd (including if it |
| is 0), the data sender can always have one DATA chunk in flight to |
| the receiver if allowed by cwnd (see rule B, below). This rule |
| allows the sender to probe for a change in rwnd that the sender |
| missed due to the SACK's having been lost in transit from the data |
| receiver to the data sender. |
| |
| When the receiver's advertised window is zero, this probe is |
| called a zero window probe. Note that a zero window probe SHOULD |
| only be sent when all outstanding DATA chunks have been |
| cumulatively acknowledged and no DATA chunks are in flight. Zero |
| window probing MUST be supported. |
| |
| If the sender continues to receive new packets from the receiver |
| while doing zero window probing, the unacknowledged window probes |
| should not increment the error counter for the association or any |
| destination transport address. This is because the receiver MAY |
| keep its window closed for an indefinite time. Refer to Section |
| 6.2 on the receiver behavior when it advertises a zero window. |
| The sender SHOULD send the first zero window probe after 1 RTO |
| when it detects that the receiver has closed its window and SHOULD |
| increase the probe interval exponentially afterwards. Also note |
| that the cwnd SHOULD be adjusted according to Section 7.2.1. Zero |
| window probing does not affect the calculation of cwnd. |
| |
| The sender MUST also have an algorithm for sending new DATA chunks |
| to avoid silly window syndrome (SWS) as described in [RFC0813]. |
| The algorithm can be similar to the one described in Section |
| 4.2.3.4 of [RFC1122]. |
| |
| However, regardless of the value of rwnd (including if it is 0), |
| the data sender can always have one DATA chunk in flight to the |
| receiver if allowed by cwnd (see rule B below). This rule allows |
| the sender to probe for a change in rwnd that the sender missed |
| due to the SACK having been lost in transit from the data receiver |
| to the data sender. |
| |
| B) At any given time, the sender MUST NOT transmit new data to a |
| given transport address if it has cwnd or more bytes of data |
| outstanding to that transport address. |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 76] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| C) When the time comes for the sender to transmit, before sending new |
| DATA chunks, the sender MUST first transmit any outstanding DATA |
| chunks that are marked for retransmission (limited by the current |
| cwnd). |
| |
| D) When the time comes for the sender to transmit new DATA chunks, |
| the protocol parameter Max.Burst SHOULD be used to limit the |
| number of packets sent. The limit MAY be applied by adjusting |
| cwnd as follows: |
| |
| if((flightsize + Max.Burst*MTU) < cwnd) cwnd = flightsize + |
| Max.Burst*MTU |
| |
| Or it MAY be applied by strictly limiting the number of packets |
| emitted by the output routine. |
| |
| E) Then, the sender can send out as many new DATA chunks as rule A |
| and rule B allow. |
| |
| Multiple DATA chunks committed for transmission MAY be bundled in a |
| single packet. Furthermore, DATA chunks being retransmitted MAY be |
| bundled with new DATA chunks, as long as the resulting packet size |
| does not exceed the path MTU. A ULP may request that no bundling is |
| performed, but this should only turn off any delays that an SCTP |
| implementation may be using to increase bundling efficiency. It does |
| not in itself stop all bundling from occurring (i.e., in case of |
| congestion or retransmission). |
| |
| Before an endpoint transmits a DATA chunk, if any received DATA |
| chunks have not been acknowledged (e.g., due to delayed ack), the |
| sender should create a SACK and bundle it with the outbound DATA |
| chunk, as long as the size of the final SCTP packet does not exceed |
| the current MTU. See Section 6.2. |
| |
| IMPLEMENTATION NOTE: When the window is full (i.e., transmission is |
| disallowed by rule A and/or rule B), the sender MAY still accept send |
| requests from its upper layer, but MUST transmit no more DATA chunks |
| until some or all of the outstanding DATA chunks are acknowledged and |
| transmission is allowed by rule A and rule B again. |
| |
| Whenever a transmission or retransmission is made to any address, if |
| the T3-rtx timer of that address is not currently running, the sender |
| MUST start that timer. If the timer for that address is already |
| running, the sender MUST restart the timer if the earliest (i.e., |
| lowest TSN) outstanding DATA chunk sent to that address is being |
| retransmitted. Otherwise, the data sender MUST NOT restart the |
| timer. |
| |
| |
| |
| |
| Stewart Standards Track [Page 77] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| When starting or restarting the T3-rtx timer, the timer value must be |
| adjusted according to the timer rules defined in Sections 6.3.2 and |
| 6.3.3. |
| |
| Note: The data sender SHOULD NOT use a TSN that is more than 2**31 - |
| 1 above the beginning TSN of the current send window. |
| |
| 6.2. Acknowledgement on Reception of DATA Chunks |
| |
| The SCTP endpoint MUST always acknowledge the reception of each valid |
| DATA chunk when the DATA chunk received is inside its receive window. |
| |
| When the receiver's advertised window is 0, the receiver MUST drop |
| any new incoming DATA chunk with a TSN larger than the largest TSN |
| received so far. If the new incoming DATA chunk holds a TSN value |
| less than the largest TSN received so far, then the receiver SHOULD |
| drop the largest TSN held for reordering and accept the new incoming |
| DATA chunk. In either case, if such a DATA chunk is dropped, the |
| receiver MUST immediately send back a SACK with the current receive |
| window showing only DATA chunks received and accepted so far. The |
| dropped DATA chunk(s) MUST NOT be included in the SACK, as they were |
| not accepted. The receiver MUST also have an algorithm for |
| advertising its receive window to avoid receiver silly window |
| syndrome (SWS), as described in [RFC0813]. The algorithm can be |
| similar to the one described in Section 4.2.3.3 of [RFC1122]. |
| |
| The guidelines on delayed acknowledgement algorithm specified in |
| Section 4.2 of [RFC2581] SHOULD be followed. Specifically, an |
| acknowledgement SHOULD be generated for at least every second packet |
| (not every second DATA chunk) received, and SHOULD be generated |
| within 200 ms of the arrival of any unacknowledged DATA chunk. In |
| some situations, it may be beneficial for an SCTP transmitter to be |
| more conservative than the algorithms detailed in this document |
| allow. However, an SCTP transmitter MUST NOT be more aggressive than |
| the following algorithms allow. |
| |
| An SCTP receiver MUST NOT generate more than one SACK for every |
| incoming packet, other than to update the offered window as the |
| receiving application consumes new data. |
| |
| IMPLEMENTATION NOTE: The maximum delay for generating an |
| acknowledgement may be configured by the SCTP administrator, either |
| statically or dynamically, in order to meet the specific timing |
| requirement of the protocol being carried. |
| |
| An implementation MUST NOT allow the maximum delay to be configured |
| to be more than 500 ms. In other words, an implementation MAY lower |
| this value below 500 ms but MUST NOT raise it above 500 ms. |
| |
| |
| |
| Stewart Standards Track [Page 78] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Acknowledgements MUST be sent in SACK chunks unless shutdown was |
| requested by the ULP, in which case an endpoint MAY send an |
| acknowledgement in the SHUTDOWN chunk. A SACK chunk can acknowledge |
| the reception of multiple DATA chunks. See Section 3.3.4 for SACK |
| chunk format. In particular, the SCTP endpoint MUST fill in the |
| Cumulative TSN Ack field to indicate the latest sequential TSN (of a |
| valid DATA chunk) it has received. Any received DATA chunks with TSN |
| greater than the value in the Cumulative TSN Ack field are reported |
| in the Gap Ack Block fields. The SCTP endpoint MUST report as many |
| Gap Ack Blocks as can fit in a single SACK chunk limited by the |
| current path MTU. |
| |
| Note: The SHUTDOWN chunk does not contain Gap Ack Block fields. |
| Therefore, the endpoint should use a SACK instead of the SHUTDOWN |
| chunk to acknowledge DATA chunks received out of order. |
| |
| When a packet arrives with duplicate DATA chunk(s) and with no new |
| DATA chunk(s), the endpoint MUST immediately send a SACK with no |
| delay. If a packet arrives with duplicate DATA chunk(s) bundled with |
| new DATA chunks, the endpoint MAY immediately send a SACK. Normally, |
| receipt of duplicate DATA chunks will occur when the original SACK |
| chunk was lost and the peer's RTO has expired. The duplicate TSN |
| number(s) SHOULD be reported in the SACK as duplicate. |
| |
| When an endpoint receives a SACK, it MAY use the duplicate TSN |
| information to determine if SACK loss is occurring. Further use of |
| this data is for future study. |
| |
| The data receiver is responsible for maintaining its receive buffers. |
| The data receiver SHOULD notify the data sender in a timely manner of |
| changes in its ability to receive data. How an implementation |
| manages its receive buffers is dependent on many factors (e.g., |
| operating system, memory management system, amount of memory, etc.). |
| However, the data sender strategy defined in Section 6.2.1 is based |
| on the assumption of receiver operation similar to the following: |
| |
| A) At initialization of the association, the endpoint tells the peer |
| how much receive buffer space it has allocated to the association |
| in the INIT or INIT ACK. The endpoint sets a_rwnd to this value. |
| |
| B) As DATA chunks are received and buffered, decrement a_rwnd by the |
| number of bytes received and buffered. This is, in effect, |
| closing rwnd at the data sender and restricting the amount of data |
| it can transmit. |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 79] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| C) As DATA chunks are delivered to the ULP and released from the |
| receive buffers, increment a_rwnd by the number of bytes delivered |
| to the upper layer. This is, in effect, opening up rwnd on the |
| data sender and allowing it to send more data. The data receiver |
| SHOULD NOT increment a_rwnd unless it has released bytes from its |
| receive buffer. For example, if the receiver is holding |
| fragmented DATA chunks in a reassembly queue, it should not |
| increment a_rwnd. |
| |
| D) When sending a SACK, the data receiver SHOULD place the current |
| value of a_rwnd into the a_rwnd field. The data receiver SHOULD |
| take into account that the data sender will not retransmit DATA |
| chunks that are acked via the Cumulative TSN Ack (i.e., will drop |
| from its retransmit queue). |
| |
| Under certain circumstances, the data receiver may need to drop DATA |
| chunks that it has received but hasn't released from its receive |
| buffers (i.e., delivered to the ULP). These DATA chunks may have |
| been acked in Gap Ack Blocks. For example, the data receiver may be |
| holding data in its receive buffers while reassembling a fragmented |
| user message from its peer when it runs out of receive buffer space. |
| It may drop these DATA chunks even though it has acknowledged them in |
| Gap Ack Blocks. If a data receiver drops DATA chunks, it MUST NOT |
| include them in Gap Ack Blocks in subsequent SACKs until they are |
| received again via retransmission. In addition, the endpoint should |
| take into account the dropped data when calculating its a_rwnd. |
| |
| An endpoint SHOULD NOT revoke a SACK and discard data. Only in |
| extreme circumstances should an endpoint use this procedure (such as |
| out of buffer space). The data receiver should take into account |
| that dropping data that has been acked in Gap Ack Blocks can result |
| in suboptimal retransmission strategies in the data sender and thus |
| in suboptimal performance. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 80] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| The following example illustrates the use of delayed |
| acknowledgements: |
| |
| Endpoint A Endpoint Z |
| |
| {App sends 3 messages; strm 0} |
| DATA [TSN=7,Strm=0,Seq=3] ------------> (ack delayed) |
| (Start T3-rtx timer) |
| |
| DATA [TSN=8,Strm=0,Seq=4] ------------> (send ack) |
| /------- SACK [TSN Ack=8,block=0] |
| (cancel T3-rtx timer) <-----/ |
| |
| DATA [TSN=9,Strm=0,Seq=5] ------------> (ack delayed) |
| (Start T3-rtx timer) |
| ... |
| {App sends 1 message; strm 1} |
| (bundle SACK with DATA) |
| /----- SACK [TSN Ack=9,block=0] \ |
| / DATA [TSN=6,Strm=1,Seq=2] |
| (cancel T3-rtx timer) <------/ (Start T3-rtx timer) |
| |
| (ack delayed) |
| (send ack) |
| SACK [TSN Ack=6,block=0] -------------> (cancel T3-rtx timer) |
| |
| Figure 7: Delayed Acknowledgement Example |
| |
| If an endpoint receives a DATA chunk with no user data (i.e., the |
| Length field is set to 16), it MUST send an ABORT with error cause |
| set to "No User Data". |
| |
| An endpoint SHOULD NOT send a DATA chunk with no user data part. |
| |
| 6.2.1. Processing a Received SACK |
| |
| Each SACK an endpoint receives contains an a_rwnd value. This value |
| represents the amount of buffer space the data receiver, at the time |
| of transmitting the SACK, has left of its total receive buffer space |
| (as specified in the INIT/INIT ACK). Using a_rwnd, Cumulative TSN |
| Ack, and Gap Ack Blocks, the data sender can develop a representation |
| of the peer's receive buffer space. |
| |
| One of the problems the data sender must take into account when |
| processing a SACK is that a SACK can be received out of order. That |
| is, a SACK sent by the data receiver can pass an earlier SACK and be |
| received first by the data sender. If a SACK is received out of |
| |
| |
| |
| |
| Stewart Standards Track [Page 81] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| order, the data sender can develop an incorrect view of the peer's |
| receive buffer space. |
| |
| Since there is no explicit identifier that can be used to detect |
| out-of-order SACKs, the data sender must use heuristics to determine |
| if a SACK is new. |
| |
| An endpoint SHOULD use the following rules to calculate the rwnd, |
| using the a_rwnd value, the Cumulative TSN Ack, and Gap Ack Blocks in |
| a received SACK. |
| |
| A) At the establishment of the association, the endpoint initializes |
| the rwnd to the Advertised Receiver Window Credit (a_rwnd) the |
| peer specified in the INIT or INIT ACK. |
| |
| B) Any time a DATA chunk is transmitted (or retransmitted) to a peer, |
| the endpoint subtracts the data size of the chunk from the rwnd of |
| that peer. |
| |
| C) Any time a DATA chunk is marked for retransmission, either via |
| T3-rtx timer expiration (Section 6.3.3) or via Fast Retransmit |
| (Section 7.2.4), add the data size of those chunks to the rwnd. |
| |
| Note: If the implementation is maintaining a timer on each DATA |
| chunk, then only DATA chunks whose timer expired would be marked |
| for retransmission. |
| |
| D) Any time a SACK arrives, the endpoint performs the following: |
| |
| i) If Cumulative TSN Ack is less than the Cumulative TSN Ack |
| Point, then drop the SACK. Since Cumulative TSN Ack is |
| monotonically increasing, a SACK whose Cumulative TSN Ack is |
| less than the Cumulative TSN Ack Point indicates an out-of- |
| order SACK. |
| |
| ii) Set rwnd equal to the newly received a_rwnd minus the number |
| of bytes still outstanding after processing the Cumulative |
| TSN Ack and the Gap Ack Blocks. |
| |
| iii) If the SACK is missing a TSN that was previously acknowledged |
| via a Gap Ack Block (e.g., the data receiver reneged on the |
| data), then consider the corresponding DATA that might be |
| possibly missing: Count one miss indication towards Fast |
| Retransmit as described in Section 7.2.4, and if no |
| retransmit timer is running for the destination address to |
| which the DATA chunk was originally transmitted, then T3-rtx |
| is started for that destination address. |
| |
| |
| |
| |
| Stewart Standards Track [Page 82] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| iv) If the Cumulative TSN Ack matches or exceeds the Fast |
| Recovery exitpoint (Section 7.2.4), Fast Recovery is exited. |
| |
| 6.3. Management of Retransmission Timer |
| |
| An SCTP endpoint uses a retransmission timer T3-rtx to ensure data |
| delivery in the absence of any feedback from its peer. The duration |
| of this timer is referred to as RTO (retransmission timeout). |
| |
| When an endpoint's peer is multi-homed, the endpoint will calculate a |
| separate RTO for each different destination transport address of its |
| peer endpoint. |
| |
| The computation and management of RTO in SCTP follow closely how TCP |
| manages its retransmission timer. To compute the current RTO, an |
| endpoint maintains two state variables per destination transport |
| address: SRTT (smoothed round-trip time) and RTTVAR (round-trip time |
| variation). |
| |
| 6.3.1. RTO Calculation |
| |
| The rules governing the computation of SRTT, RTTVAR, and RTO are as |
| follows: |
| |
| C1) Until an RTT measurement has been made for a packet sent to the |
| given destination transport address, set RTO to the protocol |
| parameter 'RTO.Initial'. |
| |
| C2) When the first RTT measurement R is made, set |
| |
| SRTT <- R, |
| |
| RTTVAR <- R/2, and |
| |
| RTO <- SRTT + 4 * RTTVAR. |
| |
| C3) When a new RTT measurement R' is made, set |
| |
| RTTVAR <- (1 - RTO.Beta) * RTTVAR + RTO.Beta * |SRTT - R'| |
| |
| and |
| |
| SRTT <- (1 - RTO.Alpha) * SRTT + RTO.Alpha * R' |
| |
| Note: The value of SRTT used in the update to RTTVAR is its |
| value before updating SRTT itself using the second assignment. |
| |
| After the computation, update RTO <- SRTT + 4 * RTTVAR. |
| |
| |
| |
| Stewart Standards Track [Page 83] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| C4) When data is in flight and when allowed by rule C5 below, a new |
| RTT measurement MUST be made each round trip. Furthermore, new |
| RTT measurements SHOULD be made no more than once per round trip |
| for a given destination transport address. There are two |
| reasons for this recommendation: First, it appears that |
| measuring more frequently often does not in practice yield any |
| significant benefit [ALLMAN99]; second, if measurements are made |
| more often, then the values of RTO.Alpha and RTO.Beta in rule C3 |
| above should be adjusted so that SRTT and RTTVAR still adjust to |
| changes at roughly the same rate (in terms of how many round |
| trips it takes them to reflect new values) as they would if |
| making only one measurement per round-trip and using RTO.Alpha |
| and RTO.Beta as given in rule C3. However, the exact nature of |
| these adjustments remains a research issue. |
| |
| C5) Karn's algorithm: RTT measurements MUST NOT be made using |
| packets that were retransmitted (and thus for which it is |
| ambiguous whether the reply was for the first instance of the |
| chunk or for a later instance) |
| |
| IMPLEMENTATION NOTE: RTT measurements should only be made using |
| a chunk with TSN r if no chunk with TSN less than or equal to r |
| is retransmitted since r is first sent. |
| |
| C6) Whenever RTO is computed, if it is less than RTO.Min seconds |
| then it is rounded up to RTO.Min seconds. The reason for this |
| rule is that RTOs that do not have a high minimum value are |
| susceptible to unnecessary timeouts [ALLMAN99]. |
| |
| C7) A maximum value may be placed on RTO provided it is at least |
| RTO.max seconds. |
| |
| There is no requirement for the clock granularity G used for |
| computing RTT measurements and the different state variables, other |
| than: |
| |
| G1) Whenever RTTVAR is computed, if RTTVAR = 0, then adjust RTTVAR <- |
| G. |
| |
| Experience [ALLMAN99] has shown that finer clock granularities (<= |
| 100 msec) perform somewhat better than more coarse granularities. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 84] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 6.3.2. Retransmission Timer Rules |
| |
| The rules for managing the retransmission timer are as follows: |
| |
| R1) Every time a DATA chunk is sent to any address (including a |
| retransmission), if the T3-rtx timer of that address is not |
| running, start it running so that it will expire after the RTO |
| of that address. The RTO used here is that obtained after any |
| doubling due to previous T3-rtx timer expirations on the |
| corresponding destination address as discussed in rule E2 below. |
| |
| R2) Whenever all outstanding data sent to an address have been |
| acknowledged, turn off the T3-rtx timer of that address. |
| |
| R3) Whenever a SACK is received that acknowledges the DATA chunk |
| with the earliest outstanding TSN for that address, restart the |
| T3-rtx timer for that address with its current RTO (if there is |
| still outstanding data on that address). |
| |
| R4) Whenever a SACK is received missing a TSN that was previously |
| acknowledged via a Gap Ack Block, start the T3-rtx for the |
| destination address to which the DATA chunk was originally |
| transmitted if it is not already running. |
| |
| The following example shows the use of various timer rules (assuming |
| that the receiver uses delayed acks). |
| |
| Endpoint A Endpoint Z |
| {App begins to send} |
| Data [TSN=7,Strm=0,Seq=3] ------------> (ack delayed) |
| (Start T3-rtx timer) |
| {App sends 1 message; strm 1} |
| (bundle ack with data) |
| DATA [TSN=8,Strm=0,Seq=4] ----\ /-- SACK [TSN Ack=7,Block=0] |
| \ / DATA [TSN=6,Strm=1,Seq=2] |
| \ / (Start T3-rtx timer) |
| \ |
| / \ |
| (Restart T3-rtx timer) <------/ \--> (ack delayed) |
| (ack delayed) |
| {send ack} |
| SACK [TSN Ack=6,Block=0] --------------> (Cancel T3-rtx timer) |
| .. |
| (send ack) |
| (Cancel T3-rtx timer) <-------------- SACK [TSN Ack=8,Block=0] |
| |
| Figure 8: Timer Rule Examples |
| |
| |
| |
| |
| Stewart Standards Track [Page 85] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 6.3.3. Handle T3-rtx Expiration |
| |
| Whenever the retransmission timer T3-rtx expires for a destination |
| address, do the following: |
| |
| E1) For the destination address for which the timer expires, adjust |
| its ssthresh with rules defined in Section 7.2.3 and set the |
| cwnd <- MTU. |
| |
| E2) For the destination address for which the timer expires, set RTO |
| <- RTO * 2 ("back off the timer"). The maximum value discussed |
| in rule C7 above (RTO.max) may be used to provide an upper bound |
| to this doubling operation. |
| |
| E3) Determine how many of the earliest (i.e., lowest TSN) |
| outstanding DATA chunks for the address for which the T3-rtx has |
| expired will fit into a single packet, subject to the MTU |
| constraint for the path corresponding to the destination |
| transport address to which the retransmission is being sent |
| (this may be different from the address for which the timer |
| expires; see Section 6.4). Call this value K. Bundle and |
| retransmit those K DATA chunks in a single packet to the |
| destination endpoint. |
| |
| E4) Start the retransmission timer T3-rtx on the destination address |
| to which the retransmission is sent, if rule R1 above indicates |
| to do so. The RTO to be used for starting T3-rtx should be the |
| one for the destination address to which the retransmission is |
| sent, which, when the receiver is multi-homed, may be different |
| from the destination address for which the timer expired (see |
| Section 6.4 below). |
| |
| After retransmitting, once a new RTT measurement is obtained (which |
| can happen only when new data has been sent and acknowledged, per |
| rule C5, or for a measurement made from a HEARTBEAT; see Section |
| 8.3), the computation in rule C3 is performed, including the |
| computation of RTO, which may result in "collapsing" RTO back down |
| after it has been subject to doubling (rule E2). |
| |
| Note: Any DATA chunks that were sent to the address for which the |
| T3-rtx timer expired but did not fit in one MTU (rule E3 above) |
| should be marked for retransmission and sent as soon as cwnd allows |
| (normally, when a SACK arrives). |
| |
| The final rule for managing the retransmission timer concerns |
| failover (see Section 6.4.1): |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 86] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| F1) Whenever an endpoint switches from the current destination |
| transport address to a different one, the current retransmission |
| timers are left running. As soon as the endpoint transmits a |
| packet containing DATA chunk(s) to the new transport address, |
| start the timer on that transport address, using the RTO value |
| of the destination address to which the data is being sent, if |
| rule R1 indicates to do so. |
| |
| 6.4. Multi-Homed SCTP Endpoints |
| |
| An SCTP endpoint is considered multi-homed if there are more than one |
| transport address that can be used as a destination address to reach |
| that endpoint. |
| |
| Moreover, the ULP of an endpoint shall select one of the multiple |
| destination addresses of a multi-homed peer endpoint as the primary |
| path (see Section 5.1.2 and Section 10.1 for details). |
| |
| By default, an endpoint SHOULD always transmit to the primary path, |
| unless the SCTP user explicitly specifies the destination transport |
| address (and possibly source transport address) to use. |
| |
| An endpoint SHOULD transmit reply chunks (e.g., SACK, HEARTBEAT ACK, |
| etc.) to the same destination transport address from which it |
| received the DATA or control chunk to which it is replying. This |
| rule should also be followed if the endpoint is bundling DATA chunks |
| together with the reply chunk. |
| |
| However, when acknowledging multiple DATA chunks received in packets |
| from different source addresses in a single SACK, the SACK chunk may |
| be transmitted to one of the destination transport addresses from |
| which the DATA or control chunks being acknowledged were received. |
| |
| When a receiver of a duplicate DATA chunk sends a SACK to a multi- |
| homed endpoint, it MAY be beneficial to vary the destination address |
| and not use the source address of the DATA chunk. The reason is that |
| receiving a duplicate from a multi-homed endpoint might indicate that |
| the return path (as specified in the source address of the DATA |
| chunk) for the SACK is broken. |
| |
| Furthermore, when its peer is multi-homed, an endpoint SHOULD try to |
| retransmit a chunk that timed out to an active destination transport |
| address that is different from the last destination address to which |
| the DATA chunk was sent. |
| |
| Retransmissions do not affect the total outstanding data count. |
| However, if the DATA chunk is retransmitted onto a different |
| destination address, both the outstanding data counts on the new |
| |
| |
| |
| Stewart Standards Track [Page 87] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| destination address and the old destination address to which the data |
| chunk was last sent shall be adjusted accordingly. |
| |
| 6.4.1. Failover from an Inactive Destination Address |
| |
| Some of the transport addresses of a multi-homed SCTP endpoint may |
| become inactive due to either the occurrence of certain error |
| conditions (see Section 8.2) or adjustments from the SCTP user. |
| |
| When there is outbound data to send and the primary path becomes |
| inactive (e.g., due to failures), or where the SCTP user explicitly |
| requests to send data to an inactive destination transport address, |
| before reporting an error to its ULP, the SCTP endpoint should try to |
| send the data to an alternate active destination transport address if |
| one exists. |
| |
| When retransmitting data that timed out, if the endpoint is multi- |
| homed, it should consider each source-destination address pair in its |
| retransmission selection policy. When retransmitting timed-out data, |
| the endpoint should attempt to pick the most divergent source- |
| destination pair from the original source-destination pair to which |
| the packet was transmitted. |
| |
| Note: Rules for picking the most divergent source-destination pair |
| are an implementation decision and are not specified within this |
| document. |
| |
| 6.5. Stream Identifier and Stream Sequence Number |
| |
| Every DATA chunk MUST carry a valid stream identifier. If an |
| endpoint receives a DATA chunk with an invalid stream identifier, it |
| shall acknowledge the reception of the DATA chunk following the |
| normal procedure, immediately send an ERROR chunk with cause set to |
| "Invalid Stream Identifier" (see Section 3.3.10), and discard the |
| DATA chunk. The endpoint may bundle the ERROR chunk in the same |
| packet as the SACK as long as the ERROR follows the SACK. |
| |
| The Stream Sequence Number in all the streams MUST start from 0 when |
| the association is established. Also, when the Stream Sequence |
| Number reaches the value 65535 the next Stream Sequence Number MUST |
| be set to 0. |
| |
| 6.6. Ordered and Unordered Delivery |
| |
| Within a stream, an endpoint MUST deliver DATA chunks received with |
| the U flag set to 0 to the upper layer according to the order of |
| their Stream Sequence Number. If DATA chunks arrive out of order of |
| |
| |
| |
| |
| Stewart Standards Track [Page 88] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| their Stream Sequence Number, the endpoint MUST hold the received |
| DATA chunks from delivery to the ULP until they are reordered. |
| |
| However, an SCTP endpoint can indicate that no ordered delivery is |
| required for a particular DATA chunk transmitted within the stream by |
| setting the U flag of the DATA chunk to 1. |
| |
| When an endpoint receives a DATA chunk with the U flag set to 1, it |
| must bypass the ordering mechanism and immediately deliver the data |
| to the upper layer (after reassembly if the user data is fragmented |
| by the data sender). |
| |
| This provides an effective way of transmitting "out-of-band" data in |
| a given stream. Also, a stream can be used as an "unordered" stream |
| by simply setting the U flag to 1 in all DATA chunks sent through |
| that stream. |
| |
| IMPLEMENTATION NOTE: When sending an unordered DATA chunk, an |
| implementation may choose to place the DATA chunk in an outbound |
| packet that is at the head of the outbound transmission queue if |
| possible. |
| |
| The 'Stream Sequence Number' field in a DATA chunk with U flag set to |
| 1 has no significance. The sender can fill it with arbitrary value, |
| but the receiver MUST ignore the field. |
| |
| Note: When transmitting ordered and unordered data, an endpoint does |
| not increment its Stream Sequence Number when transmitting a DATA |
| chunk with U flag set to 1. |
| |
| 6.7. Report Gaps in Received DATA TSNs |
| |
| Upon the reception of a new DATA chunk, an endpoint shall examine the |
| continuity of the TSNs received. If the endpoint detects a gap in |
| the received DATA chunk sequence, it SHOULD send a SACK with Gap Ack |
| Blocks immediately. The data receiver continues sending a SACK after |
| receipt of each SCTP packet that doesn't fill the gap. |
| |
| Based on the Gap Ack Block from the received SACK, the endpoint can |
| calculate the missing DATA chunks and make decisions on whether to |
| retransmit them (see Section 6.2.1 for details). |
| |
| Multiple gaps can be reported in one single SACK (see Section 3.3.4). |
| |
| When its peer is multi-homed, the SCTP endpoint SHOULD always try to |
| send the SACK to the same destination address from which the last |
| DATA chunk was received. |
| |
| |
| |
| |
| Stewart Standards Track [Page 89] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Upon the reception of a SACK, the endpoint MUST remove all DATA |
| chunks that have been acknowledged by the SACK's Cumulative TSN Ack |
| from its transmit queue. The endpoint MUST also treat all the DATA |
| chunks with TSNs not included in the Gap Ack Blocks reported by the |
| SACK as "missing". The number of "missing" reports for each |
| outstanding DATA chunk MUST be recorded by the data sender in order |
| to make retransmission decisions. See Section 7.2.4 for details. |
| |
| The following example shows the use of SACK to report a gap. |
| |
| Endpoint A Endpoint Z {App |
| sends 3 messages; strm 0} DATA [TSN=6,Strm=0,Seq=2] ---------- |
| -----> (ack delayed) (Start T3-rtx timer) |
| |
| DATA [TSN=7,Strm=0,Seq=3] --------> X (lost) |
| |
| DATA [TSN=8,Strm=0,Seq=4] ---------------> (gap detected, |
| immediately send ack) |
| /----- SACK [TSN Ack=6,Block=1, |
| / Start=2,End=2] |
| <-----/ (remove 6 from out-queue, |
| and mark 7 as "1" missing report) |
| |
| Figure 9: Reporting a Gap using SACK |
| |
| The maximum number of Gap Ack Blocks that can be reported within a |
| single SACK chunk is limited by the current path MTU. When a single |
| SACK cannot cover all the Gap Ack Blocks needed to be reported due to |
| the MTU limitation, the endpoint MUST send only one SACK, reporting |
| the Gap Ack Blocks from the lowest to highest TSNs, within the size |
| limit set by the MTU, and leave the remaining highest TSN numbers |
| unacknowledged. |
| |
| 6.8. CRC32c Checksum Calculation |
| |
| When sending an SCTP packet, the endpoint MUST strengthen the data |
| integrity of the transmission by including the CRC32c checksum value |
| calculated on the packet, as described below. |
| |
| After the packet is constructed (containing the SCTP common header |
| and one or more control or DATA chunks), the transmitter MUST |
| |
| 1) fill in the proper Verification Tag in the SCTP common header and |
| initialize the checksum field to '0's, |
| |
| 2) calculate the CRC32c checksum of the whole packet, including the |
| SCTP common header and all the chunks (refer to Appendix B for |
| details of the CRC32c algorithm); and |
| |
| |
| |
| Stewart Standards Track [Page 90] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 3) put the resultant value into the checksum field in the common |
| header, and leave the rest of the bits unchanged. |
| |
| When an SCTP packet is received, the receiver MUST first check the |
| CRC32c checksum as follows: |
| |
| 1) Store the received CRC32c checksum value aside. |
| |
| 2) Replace the 32 bits of the checksum field in the received SCTP |
| packet with all '0's and calculate a CRC32c checksum value of the |
| whole received packet. |
| |
| 3) Verify that the calculated CRC32c checksum is the same as the |
| received CRC32c checksum. If it is not, the receiver MUST treat |
| the packet as an invalid SCTP packet. |
| |
| The default procedure for handling invalid SCTP packets is to |
| silently discard them. |
| |
| Any hardware implementation SHOULD be done in a way that is |
| verifiable by the software. |
| |
| 6.9. Fragmentation and Reassembly |
| |
| An endpoint MAY support fragmentation when sending DATA chunks, but |
| it MUST support reassembly when receiving DATA chunks. If an |
| endpoint supports fragmentation, it MUST fragment a user message if |
| the size of the user message to be sent causes the outbound SCTP |
| packet size to exceed the current MTU. If an implementation does not |
| support fragmentation of outbound user messages, the endpoint MUST |
| return an error to its upper layer and not attempt to send the user |
| message. |
| |
| Note: If an implementation that supports fragmentation makes |
| available to its upper layer a mechanism to turn off fragmentation, |
| it may do so. However, in so doing, it MUST react just like an |
| implementation that does NOT support fragmentation, i.e., it MUST |
| reject sends that exceed the current Path MTU (P-MTU). |
| |
| IMPLEMENTATION NOTE: In this error case, the Send primitive discussed |
| in Section 10.1 would need to return an error to the upper layer. |
| |
| If its peer is multi-homed, the endpoint shall choose a size no |
| larger than the association Path MTU. The association Path MTU is |
| the smallest Path MTU of all destination addresses. |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 91] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Note: Once a message is fragmented, it cannot be re-fragmented. |
| Instead, if the PMTU has been reduced, then IP fragmentation must be |
| used. Please see Section 7.3 for details of PMTU discovery. |
| |
| When determining when to fragment, the SCTP implementation MUST take |
| into account the SCTP packet header as well as the DATA chunk |
| header(s). The implementation MUST also take into account the space |
| required for a SACK chunk if bundling a SACK chunk with the DATA |
| chunk. |
| |
| Fragmentation takes the following steps: |
| |
| 1) The data sender MUST break the user message into a series of DATA |
| chunks such that each chunk plus SCTP overhead fits into an IP |
| datagram smaller than or equal to the association Path MTU. |
| |
| 2) The transmitter MUST then assign, in sequence, a separate TSN to |
| each of the DATA chunks in the series. The transmitter assigns |
| the same SSN to each of the DATA chunks. If the user indicates |
| that the user message is to be delivered using unordered |
| delivery, then the U flag of each DATA chunk of the user message |
| MUST be set to 1. |
| |
| 3) The transmitter MUST also set the B/E bits of the first DATA |
| chunk in the series to '10', the B/E bits of the last DATA chunk |
| in the series to '01', and the B/E bits of all other DATA chunks |
| in the series to '00'. |
| |
| An endpoint MUST recognize fragmented DATA chunks by examining the |
| B/E bits in each of the received DATA chunks, and queue the |
| fragmented DATA chunks for reassembly. Once the user message is |
| reassembled, SCTP shall pass the reassembled user message to the |
| specific stream for possible reordering and final dispatching. |
| |
| Note: If the data receiver runs out of buffer space while still |
| waiting for more fragments to complete the reassembly of the message, |
| it should dispatch part of its inbound message through a partial |
| delivery API (see Section 10), freeing some of its receive buffer |
| space so that the rest of the message may be received. |
| |
| 6.10. Bundling |
| |
| An endpoint bundles chunks by simply including multiple chunks in one |
| outbound SCTP packet. The total size of the resultant IP datagram, |
| |
| including the SCTP packet and IP headers, MUST be less that or equal |
| to the current Path MTU. |
| |
| |
| |
| |
| Stewart Standards Track [Page 92] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| If its peer endpoint is multi-homed, the sending endpoint shall |
| choose a size no larger than the latest MTU of the current primary |
| path. |
| |
| When bundling control chunks with DATA chunks, an endpoint MUST place |
| control chunks first in the outbound SCTP packet. The transmitter |
| MUST transmit DATA chunks within an SCTP packet in increasing order |
| of TSN. |
| |
| Note: Since control chunks must be placed first in a packet and since |
| DATA chunks must be transmitted before SHUTDOWN or SHUTDOWN ACK |
| chunks, DATA chunks cannot be bundled with SHUTDOWN or SHUTDOWN ACK |
| chunks. |
| |
| Partial chunks MUST NOT be placed in an SCTP packet. A partial chunk |
| is a chunk that is not completely contained in the SCTP packet; i.e., |
| the SCTP packet is too short to contain all the bytes of the chunk as |
| indicated by the chunk length. |
| |
| An endpoint MUST process received chunks in their order in the |
| packet. The receiver uses the Chunk Length field to determine the |
| end of a chunk and beginning of the next chunk taking account of the |
| fact that all chunks end on a 4-byte boundary. If the receiver |
| detects a partial chunk, it MUST drop the chunk. |
| |
| An endpoint MUST NOT bundle INIT, INIT ACK, or SHUTDOWN COMPLETE with |
| any other chunks. |
| |
| 7. Congestion Control |
| |
| Congestion control is one of the basic functions in SCTP. For some |
| applications, it may be likely that adequate resources will be |
| allocated to SCTP traffic to ensure prompt delivery of time-critical |
| data -- thus, it would appear to be unlikely, during normal |
| operations, that transmissions encounter severe congestion |
| conditions. However, SCTP must operate under adverse operational |
| conditions, which can develop upon partial network failures or |
| unexpected traffic surges. In such situations, SCTP must follow |
| correct congestion control steps to recover from congestion quickly |
| in order to get data delivered as soon as possible. In the absence |
| of network congestion, these preventive congestion control algorithms |
| should show no impact on the protocol performance. |
| |
| IMPLEMENTATION NOTE: As far as its specific performance requirements |
| are met, an implementation is always allowed to adopt a more |
| conservative congestion control algorithm than the one defined below. |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 93] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| The congestion control algorithms used by SCTP are based on |
| [RFC2581]. This section describes how the algorithms defined in |
| [RFC2581] are adapted for use in SCTP. We first list differences in |
| protocol designs between TCP and SCTP, and then describe SCTP's |
| congestion control scheme. The description will use the same |
| terminology as in TCP congestion control whenever appropriate. |
| |
| SCTP congestion control is always applied to the entire association, |
| and not to individual streams. |
| |
| 7.1. SCTP Differences from TCP Congestion Control |
| |
| Gap Ack Blocks in the SCTP SACK carry the same semantic meaning as |
| the TCP SACK. TCP considers the information carried in the SACK as |
| advisory information only. SCTP considers the information carried in |
| the Gap Ack Blocks in the SACK chunk as advisory. In SCTP, any DATA |
| chunk that has been acknowledged by SACK, including DATA that arrived |
| at the receiving end out of order, is not considered fully delivered |
| until the Cumulative TSN Ack Point passes the TSN of the DATA chunk |
| (i.e., the DATA chunk has been acknowledged by the Cumulative TSN Ack |
| field in the SACK). Consequently, the value of cwnd controls the |
| amount of outstanding data, rather than (as in the case of non-SACK |
| TCP) the upper bound between the highest acknowledged sequence number |
| and the latest DATA chunk that can be sent within the congestion |
| window. SCTP SACK leads to different implementations of Fast |
| Retransmit and Fast Recovery than non-SACK TCP. As an example, see |
| [FALL96]. |
| |
| The biggest difference between SCTP and TCP, however, is multi- |
| homing. SCTP is designed to establish robust communication |
| associations between two endpoints each of which may be reachable by |
| more than one transport address. Potentially different addresses may |
| lead to different data paths between the two endpoints; thus, ideally |
| one may need a separate set of congestion control parameters for each |
| of the paths. The treatment here of congestion control for multi- |
| homed receivers is new with SCTP and may require refinement in the |
| future. The current algorithms make the following assumptions: |
| |
| o The sender usually uses the same destination address until being |
| instructed by the upper layer to do otherwise; however, SCTP may |
| change to an alternate destination in the event an address is |
| marked inactive (see Section 8.2). Also, SCTP may retransmit to a |
| different transport address than the original transmission. |
| |
| o The sender keeps a separate congestion control parameter set for |
| each of the destination addresses it can send to (not each |
| source-destination pair but for each destination). The parameters |
| |
| |
| |
| |
| Stewart Standards Track [Page 94] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| should decay if the address is not used for a long enough time |
| period. |
| |
| o For each of the destination addresses, an endpoint does slow start |
| upon the first transmission to that address. |
| |
| Note: TCP guarantees in-sequence delivery of data to its upper-layer |
| protocol within a single TCP session. This means that when TCP |
| notices a gap in the received sequence number, it waits until the gap |
| is filled before delivering the data that was received with sequence |
| numbers higher than that of the missing data. On the other hand, |
| SCTP can deliver data to its upper-layer protocol even if there is a |
| gap in TSN if the Stream Sequence Numbers are in sequence for a |
| particular stream (i.e., the missing DATA chunks are for a different |
| stream) or if unordered delivery is indicated. Although this does |
| not affect cwnd, it might affect rwnd calculation. |
| |
| 7.2. SCTP Slow-Start and Congestion Avoidance |
| |
| The slow-start and congestion avoidance algorithms MUST be used by an |
| endpoint to control the amount of data being injected into the |
| network. The congestion control in SCTP is employed in regard to the |
| association, not to an individual stream. In some situations, it may |
| be beneficial for an SCTP sender to be more conservative than the |
| algorithms allow; however, an SCTP sender MUST NOT be more aggressive |
| than the following algorithms allow. |
| |
| Like TCP, an SCTP endpoint uses the following three control variables |
| to regulate its transmission rate. |
| |
| o Receiver advertised window size (rwnd, in bytes), which is set by |
| the receiver based on its available buffer space for incoming |
| packets. |
| |
| Note: This variable is kept on the entire association. |
| |
| o Congestion control window (cwnd, in bytes), which is adjusted by |
| the sender based on observed network conditions. |
| |
| Note: This variable is maintained on a per-destination-address |
| basis. |
| |
| o Slow-start threshold (ssthresh, in bytes), which is used by the |
| sender to distinguish slow-start and congestion avoidance phases. |
| |
| Note: This variable is maintained on a per-destination-address |
| basis. |
| |
| |
| |
| |
| Stewart Standards Track [Page 95] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| SCTP also requires one additional control variable, |
| partial_bytes_acked, which is used during congestion avoidance phase |
| to facilitate cwnd adjustment. |
| |
| Unlike TCP, an SCTP sender MUST keep a set of these control variables |
| cwnd, ssthresh, and partial_bytes_acked for EACH destination address |
| of its peer (when its peer is multi-homed). Only one rwnd is kept |
| for the whole association (no matter if the peer is multi-homed or |
| has a single address). |
| |
| 7.2.1. Slow-Start |
| |
| Beginning data transmission into a network with unknown conditions or |
| after a sufficiently long idle period requires SCTP to probe the |
| network to determine the available capacity. The slow-start |
| algorithm is used for this purpose at the beginning of a transfer, or |
| after repairing loss detected by the retransmission timer. |
| |
| o The initial cwnd before DATA transmission or after a sufficiently |
| long idle period MUST be set to min(4*MTU, max (2*MTU, 4380 |
| bytes)). |
| |
| o The initial cwnd after a retransmission timeout MUST be no more |
| than 1*MTU. |
| |
| o The initial value of ssthresh MAY be arbitrarily high (for |
| example, implementations MAY use the size of the receiver |
| advertised window). |
| |
| o Whenever cwnd is greater than zero, the endpoint is allowed to |
| have cwnd bytes of data outstanding on that transport address. |
| |
| o When cwnd is less than or equal to ssthresh, an SCTP endpoint MUST |
| use the slow-start algorithm to increase cwnd only if the current |
| congestion window is being fully utilized, an incoming SACK |
| advances the Cumulative TSN Ack Point, and the data sender is not |
| in Fast Recovery. Only when these three conditions are met can |
| the cwnd be increased; otherwise, the cwnd MUST not be increased. |
| If these conditions are met, then cwnd MUST be increased by, at |
| most, the lesser of 1) the total size of the previously |
| outstanding DATA chunk(s) acknowledged, and 2) the destination's |
| path MTU. This upper bound protects against the ACK-Splitting |
| attack outlined in [SAVAGE99]. |
| |
| In instances where its peer endpoint is multi-homed, if an endpoint |
| receives a SACK that advances its Cumulative TSN Ack Point, then it |
| should update its cwnd (or cwnds) apportioned to the destination |
| addresses to which it transmitted the acknowledged data. However, if |
| |
| |
| |
| Stewart Standards Track [Page 96] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| the received SACK does not advance the Cumulative TSN Ack Point, the |
| endpoint MUST NOT adjust the cwnd of any of the destination |
| addresses. |
| |
| Because an endpoint's cwnd is not tied to its Cumulative TSN Ack |
| Point, as duplicate SACKs come in, even though they may not advance |
| the Cumulative TSN Ack Point an endpoint can still use them to clock |
| out new data. That is, the data newly acknowledged by the SACK |
| diminishes the amount of data now in flight to less than cwnd, and so |
| the current, unchanged value of cwnd now allows new data to be sent. |
| On the other hand, the increase of cwnd must be tied to the |
| Cumulative TSN Ack Point advancement as specified above. Otherwise, |
| the duplicate SACKs will not only clock out new data, but also will |
| adversely clock out more new data than what has just left the |
| network, during a time of possible congestion. |
| |
| o When the endpoint does not transmit data on a given transport |
| address, the cwnd of the transport address should be adjusted to |
| max(cwnd/2, 4*MTU) per RTO. |
| |
| 7.2.2. Congestion Avoidance |
| |
| When cwnd is greater than ssthresh, cwnd should be incremented by |
| 1*MTU per RTT if the sender has cwnd or more bytes of data |
| outstanding for the corresponding transport address. |
| |
| In practice, an implementation can achieve this goal in the following |
| way: |
| |
| o partial_bytes_acked is initialized to 0. |
| |
| o Whenever cwnd is greater than ssthresh, upon each SACK arrival |
| that advances the Cumulative TSN Ack Point, increase |
| partial_bytes_acked by the total number of bytes of all new chunks |
| acknowledged in that SACK including chunks acknowledged by the new |
| Cumulative TSN Ack and by Gap Ack Blocks. |
| |
| o When partial_bytes_acked is equal to or greater than cwnd and |
| before the arrival of the SACK the sender had cwnd or more bytes |
| of data outstanding (i.e., before arrival of the SACK, flightsize |
| was greater than or equal to cwnd), increase cwnd by MTU, and |
| reset partial_bytes_acked to (partial_bytes_acked - cwnd). |
| |
| o Same as in the slow start, when the sender does not transmit DATA |
| on a given transport address, the cwnd of the transport address |
| should be adjusted to max(cwnd / 2, 4*MTU) per RTO. |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 97] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| o When all of the data transmitted by the sender has been |
| acknowledged by the receiver, partial_bytes_acked is initialized |
| to 0. |
| |
| 7.2.3. Congestion Control |
| |
| Upon detection of packet losses from SACK (see Section 7.2.4), an |
| endpoint should do the following: |
| |
| ssthresh = max(cwnd/2, 4*MTU) |
| cwnd = ssthresh |
| partial_bytes_acked = 0 |
| |
| Basically, a packet loss causes cwnd to be cut in half. |
| |
| When the T3-rtx timer expires on an address, SCTP should perform slow |
| start by: |
| |
| ssthresh = max(cwnd/2, 4*MTU) |
| cwnd = 1*MTU |
| |
| and ensure that no more than one SCTP packet will be in flight for |
| that address until the endpoint receives acknowledgement for |
| successful delivery of data to that address. |
| |
| 7.2.4. Fast Retransmit on Gap Reports |
| |
| In the absence of data loss, an endpoint performs delayed |
| acknowledgement. However, whenever an endpoint notices a hole in the |
| arriving TSN sequence, it SHOULD start sending a SACK back every time |
| a packet arrives carrying data until the hole is filled. |
| |
| Whenever an endpoint receives a SACK that indicates that some TSNs |
| are missing, it SHOULD wait for two further miss indications (via |
| subsequent SACKs for a total of three missing reports) on the same |
| TSNs before taking action with regard to Fast Retransmit. |
| |
| Miss indications SHOULD follow the HTNA (Highest TSN Newly |
| Acknowledged) algorithm. For each incoming SACK, miss indications |
| are incremented only for missing TSNs prior to the highest TSN newly |
| acknowledged in the SACK. A newly acknowledged DATA chunk is one not |
| previously acknowledged in a SACK. If an endpoint is in Fast |
| Recovery and a SACK arrives that advances the Cumulative TSN Ack |
| Point, the miss indications are incremented for all TSNs reported |
| missing in the SACK. |
| |
| When the third consecutive miss indication is received for a TSN(s), |
| the data sender shall do the following: |
| |
| |
| |
| Stewart Standards Track [Page 98] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 1) Mark the DATA chunk(s) with three miss indications for |
| retransmission. |
| |
| 2) If not in Fast Recovery, adjust the ssthresh and cwnd of the |
| destination address(es) to which the missing DATA chunks were |
| last sent, according to the formula described in Section 7.2.3. |
| |
| 3) Determine how many of the earliest (i.e., lowest TSN) DATA chunks |
| marked for retransmission will fit into a single packet, subject |
| to constraint of the path MTU of the destination transport |
| address to which the packet is being sent. Call this value K. |
| Retransmit those K DATA chunks in a single packet. When a Fast |
| Retransmit is being performed, the sender SHOULD ignore the value |
| of cwnd and SHOULD NOT delay retransmission for this single |
| packet. |
| |
| 4) Restart the T3-rtx timer only if the last SACK acknowledged the |
| lowest outstanding TSN number sent to that address, or the |
| endpoint is retransmitting the first outstanding DATA chunk sent |
| to that address. |
| |
| 5) Mark the DATA chunk(s) as being fast retransmitted and thus |
| ineligible for a subsequent Fast Retransmit. Those TSNs marked |
| for retransmission due to the Fast-Retransmit algorithm that did |
| not fit in the sent datagram carrying K other TSNs are also |
| marked as ineligible for a subsequent Fast Retransmit. However, |
| as they are marked for retransmission they will be retransmitted |
| later on as soon as cwnd allows. |
| |
| 6) If not in Fast Recovery, enter Fast Recovery and mark the highest |
| outstanding TSN as the Fast Recovery exit point. When a SACK |
| acknowledges all TSNs up to and including this exit point, Fast |
| Recovery is exited. While in Fast Recovery, the ssthresh and |
| cwnd SHOULD NOT change for any destinations due to a subsequent |
| Fast Recovery event (i.e., one SHOULD NOT reduce the cwnd further |
| due to a subsequent Fast Retransmit). |
| |
| Note: Before the above adjustments, if the received SACK also |
| acknowledges new DATA chunks and advances the Cumulative TSN Ack |
| Point, the cwnd adjustment rules defined in Section 7.2.1 and Section |
| 7.2.2 must be applied first. |
| |
| A straightforward implementation of the above keeps a counter for |
| each TSN hole reported by a SACK. The counter increments for each |
| consecutive SACK reporting the TSN hole. After reaching 3 and |
| starting the Fast-Retransmit procedure, the counter resets to 0. |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 99] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Because cwnd in SCTP indirectly bounds the number of outstanding |
| TSN's, the effect of TCP Fast Recovery is achieved automatically with |
| no adjustment to the congestion control window size. |
| |
| 7.3. Path MTU Discovery |
| |
| [RFC4821], [RFC1981], and [RFC1191] specify "Packetization Layer Path |
| MTU Discovery", whereby an endpoint maintains an estimate of the |
| maximum transmission unit (MTU) along a given Internet path and |
| refrains from sending packets along that path that exceed the MTU, |
| other than occasional attempts to probe for a change in the Path MTU |
| (PMTU). [RFC4821] is thorough in its discussion of the MTU discovery |
| mechanism and strategies for determining the current end-to-end MTU |
| setting as well as detecting changes in this value. |
| |
| An endpoint SHOULD apply these techniques, and SHOULD do so on a |
| per-destination-address basis. |
| |
| There are two important SCTP-specific points regarding Path MTU |
| discovery: |
| |
| 1) SCTP associations can span multiple addresses. An endpoint MUST |
| maintain separate MTU estimates for each destination address of |
| its peer. |
| |
| 2) The sender should track an association PMTU that will be the |
| smallest PMTU discovered for all of the peer's destination |
| addresses. When fragmenting messages into multiple parts this |
| association PMTU should be used to calculate the size of each |
| fragment. This will allow retransmissions to be seamlessly sent |
| to an alternate address without encountering IP fragmentation. |
| |
| 8. Fault Management |
| |
| 8.1. Endpoint Failure Detection |
| |
| An endpoint shall keep a counter on the total number of consecutive |
| retransmissions to its peer (this includes retransmissions to all the |
| destination transport addresses of the peer if it is multi-homed), |
| including unacknowledged HEARTBEAT chunks. If the value of this |
| counter exceeds the limit indicated in the protocol parameter |
| 'Association.Max.Retrans', the endpoint shall consider the peer |
| endpoint unreachable and shall stop transmitting any more data to it |
| (and thus the association enters the CLOSED state). In addition, the |
| endpoint MAY report the failure to the upper layer and optionally |
| report back all outstanding user data remaining in its outbound |
| queue. The association is automatically closed when the peer |
| endpoint becomes unreachable. |
| |
| |
| |
| Stewart Standards Track [Page 100] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| The counter shall be reset each time a DATA chunk sent to that peer |
| endpoint is acknowledged (by the reception of a SACK) or a HEARTBEAT |
| ACK is received from the peer endpoint. |
| |
| 8.2. Path Failure Detection |
| |
| When its peer endpoint is multi-homed, an endpoint should keep an |
| error counter for each of the destination transport addresses of the |
| peer endpoint. |
| |
| Each time the T3-rtx timer expires on any address, or when a |
| HEARTBEAT sent to an idle address is not acknowledged within an RTO, |
| the error counter of that destination address will be incremented. |
| When the value in the error counter exceeds the protocol parameter |
| 'Path.Max.Retrans' of that destination address, the endpoint should |
| mark the destination transport address as inactive, and a |
| notification SHOULD be sent to the upper layer. |
| |
| When an outstanding TSN is acknowledged or a HEARTBEAT sent to that |
| address is acknowledged with a HEARTBEAT ACK, the endpoint shall |
| clear the error counter of the destination transport address to which |
| the DATA chunk was last sent (or HEARTBEAT was sent). When the peer |
| endpoint is multi-homed and the last chunk sent to it was a |
| retransmission to an alternate address, there exists an ambiguity as |
| to whether or not the acknowledgement should be credited to the |
| address of the last chunk sent. However, this ambiguity does not |
| seem to bear any significant consequence to SCTP behavior. If this |
| ambiguity is undesirable, the transmitter may choose not to clear the |
| error counter if the last chunk sent was a retransmission. |
| |
| Note: When configuring the SCTP endpoint, the user should avoid |
| having the value of 'Association.Max.Retrans' larger than the |
| summation of the 'Path.Max.Retrans' of all the destination addresses |
| for the remote endpoint. Otherwise, all the destination addresses |
| may become inactive while the endpoint still considers the peer |
| endpoint reachable. When this condition occurs, how SCTP chooses to |
| function is implementation specific. |
| |
| When the primary path is marked inactive (due to excessive |
| retransmissions, for instance), the sender MAY automatically transmit |
| new packets to an alternate destination address if one exists and is |
| active. If more than one alternate address is active when the |
| primary path is marked inactive, only ONE transport address SHOULD be |
| chosen and used as the new destination transport address. |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 101] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 8.3. Path Heartbeat |
| |
| By default, an SCTP endpoint SHOULD monitor the reachability of the |
| idle destination transport address(es) of its peer by sending a |
| HEARTBEAT chunk periodically to the destination transport |
| address(es). HEARTBEAT sending MAY begin upon reaching the |
| ESTABLISHED state and is discontinued after sending either SHUTDOWN |
| or SHUTDOWN-ACK. A receiver of a HEARTBEAT MUST respond to a |
| HEARTBEAT with a HEARTBEAT-ACK after entering the COOKIE-ECHOED state |
| (INIT sender) or the ESTABLISHED state (INIT receiver), up until |
| reaching the SHUTDOWN-SENT state (SHUTDOWN sender) or the SHUTDOWN- |
| ACK-SENT state (SHUTDOWN receiver). |
| |
| A destination transport address is considered "idle" if no new chunk |
| that can be used for updating path RTT (usually including first |
| transmission DATA, INIT, COOKIE ECHO, HEARTBEAT, etc.) and no |
| HEARTBEAT has been sent to it within the current heartbeat period of |
| that address. This applies to both active and inactive destination |
| addresses. |
| |
| The upper layer can optionally initiate the following functions: |
| |
| A) Disable heartbeat on a specific destination transport address of a |
| given association, |
| |
| B) Change the HB.interval, |
| |
| C) Re-enable heartbeat on a specific destination transport address of |
| a given association, and |
| |
| D) Request an on-demand HEARTBEAT on a specific destination transport |
| address of a given association. |
| |
| The endpoint should increment the respective error counter of the |
| destination transport address each time a HEARTBEAT is sent to that |
| address and not acknowledged within one RTO. |
| |
| When the value of this counter reaches the protocol parameter |
| 'Path.Max.Retrans', the endpoint should mark the corresponding |
| destination address as inactive if it is not so marked, and may also |
| optionally report to the upper layer the change of reachability of |
| this destination address. After this, the endpoint should continue |
| HEARTBEAT on this destination address but should stop increasing the |
| counter. |
| |
| The sender of the HEARTBEAT chunk should include in the Heartbeat |
| Information field of the chunk the current time when the packet is |
| sent out and the destination address to which the packet is sent. |
| |
| |
| |
| Stewart Standards Track [Page 102] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| IMPLEMENTATION NOTE: An alternative implementation of the heartbeat |
| mechanism that can be used is to increment the error counter variable |
| every time a HEARTBEAT is sent to a destination. Whenever a |
| HEARTBEAT ACK arrives, the sender SHOULD clear the error counter of |
| the destination that the HEARTBEAT was sent to. This in effect would |
| clear the previously stroked error (and any other error counts as |
| well). |
| |
| The receiver of the HEARTBEAT should immediately respond with a |
| HEARTBEAT ACK that contains the Heartbeat Information TLV, together |
| with any other received TLVs, copied unchanged from the received |
| HEARTBEAT chunk. |
| |
| Upon the receipt of the HEARTBEAT ACK, the sender of the HEARTBEAT |
| should clear the error counter of the destination transport address |
| to which the HEARTBEAT was sent, and mark the destination transport |
| address as active if it is not so marked. The endpoint may |
| optionally report to the upper layer when an inactive destination |
| address is marked as active due to the reception of the latest |
| HEARTBEAT ACK. The receiver of the HEARTBEAT ACK must also clear the |
| association overall error count as well (as defined in Section 8.1). |
| |
| The receiver of the HEARTBEAT ACK should also perform an RTT |
| measurement for that destination transport address using the time |
| value carried in the HEARTBEAT ACK chunk. |
| |
| On an idle destination address that is allowed to heartbeat, it is |
| recommended that a HEARTBEAT chunk is sent once per RTO of that |
| destination address plus the protocol parameter 'HB.interval', with |
| jittering of +/- 50% of the RTO value, and exponential backoff of the |
| RTO if the previous HEARTBEAT is unanswered. |
| |
| A primitive is provided for the SCTP user to change the HB.interval |
| and turn on or off the heartbeat on a given destination address. The |
| heartbeat interval set by the SCTP user is added to the RTO of that |
| destination (including any exponential backoff). Only one heartbeat |
| should be sent each time the heartbeat timer expires (if multiple |
| destinations are idle). It is an implementation decision on how to |
| choose which of the candidate idle destinations to heartbeat to (if |
| more than one destination is idle). |
| |
| Note: When tuning the heartbeat interval, there is a side effect that |
| SHOULD be taken into account. When this value is increased, i.e., |
| the HEARTBEAT takes longer, the detection of lost ABORT messages |
| takes longer as well. If a peer endpoint ABORTs the association for |
| any reason and the ABORT chunk is lost, the local endpoint will only |
| discover the lost ABORT by sending a DATA chunk or HEARTBEAT chunk |
| (thus causing the peer to send another ABORT). This must be |
| |
| |
| |
| Stewart Standards Track [Page 103] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| considered when tuning the HEARTBEAT timer. If the HEARTBEAT is |
| disabled, only sending DATA to the association will discover a lost |
| ABORT from the peer. |
| |
| 8.4. Handle "Out of the Blue" Packets |
| |
| An SCTP packet is called an "out of the blue" (OOTB) packet if it is |
| correctly formed (i.e., passed the receiver's CRC32c check; see |
| Section 6.8), but the receiver is not able to identify the |
| association to which this packet belongs. |
| |
| The receiver of an OOTB packet MUST do the following: |
| |
| 1) If the OOTB packet is to or from a non-unicast address, a |
| receiver SHOULD silently discard the packet. Otherwise, |
| |
| 2) If the OOTB packet contains an ABORT chunk, the receiver MUST |
| silently discard the OOTB packet and take no further action. |
| Otherwise, |
| |
| 3) If the packet contains an INIT chunk with a Verification Tag set |
| to '0', process it as described in Section 5.1. If, for whatever |
| reason, the INIT cannot be processed normally and an ABORT has to |
| be sent in response, the Verification Tag of the packet |
| containing the ABORT chunk MUST be the Initiate Tag of the |
| received INIT chunk, and the T bit of the ABORT chunk has to be |
| set to 0, indicating that the Verification Tag is NOT reflected. |
| |
| 4) If the packet contains a COOKIE ECHO in the first chunk, process |
| it as described in Section 5.1. Otherwise, |
| |
| 5) If the packet contains a SHUTDOWN ACK chunk, the receiver should |
| respond to the sender of the OOTB packet with a SHUTDOWN |
| COMPLETE. When sending the SHUTDOWN COMPLETE, the receiver of |
| the OOTB packet must fill in the Verification Tag field of the |
| outbound packet with the Verification Tag received in the |
| SHUTDOWN ACK and set the T bit in the Chunk Flags to indicate |
| that the Verification Tag is reflected. Otherwise, |
| |
| 6) If the packet contains a SHUTDOWN COMPLETE chunk, the receiver |
| should silently discard the packet and take no further action. |
| Otherwise, |
| |
| 7) If the packet contains a "Stale Cookie" ERROR or a COOKIE ACK, |
| the SCTP packet should be silently discarded. Otherwise, |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 104] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 8) The receiver should respond to the sender of the OOTB packet with |
| an ABORT. When sending the ABORT, the receiver of the OOTB |
| packet MUST fill in the Verification Tag field of the outbound |
| packet with the value found in the Verification Tag field of the |
| OOTB packet and set the T bit in the Chunk Flags to indicate that |
| the Verification Tag is reflected. After sending this ABORT, the |
| receiver of the OOTB packet shall discard the OOTB packet and |
| take no further action. |
| |
| 8.5. Verification Tag |
| |
| The Verification Tag rules defined in this section apply when sending |
| or receiving SCTP packets that do not contain an INIT, SHUTDOWN |
| COMPLETE, COOKIE ECHO (see Section 5.1), ABORT, or SHUTDOWN ACK |
| chunk. The rules for sending and receiving SCTP packets containing |
| one of these chunk types are discussed separately in Section 8.5.1. |
| |
| When sending an SCTP packet, the endpoint MUST fill in the |
| Verification Tag field of the outbound packet with the tag value in |
| the Initiate Tag parameter of the INIT or INIT ACK received from its |
| peer. |
| |
| When receiving an SCTP packet, the endpoint MUST ensure that the |
| value in the Verification Tag field of the received SCTP packet |
| matches its own tag. If the received Verification Tag value does not |
| match the receiver's own tag value, the receiver shall silently |
| discard the packet and shall not process it any further except for |
| those cases listed in Section 8.5.1 below. |
| |
| 8.5.1. Exceptions in Verification Tag Rules |
| |
| A) Rules for packet carrying INIT: |
| |
| - The sender MUST set the Verification Tag of the packet to 0. |
| |
| - When an endpoint receives an SCTP packet with the Verification |
| Tag set to 0, it should verify that the packet contains only an |
| INIT chunk. Otherwise, the receiver MUST silently discard the |
| packet. |
| |
| B) Rules for packet carrying ABORT: |
| |
| - The endpoint MUST always fill in the Verification Tag field of |
| the outbound packet with the destination endpoint's tag value, if |
| it is known. |
| |
| - If the ABORT is sent in response to an OOTB packet, the endpoint |
| MUST follow the procedure described in Section 8.4. |
| |
| |
| |
| Stewart Standards Track [Page 105] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| - The receiver of an ABORT MUST accept the packet if the |
| Verification Tag field of the packet matches its own tag and the |
| T bit is not set OR if it is set to its peer's tag and the T bit |
| is set in the Chunk Flags. Otherwise, the receiver MUST silently |
| discard the packet and take no further action. |
| |
| C) Rules for packet carrying SHUTDOWN COMPLETE: |
| |
| - When sending a SHUTDOWN COMPLETE, if the receiver of the SHUTDOWN |
| ACK has a TCB, then the destination endpoint's tag MUST be used, |
| and the T bit MUST NOT be set. Only where no TCB exists should |
| the sender use the Verification Tag from the SHUTDOWN ACK, and |
| MUST set the T bit. |
| |
| - The receiver of a SHUTDOWN COMPLETE shall accept the packet if |
| the Verification Tag field of the packet matches its own tag and |
| the T bit is not set OR if it is set to its peer's tag and the T |
| bit is set in the Chunk Flags. Otherwise, the receiver MUST |
| silently discard the packet and take no further action. An |
| endpoint MUST ignore the SHUTDOWN COMPLETE if it is not in the |
| SHUTDOWN-ACK-SENT state. |
| |
| D) Rules for packet carrying a COOKIE ECHO |
| |
| - When sending a COOKIE ECHO, the endpoint MUST use the value of |
| the Initiate Tag received in the INIT ACK. |
| |
| - The receiver of a COOKIE ECHO follows the procedures in Section |
| 5. |
| |
| E) Rules for packet carrying a SHUTDOWN ACK |
| |
| - If the receiver is in COOKIE-ECHOED or COOKIE-WAIT state the |
| procedures in Section 8.4 SHOULD be followed; in other words, it |
| should be treated as an Out Of The Blue packet. |
| |
| 9. Termination of Association |
| |
| An endpoint should terminate its association when it exits from |
| service. An association can be terminated by either abort or |
| shutdown. An abort of an association is abortive by definition in |
| that any data pending on either end of the association is discarded |
| and not delivered to the peer. A shutdown of an association is |
| considered a graceful close where all data in queue by either |
| endpoint is delivered to the respective peers. However, in the case |
| of a shutdown, SCTP does not support a half-open state (like TCP) |
| wherein one side may continue sending data while the other end is |
| closed. When either endpoint performs a shutdown, the association on |
| |
| |
| |
| Stewart Standards Track [Page 106] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| each peer will stop accepting new data from its user and only deliver |
| data in queue at the time of sending or receiving the SHUTDOWN chunk. |
| |
| 9.1. Abort of an Association |
| |
| When an endpoint decides to abort an existing association, it MUST |
| send an ABORT chunk to its peer endpoint. The sender MUST fill in |
| the peer's Verification Tag in the outbound packet and MUST NOT |
| bundle any DATA chunk with the ABORT. If the association is aborted |
| on request of the upper layer, a User-Initiated Abort error cause |
| (see Section 3.3.10.12) SHOULD be present in the ABORT chunk. |
| |
| An endpoint MUST NOT respond to any received packet that contains an |
| ABORT chunk (also see Section 8.4). |
| |
| An endpoint receiving an ABORT MUST apply the special Verification |
| Tag check rules described in Section 8.5.1. |
| |
| After checking the Verification Tag, the receiving endpoint MUST |
| remove the association from its record and SHOULD report the |
| termination to its upper layer. If a User-Initiated Abort error |
| cause is present in the ABORT chunk, the Upper Layer Abort Reason |
| SHOULD be made available to the upper layer. |
| |
| 9.2. Shutdown of an Association |
| |
| Using the SHUTDOWN primitive (see Section 10.1), the upper layer of |
| an endpoint in an association can gracefully close the association. |
| This will allow all outstanding DATA chunks from the peer of the |
| shutdown initiator to be delivered before the association terminates. |
| |
| Upon receipt of the SHUTDOWN primitive from its upper layer, the |
| endpoint enters the SHUTDOWN-PENDING state and remains there until |
| all outstanding data has been acknowledged by its peer. The endpoint |
| accepts no new data from its upper layer, but retransmits data to the |
| far end if necessary to fill gaps. |
| |
| Once all its outstanding data has been acknowledged, the endpoint |
| shall send a SHUTDOWN chunk to its peer including in the Cumulative |
| TSN Ack field the last sequential TSN it has received from the peer. |
| It shall then start the T2-shutdown timer and enter the SHUTDOWN-SENT |
| state. If the timer expires, the endpoint must resend the SHUTDOWN |
| with the updated last sequential TSN received from its peer. |
| |
| The rules in Section 6.3 MUST be followed to determine the proper |
| timer value for T2-shutdown. To indicate any gaps in TSN, the |
| endpoint may also bundle a SACK with the SHUTDOWN chunk in the same |
| SCTP packet. |
| |
| |
| |
| Stewart Standards Track [Page 107] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| An endpoint should limit the number of retransmissions of the |
| SHUTDOWN chunk to the protocol parameter 'Association.Max.Retrans'. |
| If this threshold is exceeded, the endpoint should destroy the TCB |
| and MUST report the peer endpoint unreachable to the upper layer (and |
| thus the association enters the CLOSED state). The reception of any |
| packet from its peer (i.e., as the peer sends all of its queued DATA |
| chunks) should clear the endpoint's retransmission count and restart |
| the T2-shutdown timer, giving its peer ample opportunity to transmit |
| all of its queued DATA chunks that have not yet been sent. |
| |
| Upon reception of the SHUTDOWN, the peer endpoint shall |
| |
| - enter the SHUTDOWN-RECEIVED state, |
| |
| - stop accepting new data from its SCTP user, and |
| |
| - verify, by checking the Cumulative TSN Ack field of the chunk, |
| that all its outstanding DATA chunks have been received by the |
| SHUTDOWN sender. |
| |
| Once an endpoint has reached the SHUTDOWN-RECEIVED state, it MUST NOT |
| send a SHUTDOWN in response to a ULP request, and should discard |
| subsequent SHUTDOWN chunks. |
| |
| If there are still outstanding DATA chunks left, the SHUTDOWN |
| receiver MUST continue to follow normal data transmission procedures |
| defined in Section 6, until all outstanding DATA chunks are |
| acknowledged; however, the SHUTDOWN receiver MUST NOT accept new data |
| from its SCTP user. |
| |
| While in the SHUTDOWN-SENT state, the SHUTDOWN sender MUST |
| immediately respond to each received packet containing one or more |
| DATA chunks with a SHUTDOWN chunk and restart the T2-shutdown timer. |
| If a SHUTDOWN chunk by itself cannot acknowledge all of the received |
| DATA chunks (i.e., there are TSNs that can be acknowledged that are |
| larger than the cumulative TSN, and thus gaps exist in the TSN |
| sequence), or if duplicate TSNs have been received, then a SACK chunk |
| MUST also be sent. |
| |
| The sender of the SHUTDOWN MAY also start an overall guard timer |
| 'T5-shutdown-guard' to bound the overall time for the shutdown |
| sequence. At the expiration of this timer, the sender SHOULD abort |
| the association by sending an ABORT chunk. If the 'T5-shutdown- |
| guard' timer is used, it SHOULD be set to the recommended value of 5 |
| times 'RTO.Max'. |
| |
| If the receiver of the SHUTDOWN has no more outstanding DATA chunks, |
| the SHUTDOWN receiver MUST send a SHUTDOWN ACK and start a T2- |
| |
| |
| |
| Stewart Standards Track [Page 108] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| shutdown timer of its own, entering the SHUTDOWN-ACK-SENT state. If |
| the timer expires, the endpoint must resend the SHUTDOWN ACK. |
| |
| The sender of the SHUTDOWN ACK should limit the number of |
| retransmissions of the SHUTDOWN ACK chunk to the protocol parameter |
| 'Association.Max.Retrans'. If this threshold is exceeded, the |
| endpoint should destroy the TCB and may report the peer endpoint |
| unreachable to the upper layer (and thus the association enters the |
| CLOSED state). |
| |
| Upon the receipt of the SHUTDOWN ACK, the SHUTDOWN sender shall stop |
| the T2-shutdown timer, send a SHUTDOWN COMPLETE chunk to its peer, |
| and remove all record of the association. |
| |
| Upon reception of the SHUTDOWN COMPLETE chunk, the endpoint will |
| verify that it is in the SHUTDOWN-ACK-SENT state; if it is not, the |
| chunk should be discarded. If the endpoint is in the SHUTDOWN-ACK- |
| SENT state, the endpoint should stop the T2-shutdown timer and remove |
| all knowledge of the association (and thus the association enters the |
| CLOSED state). |
| |
| An endpoint SHOULD ensure that all its outstanding DATA chunks have |
| been acknowledged before initiating the shutdown procedure. |
| |
| An endpoint should reject any new data request from its upper layer |
| if it is in the SHUTDOWN-PENDING, SHUTDOWN-SENT, SHUTDOWN-RECEIVED, |
| or SHUTDOWN-ACK-SENT state. |
| |
| If an endpoint is in the SHUTDOWN-ACK-SENT state and receives an INIT |
| chunk (e.g., if the SHUTDOWN COMPLETE was lost) with source and |
| destination transport addresses (either in the IP addresses or in the |
| INIT chunk) that belong to this association, it should discard the |
| INIT chunk and retransmit the SHUTDOWN ACK chunk. |
| |
| Note: Receipt of an INIT with the same source and destination IP |
| addresses as used in transport addresses assigned to an endpoint but |
| with a different port number indicates the initialization of a |
| separate association. |
| |
| The sender of the INIT or COOKIE ECHO should respond to the receipt |
| of a SHUTDOWN ACK with a stand-alone SHUTDOWN COMPLETE in an SCTP |
| packet with the Verification Tag field of its common header set to |
| the same tag that was received in the SHUTDOWN ACK packet. This is |
| considered an Out of the Blue packet as defined in Section 8.4. The |
| sender of the INIT lets T1-init continue running and remains in the |
| COOKIE-WAIT or COOKIE-ECHOED state. Normal T1-init timer expiration |
| will cause the INIT or COOKIE chunk to be retransmitted and thus |
| start a new association. |
| |
| |
| |
| Stewart Standards Track [Page 109] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| If a SHUTDOWN is received in the COOKIE-WAIT or COOKIE ECHOED state, |
| the SHUTDOWN chunk SHOULD be silently discarded. |
| |
| If an endpoint is in the SHUTDOWN-SENT state and receives a SHUTDOWN |
| chunk from its peer, the endpoint shall respond immediately with a |
| SHUTDOWN ACK to its peer, and move into the SHUTDOWN-ACK-SENT state |
| restarting its T2-shutdown timer. |
| |
| If an endpoint is in the SHUTDOWN-ACK-SENT state and receives a |
| SHUTDOWN ACK, it shall stop the T2-shutdown timer, send a SHUTDOWN |
| COMPLETE chunk to its peer, and remove all record of the association. |
| |
| 10. Interface with Upper Layer |
| |
| The Upper Layer Protocols (ULPs) shall request services by passing |
| primitives to SCTP and shall receive notifications from SCTP for |
| various events. |
| |
| The primitives and notifications described in this section should be |
| used as a guideline for implementing SCTP. The following functional |
| description of ULP interface primitives is shown for illustrative |
| purposes. Different SCTP implementations may have different ULP |
| interfaces. However, all SCTPs must provide a certain minimum set of |
| services to guarantee that all SCTP implementations can support the |
| same protocol hierarchy. |
| |
| 10.1. ULP-to-SCTP |
| |
| The following sections functionally characterize a ULP/SCTP |
| interface. The notation used is similar to most procedure or |
| function calls in high-level languages. |
| |
| The ULP primitives described below specify the basic functions that |
| SCTP must perform to support inter-process communication. Individual |
| implementations must define their own exact format, and may provide |
| combinations or subsets of the basic functions in single calls. |
| |
| A) Initialize |
| |
| Format: INITIALIZE ([local port],[local eligible address list])-> |
| local SCTP instance name |
| |
| This primitive allows SCTP to initialize its internal data structures |
| and allocate necessary resources for setting up its operation |
| environment. Once SCTP is initialized, ULP can communicate directly |
| with other endpoints without re-invoking this primitive. |
| |
| SCTP will return a local SCTP instance name to the ULP. |
| |
| |
| |
| Stewart Standards Track [Page 110] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Mandatory attributes: |
| |
| None. |
| |
| Optional attributes: |
| |
| The following types of attributes may be passed along with the |
| primitive: |
| |
| o local port - SCTP port number, if ULP wants it to be specified. |
| |
| o local eligible address list - an address list that the local SCTP |
| endpoint should bind. By default, if an address list is not |
| included, all IP addresses assigned to the host should be used by |
| the local endpoint. |
| |
| IMPLEMENTATION NOTE: If this optional attribute is supported by an |
| implementation, it will be the responsibility of the implementation |
| to enforce that the IP source address field of any SCTP packets sent |
| out by this endpoint contains one of the IP addresses indicated in |
| the local eligible address list. |
| |
| B) Associate |
| |
| Format: ASSOCIATE(local SCTP instance name, |
| destination transport addr, outbound stream count) |
| -> association id [,destination transport addr list] |
| [,outbound stream count] |
| |
| This primitive allows the upper layer to initiate an association to a |
| specific peer endpoint. |
| |
| The peer endpoint shall be specified by one of the transport |
| addresses that defines the endpoint (see Section 1.3). If the local |
| SCTP instance has not been initialized, the ASSOCIATE is considered |
| an error. |
| |
| An association id, which is a local handle to the SCTP association, |
| will be returned on successful establishment of the association. If |
| SCTP is not able to open an SCTP association with the peer endpoint, |
| an error is returned. |
| |
| Other association parameters may be returned, including the complete |
| destination transport addresses of the peer as well as the outbound |
| stream count of the local endpoint. One of the transport addresses |
| from the returned destination addresses will be selected by the local |
| endpoint as default primary path for sending SCTP packets to this |
| peer. The returned "destination transport addr list" can be used by |
| |
| |
| |
| Stewart Standards Track [Page 111] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| the ULP to change the default primary path or to force sending a |
| packet to a specific transport address. |
| |
| IMPLEMENTATION NOTE: If ASSOCIATE primitive is implemented as a |
| blocking function call, the ASSOCIATE primitive can return |
| association parameters in addition to the association id upon |
| successful establishment. If ASSOCIATE primitive is implemented as a |
| non-blocking call, only the association id shall be returned and |
| association parameters shall be passed using the COMMUNICATION UP |
| notification. |
| |
| Mandatory attributes: |
| |
| o local SCTP instance name - obtained from the INITIALIZE operation. |
| |
| o destination transport addr - specified as one of the transport |
| addresses of the peer endpoint with which the association is to be |
| established. |
| |
| o outbound stream count - the number of outbound streams the ULP |
| would like to open towards this peer endpoint. |
| |
| Optional attributes: |
| |
| None. |
| |
| C) Shutdown |
| |
| Format: SHUTDOWN(association id) |
| -> result |
| |
| Gracefully closes an association. Any locally queued user data will |
| be delivered to the peer. The association will be terminated only |
| after the peer acknowledges all the SCTP packets sent. A success |
| code will be returned on successful termination of the association. |
| If attempting to terminate the association results in a failure, an |
| error code shall be returned. |
| |
| Mandatory attributes: |
| |
| o association id - local handle to the SCTP association. |
| |
| Optional attributes: |
| |
| None. |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 112] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| D) Abort |
| |
| Format: ABORT(association id [, Upper Layer Abort Reason]) -> |
| result |
| |
| Ungracefully closes an association. Any locally queued user data |
| will be discarded, and an ABORT chunk is sent to the peer. A success |
| code will be returned on successful abort of the association. If |
| attempting to abort the association results in a failure, an error |
| code shall be returned. |
| |
| Mandatory attributes: |
| |
| o association id - local handle to the SCTP association. |
| |
| Optional attributes: |
| |
| o Upper Layer Abort Reason - reason of the abort to be passed to the |
| peer. |
| |
| None. |
| |
| E) Send |
| |
| Format: SEND(association id, buffer address, byte count [,context] |
| [,stream id] [,life time] [,destination transport address] |
| [,unordered flag] [,no-bundle flag] [,payload protocol-id] ) |
| -> result |
| |
| This is the main method to send user data via SCTP. |
| |
| Mandatory attributes: |
| |
| o association id - local handle to the SCTP association. |
| |
| o buffer address - the location where the user message to be |
| transmitted is stored. |
| |
| o byte count - the size of the user data in number of bytes. |
| |
| Optional attributes: |
| |
| o context - an optional 32-bit integer that will be carried in the |
| sending failure notification to the ULP if the transportation of |
| this user message fails. |
| |
| o stream id - to indicate which stream to send the data on. If not |
| specified, stream 0 will be used. |
| |
| |
| |
| Stewart Standards Track [Page 113] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| o life time - specifies the life time of the user data. The user |
| data will not be sent by SCTP after the life time expires. This |
| parameter can be used to avoid efforts to transmit stale user |
| messages. SCTP notifies the ULP if the data cannot be initiated |
| to transport (i.e., sent to the destination via SCTP's send |
| primitive) within the life time variable. However, the user data |
| will be transmitted if SCTP has attempted to transmit a chunk |
| before the life time expired. |
| |
| IMPLEMENTATION NOTE: In order to better support the data life time |
| option, the transmitter may hold back the assigning of the TSN number |
| to an outbound DATA chunk to the last moment. And, for |
| implementation simplicity, once a TSN number has been assigned the |
| sender should consider the send of this DATA chunk as committed, |
| overriding any life time option attached to the DATA chunk. |
| |
| o destination transport address - specified as one of the |
| destination transport addresses of the peer endpoint to which this |
| packet should be sent. Whenever possible, SCTP should use this |
| destination transport address for sending the packets, instead of |
| the current primary path. |
| |
| o unordered flag - this flag, if present, indicates that the user |
| would like the data delivered in an unordered fashion to the peer |
| (i.e., the U flag is set to 1 on all DATA chunks carrying this |
| message). |
| |
| o no-bundle flag - instructs SCTP not to bundle this user data with |
| other outbound DATA chunks. SCTP MAY still bundle even when this |
| flag is present, when faced with network congestion. |
| |
| o payload protocol-id - a 32-bit unsigned integer that is to be |
| passed to the peer indicating the type of payload protocol data |
| being transmitted. This value is passed as opaque data by SCTP. |
| |
| F) Set Primary |
| |
| Format: SETPRIMARY(association id, destination transport address, |
| [source transport address] ) |
| -> result |
| |
| Instructs the local SCTP to use the specified destination transport |
| address as the primary path for sending packets. |
| |
| The result of attempting this operation shall be returned. If the |
| specified destination transport address is not present in the |
| "destination transport address list" returned earlier in an associate |
| command or communication up notification, an error shall be returned. |
| |
| |
| |
| Stewart Standards Track [Page 114] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Mandatory attributes: |
| |
| o association id - local handle to the SCTP association. |
| |
| o destination transport address - specified as one of the transport |
| addresses of the peer endpoint, which should be used as the |
| primary address for sending packets. This overrides the current |
| primary address information maintained by the local SCTP endpoint. |
| |
| Optional attributes: |
| |
| o source transport address - optionally, some implementations may |
| allow you to set the default source address placed in all outgoing |
| IP datagrams. |
| |
| G) Receive |
| |
| Format: RECEIVE(association id, buffer address, buffer size |
| [,stream id]) |
| -> byte count [,transport address] [,stream id] [,stream sequence |
| number] [,partial flag] [,delivery number] [,payload protocol-id] |
| |
| This primitive shall read the first user message in the SCTP in-queue |
| into the buffer specified by ULP, if there is one available. The |
| size of the message read, in bytes, will be returned. It may, |
| depending on the specific implementation, also return other |
| information such as the sender's address, the stream id on which it |
| is received, whether there are more messages available for retrieval, |
| etc. For ordered messages, their Stream Sequence Number may also be |
| returned. |
| |
| Depending upon the implementation, if this primitive is invoked when |
| no message is available the implementation should return an |
| indication of this condition or should block the invoking process |
| until data does become available. |
| |
| Mandatory attributes: |
| |
| o association id - local handle to the SCTP association |
| |
| o buffer address - the memory location indicated by the ULP to store |
| the received message. |
| |
| o buffer size - the maximum size of data to be received, in bytes. |
| |
| Optional attributes: |
| |
| o stream id - to indicate which stream to receive the data on. |
| |
| |
| |
| Stewart Standards Track [Page 115] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| o Stream Sequence Number - the Stream Sequence Number assigned by |
| the sending SCTP peer. |
| |
| o partial flag - if this returned flag is set to 1, then this |
| Receive contains a partial delivery of the whole message. When |
| this flag is set, the stream id and Stream Sequence Number MUST |
| accompany this receive. When this flag is set to 0, it indicates |
| that no more deliveries will be received for this Stream Sequence |
| Number. |
| |
| o payload protocol-id - a 32-bit unsigned integer that is received |
| from the peer indicating the type of payload protocol of the |
| received data. This value is passed as opaque data by SCTP. |
| |
| H) Status |
| |
| Format: STATUS(association id) |
| -> status data |
| |
| This primitive should return a data block containing the following |
| information: |
| |
| association connection state, |
| destination transport address list, |
| destination transport address reachability states, |
| current receiver window size, |
| current congestion window sizes, |
| number of unacknowledged DATA chunks, |
| number of DATA chunks pending receipt, |
| primary path, |
| most recent SRTT on primary path, |
| RTO on primary path, |
| SRTT and RTO on other destination addresses, etc. |
| |
| Mandatory attributes: |
| |
| o association id - local handle to the SCTP association. |
| |
| Optional attributes: |
| |
| None. |
| |
| I) Change Heartbeat |
| |
| Format: CHANGE HEARTBEAT(association id, |
| destination transport address, new state [,interval]) |
| -> result |
| |
| |
| |
| |
| Stewart Standards Track [Page 116] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Instructs the local endpoint to enable or disable heartbeat on the |
| specified destination transport address. |
| |
| The result of attempting this operation shall be returned. |
| |
| Note: Even when enabled, heartbeat will not take place if the |
| destination transport address is not idle. |
| |
| Mandatory attributes: |
| |
| o association id - local handle to the SCTP association. |
| |
| o destination transport address - specified as one of the transport |
| addresses of the peer endpoint. |
| |
| o new state - the new state of heartbeat for this destination |
| transport address (either enabled or disabled). |
| |
| Optional attributes: |
| |
| o interval - if present, indicates the frequency of the heartbeat if |
| this is to enable heartbeat on a destination transport address. |
| This value is added to the RTO of the destination transport |
| address. This value, if present, affects all destinations. |
| |
| J) Request HeartBeat |
| |
| Format: REQUESTHEARTBEAT(association id, destination transport |
| address) |
| -> result |
| |
| Instructs the local endpoint to perform a HeartBeat on the specified |
| destination transport address of the given association. The returned |
| result should indicate whether the transmission of the HEARTBEAT |
| chunk to the destination address is successful. |
| |
| Mandatory attributes: |
| |
| o association id - local handle to the SCTP association. |
| |
| o destination transport address - the transport address of the |
| association on which a heartbeat should be issued. |
| |
| K) Get SRTT Report |
| |
| Format: GETSRTTREPORT(association id, |
| destination transport address) |
| -> srtt result |
| |
| |
| |
| Stewart Standards Track [Page 117] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Instructs the local SCTP to report the current SRTT measurement on |
| the specified destination transport address of the given association. |
| The returned result can be an integer containing the most recent SRTT |
| in milliseconds. |
| |
| Mandatory attributes: |
| |
| o association id - local handle to the SCTP association. |
| |
| o destination transport address - the transport address of the |
| association on which the SRTT measurement is to be reported. |
| |
| L) Set Failure Threshold |
| |
| Format: SETFAILURETHRESHOLD(association id, destination transport |
| address, failure threshold) |
| |
| -> result |
| |
| This primitive allows the local SCTP to customize the reachability |
| failure detection threshold 'Path.Max.Retrans' for the specified |
| destination address. |
| |
| Mandatory attributes: |
| |
| o association id - local handle to the SCTP association. |
| |
| o destination transport address - the transport address of the |
| association on which the failure detection threshold is to be set. |
| |
| o failure threshold - the new value of 'Path.Max.Retrans' for the |
| destination address. |
| |
| M) Set Protocol Parameters |
| |
| Format: SETPROTOCOLPARAMETERS(association id, |
| [,destination transport address,] |
| protocol parameter list) |
| -> result |
| |
| This primitive allows the local SCTP to customize the protocol |
| parameters. |
| |
| Mandatory attributes: |
| |
| o association id - local handle to the SCTP association. |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 118] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| o protocol parameter list - the specific names and values of the |
| protocol parameters (e.g., Association.Max.Retrans; see Section |
| 15) that the SCTP user wishes to customize. |
| |
| Optional attributes: |
| |
| o destination transport address - some of the protocol parameters |
| may be set on a per destination transport address basis. |
| |
| N) Receive Unsent Message |
| |
| Format: RECEIVE_UNSENT(data retrieval id, buffer address, buffer |
| size [,stream id] [, stream sequence number] [,partial |
| flag] [,payload protocol-id]) |
| |
| o data retrieval id - the identification passed to the ULP in the |
| failure notification. |
| |
| o buffer address - the memory location indicated by the ULP to store |
| the received message. |
| |
| o buffer size - the maximum size of data to be received, in bytes. |
| |
| Optional attributes: |
| |
| o stream id - this is a return value that is set to indicate which |
| stream the data was sent to. |
| |
| o Stream Sequence Number - this value is returned indicating the |
| Stream Sequence Number that was associated with the message. |
| |
| o partial flag - if this returned flag is set to 1, then this |
| message is a partial delivery of the whole message. When this |
| flag is set, the stream id and Stream Sequence Number MUST |
| accompany this receive. When this flag is set to 0, it indicates |
| that no more deliveries will be received for this Stream Sequence |
| Number. |
| |
| o payload protocol-id - The 32 bit unsigned integer that was sent to |
| be sent to the peer indicating the type of payload protocol of the |
| received data. |
| |
| o Receive Unacknowledged Message |
| |
| Format: RECEIVE_UNACKED(data retrieval id, buffer address, buffer |
| size, [,stream id] [, stream sequence number] [,partial |
| flag] [,payload protocol-id]) |
| |
| |
| |
| |
| Stewart Standards Track [Page 119] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| o data retrieval id - the identification passed to the ULP in the |
| failure notification. |
| |
| o buffer address - the memory location indicated by the ULP to store |
| the received message. |
| |
| o buffer size - the maximum size of data to be received, in bytes. |
| |
| Optional attributes: |
| |
| o stream id - this is a return value that is set to indicate which |
| stream the data was sent to. |
| |
| o Stream Sequence Number - this value is returned indicating the |
| Stream Sequence Number that was associated with the message. |
| |
| o partial flag - if this returned flag is set to 1, then this |
| message is a partial delivery of the whole message. When this |
| flag is set, the stream id and Stream Sequence Number MUST |
| accompany this receive. When this flag is set to 0, it indicates |
| that no more deliveries will be received for this Stream Sequence |
| Number. |
| |
| o payload protocol-id - the 32-bit unsigned integer that was sent to |
| the peer indicating the type of payload protocol of the received |
| data. |
| |
| P) Destroy SCTP Instance |
| |
| Format: DESTROY(local SCTP instance name) |
| |
| o local SCTP instance name - this is the value that was passed to |
| the application in the initialize primitive and it indicates which |
| SCTP instance is to be destroyed. |
| |
| 10.2. SCTP-to-ULP |
| |
| It is assumed that the operating system or application environment |
| provides a means for the SCTP to asynchronously signal the ULP |
| process. When SCTP does signal a ULP process, certain information is |
| passed to the ULP. |
| |
| IMPLEMENTATION NOTE: In some cases, this may be done through a |
| separate socket or error channel. |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 120] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| A) DATA ARRIVE notification |
| |
| SCTP shall invoke this notification on the ULP when a user message is |
| successfully received and ready for retrieval. |
| |
| The following may optionally be passed with the notification: |
| |
| o association id - local handle to the SCTP association. |
| |
| o stream id - to indicate which stream the data is received on. |
| |
| B) SEND FAILURE notification |
| |
| If a message cannot be delivered, SCTP shall invoke this notification |
| on the ULP. |
| |
| The following may optionally be passed with the notification: |
| |
| o association id - local handle to the SCTP association. |
| |
| o data retrieval id - an identification used to retrieve unsent and |
| unacknowledged data. |
| |
| o cause code - indicating the reason of the failure, e.g., size too |
| large, message life time expiration, etc. |
| |
| o context - optional information associated with this message (see D |
| in Section 10.1). |
| |
| C) NETWORK STATUS CHANGE notification |
| |
| When a destination transport address is marked inactive (e.g., when |
| SCTP detects a failure) or marked active (e.g., when SCTP detects a |
| recovery), SCTP shall invoke this notification on the ULP. |
| |
| The following shall be passed with the notification: |
| |
| o association id - local handle to the SCTP association. |
| |
| o destination transport address - this indicates the destination |
| transport address of the peer endpoint affected by the change. |
| |
| o new-status - this indicates the new status. |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 121] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| D) COMMUNICATION UP notification |
| |
| This notification is used when SCTP becomes ready to send or receive |
| user messages, or when a lost communication to an endpoint is |
| restored. |
| |
| IMPLEMENTATION NOTE: If the ASSOCIATE primitive is implemented as a |
| blocking function call, the association parameters are returned as a |
| result of the ASSOCIATE primitive itself. In that case, |
| COMMUNICATION UP notification is optional at the association |
| initiator's side. |
| |
| The following shall be passed with the notification: |
| |
| o association id - local handle to the SCTP association. |
| |
| o status - This indicates what type of event has occurred. |
| |
| o destination transport address list - the complete set of |
| transport addresses of the peer. |
| |
| o outbound stream count - the maximum number of streams allowed to |
| be used in this association by the ULP. |
| |
| o inbound stream count - the number of streams the peer endpoint |
| has requested with this association (this may not be the same |
| number as 'outbound stream count'). |
| |
| E) COMMUNICATION LOST notification |
| |
| When SCTP loses communication to an endpoint completely (e.g., via |
| Heartbeats) or detects that the endpoint has performed an abort |
| operation, it shall invoke this notification on the ULP. |
| |
| The following shall be passed with the notification: |
| |
| o association id - local handle to the SCTP association. |
| |
| o status - this indicates what type of event has occurred; the |
| status may indicate that a failure OR a normal |
| termination event occurred in response to a shutdown or |
| abort request. |
| |
| The following may be passed with the notification: |
| |
| o data retrieval id - an identification used to retrieve unsent and |
| unacknowledged data. |
| |
| |
| |
| |
| Stewart Standards Track [Page 122] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| o last-acked - the TSN last acked by that peer endpoint. |
| |
| o last-sent - the TSN last sent to that peer endpoint. |
| |
| o Upper Layer Abort Reason - the abort reason specified in case of |
| a user-initiated abort. |
| |
| F) COMMUNICATION ERROR notification |
| |
| When SCTP receives an ERROR chunk from its peer and decides to notify |
| its ULP, it can invoke this notification on the ULP. |
| |
| The following can be passed with the notification: |
| |
| o association id - local handle to the SCTP association. |
| |
| o error info - this indicates the type of error and optionally some |
| additional information received through the ERROR chunk. |
| |
| G) RESTART notification |
| |
| When SCTP detects that the peer has restarted, it may send this |
| notification to its ULP. |
| |
| The following can be passed with the notification: |
| |
| o association id - local handle to the SCTP association. |
| |
| H) SHUTDOWN COMPLETE notification |
| |
| When SCTP completes the shutdown procedures (Section 9.2), this |
| notification is passed to the upper layer. |
| |
| The following can be passed with the notification: |
| |
| o association id - local handle to the SCTP association. |
| |
| 11. Security Considerations |
| |
| 11.1. Security Objectives |
| |
| As a common transport protocol designed to reliably carry time- |
| sensitive user messages, such as billing or signaling messages for |
| telephony services, between two networked endpoints, SCTP has the |
| following security objectives. |
| |
| - availability of reliable and timely data transport services |
| |
| |
| |
| |
| Stewart Standards Track [Page 123] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| - integrity of the user-to-user information carried by SCTP |
| |
| 11.2. SCTP Responses to Potential Threats |
| |
| SCTP may potentially be used in a wide variety of risk situations. |
| It is important for operators of systems running SCTP to analyze |
| their particular situations and decide on the appropriate counter- |
| measures. |
| |
| Operators of systems running SCTP should consult [RFC2196] for |
| guidance in securing their site. |
| |
| 11.2.1. Countering Insider Attacks |
| |
| The principles of [RFC2196] should be applied to minimize the risk of |
| theft of information or sabotage by insiders. Such procedures |
| include publication of security policies, control of access at the |
| physical, software, and network levels, and separation of services. |
| |
| 11.2.2. Protecting against Data Corruption in the Network |
| |
| Where the risk of undetected errors in datagrams delivered by the |
| lower-layer transport services is considered to be too great, |
| additional integrity protection is required. If this additional |
| protection were provided in the application layer, the SCTP header |
| would remain vulnerable to deliberate integrity attacks. While the |
| existing SCTP mechanisms for detection of packet replays are |
| considered sufficient for normal operation, stronger protections are |
| needed to protect SCTP when the operating environment contains |
| significant risk of deliberate attacks from a sophisticated |
| adversary. |
| |
| The SCTP Authentication extension SCTP-AUTH [RFC4895] MAY be used |
| when the threat environment requires stronger integrity protections, |
| but does not require confidentiality. |
| |
| 11.2.3. Protecting Confidentiality |
| |
| In most cases, the risk of breach of confidentiality applies to the |
| signaling data payload, not to the SCTP or lower-layer protocol |
| overheads. If that is true, encryption of the SCTP user data only |
| might be considered. As with the supplementary checksum service, |
| user data encryption MAY be performed by the SCTP user application. |
| Alternately, the user application MAY use an implementation-specific |
| API to request that the IP Encapsulating Security Payload (ESP) |
| [RFC4303] be used to provide confidentiality and integrity. |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 124] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Particularly for mobile users, the requirement for confidentiality |
| might include the masking of IP addresses and ports. In this case, |
| ESP SHOULD be used instead of application-level confidentiality. If |
| ESP is used to protect confidentiality of SCTP traffic, an ESP |
| cryptographic transform that includes cryptographic integrity |
| protection MUST be used, because if there is a confidentiality threat |
| there will also be a strong integrity threat. |
| |
| Whenever ESP is in use, application-level encryption is not generally |
| required. |
| |
| Regardless of where confidentiality is provided, the Internet Key |
| Exchange Protocol version 2 (IKEv2) [RFC4306] SHOULD be used for key |
| management. |
| |
| Operators should consult [RFC4301] for more information on the |
| security services available at and immediately above the Internet |
| Protocol layer. |
| |
| 11.2.4. Protecting against Blind Denial-of-Service Attacks |
| |
| A blind attack is one where the attacker is unable to intercept or |
| otherwise see the content of data flows passing to and from the |
| target SCTP node. Blind denial-of-service attacks may take the form |
| of flooding, masquerade, or improper monopolization of services. |
| |
| 11.2.4.1. Flooding |
| |
| The objective of flooding is to cause loss of service and incorrect |
| behavior at target systems through resource exhaustion, interference |
| with legitimate transactions, and exploitation of buffer-related |
| software bugs. Flooding may be directed either at the SCTP node or |
| at resources in the intervening IP Access Links or the Internet. |
| Where the latter entities are the target, flooding will manifest |
| itself as loss of network services, including potentially the breach |
| of any firewalls in place. |
| |
| In general, protection against flooding begins at the equipment |
| design level, where it includes measures such as: |
| |
| - avoiding commitment of limited resources before determining that |
| the request for service is legitimate. |
| |
| - giving priority to completion of processing in progress over the |
| acceptance of new work. |
| |
| - identification and removal of duplicate or stale queued requests |
| for service. |
| |
| |
| |
| Stewart Standards Track [Page 125] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| - not responding to unexpected packets sent to non-unicast |
| addresses. |
| |
| Network equipment should be capable of generating an alarm and log if |
| a suspicious increase in traffic occurs. The log should provide |
| information such as the identity of the incoming link and source |
| address(es) used, which will help the network or SCTP system operator |
| to take protective measures. Procedures should be in place for the |
| operator to act on such alarms if a clear pattern of abuse emerges. |
| |
| The design of SCTP is resistant to flooding attacks, particularly in |
| its use of a four-way startup handshake, its use of a cookie to defer |
| commitment of resources at the responding SCTP node until the |
| handshake is completed, and its use of a Verification Tag to prevent |
| insertion of extraneous packets into the flow of an established |
| association. |
| |
| The IP Authentication Header and Encapsulating Security Payload might |
| be useful in reducing the risk of certain kinds of denial-of-service |
| attacks. |
| |
| The use of the host name feature in the INIT chunk could be used to |
| flood a target DNS server. A large backlog of DNS queries, resolving |
| the host name received in the INIT chunk to IP addresses, could be |
| accomplished by sending INITs to multiple hosts in a given domain. |
| In addition, an attacker could use the host name feature in an |
| indirect attack on a third party by sending large numbers of INITs to |
| random hosts containing the host name of the target. In addition to |
| the strain on DNS resources, this could also result in large numbers |
| of INIT ACKs being sent to the target. One method to protect against |
| this type of attack is to verify that the IP addresses received from |
| DNS include the source IP address of the original INIT. If the list |
| of IP addresses received from DNS does not include the source IP |
| address of the INIT, the endpoint MAY silently discard the INIT. |
| This last option will not protect against the attack against the DNS. |
| |
| 11.2.4.2. Blind Masquerade |
| |
| Masquerade can be used to deny service in several ways: |
| |
| - by tying up resources at the target SCTP node to which the |
| impersonated node has limited access. For example, the target |
| node may by policy permit a maximum of one SCTP association with |
| the impersonated SCTP node. The masquerading attacker may attempt |
| to establish an association purporting to come from the |
| impersonated node so that the latter cannot do so when it requires |
| it. |
| |
| |
| |
| |
| Stewart Standards Track [Page 126] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| - by deliberately allowing the impersonation to be detected, thereby |
| provoking counter-measures that cause the impersonated node to be |
| locked out of the target SCTP node. |
| |
| - by interfering with an established association by inserting |
| extraneous content such as a SHUTDOWN request. |
| |
| SCTP reduces the risk of blind masquerade attacks through IP spoofing |
| by use of the four-way startup handshake. Because the initial |
| exchange is memory-less, no lockout mechanism is triggered by blind |
| masquerade attacks. In addition, the INIT ACK containing the State |
| Cookie is transmitted back to the IP address from which it received |
| the INIT. Thus, the attacker would not receive the INIT ACK |
| containing the State Cookie. SCTP protects against insertion of |
| extraneous packets into the flow of an established association by use |
| of the Verification Tag. |
| |
| Logging of received INIT requests and abnormalities such as |
| unexpected INIT ACKs might be considered as a way to detect patterns |
| of hostile activity. However, the potential usefulness of such |
| logging must be weighed against the increased SCTP startup processing |
| it implies, rendering the SCTP node more vulnerable to flooding |
| attacks. Logging is pointless without the establishment of operating |
| procedures to review and analyze the logs on a routine basis. |
| |
| 11.2.4.3. Improper Monopolization of Services |
| |
| Attacks under this heading are performed openly and legitimately by |
| the attacker. They are directed against fellow users of the target |
| SCTP node or of the shared resources between the attacker and the |
| target node. Possible attacks include the opening of a large number |
| of associations between the attacker's node and the target, or |
| transfer of large volumes of information within a legitimately |
| established association. |
| |
| Policy limits should be placed on the number of associations per |
| adjoining SCTP node. SCTP user applications should be capable of |
| detecting large volumes of illegitimate or "no-op" messages within a |
| given association and either logging or terminating the association |
| as a result, based on local policy. |
| |
| 11.3. SCTP Interactions with Firewalls |
| |
| It is helpful for some firewalls if they can inspect just the first |
| fragment of a fragmented SCTP packet and unambiguously determine |
| whether it corresponds to an INIT chunk (for further information, |
| please refer to [RFC1858]). Accordingly, we stress the requirements, |
| stated in Section 3.1, that (1) an INIT chunk MUST NOT be bundled |
| |
| |
| |
| Stewart Standards Track [Page 127] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| with any other chunk in a packet, and (2) a packet containing an INIT |
| chunk MUST have a zero Verification Tag. Furthermore, we require |
| that the receiver of an INIT chunk MUST enforce these rules by |
| silently discarding an arriving packet with an INIT chunk that is |
| bundled with other chunks or has a non-zero verification tag and |
| contains an INIT-chunk. |
| |
| 11.4. Protection of Non-SCTP-Capable Hosts |
| |
| To provide a non-SCTP-capable host with the same level of protection |
| against attacks as for SCTP-capable ones, all SCTP stacks MUST |
| implement the ICMP handling described in Appendix C. |
| |
| When an SCTP stack receives a packet containing multiple control or |
| DATA chunks and the processing of the packet requires the sending of |
| multiple chunks in response, the sender of the response chunk(s) MUST |
| NOT send more than one packet. If bundling is supported, multiple |
| response chunks that fit into a single packet MAY be bundled together |
| into one single response packet. If bundling is not supported, then |
| the sender MUST NOT send more than one response chunk and MUST |
| discard all other responses. Note that this rule does NOT apply to a |
| SACK chunk, since a SACK chunk is, in itself, a response to DATA and |
| a SACK does not require a response of more DATA. |
| |
| An SCTP implementation SHOULD abort the association if it receives a |
| SACK acknowledging a TSN that has not been sent. |
| |
| An SCTP implementation that receives an INIT that would require a |
| large packet in response, due to the inclusion of multiple ERROR |
| parameters, MAY (at its discretion) elect to omit some or all of the |
| ERROR parameters to reduce the size of the INIT ACK. Due to a |
| combination of the size of the COOKIE parameter and the number of |
| addresses a receiver of an INIT may be indicating to a peer, it is |
| always possible that the INIT ACK will be larger than the original |
| INIT. An SCTP implementation SHOULD attempt to make the INIT ACK as |
| small as possible to reduce the possibility of byte amplification |
| attacks. |
| |
| 12. Network Management Considerations |
| |
| The MIB module for SCTP defined in [RFC3873] applies for the version |
| of the protocol specified in this document. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 128] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 13. Recommended Transmission Control Block (TCB) Parameters |
| |
| This section details a recommended set of parameters that should be |
| contained within the TCB for an implementation. This section is for |
| illustrative purposes and should not be deemed as requirements on an |
| implementation or as an exhaustive list of all parameters inside an |
| SCTP TCB. Each implementation may need its own additional parameters |
| for optimization. |
| |
| 13.1. Parameters Necessary for the SCTP Instance |
| |
| Associations: A list of current associations and mappings to the data |
| consumers for each association. This may be in the |
| form of a hash table or other implementation-dependent |
| structure. The data consumers may be process |
| identification information such as file descriptors, |
| named pipe pointer, or table pointers dependent on how |
| SCTP is implemented. |
| |
| Secret Key: A secret key used by this endpoint to compute the MAC. |
| This SHOULD be a cryptographic quality random number |
| with a sufficient length. Discussion in RFC 4086 can |
| be helpful in selection of the key. |
| |
| Address List: The list of IP addresses that this instance has bound. |
| This information is passed to one's peer(s) in INIT and |
| INIT ACK chunks. |
| |
| SCTP Port: The local SCTP port number to which the endpoint is |
| bound. |
| |
| 13.2. Parameters Necessary per Association (i.e., the TCB) |
| |
| Peer : Tag value to be sent in every packet and is received |
| Verification: in the INIT or INIT ACK chunk. |
| Tag : |
| |
| My : Tag expected in every inbound packet and sent in the |
| Verification: INIT or INIT ACK chunk. |
| Tag : |
| |
| State : A state variable indicating what state the association |
| : is in, i.e., COOKIE-WAIT, COOKIE-ECHOED, ESTABLISHED, |
| : SHUTDOWN-PENDING, SHUTDOWN-SENT, SHUTDOWN-RECEIVED, |
| : SHUTDOWN-ACK-SENT. |
| |
| Note: No "CLOSED" state is illustrated since if a |
| association is "CLOSED" its TCB SHOULD be removed. |
| |
| |
| |
| Stewart Standards Track [Page 129] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Peer : A list of SCTP transport addresses to which the peer |
| Transport : is bound. This information is derived from the INIT or |
| Address : INIT ACK and is used to associate an inbound packet |
| List : with a given association. Normally, this information |
| : is hashed or keyed for quick lookup and access of the |
| : TCB. |
| |
| Primary : This is the current primary destination transport |
| Path : address of the peer endpoint. It may also specify a |
| : source transport address on this endpoint. |
| |
| Overall : The overall association error count. |
| Error Count : |
| |
| Overall : The threshold for this association that if the Overall |
| Error : Error Count reaches will cause this association to be |
| Threshold : torn down. |
| |
| Peer Rwnd : Current calculated value of the peer's rwnd. |
| |
| Next TSN : The next TSN number to be assigned to a new DATA chunk. |
| : This is sent in the INIT or INIT ACK chunk to the peer |
| : and incremented each time a DATA chunk is assigned a |
| : TSN (normally just prior to transmit or during |
| : fragmentation). |
| |
| Last Rcvd : This is the last TSN received in sequence. This value |
| TSN : is set initially by taking the peer's initial TSN, |
| : received in the INIT or INIT ACK chunk, and |
| : subtracting one from it. |
| |
| Mapping : An array of bits or bytes indicating which out-of- |
| Array : order TSNs have been received (relative to the |
| : Last Rcvd TSN). If no gaps exist, i.e., no out-of- |
| : order packets have been received, this array will |
| : be set to all zero. This structure may be in the |
| : form of a circular buffer or bit array. |
| |
| Ack State : This flag indicates if the next received packet |
| : is to be responded to with a SACK. This is initialized |
| : to 0. When a packet is received it is incremented. |
| : If this value reaches 2 or more, a SACK is sent and the |
| : value is reset to 0. Note: This is used only when no |
| : DATA chunks are received out of order. When DATA |
| : chunks are out of order, SACKs are not delayed (see |
| : Section 6). |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 130] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Inbound : An array of structures to track the inbound streams, |
| Streams : normally including the next sequence number expected |
| : and possibly the stream number. |
| |
| Outbound : An array of structures to track the outbound streams, |
| Streams : normally including the next sequence number to |
| : be sent on the stream. |
| |
| Reasm Queue : A reassembly queue. |
| |
| Local : The list of local IP addresses bound in to this |
| Transport : association. |
| Address : |
| List : |
| |
| Association : The smallest PMTU discovered for all of the |
| PMTU : peer's transport addresses. |
| |
| 13.3. Per Transport Address Data |
| |
| For each destination transport address in the peer's address list |
| derived from the INIT or INIT ACK chunk, a number of data elements |
| need to be maintained including: |
| |
| Error Count : The current error count for this destination. |
| |
| Error : Current error threshold for this destination, i.e., |
| Threshold : what value marks the destination down if error count |
| : reaches this value. |
| |
| cwnd : The current congestion window. |
| |
| ssthresh : The current ssthresh value. |
| |
| RTO : The current retransmission timeout value. |
| |
| SRTT : The current smoothed round-trip time. |
| |
| RTTVAR : The current RTT variation. |
| |
| partial : The tracking method for increase of cwnd when in |
| bytes acked : congestion avoidance mode (see Section 7.2.2). |
| |
| state : The current state of this destination, i.e., DOWN, UP, |
| : ALLOW-HB, NO-HEARTBEAT, etc. |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 131] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| PMTU : The current known path MTU. |
| |
| Per : A timer used by each destination. |
| Destination : |
| Timer : |
| |
| RTO-Pending : A flag used to track if one of the DATA chunks sent to |
| : this address is currently being used to compute an |
| : RTT. If this flag is 0, the next DATA chunk sent to |
| : this destination should be used to compute an RTT and |
| : this flag should be set. Every time the RTT |
| : calculation completes (i.e., the DATA chunk is SACK'd), |
| : clear this flag. |
| |
| last-time : The time to which this destination was last sent. |
| : This can be to determine if a HEARTBEAT is needed. |
| |
| 13.4. General Parameters Needed |
| |
| Out Queue : A queue of outbound DATA chunks. |
| |
| In Queue : A queue of inbound DATA chunks. |
| |
| 14. IANA Considerations |
| |
| SCTP defines three registries that IANA maintains: |
| |
| - through definition of additional chunk types, |
| - through definition of additional parameter types, or |
| - through definition of additional cause codes within ERROR chunks. |
| |
| SCTP requires that the IANA Port Numbers registry be opened for SCTP |
| port registrations, Section 14.5 describes how. An IESG-appointed |
| Expert Reviewer supports IANA in evaluating SCTP port allocation |
| requests. |
| |
| 14.1. IETF-Defined Chunk Extension |
| |
| The assignment of new chunk parameter type codes is done through an |
| IETF Consensus action, as defined in [RFC2434]. Documentation of the |
| chunk parameter MUST contain the following information: |
| |
| a) A long and short name for the new chunk type. |
| |
| b) A detailed description of the structure of the chunk, which MUST |
| conform to the basic structure defined in Section 3.2. |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 132] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| c) A detailed definition and description of intended use of each |
| field within the chunk, including the chunk flags if any. |
| |
| d) A detailed procedural description of the use of the new chunk type |
| within the operation of the protocol. |
| |
| The last chunk type (255) is reserved for future extension if |
| necessary. |
| |
| 14.2. IETF-Defined Chunk Parameter Extension |
| |
| The assignment of new chunk parameter type codes is done through an |
| IETF Consensus action as defined in [RFC2434]. Documentation of the |
| chunk parameter MUST contain the following information: |
| |
| a) Name of the parameter type. |
| |
| b) Detailed description of the structure of the parameter field. |
| This structure MUST conform to the general Type-Length-Value |
| format described in Section 3.2.1. |
| |
| c) Detailed definition of each component of the parameter value. |
| |
| d) Detailed description of the intended use of this parameter type, |
| and an indication of whether and under what circumstances multiple |
| instances of this parameter type may be found within the same |
| chunk. |
| |
| e) Each parameter type MUST be unique across all chunks. |
| |
| 14.3. IETF-Defined Additional Error Causes |
| |
| Additional cause codes may be allocated in the range 11 to 65535 |
| through a Specification Required action as defined in [RFC2434]. |
| Provided documentation must include the following information: |
| |
| a) Name of the error condition. |
| |
| b) Detailed description of the conditions under which an SCTP |
| endpoint should issue an ERROR (or ABORT) with this cause code. |
| |
| c) Expected action by the SCTP endpoint that receives an ERROR (or |
| ABORT) chunk containing this cause code. |
| |
| d) Detailed description of the structure and content of data fields |
| that accompany this cause code. |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 133] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| The initial word (32 bits) of a cause code parameter MUST conform to |
| the format shown in Section 3.3.10, i.e.: |
| |
| - first 2 bytes contain the cause code value |
| - last 2 bytes contain the length of the cause parameter. |
| |
| 14.4. Payload Protocol Identifiers |
| |
| Except for value 0, which is reserved by SCTP to indicate an |
| unspecified payload protocol identifier in a DATA chunk, SCTP will |
| not be responsible for standardizing or verifying any payload |
| protocol identifiers; SCTP simply receives the identifier from the |
| upper layer and carries it with the corresponding payload data. |
| |
| The upper layer, i.e., the SCTP user, SHOULD standardize any specific |
| protocol identifier with IANA if it is so desired. The use of any |
| specific payload protocol identifier is out of the scope of SCTP. |
| |
| 14.5. Port Numbers Registry |
| |
| SCTP services may use contact port numbers to provide service to |
| unknown callers, as in TCP and UDP. IANA is therefore requested to |
| open the existing Port Numbers registry for SCTP using the following |
| rules, which we intend to mesh well with existing Port Numbers |
| registration procedures. An IESG-appointed Expert Reviewer supports |
| IANA in evaluating SCTP port allocation requests, according to the |
| procedure defined in [RFC2434]. |
| |
| Port numbers are divided into three ranges. The Well Known Ports are |
| those from 0 through 1023, the Registered Ports are those from 1024 |
| through 49151, and the Dynamic and/or Private Ports are those from |
| 49152 through 65535. Well Known and Registered Ports are intended |
| for use by server applications that desire a default contact point on |
| a system. On most systems, Well Known Ports can only be used by |
| system (or root) processes or by programs executed by privileged |
| users, while Registered Ports can be used by ordinary user processes |
| or programs executed by ordinary users. Dynamic and/or Private Ports |
| are intended for temporary use, including client-side ports, out-of- |
| band negotiated ports, and application testing prior to registration |
| of a dedicated port; they MUST NOT be registered. |
| |
| The Port Numbers registry should accept registrations for SCTP ports |
| in the Well Known Ports and Registered Ports ranges. Well Known and |
| Registered Ports SHOULD NOT be used without registration. Although |
| in some cases -- such as porting an application from TCP to SCTP -- |
| it may seem natural to use an SCTP port before registration |
| completes, we emphasize that IANA will not guarantee registration of |
| |
| |
| |
| |
| Stewart Standards Track [Page 134] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| particular Well Known and Registered Ports. Registrations should be |
| requested as early as possible. |
| |
| Each port registration SHALL include the following information: |
| |
| o A short port name, consisting entirely of letters (A-Z and a-z), |
| digits (0-9), and punctuation characters from "-_+./*" (not |
| including the quotes). |
| |
| o The port number that is requested for registration. |
| |
| o A short English phrase describing the port's purpose. |
| |
| o Name and contact information for the person or entity performing |
| the registration, and possibly a reference to a document defining |
| the port's use. Registrations coming from IETF working groups |
| need only name the working group, but indicating a contact person |
| is recommended. |
| |
| Registrants are encouraged to follow these guidelines when submitting |
| a registration. |
| |
| o A port name SHOULD NOT be registered for more than one SCTP port |
| number. |
| |
| o A port name registered for TCP MAY be registered for SCTP as well. |
| Any such registration SHOULD use the same port number as the |
| existing TCP registration. |
| |
| o Concrete intent to use a port SHOULD precede port registration. |
| For example, existing TCP ports SHOULD NOT be registered in |
| advance of any intent to use those ports for SCTP. |
| |
| This document registers the following ports. (These registrations |
| should be considered models to follow for future allocation |
| requests.) |
| |
| discard 9/sctp Discard # IETF TSVWG |
| # Randall Stewart <rrs@cisco.com> |
| # [RFC4960] |
| |
| The discard service, which accepts SCTP connections on port |
| 9, discards all incoming application data and sends no data |
| in response. Thus, SCTP's discard port is analogous to |
| TCP's discard port, and might be used to check the health |
| of an SCTP stack. |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 135] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| ftp-data 20/sctp FTP # IETF TSVWG |
| # Randall Stewart <rrs@cisco.com> |
| # [RFC4960] |
| |
| ftp 21/sctp FTP # IETF TSVWG |
| # Randall Stewart <rrs@cisco.com> |
| # [RFC4960] |
| |
| File Transfer Protocol (FTP) data (20) and control ports |
| (21). |
| |
| ssh 22/sctp SSH # IETF TSVWG |
| # Randall Stewart <rrs@cisco.com> |
| # [RFC4960] |
| |
| The Secure Shell (SSH) remote login service, which allows |
| secure shell logins to a host. |
| |
| http 80/sctp HTTP # IETF TSVWG |
| # Randall Stewart <rrs@cisco.com> |
| # [RFC4960] |
| |
| World Wide Web HTTP over SCTP. |
| |
| bgp 179/sctp BGP # IETF TSVWG |
| # Randall Stewart <rrs@cisco.com> |
| # [RFC4960] |
| |
| Border Gateway Protocol over SCTP. |
| |
| https 443/sctp HTTPS # IETF TSVWG |
| # Randall Stewart <rrs@cisco.com> |
| # [RFC4960] |
| |
| World Wide Web HTTP over TLS/SSL over SCTP. |
| |
| 15. Suggested SCTP Protocol Parameter Values |
| |
| The following protocol parameters are RECOMMENDED: |
| |
| RTO.Initial - 3 seconds |
| RTO.Min - 1 second |
| RTO.Max - 60 seconds |
| Max.Burst - 4 |
| RTO.Alpha - 1/8 |
| RTO.Beta - 1/4 |
| Valid.Cookie.Life - 60 seconds |
| Association.Max.Retrans - 10 attempts |
| |
| |
| |
| Stewart Standards Track [Page 136] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Path.Max.Retrans - 5 attempts (per destination address) |
| Max.Init.Retransmits - 8 attempts |
| HB.interval - 30 seconds |
| HB.Max.Burst - 1 |
| |
| IMPLEMENTATION NOTE: The SCTP implementation may allow ULP to |
| customize some of these protocol parameters (see Section 10). |
| |
| Note: RTO.Min SHOULD be set as recommended above. |
| |
| 16. Acknowledgements |
| |
| An undertaking represented by this updated document is not a small |
| feat and represents the summation of the initial authors of RFC 2960: |
| Q. Xie, K. Morneault, C. Sharp, H. Schwarzbauer, T. Taylor, I. |
| Rytina, M. Kalla, L. Zhang, and V. Paxson. |
| |
| Add to that, the comments from everyone who contributed to the |
| original RFC: |
| |
| Mark Allman, R.J. Atkinson, Richard Band, Scott Bradner, Steve |
| Bellovin, Peter Butler, Ram Dantu, R. Ezhirpavai, Mike Fisk, Sally |
| Floyd, Atsushi Fukumoto, Matt Holdrege, Henry Houh, Christian |
| Huitema, Gary Lehecka, Jonathan Lee, David Lehmann, John Loughney, |
| Daniel Luan, Barry Nagelberg, Thomas Narten, Erik Nordmark, Lyndon |
| Ong, Shyamal Prasad, Kelvin Porter, Heinz Prantner, Jarno Rajahalme, |
| Raymond E. Reeves, Renee Revis, Ivan Arias Rodriguez, A. Sankar, Greg |
| Sidebottom, Brian Wyld, La Monte Yarroll, and many others for their |
| invaluable comments. |
| |
| Then, add the authors of the SCTP implementor's guide, I. Arias- |
| Rodriguez, K. Poon, A. Caro, and M. Tuexen. |
| |
| Then add to these the efforts of all the subsequent seven SCTP |
| interoperability tests and those who commented on RFC 4460 as shown |
| in its acknowledgements: |
| |
| Barry Zuckerman, La Monte Yarroll, Qiaobing Xie, Wang Xiaopeng, |
| Jonathan Wood, Jeff Waskow, Mike Turner, John Townsend, Sabina |
| Torrente, Cliff Thomas, Yuji Suzuki, Manoj Solanki, Sverre Slotte, |
| Keyur Shah, Jan Rovins, Ben Robinson, Renee Revis, Ian Periam, RC |
| Monee, Sanjay Rao, Sujith Radhakrishnan, Heinz Prantner, Biren Patel, |
| Nathalie Mouellic, Mitch Miers, Bernward Meyknecht, Stan McClellan, |
| Oliver Mayor, Tomas Orti Martin, Sandeep Mahajan, David Lehmann, |
| Jonathan Lee, Philippe Langlois, Karl Knutson, Joe Keller, Gareth |
| Keily, Andreas Jungmaier, Janardhan Iyengar, Mutsuya Irie, John |
| Hebert, Kausar Hassan, Fred Hasle, Dan Harrison, Jon Grim, Laurent |
| Glaude, Steven Furniss, Atsushi Fukumoto, Ken Fujita, Steve Dimig, |
| |
| |
| |
| Stewart Standards Track [Page 137] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Thomas Curran, Serkan Cil, Melissa Campbell, Peter Butler, Rob |
| Brennan, Harsh Bhondwe, Brian Bidulock, Caitlin Bestler, Jon Berger, |
| Robby Benedyk, Stephen Baucke, Sandeep Balani, and Ronnie Sellar. |
| |
| A special thanks to Mark Allman, who should actually be a co-author |
| for his work on the max-burst, but managed to wiggle out due to a |
| technicality. Also, we would like to acknowledge Lyndon Ong and Phil |
| Conrad for their valuable input and many contributions. |
| |
| And finally, you have this document, and those who have commented |
| upon that including Alfred Hoenes and Ronnie Sellars. |
| |
| My thanks cannot be adequately expressed to all of you who have |
| participated in the coding, testing, and updating process of this |
| document. All I can say is, Thank You! |
| |
| Randall Stewart - Editor |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 138] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Appendix A. Explicit Congestion Notification |
| |
| ECN [RFC3168] describes a proposed extension to IP that details a |
| method to become aware of congestion outside of datagram loss. This |
| is an optional feature that an implementation MAY choose to add to |
| SCTP. This appendix details the minor differences implementers will |
| need to be aware of if they choose to implement this feature. In |
| general, [RFC3168] should be followed with the following exceptions. |
| |
| Negotiation: |
| |
| [RFC3168] details negotiation of ECN during the SYN and SYN-ACK |
| stages of a TCP connection. The sender of the SYN sets 2 bits in the |
| TCP flags, and the sender of the SYN-ACK sets only 1 bit. The |
| reasoning behind this is to ensure that both sides are truly ECN |
| capable. For SCTP, this is not necessary. To indicate that an |
| endpoint is ECN capable, an endpoint SHOULD add to the INIT and or |
| INIT ACK chunk the TLV reserved for ECN. This TLV contains no |
| parameters, and thus has the following format: |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Parameter Type = 32768 | Parameter Length = 4 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| ECN-Echo: |
| |
| [RFC3168] details a specific bit for a receiver to send back in its |
| TCP acknowledgements to notify the sender of the Congestion |
| Experienced (CE) bit having arrived from the network. For SCTP, this |
| same indication is made by including the ECNE chunk. This chunk |
| contains one data element, i.e., the lowest TSN associated with the |
| IP datagram marked with the CE bit, and looks 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Chunk Type=12 | Flags=00000000| Chunk Length = 8 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Lowest TSN Number | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Note: The ECNE is considered a Control chunk. |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 139] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| CWR: |
| |
| [RFC3168] details a specific bit for a sender to send in the header |
| of its next outbound TCP segment to indicate to its peer that it has |
| reduced its congestion window. This is termed the CWR bit. For |
| SCTP, the same indication is made by including the CWR chunk. This |
| chunk contains one data element, i.e., the TSN number that was sent |
| in the ECNE chunk. This element represents the lowest TSN number in |
| the datagram that was originally marked with the CE bit. |
| |
| 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 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Chunk Type=13 | Flags=00000000| Chunk Length = 8 | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Lowest TSN Number | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Note: The CWR is considered a Control chunk. |
| |
| Appendix B. CRC32c Checksum Calculation |
| |
| We define a 'reflected value' as one that is the opposite of the |
| normal bit order of the machine. The 32-bit CRC (Cyclic Redundancy |
| Check) is calculated as described for CRC32c and uses the polynomial |
| code 0x11EDC6F41 (Castagnoli93) or x^32+x^28+x^27+x^26+x^25 |
| +x^23+x^22+x^20+x^19+x^18+ x^14+x^13+x^11+x^10+x^9+x^8+x^6+x^0. The |
| CRC is computed using a procedure similar to ETHERNET CRC [ITU32], |
| modified to reflect transport-level usage. |
| |
| CRC computation uses polynomial division. A message bit-string M is |
| transformed to a polynomial, M(X), and the CRC is calculated from |
| M(X) using polynomial arithmetic. |
| |
| When CRCs are used at the link layer, the polynomial is derived from |
| on-the-wire bit ordering: the first bit 'on the wire' is the high- |
| order coefficient. Since SCTP is a transport-level protocol, it |
| cannot know the actual serial-media bit ordering. Moreover, |
| different links in the path between SCTP endpoints may use different |
| link-level bit orders. |
| |
| A convention must therefore be established for mapping SCTP transport |
| messages to polynomials for purposes of CRC computation. The bit- |
| ordering for mapping SCTP messages to polynomials is that bytes are |
| taken most-significant first, but within each byte, bits are taken |
| least-significant first. The first byte of the message provides the |
| eight highest coefficients. Within each byte, the least-significant |
| SCTP bit gives the most-significant polynomial coefficient within |
| |
| |
| |
| Stewart Standards Track [Page 140] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| that byte, and the most-significant SCTP bit is the least-significant |
| polynomial coefficient in that byte. (This bit ordering is sometimes |
| called 'mirrored' or 'reflected' [WILLIAMS93].) CRC polynomials are |
| to be transformed back into SCTP transport-level byte values, using a |
| consistent mapping. |
| |
| The SCTP transport-level CRC value should be calculated as follows: |
| |
| - CRC input data are assigned to a byte stream, numbered from 0 to |
| N-1. |
| |
| - The transport-level byte stream is mapped to a polynomial value. |
| An N-byte PDU with j bytes numbered 0 to N-1 is considered as |
| coefficients of a polynomial M(x) of order 8N-1, with bit 0 of |
| byte j being coefficient x^(8(N-j)-8), and bit 7 of byte j being |
| coefficient x^(8(N-j)-1). |
| |
| - The CRC remainder register is initialized with all 1s and the CRC |
| is computed with an algorithm that simultaneously multiplies by |
| x^32 and divides by the CRC polynomial. |
| |
| - The polynomial is multiplied by x^32 and divided by G(x), the |
| generator polynomial, producing a remainder R(x) of degree less |
| than or equal to 31. |
| |
| - The coefficients of R(x) are considered a 32-bit sequence. |
| |
| - The bit sequence is complemented. The result is the CRC |
| polynomial. |
| |
| - The CRC polynomial is mapped back into SCTP transport-level bytes. |
| The coefficient of x^31 gives the value of bit 7 of SCTP byte 0, |
| and the coefficient of x^24 gives the value of bit 0 of byte 0. |
| The coefficient of x^7 gives bit 7 of byte 3, and the coefficient |
| of x^0 gives bit 0 of byte 3. The resulting 4-byte transport- |
| level sequence is the 32-bit SCTP checksum value. |
| |
| IMPLEMENTATION NOTE: Standards documents, textbooks, and vendor |
| literature on CRCs often follow an alternative formulation, in which |
| the register used to hold the remainder of the long-division |
| algorithm is initialized to zero rather than all-1s, and instead the |
| first 32 bits of the message are complemented. The long-division |
| algorithm used in our formulation is specified such that the initial |
| multiplication by 2^32 and the long-division are combined into one |
| simultaneous operation. For such algorithms, and for messages longer |
| than 64 bits, the two specifications are precisely equivalent. That |
| equivalence is the intent of this document. |
| |
| |
| |
| |
| Stewart Standards Track [Page 141] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Implementors of SCTP are warned that both specifications are to be |
| found in the literature, sometimes with no restriction on the long- |
| division algorithm. The choice of formulation in this document is to |
| permit non-SCTP usage, where the same CRC algorithm may be used to |
| protect messages shorter than 64 bits. |
| |
| There may be a computational advantage in validating the association |
| against the Verification Tag, prior to performing a checksum, as |
| invalid tags will result in the same action as a bad checksum in most |
| cases. The exceptions for this technique would be INIT and some |
| SHUTDOWN-COMPLETE exchanges, as well as a stale COOKIE ECHO. These |
| special-case exchanges must represent small packets and will minimize |
| the effect of the checksum calculation. |
| |
| Appendix C. ICMP Handling |
| |
| Whenever an ICMP message is received by an SCTP endpoint, the |
| following procedures MUST be followed to ensure proper utilization of |
| the information being provided by layer 3. |
| |
| ICMP1) An implementation MAY ignore all ICMPv4 messages where the |
| type field is not set to "Destination Unreachable". |
| |
| ICMP2) An implementation MAY ignore all ICMPv6 messages where the |
| type field is not "Destination Unreachable", "Parameter |
| Problem",, or "Packet Too Big". |
| |
| ICMP3) An implementation MAY ignore any ICMPv4 messages where the |
| code does not indicate "Protocol Unreachable" or |
| "Fragmentation Needed". |
| |
| ICMP4) An implementation MAY ignore all ICMPv6 messages of type |
| "Parameter Problem" if the code is not "Unrecognized Next |
| Header Type Encountered". |
| |
| ICMP5) An implementation MUST use the payload of the ICMP message (v4 |
| or v6) to locate the association that sent the message to |
| which ICMP is responding. If the association cannot be found, |
| an implementation SHOULD ignore the ICMP message. |
| |
| ICMP6) An implementation MUST validate that the Verification Tag |
| contained in the ICMP message matches the Verification Tag of |
| the peer. If the Verification Tag is not 0 and does NOT |
| match, discard the ICMP message. If it is 0 and the ICMP |
| message contains enough bytes to verify that the chunk type is |
| an INIT chunk and that the Initiate Tag matches the tag of the |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 142] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| peer, continue with ICMP7. If the ICMP message is too short |
| or the chunk type or the Initiate Tag does not match, silently |
| discard the packet. |
| |
| ICMP7) If the ICMP message is either a v6 "Packet Too Big" or a v4 |
| "Fragmentation Needed", an implementation MAY process this |
| information as defined for PATH MTU discovery. |
| |
| ICMP8) If the ICMP code is an "Unrecognized Next Header Type |
| Encountered" or a "Protocol Unreachable", an implementation |
| MUST treat this message as an abort with the T bit set if it |
| does not contain an INIT chunk. If it does contain an INIT |
| chunk and the association is in the COOKIE-WAIT state, handle |
| the ICMP message like an ABORT. |
| |
| ICMP9) If the ICMPv6 code is "Destination Unreachable", the |
| implementation MAY mark the destination into the unreachable |
| state or alternatively increment the path error counter. |
| |
| Note that these procedures differ from [RFC1122] and from its |
| requirements for processing of port-unreachable messages and the |
| requirements that an implementation MUST abort associations in |
| response to a "protocol unreachable" message. Port-unreachable |
| messages are not processed, since an implementation will send an |
| ABORT, not a port unreachable. The stricter handling of the |
| "protocol unreachable" message is due to security concerns for hosts |
| that do NOT support SCTP. |
| |
| The following non-normative sample code is taken from an open-source |
| CRC generator [WILLIAMS93], using the "mirroring" technique and |
| yielding a lookup table for SCTP CRC32c with 256 entries, each 32 |
| bits wide. While neither especially slow nor especially fast, as |
| software table-lookup CRCs go, it has the advantage of working on |
| both big-endian and little-endian CPUs, using the same (host-order) |
| lookup tables, and using only the predefined ntohl() and htonl() |
| operations. The code is somewhat modified from [WILLIAMS93], to |
| ensure portability between big-endian and little-endian |
| architectures. (Note that if the byte endian-ness of the target |
| architecture is known to be little-endian, the final bit-reversal and |
| byte-reversal steps can be folded into a single operation.) |
| |
| /*************************************************************/ |
| /* Note Definition for Ross Williams table generator would */ |
| /* be: TB_WIDTH=4, TB_POLLY=0x1EDC6F41, TB_REVER=TRUE */ |
| /* For Mr. Williams direct calculation code use the settings */ |
| /* cm_width=32, cm_poly=0x1EDC6F41, cm_init=0xFFFFFFFF, */ |
| /* cm_refin=TRUE, cm_refot=TRUE, cm_xorort=0x00000000 */ |
| /*************************************************************/ |
| |
| |
| |
| Stewart Standards Track [Page 143] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| /* Example of the crc table file */ |
| #ifndef __crc32cr_table_h__ |
| #define __crc32cr_table_h__ |
| |
| #define CRC32C_POLY 0x1EDC6F41 |
| #define CRC32C(c,d) (c=(c>>8)^crc_c[(c^(d))&0xFF]) |
| |
| unsigned long crc_c[256] = |
| { |
| 0x00000000L, 0xF26B8303L, 0xE13B70F7L, 0x1350F3F4L, |
| 0xC79A971FL, 0x35F1141CL, 0x26A1E7E8L, 0xD4CA64EBL, |
| 0x8AD958CFL, 0x78B2DBCCL, 0x6BE22838L, 0x9989AB3BL, |
| 0x4D43CFD0L, 0xBF284CD3L, 0xAC78BF27L, 0x5E133C24L, |
| 0x105EC76FL, 0xE235446CL, 0xF165B798L, 0x030E349BL, |
| 0xD7C45070L, 0x25AFD373L, 0x36FF2087L, 0xC494A384L, |
| 0x9A879FA0L, 0x68EC1CA3L, 0x7BBCEF57L, 0x89D76C54L, |
| 0x5D1D08BFL, 0xAF768BBCL, 0xBC267848L, 0x4E4DFB4BL, |
| 0x20BD8EDEL, 0xD2D60DDDL, 0xC186FE29L, 0x33ED7D2AL, |
| 0xE72719C1L, 0x154C9AC2L, 0x061C6936L, 0xF477EA35L, |
| 0xAA64D611L, 0x580F5512L, 0x4B5FA6E6L, 0xB93425E5L, |
| 0x6DFE410EL, 0x9F95C20DL, 0x8CC531F9L, 0x7EAEB2FAL, |
| 0x30E349B1L, 0xC288CAB2L, 0xD1D83946L, 0x23B3BA45L, |
| |
| 0xF779DEAEL, 0x05125DADL, 0x1642AE59L, 0xE4292D5AL, |
| 0xBA3A117EL, 0x4851927DL, 0x5B016189L, 0xA96AE28AL, |
| 0x7DA08661L, 0x8FCB0562L, 0x9C9BF696L, 0x6EF07595L, |
| 0x417B1DBCL, 0xB3109EBFL, 0xA0406D4BL, 0x522BEE48L, |
| 0x86E18AA3L, 0x748A09A0L, 0x67DAFA54L, 0x95B17957L, |
| 0xCBA24573L, 0x39C9C670L, 0x2A993584L, 0xD8F2B687L, |
| 0x0C38D26CL, 0xFE53516FL, 0xED03A29BL, 0x1F682198L, |
| 0x5125DAD3L, 0xA34E59D0L, 0xB01EAA24L, 0x42752927L, |
| 0x96BF4DCCL, 0x64D4CECFL, 0x77843D3BL, 0x85EFBE38L, |
| 0xDBFC821CL, 0x2997011FL, 0x3AC7F2EBL, 0xC8AC71E8L, |
| 0x1C661503L, 0xEE0D9600L, 0xFD5D65F4L, 0x0F36E6F7L, |
| 0x61C69362L, 0x93AD1061L, 0x80FDE395L, 0x72966096L, |
| 0xA65C047DL, 0x5437877EL, 0x4767748AL, 0xB50CF789L, |
| 0xEB1FCBADL, 0x197448AEL, 0x0A24BB5AL, 0xF84F3859L, |
| 0x2C855CB2L, 0xDEEEDFB1L, 0xCDBE2C45L, 0x3FD5AF46L, |
| 0x7198540DL, 0x83F3D70EL, 0x90A324FAL, 0x62C8A7F9L, |
| 0xB602C312L, 0x44694011L, 0x5739B3E5L, 0xA55230E6L, |
| 0xFB410CC2L, 0x092A8FC1L, 0x1A7A7C35L, 0xE811FF36L, |
| 0x3CDB9BDDL, 0xCEB018DEL, 0xDDE0EB2AL, 0x2F8B6829L, |
| 0x82F63B78L, 0x709DB87BL, 0x63CD4B8FL, 0x91A6C88CL, |
| 0x456CAC67L, 0xB7072F64L, 0xA457DC90L, 0x563C5F93L, |
| 0x082F63B7L, 0xFA44E0B4L, 0xE9141340L, 0x1B7F9043L, |
| 0xCFB5F4A8L, 0x3DDE77ABL, 0x2E8E845FL, 0xDCE5075CL, |
| 0x92A8FC17L, 0x60C37F14L, 0x73938CE0L, 0x81F80FE3L, |
| 0x55326B08L, 0xA759E80BL, 0xB4091BFFL, 0x466298FCL, |
| |
| |
| |
| Stewart Standards Track [Page 144] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| 0x1871A4D8L, 0xEA1A27DBL, 0xF94AD42FL, 0x0B21572CL, |
| 0xDFEB33C7L, 0x2D80B0C4L, 0x3ED04330L, 0xCCBBC033L, |
| 0xA24BB5A6L, 0x502036A5L, 0x4370C551L, 0xB11B4652L, |
| 0x65D122B9L, 0x97BAA1BAL, 0x84EA524EL, 0x7681D14DL, |
| 0x2892ED69L, 0xDAF96E6AL, 0xC9A99D9EL, 0x3BC21E9DL, |
| 0xEF087A76L, 0x1D63F975L, 0x0E330A81L, 0xFC588982L, |
| 0xB21572C9L, 0x407EF1CAL, 0x532E023EL, 0xA145813DL, |
| 0x758FE5D6L, 0x87E466D5L, 0x94B49521L, 0x66DF1622L, |
| 0x38CC2A06L, 0xCAA7A905L, 0xD9F75AF1L, 0x2B9CD9F2L, |
| 0xFF56BD19L, 0x0D3D3E1AL, 0x1E6DCDEEL, 0xEC064EEDL, |
| 0xC38D26C4L, 0x31E6A5C7L, 0x22B65633L, 0xD0DDD530L, |
| 0x0417B1DBL, 0xF67C32D8L, 0xE52CC12CL, 0x1747422FL, |
| 0x49547E0BL, 0xBB3FFD08L, 0xA86F0EFCL, 0x5A048DFFL, |
| 0x8ECEE914L, 0x7CA56A17L, 0x6FF599E3L, 0x9D9E1AE0L, |
| 0xD3D3E1ABL, 0x21B862A8L, 0x32E8915CL, 0xC083125FL, |
| 0x144976B4L, 0xE622F5B7L, 0xF5720643L, 0x07198540L, |
| 0x590AB964L, 0xAB613A67L, 0xB831C993L, 0x4A5A4A90L, |
| 0x9E902E7BL, 0x6CFBAD78L, 0x7FAB5E8CL, 0x8DC0DD8FL, |
| 0xE330A81AL, 0x115B2B19L, 0x020BD8EDL, 0xF0605BEEL, |
| 0x24AA3F05L, 0xD6C1BC06L, 0xC5914FF2L, 0x37FACCF1L, |
| 0x69E9F0D5L, 0x9B8273D6L, 0x88D28022L, 0x7AB90321L, |
| 0xAE7367CAL, 0x5C18E4C9L, 0x4F48173DL, 0xBD23943EL, |
| 0xF36E6F75L, 0x0105EC76L, 0x12551F82L, 0xE03E9C81L, |
| |
| 0x34F4F86AL, 0xC69F7B69L, 0xD5CF889DL, 0x27A40B9EL, |
| 0x79B737BAL, 0x8BDCB4B9L, 0x988C474DL, 0x6AE7C44EL, |
| 0xBE2DA0A5L, 0x4C4623A6L, 0x5F16D052L, 0xAD7D5351L, |
| }; |
| |
| #endif |
| |
| /* Example of table build routine */ |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| #define OUTPUT_FILE "crc32cr.h" |
| #define CRC32C_POLY 0x1EDC6F41L |
| FILE *tf; |
| unsigned long |
| reflect_32 (unsigned long b) |
| { |
| int i; |
| unsigned long rw = 0L; |
| |
| for (i = 0; i < 32; i++){ |
| if (b & 1) |
| rw |= 1 << (31 - i); |
| |
| |
| |
| Stewart Standards Track [Page 145] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| b >>= 1; |
| } |
| return (rw); |
| } |
| |
| unsigned long |
| build_crc_table (int index) |
| { |
| int i; |
| unsigned long rb; |
| |
| rb = reflect_32 (index); |
| |
| for (i = 0; i < 8; i++){ |
| if (rb & 0x80000000L) |
| rb = (rb << 1) ^ CRC32C_POLY; |
| else |
| rb <<= 1; |
| } |
| return (reflect_32 (rb)); |
| } |
| |
| main () |
| { |
| int i; |
| |
| printf ("\nGenerating CRC-32c table file <%s>\n", |
| OUTPUT_FILE); |
| if ((tf = fopen (OUTPUT_FILE, "w")) == NULL){ |
| printf ("Unable to open %s\n", OUTPUT_FILE); |
| exit (1); |
| } |
| fprintf (tf, "#ifndef __crc32cr_table_h__\n"); |
| fprintf (tf, "#define __crc32cr_table_h__\n\n"); |
| fprintf (tf, "#define CRC32C_POLY 0x%08lX\n", |
| CRC32C_POLY); |
| fprintf (tf, |
| "#define CRC32C(c,d) (c=(c>>8)^crc_c[(c^(d))&0xFF])\n"); |
| fprintf (tf, "\nunsigned long crc_c[256] =\n{\n"); |
| for (i = 0; i < 256; i++){ |
| fprintf (tf, "0x%08lXL, ", build_crc_table (i)); |
| if ((i & 3) == 3) |
| fprintf (tf, "\n"); |
| } |
| fprintf (tf, "};\n\n#endif\n"); |
| |
| if (fclose (tf) != 0) |
| printf ("Unable to close <%s>." OUTPUT_FILE); |
| |
| |
| |
| Stewart Standards Track [Page 146] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| else |
| printf ("\nThe CRC-32c table has been written to <%s>.\n", |
| OUTPUT_FILE); |
| } |
| |
| /* Example of crc insertion */ |
| |
| #include "crc32cr.h" |
| |
| unsigned long |
| generate_crc32c(unsigned char *buffer, unsigned int length) |
| { |
| unsigned int i; |
| unsigned long crc32 = ~0L; |
| unsigned long result; |
| unsigned char byte0,byte1,byte2,byte3; |
| |
| for (i = 0; i < length; i++){ |
| CRC32C(crc32, buffer[i]); |
| } |
| |
| result = ~crc32; |
| |
| /* result now holds the negated polynomial remainder; |
| * since the table and algorithm is "reflected" [williams95]. |
| * That is, result has the same value as if we mapped the message |
| * to a polynomial, computed the host-bit-order polynomial |
| * remainder, performed final negation, then did an end-for-end |
| * bit-reversal. |
| * Note that a 32-bit bit-reversal is identical to four inplace |
| * 8-bit reversals followed by an end-for-end byteswap. |
| * In other words, the bytes of each bit are in the right order, |
| * but the bytes have been byteswapped. So we now do an explicit |
| * byteswap. On a little-endian machine, this byteswap and |
| * the final ntohl cancel out and could be elided. |
| */ |
| |
| byte0 = result & 0xff; |
| byte1 = (result>>8) & 0xff; |
| byte2 = (result>>16) & 0xff; |
| byte3 = (result>>24) & 0xff; |
| crc32 = ((byte0 << 24) | |
| (byte1 << 16) | |
| (byte2 << 8) | |
| byte3); |
| return ( crc32 ); |
| } |
| |
| |
| |
| |
| Stewart Standards Track [Page 147] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| int |
| insert_crc32(unsigned char *buffer, unsigned int length) |
| { |
| SCTP_message *message; |
| unsigned long crc32; |
| message = (SCTP_message *) buffer; |
| message->common_header.checksum = 0L; |
| crc32 = generate_crc32c(buffer,length); |
| /* and insert it into the message */ |
| message->common_header.checksum = htonl(crc32); |
| return 1; |
| } |
| |
| int |
| validate_crc32(unsigned char *buffer, unsigned int length) |
| { |
| SCTP_message *message; |
| unsigned int i; |
| unsigned long original_crc32; |
| unsigned long crc32 = ~0L; |
| |
| /* save and zero checksum */ |
| message = (SCTP_message *) buffer; |
| original_crc32 = ntohl(message->common_header.checksum); |
| message->common_header.checksum = 0L; |
| crc32 = generate_crc32c(buffer,length); |
| return ((original_crc32 == crc32)? 1 : -1); |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 148] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| References |
| |
| Normative References |
| |
| [ITU32] "ITU-T Recommendation V.42, "Error-correcting procedures |
| for DCEs using asynchronous-to-synchronous |
| conversion".", ITU-T section 8.1.1.6.2. |
| |
| [RFC0768] Postel, J., "User Datagram Protocol", STD 6, RFC 768, |
| August 1980. |
| |
| [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, RFC |
| 793, September 1981. |
| |
| [RFC1122] Braden, R., Ed., "Requirements for Internet Hosts - |
| Communication Layers", STD 3, RFC 1122, October 1989. |
| |
| [RFC1123] Braden, R., Ed., "Requirements for Internet Hosts - |
| Application and Support", STD 3, RFC 1123, October 1989. |
| |
| [RFC1191] Mogul, J. and S. Deering, "Path MTU discovery", RFC |
| 1191, November 1990. |
| |
| [RFC1981] McCann, J., Deering, S., and J. Mogul, "Path MTU |
| Discovery for IP version 6", RFC 1981, August 1996. |
| |
| [RFC1982] Elz, R. and R. Bush, "Serial Number Arithmetic", RFC |
| 1982, August 1996. |
| |
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate |
| Requirement Levels", BCP 14, RFC 2119, March 1997. |
| |
| [RFC2434] Narten, T. and H. Alvestrand, "Guidelines for Writing an |
| IANA Considerations Section in RFCs", BCP 26, RFC 2434, |
| October 1998. |
| |
| [RFC2460] Deering, S. and R. Hinden, "Internet Protocol, Version 6 |
| (IPv6) Specification", RFC 2460, December 1998. |
| |
| [RFC2581] Allman, M., Paxson, V., and W. Stevens, "TCP Congestion |
| Control", RFC 2581, April 1999. |
| |
| [RFC3873] Pastor, J. and M. Belinchon, "Stream Control |
| Transmission Protocol (SCTP) Management Information Base |
| (MIB)", RFC 3873, September 2004. |
| |
| [RFC4291] Hinden, R. and S. Deering, "IP Version 6 Addressing |
| Architecture", RFC 4291, February 2006. |
| |
| |
| |
| Stewart Standards Track [Page 149] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| [RFC4301] Kent, S. and K. Seo, "Security Architecture for the |
| Internet Protocol", RFC 4301, December 2005. |
| |
| [RFC4303] Kent, S., "IP Encapsulating Security Payload (ESP)", RFC |
| 4303, December 2005. |
| |
| [RFC4306] Kaufman, C., Ed., "Internet Key Exchange (IKEv2) |
| Protocol", RFC 4306, December 2005. |
| |
| [RFC4821] Mathis, M. and J. Heffner, "Packetization Layer Path MTU |
| Discovery", RFC 4821, March 2007. |
| |
| Informative References |
| |
| [FALL96] Fall, K. and S. Floyd, "Simulation-based Comparisons of |
| Tahoe, Reno, and SACK TCP", SIGCOMM'99 V. 26 N. 3 pp 5- |
| 21, July 1996. |
| |
| [SAVAGE99] Savage, S., Cardwell, N., Wetherall, D., and T. |
| Anderson, "TCP Congestion Control with a Misbehaving |
| Receiver", ACM Computer Communications Review 29(5), |
| October 1999. |
| |
| [ALLMAN99] Allman, M. and V. Paxson, "On Estimating End-to-End |
| Network Path Properties", SIGCOMM'99 , 1999. |
| |
| [WILLIAMS93] Williams, R., "A PAINLESS GUIDE TO CRC ERROR DETECTION |
| ALGORITHMS", Internet publication, |
| http://www.geocities.com/SiliconValley/Pines/ |
| 8659/crc.htm, August 1993. |
| |
| [RFC0813] Clark, D., "Window and Acknowledgement Strategy in TCP", |
| RFC 813, July 1982. |
| |
| [RFC1858] Ziemba, G., Reed, D., and P. Traina, "Security |
| Considerations for IP Fragment Filtering", RFC 1858, |
| October 1995. |
| |
| [RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: |
| Keyed-Hashing for Message Authentication", RFC 2104, |
| February 1997. |
| |
| [RFC2196] Fraser, B., "Site Security Handbook", FYI 8, RFC 2196, |
| September 1997. |
| |
| [RFC2522] Karn, P. and W. Simpson, "Photuris: Session-Key |
| Management Protocol", RFC 2522, March 1999. |
| |
| |
| |
| |
| Stewart Standards Track [Page 150] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| [RFC2960] Stewart, R., Xie, Q., Morneault, K., Sharp, C., |
| Schwarzbauer, H., Taylor, T., Rytina, I., Kalla, M., |
| Zhang, L., and V. Paxson, "Stream Control Transmission |
| Protocol", RFC 2960, October 2000. |
| |
| [RFC3309] Stone, J., Stewart, R., and D. Otis, "Stream Control |
| Transmission Protocol (SCTP) Checksum Change", RFC 3309, |
| September 2002. |
| |
| [RFC3168] Ramakrishnan, K., Floyd, S., and D. Black, "The Addition |
| of Explicit Congestion Notification (ECN) to IP", RFC |
| 3168, September 2001. |
| |
| [RFC4086] Eastlake, D., 3rd, Schiller, J., and S. Crocker, |
| "Randomness Requirements for Security", BCP 106, RFC |
| 4086, June 2005. |
| |
| [RFC4460] Stewart, R., Arias-Rodriguez, I., Poon, K., Caro, A., |
| and M. Tuexen, "Stream Control Transmission Protocol |
| (SCTP) Specification Errata and Issues", RFC 4460, April |
| 2006. |
| |
| [RFC4895] Tuexen, M., Stewart, R., Lei, P., and E. Rescorla, |
| "Authenticated Chunks for Stream Control Transmission |
| Protocol (SCTP)", RFC 4895, August 2007. |
| |
| Editor's Address |
| |
| Randall R. Stewart |
| 4875 Forest Drive |
| Suite 200 |
| Columbia, SC 29206 |
| US |
| |
| EMail: rrs@cisco.com |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 151] |
| |
| RFC 4960 Stream Control Transmission Protocol September 2007 |
| |
| |
| Full Copyright Statement |
| |
| Copyright (C) The IETF Trust (2007). |
| |
| This document is subject to the rights, licenses and restrictions |
| contained in BCP 78, and except as set forth therein, the authors |
| retain all their rights. |
| |
| This document and the information contained herein are provided on an |
| "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS |
| OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND |
| THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS |
| OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF |
| THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED |
| WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. |
| |
| Intellectual Property |
| |
| The IETF takes no position regarding the validity or scope of any |
| Intellectual Property Rights or other rights that might be claimed to |
| pertain to the implementation or use of the technology described in |
| this document or the extent to which any license under such rights |
| might or might not be available; nor does it represent that it has |
| made any independent effort to identify any such rights. Information |
| on the procedures with respect to rights in RFC documents can be |
| found in BCP 78 and BCP 79. |
| |
| Copies of IPR disclosures made to the IETF Secretariat and any |
| assurances of licenses to be made available, or the result of an |
| attempt made to obtain a general license or permission for the use of |
| such proprietary rights by implementers or users of this |
| specification can be obtained from the IETF on-line IPR repository at |
| http://www.ietf.org/ipr. |
| |
| The IETF invites any interested party to bring to its attention any |
| copyrights, patents or patent applications, or other proprietary |
| rights that may cover technology that may be required to implement |
| this standard. Please address the information to the IETF at |
| ietf-ipr@ietf.org. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Stewart Standards Track [Page 152] |
| |