rfc9260.original | rfc9260.txt | |||
---|---|---|---|---|
Network Working Group R. R. Stewart | Internet Engineering Task Force (IETF) R. Stewart | |||
Internet-Draft Netflix, Inc. | Request for Comments: 9260 Netflix, Inc. | |||
Obsoletes: 4460, 4960, 6096, 7053, 8540 (if M. Tüxen | Obsoletes: 4460, 4960, 6096, 7053, 8540 M. Tüxen | |||
approved) Münster Univ. of Appl. Sciences | Category: Standards Track Münster Univ. of Appl. Sciences | |||
Intended status: Standards Track K. E. E. Nielsen | ISSN: 2070-1721 K. Nielsen | |||
Expires: 9 August 2022 Kamstrup A/S | Kamstrup A/S | |||
5 February 2022 | May 2022 | |||
Stream Control Transmission Protocol | Stream Control Transmission Protocol | |||
draft-ietf-tsvwg-rfc4960-bis-19 | ||||
Abstract | Abstract | |||
This document obsoletes RFC 4960, if approved. It describes the | This document describes the Stream Control Transmission Protocol | |||
Stream Control Transmission Protocol (SCTP) and incorporates the | (SCTP) and obsoletes RFC 4960. It incorporates the specification of | |||
specification of the chunk flags registry from RFC 6096 and the | the chunk flags registry from RFC 6096 and the specification of the I | |||
specification of the I bit of DATA chunks from RFC 7053. Therefore, | bit of DATA chunks from RFC 7053. Therefore, RFCs 6096 and 7053 are | |||
RFC 6096 and RFC 7053 are also obsoleted by this document, if | also obsoleted by this document. In addition, RFCs 4460 and 8540, | |||
approved. In addition to that, the Errata documents RFC 4460 and RFC | which describe errata for SCTP, are obsoleted by this document. | |||
8540 are also obsoleted by this document, if approved. | ||||
SCTP was originally designed to transport Public Switched Telephone | SCTP was originally designed to transport Public Switched Telephone | |||
Network (PSTN) signaling messages over IP networks. It is also | Network (PSTN) signaling messages over IP networks. It is also | |||
suited to be used for other applications, for example WebRTC. | suited to be used for other applications, for example, WebRTC. | |||
SCTP is a reliable transport protocol operating on top of a | SCTP is a reliable transport protocol operating on top of a | |||
connectionless packet network such as IP. It offers the following | connectionless packet network, such as IP. It offers the following | |||
services to its users: | services to its users: | |||
* acknowledged error-free non-duplicated transfer of user data, | * acknowledged error-free, non-duplicated transfer of user data, | |||
* data fragmentation to conform to discovered path maximum | * data fragmentation to conform to discovered Path Maximum | |||
transmission unit (PMTU) size, | Transmission Unit (PMTU) size, | |||
* sequenced delivery of user messages within multiple streams, with | * sequenced delivery of user messages within multiple streams, with | |||
an option for order-of-arrival delivery of individual user | an option for order-of-arrival delivery of individual user | |||
messages, | messages, | |||
* optional bundling of multiple user messages into a single SCTP | * optional bundling of multiple user messages into a single SCTP | |||
packet, and | packet, and | |||
* network-level fault tolerance through supporting of multi-homing | * network-level fault tolerance through supporting of multi-homing | |||
at either or both ends of an association. | at either or both ends of an association. | |||
The design of SCTP includes appropriate congestion avoidance behavior | The design of SCTP includes appropriate congestion avoidance behavior | |||
and resistance to flooding and masquerade attacks. | and resistance to flooding and masquerade attacks. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
provisions of BCP 78 and BCP 79. | ||||
Internet-Drafts are working documents of the Internet Engineering | ||||
Task Force (IETF). Note that other groups may also distribute | ||||
working documents as Internet-Drafts. The list of current Internet- | ||||
Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
Internet Standards is available in Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on 9 August 2022. | Information about the current status of this document, any errata, | |||
and how to provide feedback on it may be obtained at | ||||
https://www.rfc-editor.org/info/rfc9260. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2022 IETF Trust and the persons identified as the | Copyright (c) 2022 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
extracted from this document must include Revised BSD License text as | to this document. Code Components extracted from this document must | |||
described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
provided without warranty as described in the Revised BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
in the Revised BSD License. | ||||
This document may contain material from IETF Documents or IETF | This document may contain material from IETF Documents or IETF | |||
Contributions published or made publicly available before November | Contributions published or made publicly available before November | |||
10, 2008. The person(s) controlling the copyright in some of this | 10, 2008. The person(s) controlling the copyright in some of this | |||
material may not have granted the IETF Trust the right to allow | material may not have granted the IETF Trust the right to allow | |||
modifications of such material outside the IETF Standards Process. | modifications of such material outside the IETF Standards Process. | |||
Without obtaining an adequate license from the person(s) controlling | Without obtaining an adequate license from the person(s) controlling | |||
the copyright in such materials, this document may not be modified | the copyright in such materials, this document may not be modified | |||
outside the IETF Standards Process, and derivative works of it may | outside the IETF Standards Process, and derivative works of it may | |||
not be created outside the IETF Standards Process, except to format | not be created outside the IETF Standards Process, except to format | |||
it for publication as an RFC or to translate it into languages other | it for publication as an RFC or to translate it into languages other | |||
than English. | than English. | |||
Table of Contents | Table of Contents | |||
1. Conventions . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 1. Introduction | |||
2. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 6 | 1.1. Motivation | |||
2.1. Motivation . . . . . . . . . . . . . . . . . . . . . . . 7 | 1.2. Architectural View of SCTP | |||
2.2. Architectural View of SCTP . . . . . . . . . . . . . . . 7 | 1.3. Key Terms | |||
2.3. Key Terms . . . . . . . . . . . . . . . . . . . . . . . . 8 | 1.4. Abbreviations | |||
2.4. Abbreviations . . . . . . . . . . . . . . . . . . . . . . 12 | 1.5. Functional View of SCTP | |||
2.5. Functional View of SCTP . . . . . . . . . . . . . . . . . 13 | 1.5.1. Association Startup and Takedown | |||
2.5.1. Association Startup and Takedown . . . . . . . . . . 13 | 1.5.2. Sequenced Delivery within Streams | |||
2.5.2. Sequenced Delivery within Streams . . . . . . . . . . 14 | 1.5.3. User Data Fragmentation | |||
2.5.3. User Data Fragmentation . . . . . . . . . . . . . . . 15 | 1.5.4. Acknowledgement and Congestion Avoidance | |||
2.5.4. Acknowledgement and Congestion Avoidance . . . . . . 15 | 1.5.5. Chunk Bundling | |||
2.5.5. Chunk Bundling . . . . . . . . . . . . . . . . . . . 15 | 1.5.6. Packet Validation | |||
2.5.6. Packet Validation . . . . . . . . . . . . . . . . . . 16 | 1.5.7. Path Management | |||
2.5.7. Path Management . . . . . . . . . . . . . . . . . . . 16 | 1.6. Serial Number Arithmetic | |||
2.6. Serial Number Arithmetic . . . . . . . . . . . . . . . . 17 | 1.7. Changes from RFC 4960 | |||
2.7. Changes from RFC 4960 . . . . . . . . . . . . . . . . . . 17 | 2. Conventions | |||
3. SCTP Packet Format . . . . . . . . . . . . . . . . . . . . . 18 | 3. SCTP Packet Format | |||
3.1. SCTP Common Header Field Descriptions . . . . . . . . . . 19 | 3.1. SCTP Common Header Field Descriptions | |||
3.2. Chunk Field Descriptions . . . . . . . . . . . . . . . . 20 | 3.2. Chunk Field Descriptions | |||
3.2.1. Optional/Variable-Length Parameter Format . . . . . . 23 | 3.2.1. Optional/Variable-Length Parameter Format | |||
3.2.2. Reporting of Unrecognized Parameters . . . . . . . . 25 | 3.2.2. Reporting of Unrecognized Parameters | |||
3.3. SCTP Chunk Definitions . . . . . . . . . . . . . . . . . 25 | 3.3. SCTP Chunk Definitions | |||
3.3.1. Payload Data (DATA) (0) . . . . . . . . . . . . . . . 25 | 3.3.1. Payload Data (DATA) (0) | |||
3.3.2. Initiation (INIT) (1) . . . . . . . . . . . . . . . . 28 | 3.3.2. Initiation (INIT) (1) | |||
3.3.2.1. Optional or Variable-Length Parameters in INIT | 3.3.2.1. Optional or Variable-Length Parameters in INIT | |||
chunks . . . . . . . . . . . . . . . . . . . . . . 32 | chunks | |||
3.3.3. Initiation Acknowledgement (INIT ACK) (2) . . . . . . 35 | 3.3.3. Initiation Acknowledgement (INIT ACK) (2) | |||
3.3.3.1. Optional or Variable-Length Parameters in INIT ACK | 3.3.3.1. Optional or Variable-Length Parameters in INIT ACK | |||
chunks . . . . . . . . . . . . . . . . . . . . . . 39 | Chunks | |||
3.3.4. Selective Acknowledgement (SACK) (3) . . . . . . . . 40 | 3.3.4. Selective Acknowledgement (SACK) (3) | |||
3.3.5. Heartbeat Request (HEARTBEAT) (4) . . . . . . . . . . 43 | 3.3.5. Heartbeat Request (HEARTBEAT) (4) | |||
3.3.6. Heartbeat Acknowledgement (HEARTBEAT ACK) (5) . . . . 44 | 3.3.6. Heartbeat Acknowledgement (HEARTBEAT ACK) (5) | |||
3.3.7. Abort Association (ABORT) (6) . . . . . . . . . . . . 45 | 3.3.7. Abort Association (ABORT) (6) | |||
3.3.8. Shutdown Association (SHUTDOWN) (7) . . . . . . . . . 46 | 3.3.8. Shutdown Association (SHUTDOWN) (7) | |||
3.3.9. Shutdown Acknowledgement (SHUTDOWN ACK) (8) . . . . . 47 | 3.3.9. Shutdown Acknowledgement (SHUTDOWN ACK) (8) | |||
3.3.10. Operation Error (ERROR) (9) . . . . . . . . . . . . . 47 | 3.3.10. Operation Error (ERROR) (9) | |||
3.3.10.1. Invalid Stream Identifier (1) . . . . . . . . . 49 | 3.3.10.1. Invalid Stream Identifier (1) | |||
3.3.10.2. Missing Mandatory Parameter (2) . . . . . . . . 50 | 3.3.10.2. Missing Mandatory Parameter (2) | |||
3.3.10.3. Stale Cookie Error (3) . . . . . . . . . . . . . 50 | 3.3.10.3. Stale Cookie (3) | |||
3.3.10.4. Out of Resource (4) . . . . . . . . . . . . . . 51 | 3.3.10.4. Out of Resource (4) | |||
3.3.10.5. Unresolvable Address (5) . . . . . . . . . . . . 51 | 3.3.10.5. Unresolvable Address (5) | |||
3.3.10.6. Unrecognized Chunk Type (6) . . . . . . . . . . 52 | 3.3.10.6. Unrecognized Chunk Type (6) | |||
3.3.10.7. Invalid Mandatory Parameter (7) . . . . . . . . 52 | 3.3.10.7. Invalid Mandatory Parameter (7) | |||
3.3.10.8. Unrecognized Parameters (8) . . . . . . . . . . 52 | 3.3.10.8. Unrecognized Parameters (8) | |||
3.3.10.9. No User Data (9) . . . . . . . . . . . . . . . . 53 | 3.3.10.9. No User Data (9) | |||
3.3.10.10. Cookie Received While Shutting Down (10) . . . . 53 | 3.3.10.10. Cookie Received While Shutting Down (10) | |||
3.3.10.11. Restart of an Association with New Addresses | 3.3.10.11. Restart of an Association with New Addresses (11) | |||
(11) . . . . . . . . . . . . . . . . . . . . . . . 54 | 3.3.10.12. User-Initiated Abort (12) | |||
3.3.10.12. User-Initiated Abort (12) . . . . . . . . . . . 54 | 3.3.10.13. Protocol Violation (13) | |||
3.3.10.13. Protocol Violation (13) . . . . . . . . . . . . 54 | 3.3.11. Cookie Echo (COOKIE ECHO) (10) | |||
3.3.12. Cookie Acknowledgement (COOKIE ACK) (11) | ||||
3.3.11. Cookie Echo (COOKIE ECHO) (10) . . . . . . . . . . . 55 | 3.3.13. Shutdown Complete (SHUTDOWN COMPLETE) (14) | |||
3.3.12. Cookie Acknowledgement (COOKIE ACK) (11) . . . . . . 56 | 4. SCTP Association State Diagram | |||
3.3.13. Shutdown Complete (SHUTDOWN COMPLETE) (14) . . . . . 56 | 5. Association Initialization | |||
4. SCTP Association State Diagram . . . . . . . . . . . . . . . 57 | 5.1. Normal Establishment of an Association | |||
5. Association Initialization . . . . . . . . . . . . . . . . . 60 | 5.1.1. Handle Stream Parameters | |||
5.1. Normal Establishment of an Association . . . . . . . . . 60 | 5.1.2. Handle Address Parameters | |||
5.1.1. Handle Stream Parameters . . . . . . . . . . . . . . 62 | 5.1.3. Generating State Cookie | |||
5.1.2. Handle Address Parameters . . . . . . . . . . . . . . 63 | 5.1.4. State Cookie Processing | |||
5.1.3. Generating State Cookie . . . . . . . . . . . . . . . 64 | 5.1.5. State Cookie Authentication | |||
5.1.4. State Cookie Processing . . . . . . . . . . . . . . . 65 | 5.1.6. An Example of Normal Association Establishment | |||
5.1.5. State Cookie Authentication . . . . . . . . . . . . . 65 | ||||
5.1.6. An Example of Normal Association Establishment . . . 66 | ||||
5.2. Handle Duplicate or Unexpected INIT, INIT ACK, COOKIE ECHO, | 5.2. Handle Duplicate or Unexpected INIT, INIT ACK, COOKIE ECHO, | |||
and COOKIE ACK Chunks . . . . . . . . . . . . . . . . . . 68 | and COOKIE ACK Chunks | |||
5.2.1. INIT Chunk Received in COOKIE-WAIT or COOKIE-ECHOED | 5.2.1. INIT Chunk Received in COOKIE-WAIT or COOKIE-ECHOED | |||
State (Item B) . . . . . . . . . . . . . . . . . . . 68 | State (Item B) | |||
5.2.2. Unexpected INIT Chunk in States Other than CLOSED, | 5.2.2. Unexpected INIT Chunk in States Other than CLOSED, | |||
COOKIE-ECHOED, COOKIE-WAIT, and SHUTDOWN-ACK-SENT . . 69 | COOKIE-ECHOED, COOKIE-WAIT, and SHUTDOWN-ACK-SENT | |||
5.2.3. Unexpected INIT ACK Chunk . . . . . . . . . . . . . . 70 | 5.2.3. Unexpected INIT ACK Chunk | |||
5.2.4. Handle a COOKIE ECHO Chunk when a TCB Exists . . . . 70 | 5.2.4. Handle a COOKIE ECHO Chunk When a TCB Exists | |||
5.2.4.1. An Example of a Association Restart . . . . . . . 73 | 5.2.4.1. An Example of an Association Restart | |||
5.2.5. Handle Duplicate COOKIE ACK Chunk . . . . . . . . . . 74 | 5.2.5. Handle Duplicate COOKIE ACK Chunk | |||
5.2.6. Handle Stale Cookie Error . . . . . . . . . . . . . . 74 | 5.2.6. Handle Stale Cookie Error | |||
5.3. Other Initialization Issues . . . . . . . . . . . . . . . 74 | 5.3. Other Initialization Issues | |||
5.3.1. Selection of Tag Value . . . . . . . . . . . . . . . 75 | 5.3.1. Selection of Tag Value | |||
5.4. Path Verification . . . . . . . . . . . . . . . . . . . . 75 | 5.4. Path Verification | |||
6. User Data Transfer . . . . . . . . . . . . . . . . . . . . . 76 | 6. User Data Transfer | |||
6.1. Transmission of DATA Chunks . . . . . . . . . . . . . . . 78 | 6.1. Transmission of DATA Chunks | |||
6.2. Acknowledgement on Reception of DATA Chunks . . . . . . . 81 | 6.2. Acknowledgement on Reception of DATA Chunks | |||
6.2.1. Processing a Received SACK Chunk . . . . . . . . . . 84 | 6.2.1. Processing a Received SACK Chunk | |||
6.3. Management of Retransmission Timer . . . . . . . . . . . 86 | 6.3. Management of Retransmission Timer | |||
6.3.1. RTO Calculation . . . . . . . . . . . . . . . . . . . 86 | 6.3.1. RTO Calculation | |||
6.3.2. Retransmission Timer Rules . . . . . . . . . . . . . 88 | 6.3.2. Retransmission Timer Rules | |||
6.3.3. Handle T3-rtx Expiration . . . . . . . . . . . . . . 89 | 6.3.3. Handle T3-rtx Expiration | |||
6.4. Multi-Homed SCTP Endpoints . . . . . . . . . . . . . . . 90 | 6.4. Multi-Homed SCTP Endpoints | |||
6.4.1. Failover from an Inactive Destination Address . . . . 91 | 6.4.1. Failover from an Inactive Destination Address | |||
6.5. Stream Identifier and Stream Sequence Number . . . . . . 92 | 6.5. Stream Identifier and Stream Sequence Number | |||
6.6. Ordered and Unordered Delivery . . . . . . . . . . . . . 92 | 6.6. Ordered and Unordered Delivery | |||
6.7. Report Gaps in Received DATA TSNs . . . . . . . . . . . . 93 | 6.7. Report Gaps in Received DATA TSNs | |||
6.8. CRC32c Checksum Calculation . . . . . . . . . . . . . . . 94 | 6.8. CRC32c Checksum Calculation | |||
6.9. Fragmentation and Reassembly . . . . . . . . . . . . . . 95 | 6.9. Fragmentation and Reassembly | |||
6.10. Bundling . . . . . . . . . . . . . . . . . . . . . . . . 96 | 6.10. Bundling | |||
7. Congestion Control . . . . . . . . . . . . . . . . . . . . . 97 | 7. Congestion Control | |||
7.1. SCTP Differences from TCP Congestion Control . . . . . . 98 | 7.1. SCTP Differences from TCP Congestion Control | |||
7.2. SCTP Slow-Start and Congestion Avoidance . . . . . . . . 99 | 7.2. SCTP Slow-Start and Congestion Avoidance | |||
7.2.1. Slow-Start . . . . . . . . . . . . . . . . . . . . . 100 | 7.2.1. Slow-Start | |||
7.2.2. Congestion Avoidance . . . . . . . . . . . . . . . . 101 | 7.2.2. Congestion Avoidance | |||
7.2.3. Congestion Control . . . . . . . . . . . . . . . . . 102 | 7.2.3. Congestion Control | |||
7.2.4. Fast Retransmit on Gap Reports . . . . . . . . . . . 102 | 7.2.4. Fast Retransmit on Gap Reports | |||
7.2.5. Reinitialization . . . . . . . . . . . . . . . . . . 104 | 7.2.5. Reinitialization | |||
7.2.5.1. Change of Differentiated Services Code Points . . 104 | 7.2.5.1. Change of Differentiated Services Code Points | |||
7.2.5.2. Change of Routes . . . . . . . . . . . . . . . . 104 | 7.2.5.2. Change of Routes | |||
7.3. PMTU Discovery . . . . . . . . . . . . . . . . . . . . . 104 | 7.3. PMTU Discovery | |||
8. Fault Management . . . . . . . . . . . . . . . . . . . . . . 105 | 8. Fault Management | |||
8.1. Endpoint Failure Detection . . . . . . . . . . . . . . . 105 | 8.1. Endpoint Failure Detection | |||
8.2. Path Failure Detection . . . . . . . . . . . . . . . . . 105 | 8.2. Path Failure Detection | |||
8.3. Path Heartbeat . . . . . . . . . . . . . . . . . . . . . 106 | 8.3. Path Heartbeat | |||
8.4. Handle "Out of the Blue" Packets . . . . . . . . . . . . 109 | 8.4. Handle "Out of the Blue" Packets | |||
8.5. Verification Tag . . . . . . . . . . . . . . . . . . . . 110 | 8.5. Verification Tag | |||
8.5.1. Exceptions in Verification Tag Rules . . . . . . . . 110 | 8.5.1. Exceptions in Verification Tag Rules | |||
9. Termination of Association . . . . . . . . . . . . . . . . . 111 | 9. Termination of Association | |||
9.1. Abort of an Association . . . . . . . . . . . . . . . . . 112 | 9.1. Abort of an Association | |||
9.2. Shutdown of an Association . . . . . . . . . . . . . . . 112 | 9.2. Shutdown of an Association | |||
10. ICMP Handling . . . . . . . . . . . . . . . . . . . . . . . . 115 | 10. ICMP Handling | |||
11. Interface with Upper Layer . . . . . . . . . . . . . . . . . 116 | 11. Interface with Upper Layer | |||
11.1. ULP-to-SCTP . . . . . . . . . . . . . . . . . . . . . . 117 | 11.1. ULP-to-SCTP | |||
11.1.1. Initialize . . . . . . . . . . . . . . . . . . . . . 117 | 11.1.1. Initialize | |||
11.1.2. Associate . . . . . . . . . . . . . . . . . . . . . 118 | 11.1.2. Associate | |||
11.1.3. Shutdown . . . . . . . . . . . . . . . . . . . . . . 119 | 11.1.3. Shutdown | |||
11.1.4. Abort . . . . . . . . . . . . . . . . . . . . . . . 119 | 11.1.4. Abort | |||
11.1.5. Send . . . . . . . . . . . . . . . . . . . . . . . . 119 | 11.1.5. Send | |||
11.1.6. Set Primary . . . . . . . . . . . . . . . . . . . . 121 | 11.1.6. Set Primary | |||
11.1.7. Receive . . . . . . . . . . . . . . . . . . . . . . 121 | 11.1.7. Receive | |||
11.1.8. Status . . . . . . . . . . . . . . . . . . . . . . . 122 | 11.1.8. Status | |||
11.1.9. Change Heartbeat . . . . . . . . . . . . . . . . . . 123 | 11.1.9. Change Heartbeat | |||
11.1.10. Request Heartbeat . . . . . . . . . . . . . . . . . 124 | 11.1.10. Request Heartbeat | |||
11.1.11. Get SRTT Report . . . . . . . . . . . . . . . . . . 124 | 11.1.11. Get SRTT Report | |||
11.1.12. Set Failure Threshold . . . . . . . . . . . . . . . 125 | 11.1.12. Set Failure Threshold | |||
11.1.13. Set Protocol Parameters . . . . . . . . . . . . . . 125 | 11.1.13. Set Protocol Parameters | |||
11.1.14. Receive Unsent Message . . . . . . . . . . . . . . . 125 | 11.1.14. Receive Unsent Message | |||
11.1.15. Receive Unacknowledged Message . . . . . . . . . . . 126 | 11.1.15. Receive Unacknowledged Message | |||
11.1.16. Destroy SCTP Instance . . . . . . . . . . . . . . . 127 | 11.1.16. Destroy SCTP Instance | |||
11.2. SCTP-to-ULP . . . . . . . . . . . . . . . . . . . . . . 127 | 11.2. SCTP-to-ULP | |||
11.2.1. DATA ARRIVE Notification . . . . . . . . . . . . . . 127 | 11.2.1. DATA ARRIVE Notification | |||
11.2.2. SEND FAILURE Notification . . . . . . . . . . . . . 128 | 11.2.2. SEND FAILURE Notification | |||
11.2.3. NETWORK STATUS CHANGE Notification . . . . . . . . . 128 | 11.2.3. NETWORK STATUS CHANGE Notification | |||
11.2.4. COMMUNICATION UP Notification . . . . . . . . . . . 128 | 11.2.4. COMMUNICATION UP Notification | |||
11.2.5. COMMUNICATION LOST Notification . . . . . . . . . . 129 | 11.2.5. COMMUNICATION LOST Notification | |||
11.2.6. COMMUNICATION ERROR Notification . . . . . . . . . . 130 | 11.2.6. COMMUNICATION ERROR Notification | |||
11.2.7. RESTART Notification . . . . . . . . . . . . . . . . 130 | 11.2.7. RESTART Notification | |||
11.2.8. SHUTDOWN COMPLETE Notification . . . . . . . . . . . 130 | 11.2.8. SHUTDOWN COMPLETE Notification | |||
12. Security Considerations . . . . . . . . . . . . . . . . . . . 130 | 12. Security Considerations | |||
12.1. Security Objectives . . . . . . . . . . . . . . . . . . 130 | 12.1. Security Objectives | |||
12.2. SCTP Responses to Potential Threats . . . . . . . . . . 131 | 12.2. SCTP Responses to Potential Threats | |||
12.2.1. Countering Insider Attacks . . . . . . . . . . . . . 131 | 12.2.1. Countering Insider Attacks | |||
12.2.2. Protecting against Data Corruption in the Network . 131 | 12.2.2. Protecting against Data Corruption in the Network | |||
12.2.3. Protecting Confidentiality . . . . . . . . . . . . . 131 | 12.2.3. Protecting Confidentiality | |||
12.2.4. Protecting against Blind Denial-of-Service | 12.2.4. Protecting against Blind Denial-of-Service Attacks | |||
Attacks . . . . . . . . . . . . . . . . . . . . . . . 132 | 12.2.4.1. Flooding | |||
12.2.4.1. Flooding . . . . . . . . . . . . . . . . . . . . 132 | 12.2.4.2. Blind Masquerade | |||
12.2.4.2. Blind Masquerade . . . . . . . . . . . . . . . . 133 | 12.2.4.3. Improper Monopolization of Services | |||
12.2.4.3. Improper Monopolization of Services . . . . . . 134 | 12.3. SCTP Interactions with Firewalls | |||
12.3. SCTP Interactions with Firewalls . . . . . . . . . . . . 134 | 12.4. Protection of Non-SCTP-capable Hosts | |||
12.4. Protection of Non-SCTP-Capable Hosts . . . . . . . . . . 134 | 13. Network Management Considerations | |||
13. Network Management Considerations . . . . . . . . . . . . . . 135 | 14. Recommended Transmission Control Block (TCB) Parameters | |||
14. Recommended Transmission Control Block (TCB) Parameters . . . 135 | 14.1. Parameters Necessary for the SCTP Instance | |||
14.1. Parameters Necessary for the SCTP Instance . . . . . . . 135 | 14.2. Parameters Necessary per Association (i.e., the TCB) | |||
14.2. Parameters Necessary per Association (i.e., the TCB) . . 136 | 14.3. Per Transport Address Data | |||
14.3. Per Transport Address Data . . . . . . . . . . . . . . . 138 | 14.4. General Parameters Needed | |||
14.4. General Parameters Needed . . . . . . . . . . . . . . . 139 | 15. IANA Considerations | |||
15. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 139 | 15.1. IETF-Defined Chunk Extension | |||
15.1. IETF-Defined Chunk Extension . . . . . . . . . . . . . . 143 | 15.2. IETF-Defined Chunk Flags Registration | |||
15.2. IETF Chunk Flags Registration . . . . . . . . . . . . . 144 | 15.3. IETF-Defined Chunk Parameter Extension | |||
15.3. IETF-Defined Chunk Parameter Extension . . . . . . . . . 144 | 15.4. IETF-Defined Additional Error Causes | |||
15.4. IETF-Defined Additional Error Causes . . . . . . . . . . 144 | 15.5. Payload Protocol Identifiers | |||
15.5. Payload Protocol Identifiers . . . . . . . . . . . . . . 145 | 15.6. Port Numbers Registry | |||
15.6. Port Numbers Registry . . . . . . . . . . . . . . . . . 145 | 16. Suggested SCTP Protocol Parameter Values | |||
16. Suggested SCTP Protocol Parameter Values . . . . . . . . . . 145 | 17. References | |||
17. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 146 | 17.1. Normative References | |||
18. Normative References . . . . . . . . . . . . . . . . . . . . 147 | 17.2. Informative References | |||
19. Informative References . . . . . . . . . . . . . . . . . . . 149 | Appendix A. CRC32c Checksum Calculation | |||
Appendix A. CRC32c Checksum Calculation . . . . . . . . . . . . 152 | Acknowledgements | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 159 | Authors' Addresses | |||
1. Conventions | ||||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | ||||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | ||||
"OPTIONAL" in this document are to be interpreted as described in BCP | ||||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | ||||
capitals, as shown here. | ||||
2. Introduction | 1. Introduction | |||
This section explains the reasoning behind the development of the | This section explains the reasoning behind the development of the | |||
Stream Control Transmission Protocol (SCTP), the services it offers, | Stream Control Transmission Protocol (SCTP), the services it offers, | |||
and the basic concepts needed to understand the detailed description | and the basic concepts needed to understand the detailed description | |||
of the protocol. | of the protocol. | |||
This document obsoletes [RFC4960], if approved. In addition to that, | This document obsoletes [RFC4960]. In addition to that, it | |||
it incorporates the specification of the chunk flags registry from | incorporates the specification of the chunk flags registry from | |||
[RFC6096] and the specification of the I bit of DATA chunks from | [RFC6096] and the specification of the I bit of DATA chunks from | |||
[RFC7053]. Therefore, [RFC6096] and [RFC7053] are also obsoleted by | [RFC7053]. Therefore, [RFC6096] and [RFC7053] are also obsoleted by | |||
this document, if approved. | this document. | |||
2.1. Motivation | 1.1. Motivation | |||
TCP [RFC0793] has performed immense service as the primary means of | TCP [RFC0793] has performed immense service as the primary means of | |||
reliable data transfer in IP networks. However, an increasing number | reliable data transfer in IP networks. However, an increasing number | |||
of recent applications have found TCP too limiting, and have | of recent applications have found TCP too limiting and have | |||
incorporated their own reliable data transfer protocol on top of UDP | incorporated their own reliable data transfer protocol on top of UDP | |||
[RFC0768]. The limitations that users have wished to bypass include | [RFC0768]. The limitations that users have wished to bypass include | |||
the following: | the following: | |||
* TCP provides both reliable data transfer and strict order-of- | * TCP provides both reliable data transfer and strict order-of- | |||
transmission delivery of data. Some applications need reliable | transmission delivery of data. Some applications need reliable | |||
transfer without sequence maintenance, while others would be | transfer without sequence maintenance, while others would be | |||
satisfied with partial ordering of the data. In both of these | satisfied with partial ordering of the data. In both of these | |||
cases, the head-of-line blocking offered by TCP causes unnecessary | cases, the head-of-line blocking offered by TCP causes unnecessary | |||
delay. | delay. | |||
* The stream-oriented nature of TCP is often an inconvenience. | * The stream-oriented nature of TCP is often an inconvenience. | |||
Applications add their own record marking to delineate their | Applications add their own record marking to delineate their | |||
messages, and make explicit use of the push facility to ensure | messages and make explicit use of the push facility to ensure that | |||
that a complete message is transferred in a reasonable time. | a complete message is transferred in a reasonable time. | |||
* The limited scope of TCP sockets complicates the task of providing | * The limited scope of TCP sockets complicates the task of providing | |||
highly-available data transfer capability using multi-homed hosts. | highly available data transfer capability using multi-homed hosts. | |||
* TCP is relatively vulnerable to denial-of-service attacks, such as | * TCP is relatively vulnerable to denial-of-service attacks, such as | |||
SYN attacks. | SYN attacks. | |||
Transport of PSTN signaling across the IP network is an application | Transport of PSTN signaling across the IP network is an application | |||
for which all of these limitations of TCP are relevant. While this | for which all of these limitations of TCP are relevant. While this | |||
application directly motivated the development of SCTP, other | application directly motivated the development of SCTP, other | |||
applications might find SCTP a good match to their requirements. One | applications might find SCTP a good match to their requirements. One | |||
example of this is the use of datachannels in the WebRTC | example of this is the use of data channels in the WebRTC | |||
infrastructure. | infrastructure. | |||
2.2. Architectural View of SCTP | 1.2. Architectural View of SCTP | |||
SCTP is viewed as a layer between the SCTP user application ("SCTP | SCTP is viewed as a layer between the SCTP user application ("SCTP | |||
user" for short) and a connectionless packet network service such as | user" for short) and a connectionless packet network service, such as | |||
IP. The remainder of this document assumes SCTP runs on top of IP. | 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 | The basic service offered by SCTP is the reliable transfer of user | |||
messages between peer SCTP users. It performs this service within | messages between peer SCTP users. It performs this service within | |||
the context of an association between two SCTP endpoints. Section 11 | the context of an association between two SCTP endpoints. Section 11 | |||
of this document sketches the API that exists at the boundary between | of this document sketches the API that exists at the boundary between | |||
the SCTP and the SCTP upper layers. | SCTP and the SCTP upper layers. | |||
SCTP is connection-oriented in nature, but the SCTP association is a | SCTP is connection oriented in nature, but the SCTP association is a | |||
broader concept than the TCP connection. SCTP provides the means for | broader concept than the TCP connection. SCTP provides the means for | |||
each SCTP endpoint (Section 2.3) to provide the other endpoint | each SCTP endpoint (Section 1.3) to provide the other endpoint | |||
(during association startup) with a list of transport addresses | (during association startup) with a list of transport addresses | |||
(i.e., multiple IP addresses in combination with an SCTP port) | (i.e., multiple IP addresses in combination with an SCTP port) | |||
through which that endpoint can be reached and from which it will | through which that endpoint can be reached and from which it will | |||
originate SCTP packets. The association spans transfers over all of | originate SCTP packets. The association spans transfers over all of | |||
the possible source/destination combinations that can be generated | the possible source/destination combinations that can be generated | |||
from each endpoint's lists. | from each endpoint's lists. | |||
_____________ _____________ | _____________ _____________ | |||
| SCTP User | | SCTP User | | | SCTP User | | SCTP User | | |||
| Application | | Application | | | Application | | Application | | |||
skipping to change at page 8, line 32 ¶ | skipping to change at line 352 ¶ | |||
|_____________| ---- |_____________| | |_____________| ---- |_____________| | |||
SCTP Node A |<-------- Network transport ------->| SCTP Node B | SCTP Node A |<-------- Network transport ------->| SCTP Node B | |||
Figure 1: An SCTP Association | Figure 1: An SCTP Association | |||
In addition to encapsulating SCTP packets in IPv4 or IPv6, it is also | In addition to encapsulating SCTP packets in IPv4 or IPv6, it is also | |||
possible to encapsulate SCTP packets in UDP as specified in [RFC6951] | possible to encapsulate SCTP packets in UDP as specified in [RFC6951] | |||
or encapsulate them in DTLS as specified in [RFC8261]. | or encapsulate them in DTLS as specified in [RFC8261]. | |||
2.3. Key Terms | 1.3. Key Terms | |||
Some of the language used to describe SCTP has been introduced in the | Some of the language used to describe SCTP has been introduced in the | |||
previous sections. This section provides a consolidated list of the | previous sections. This section provides a consolidated list of the | |||
key terms and their definitions. | key terms and their definitions. | |||
Active Destination Transport Address: A transport address on a peer | Active Destination Transport Address: A transport address on a peer | |||
endpoint that a transmitting endpoint considers available for | endpoint that a transmitting endpoint considers available for | |||
receiving user messages. | receiving user messages. | |||
Association Maximum DATA Chunk Size (AMDCS): The smallest Path | Association Maximum DATA Chunk Size (AMDCS): The smallest Path | |||
Maximum DATA Chunk Size (PMDCS) of all destination addresses. | Maximum DATA Chunk Size (PMDCS) of all destination addresses. | |||
Bundling Of Chunks: An optional multiplexing operation, whereby more | Bundling of Chunks: An optional multiplexing operation, whereby more | |||
than one chunk can be carried in the same SCTP packet. | than one chunk can be carried in the same SCTP packet. | |||
Bundling Of User Messages: An optional multiplexing operation, | Bundling of User Messages: An optional multiplexing operation, | |||
whereby more than one user message can be carried in the same SCTP | whereby more than one user message can be carried in the same SCTP | |||
packet. Each user message occupies its own DATA chunk. | packet. Each user message occupies its own DATA chunk. | |||
Chunk: A unit of information within an SCTP packet, consisting of a | Chunk: A unit of information within an SCTP packet, consisting of a | |||
chunk header and chunk-specific content. | chunk header and chunk-specific content. | |||
Congestion Window (cwnd): An SCTP variable that limits outstanding | Congestion Window (cwnd): An SCTP variable that limits outstanding | |||
data, in number of bytes, that a sender can send to a particular | data, in number of bytes, that a sender can send to a particular | |||
destination transport address before receiving an acknowledgement. | destination transport address before receiving an acknowledgement. | |||
Control Chunk: A chunk not being used for transmitting user data, | Control Chunk: A chunk not being used for transmitting user data, | |||
i.e. every chunk which is not a DATA chunk. | i.e., every chunk that is not a DATA chunk. | |||
Cumulative TSN Ack Point: The Transmission Sequence Number (TSN) of | Cumulative TSN Ack Point: The Transmission Sequence Number (TSN) of | |||
the last DATA chunk acknowledged via the Cumulative TSN Ack field | the last DATA chunk acknowledged via the Cumulative TSN Ack field | |||
of a SACK chunk. | of a SACK chunk. | |||
Flightsize: The number of bytes of outstanding data to a particular | Flightsize: The number of bytes of outstanding data to a particular | |||
destination transport address at any given time. | destination transport address at any given time. | |||
Idle Destination Address: An address that has not had user messages | Idle Destination Address: An address that has not had user messages | |||
sent to it within some length of time, normally the 'HB.interval' | sent to it within some length of time, normally the 'HB.interval' | |||
or greater. | or greater. | |||
Inactive Destination Transport Address: An address that is | Inactive Destination Transport Address: An address that is | |||
considered inactive due to errors and unavailable to transport | considered inactive due to errors and unavailable to transport | |||
user messages. | user messages. | |||
Message (or User Message): Data submitted to SCTP by the Upper Layer | Message (or User Message): Data submitted to SCTP by the Upper-Layer | |||
Protocol (ULP). | Protocol (ULP). | |||
Network Byte Order: Most significant byte first, a.k.a., big endian. | Network Byte Order: Most significant byte first, a.k.a., big endian. | |||
Ordered Message: A user message that is delivered in order with | Ordered Message: A user message that is delivered in order with | |||
respect to all previous user messages sent within the stream on | respect to all previous user messages sent within the stream on | |||
which the message was sent. | which the message was sent. | |||
Outstanding Data (or Data Outstanding or Data In Flight): The total | Outstanding Data (or Data Outstanding or Data In Flight): The total | |||
size of the DATA chunks associated with outstanding TSNs. A | size of the DATA chunks associated with outstanding TSNs. A | |||
retransmitted DATA chunk is counted once in outstanding data. A | retransmitted DATA chunk is counted once in outstanding data. A | |||
DATA chunk that is classified as lost but that has not yet been | DATA chunk that is classified as lost but that has not yet been | |||
retransmitted is not in outstanding data. | retransmitted is not in outstanding data. | |||
Outstanding TSN (at an SCTP Endpoint): A TSN (and the associated | Outstanding TSN (at an SCTP Endpoint): A TSN (and the associated | |||
DATA chunk) that has been sent by the endpoint but for which it | DATA chunk) that has been sent by the endpoint but for which it | |||
has not yet received an acknowledgement. | has not yet received an acknowledgement. | |||
Out Of The Blue (OOTB) Packet: A correctly formed packet, for which | "Out of the Blue" (OOTB) Packet: A correctly formed packet, for | |||
the receiver can not identify the association it belongs to. See | which the receiver cannot identify the association it belongs to. | |||
Section 8.4. | See Section 8.4. | |||
Path: The route taken by the SCTP packets sent by one SCTP endpoint | Path: The route taken by the SCTP packets sent by one SCTP endpoint | |||
to a specific destination transport address of its peer SCTP | to a specific destination transport address of its peer SCTP | |||
endpoint. Sending to different destination transport addresses | endpoint. Sending to different destination transport addresses | |||
does not necessarily guarantee getting separate paths. Within | does not necessarily guarantee getting separate paths. Within | |||
this specification, a path is identified by the destination | this specification, a path is identified by the destination | |||
transport address, since the routing is assumed to be stable. | transport address, since the routing is assumed to be stable. | |||
This includes in particular the source address being selected when | This includes, in particular, the source address being selected | |||
sending packets to the destination address. | when sending packets to the destination address. | |||
Path Maximum DATA Chunk Size (PMDCS): The maximum size (including | Path Maximum DATA Chunk Size (PMDCS): The maximum size (including | |||
the DATA chunk header) of a DATA chunk which fits into an SCTP | the DATA chunk header) of a DATA chunk that fits into an SCTP | |||
packet not exceeding the PMTU of a particular destination address. | packet not exceeding the PMTU of a particular destination address. | |||
Path Maximum Transmission Unit (PMTU): The maximum size (including | Path Maximum Transmission Unit (PMTU): The maximum size (including | |||
the SCTP common header and all chunks including their paddings) of | the SCTP common header and all chunks including their paddings) of | |||
an SCTP packet which can be sent to a particular destination | an SCTP packet that can be sent to a particular destination | |||
address without using IP level fragmentation. | address without using IP-level fragmentation. | |||
Primary Path: The primary path is the destination and source address | Primary Path: The destination and source address that will be put | |||
that will be put into a packet outbound to the peer endpoint by | into a packet outbound to the peer endpoint by default. The | |||
default. The definition includes the source address since an | definition includes the source address since an implementation MAY | |||
implementation MAY wish to specify both destination and source | wish to specify both destination and source address to better | |||
address to better control the return path taken by reply chunks | control the return path taken by reply chunks and on which | |||
and on which interface the packet is transmitted when the data | interface the packet is transmitted when the data sender is multi- | |||
sender is multi-homed. | homed. | |||
Receiver Window (rwnd): An SCTP variable a data sender uses to store | Receiver Window (rwnd): An SCTP variable a data sender uses to store | |||
the most recently calculated receiver window of its peer, in | the most recently calculated receiver window of its peer, in | |||
number of bytes. This gives the sender an indication of the space | number of bytes. This gives the sender an indication of the space | |||
available in the receiver's inbound buffer. | available in the receiver's inbound buffer. | |||
SCTP Association: A protocol relationship between SCTP endpoints, | SCTP Association: A protocol relationship between SCTP endpoints, | |||
composed of the two SCTP endpoints and protocol state information | composed of the two SCTP endpoints and protocol state information, | |||
including Verification Tags and the currently active set of | including Verification Tags and the currently active set of | |||
Transmission Sequence Numbers (TSNs), etc. An association can be | Transmission Sequence Numbers (TSNs), etc. An association can be | |||
uniquely identified by the transport addresses used by the | uniquely identified by the transport addresses used by the | |||
endpoints in the association. Two SCTP endpoints MUST NOT have | endpoints in the association. Two SCTP endpoints MUST NOT have | |||
more than one SCTP association between them at any given time. | more than one SCTP association between them at any given time. | |||
SCTP Endpoint: The logical sender/receiver of SCTP packets. On a | SCTP Endpoint: The logical sender/receiver of SCTP packets. On a | |||
multi-homed host, an SCTP endpoint is represented to its peers as | multi-homed host, an SCTP endpoint is represented to its peers as | |||
a combination of a set of eligible destination transport addresses | a combination of a set of eligible destination transport addresses | |||
to which SCTP packets can be sent and a set of eligible source | 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 from which SCTP packets can be received. All | |||
transport addresses used by an SCTP endpoint MUST use the same | transport addresses used by an SCTP endpoint MUST use the same | |||
port number, but can use multiple IP addresses. A transport | port number but can use multiple IP addresses. A transport | |||
address used by an SCTP endpoint MUST NOT be used by another SCTP | address used by an SCTP endpoint MUST NOT be used by another SCTP | |||
endpoint. In other words, a transport address is unique to an | endpoint. In other words, a transport address is unique to an | |||
SCTP endpoint. | SCTP endpoint. | |||
SCTP Packet (or Packet): The unit of data delivery across the | SCTP Packet (or Packet): The unit of data delivery across the | |||
interface between SCTP and the connectionless packet network | interface between SCTP and the connectionless packet network | |||
(e.g., IP). An SCTP packet includes the common SCTP header, | (e.g., IP). An SCTP packet includes the common SCTP header, | |||
possible SCTP control chunks, and user data encapsulated within | possible SCTP control chunks, and user data encapsulated within | |||
SCTP DATA chunks. | SCTP DATA chunks. | |||
SCTP User Application (or SCTP User): The logical higher-layer | SCTP User Application (or SCTP User): The logical higher-layer | |||
application entity which uses the services of SCTP, also called | application entity that uses the services of SCTP, also called the | |||
the Upper-Layer Protocol (ULP). | Upper-Layer Protocol (ULP). | |||
Slow-Start Threshold (ssthresh): An SCTP variable. This is the | Slow-Start Threshold (ssthresh): An SCTP variable. This is the | |||
threshold that the endpoint will use to determine whether to | threshold that the endpoint will use to determine whether to | |||
perform slow start or congestion avoidance on a particular | perform slow-start or congestion avoidance on a particular | |||
destination transport address. Ssthresh is in number of bytes. | destination transport address. Ssthresh is in number of bytes. | |||
State Cookie: A container of all information needed to establish an | State Cookie: A container of all information needed to establish an | |||
association. | association. | |||
Stream: A unidirectional logical channel established from one to | Stream: A unidirectional logical channel established from one to | |||
another associated SCTP endpoint, within which all user messages | another associated SCTP endpoint, within which all user messages | |||
are delivered in sequence except for those submitted to the | are delivered in sequence, except for those submitted to the | |||
unordered delivery service. | unordered delivery service. | |||
Note: The relationship between stream numbers in opposite | Note: The relationship between stream numbers in opposite | |||
directions is strictly a matter of how the applications use them. | directions is strictly a matter of how the applications use them. | |||
It is the responsibility of the SCTP user to create and manage | It is the responsibility of the SCTP user to create and manage | |||
these correlations if they are so desired. | these correlations if they are so desired. | |||
Stream Sequence Number: A 16-bit sequence number used internally by | Stream Sequence Number: A 16-bit sequence number used internally by | |||
SCTP to ensure sequenced delivery of the user messages within a | SCTP to ensure sequenced delivery of the user messages within a | |||
given stream. One Stream Sequence Number is attached to each | given stream. One Stream Sequence Number is attached to each | |||
skipping to change at page 12, line 16 ¶ | skipping to change at line 520 ¶ | |||
by an SCTP endpoint for each of its existing SCTP associations to | by an SCTP endpoint for each of its existing SCTP associations to | |||
other SCTP endpoints. TCB contains all the status and operational | other SCTP endpoints. TCB contains all the status and operational | |||
information for the endpoint to maintain and manage the | information for the endpoint to maintain and manage the | |||
corresponding association. | corresponding association. | |||
Transmission Sequence Number (TSN): A 32-bit sequence number used | Transmission Sequence Number (TSN): A 32-bit sequence number used | |||
internally by SCTP. One TSN is attached to each chunk containing | internally by SCTP. One TSN is attached to each chunk containing | |||
user data to permit the receiving SCTP endpoint to acknowledge its | user data to permit the receiving SCTP endpoint to acknowledge its | |||
receipt and detect duplicate deliveries. | receipt and detect duplicate deliveries. | |||
Transport Address: A transport address is traditionally defined by a | Transport Address: A transport address is typically defined by a | |||
network-layer address, a transport-layer protocol, and a | network-layer address, a transport-layer protocol, and a | |||
transport-layer port number. In the case of SCTP running over IP, | transport-layer port number. In the case of SCTP running over IP, | |||
a transport address is defined by the combination of an IP address | a transport address is defined by the combination of an IP address | |||
and an SCTP port number (where SCTP is the transport protocol). | and an SCTP port number (where SCTP is the transport protocol). | |||
Unordered Message: Unordered messages are "unordered" with respect | Unordered Message: Unordered messages are "unordered" with respect | |||
to any other message; this includes both other unordered messages | to any other message; this includes both other unordered messages | |||
as well as other ordered messages. An unordered message might be | as well as other ordered messages. An unordered message might be | |||
delivered prior to or later than ordered messages sent on the same | delivered prior to or later than ordered messages sent on the same | |||
stream. | stream. | |||
User Message: The unit of data delivery across the interface between | User Message: The unit of data delivery across the interface between | |||
SCTP and its user. | SCTP and its user. | |||
Verification Tag: A 32-bit unsigned integer that is randomly | Verification Tag: A 32-bit unsigned integer that is randomly | |||
generated. The Verification Tag provides a key that allows a | generated. The Verification Tag provides a key that allows a | |||
receiver to verify that the SCTP packet belongs to the current | receiver to verify that the SCTP packet belongs to the current | |||
association and is not an old or stale packet from a previous | association and is not an old or stale packet from a previous | |||
association. | association. | |||
2.4. Abbreviations | 1.4. Abbreviations | |||
MAC Message Authentication Code [RFC2104] | ||||
RTO Retransmission Timeout | ||||
RTT Round-Trip Time | ||||
MAC Message Authentication Code [RFC2104] | ||||
RTO Retransmission Timeout | ||||
RTT Round-Trip Time | ||||
RTTVAR Round-Trip Time Variation | 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 | ||||
2.5. Functional View of SCTP | 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 | The SCTP transport service can be decomposed into a number of | |||
functions. These are depicted in Figure 2 and explained in the | functions. These are depicted in Figure 2 and explained in the | |||
remainder of this section. | remainder of this section. | |||
SCTP User Application | SCTP User Application | |||
----------------------------------------------------- | ----------------------------------------------------- | |||
_____________ ____________________ | _____________ ____________________ | |||
| | | Sequenced Delivery | | | | | Sequenced Delivery | | |||
skipping to change at page 13, line 43 ¶ | skipping to change at line 601 ¶ | |||
| | ________________________________ | | | ________________________________ | |||
| | | Packet Validation | | | | | Packet Validation | | |||
| | |________________________________| | | | |________________________________| | |||
| | | | | | |||
| | ________________________________ | | | ________________________________ | |||
| | | Path Management | | | | | Path Management | | |||
|_____________| |________________________________| | |_____________| |________________________________| | |||
Figure 2: Functional View of the SCTP Transport Service | Figure 2: Functional View of the SCTP Transport Service | |||
2.5.1. Association Startup and Takedown | 1.5.1. Association Startup and Takedown | |||
An association is initiated by a request from the SCTP user (see the | An association is initiated by a request from the SCTP user (see the | |||
description of the ASSOCIATE (or SEND) primitive in Section 11). | description of the ASSOCIATE (or SEND) primitive in Section 11). | |||
A cookie mechanism, similar to one described by Karn and Simpson in | A cookie mechanism, similar to one described by Karn and Simpson in | |||
[RFC2522], is employed during the initialization to provide | [RFC2522], is employed during the initialization to provide | |||
protection against synchronization attacks. The cookie mechanism | protection against synchronization attacks. The cookie mechanism | |||
uses a four-way handshake, the last two legs of which are allowed to | 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 | carry user data for fast setup. The startup sequence is described in | |||
Section 5 of this document. | Section 5 of this document. | |||
skipping to change at page 14, line 26 ¶ | skipping to change at line 627 ¶ | |||
primitive) or as a result of an error condition detected within the | primitive) or as a result of an error condition detected within the | |||
SCTP layer. Section 9 describes both the graceful and the ungraceful | SCTP layer. Section 9 describes both the graceful and the ungraceful | |||
close procedures. | close procedures. | |||
SCTP does not support a half-open state (like TCP) wherein one side | SCTP does not support a half-open state (like TCP) wherein one side | |||
continues sending data while the other end is closed. When either | continues sending data while the other end is closed. When either | |||
endpoint performs a shutdown, the association on each peer will stop | endpoint performs a shutdown, the association on each peer will stop | |||
accepting new data from its user and only deliver data in queue at | accepting new data from its user and only deliver data in queue at | |||
the time of the graceful close (see Section 9). | the time of the graceful close (see Section 9). | |||
2.5.2. Sequenced Delivery within Streams | 1.5.2. Sequenced Delivery within Streams | |||
The term "stream" is used in SCTP to refer to a sequence of user | 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 | messages that are to be delivered to the upper-layer protocol in | |||
order with respect to other messages within the same stream. This is | 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 | 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). | bytes (in this document, a byte is assumed to be 8 bits). | |||
The SCTP user can specify at association startup time the number of | At association startup time, the SCTP user can specify the number of | |||
streams to be supported by the association. This number is | streams to be supported by the association. This number is | |||
negotiated with the remote end (see Section 5.1.1). User messages | negotiated with the remote end (see Section 5.1.1). User messages | |||
are associated with stream numbers (SEND, RECEIVE primitives, | are associated with stream numbers (SEND, RECEIVE primitives; | |||
Section 11). Internally, SCTP assigns a Stream Sequence Number to | Section 11). Internally, SCTP assigns a Stream Sequence Number to | |||
each message passed to it by the SCTP user. On the receiving side, | 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 | SCTP ensures that messages are delivered to the SCTP user in sequence | |||
within a given stream. However, while one stream might be blocked | within a given stream. However, while one stream might be blocked | |||
waiting for the next in-sequence user message, delivery from other | waiting for the next in-sequence user message, delivery from other | |||
streams might proceed. | streams might proceed. | |||
SCTP provides a mechanism for bypassing the sequenced delivery | SCTP provides a mechanism for bypassing the sequenced delivery | |||
service. User messages sent using this mechanism are delivered to | service. User messages sent using this mechanism are delivered to | |||
the SCTP user as soon as they are received. | the SCTP user as soon as they are received. | |||
2.5.3. User Data Fragmentation | 1.5.3. User Data Fragmentation | |||
When needed, SCTP fragments user messages to ensure that the size of | When needed, SCTP fragments user messages to ensure that the size of | |||
the SCTP packet passed to the lower layer does not exceed the PMTU. | the SCTP packet passed to the lower layer does not exceed the PMTU. | |||
Once a user message has been fragmented, this fragmentation cannot be | Once a user message has been fragmented, this fragmentation cannot be | |||
changed anymore. On receipt, fragments are reassembled into complete | changed anymore. On receipt, fragments are reassembled into complete | |||
messages before being passed to the SCTP user. | messages before being passed to the SCTP user. | |||
2.5.4. Acknowledgement and Congestion Avoidance | 1.5.4. Acknowledgement and Congestion Avoidance | |||
SCTP assigns a Transmission Sequence Number (TSN) to each user data | SCTP assigns a Transmission Sequence Number (TSN) to each user data | |||
fragment or unfragmented message. The TSN is independent of any | fragment or unfragmented message. The TSN is independent of any | |||
Stream Sequence Number assigned at the stream level. The receiving | Stream Sequence Number assigned at the stream level. The receiving | |||
end acknowledges all TSNs received, even if there are gaps in the | end acknowledges all TSNs received, even if there are gaps in the | |||
sequence. If a user data fragment or unfragmented message needs to | sequence. If a user data fragment or unfragmented message needs to | |||
be retransmitted, the TSN assigned to it is used. In this way, | be retransmitted, the TSN assigned to it is used. In this way, | |||
reliable delivery is kept functionally separate from sequenced stream | reliable delivery is kept functionally separate from sequenced stream | |||
delivery. | delivery. | |||
The acknowledgement and congestion avoidance function is responsible | The acknowledgement and congestion avoidance function is responsible | |||
for packet retransmission when timely acknowledgement has not been | for packet retransmission when timely acknowledgement has not been | |||
received. Packet retransmission is conditioned by congestion | received. Packet retransmission is conditioned by congestion | |||
avoidance procedures similar to those used for TCP. See Section 6 | avoidance procedures similar to those used for TCP. See Sections 6 | |||
and Section 7 for a detailed description of the protocol procedures | and 7 for detailed descriptions of the protocol procedures associated | |||
associated with this function. | with this function. | |||
2.5.5. Chunk Bundling | 1.5.5. Chunk Bundling | |||
As described in Section 3, the SCTP packet as delivered to the lower | 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. | layer consists of a common header followed by one or more chunks. | |||
Each chunk contains either user data or SCTP control information. An | Each chunk contains either user data or SCTP control information. An | |||
SCTP implementation supporting bundling on the sender side might | SCTP implementation supporting bundling on the sender side might | |||
delay the sending of user messages to allow the corresponding DATA | delay the sending of user messages to allow the corresponding DATA | |||
chunks to be bundled. | chunks to be bundled. | |||
The SCTP user has the option to request that an SCTP implementation | The SCTP user has the option to request that an SCTP implementation | |||
does not delay the sending of a user message just for this purpose. | does not delay the sending of a user message just for this purpose. | |||
However, even if the SCTP user has chosen this option, the SCTP | However, even if the SCTP user has chosen this option, the SCTP | |||
implementation might delay the sending due to other reasons, for | implementation might delay the sending due to other reasons (for | |||
example due to congestion control or flow control, and might also | example, due to congestion control or flow control) and might also | |||
bundle multiple DATA chunks, if possible. | bundle multiple DATA chunks, if possible. | |||
2.5.6. Packet Validation | 1.5.6. Packet Validation | |||
A mandatory Verification Tag field and a 32-bit checksum field (see | A mandatory Verification Tag field and a 32-bit checksum field (see | |||
Appendix A for a description of the CRC32c checksum) are included in | Appendix A for a description of the 32-bit Cyclic Redundancy Check | |||
the SCTP common header. The Verification Tag value is chosen by each | (CRC32c) checksum) are included in the SCTP common header. The | |||
end of the association during association startup. Packets received | Verification Tag value is chosen by each end of the association | |||
without the expected Verification Tag value are discarded, as a | during association startup. Packets received without the expected | |||
protection against blind masquerade attacks and against stale SCTP | Verification Tag value are discarded, as a protection against blind | |||
packets from a previous association. The CRC32c checksum is set by | masquerade attacks and against stale SCTP packets from a previous | |||
the sender of each SCTP packet to provide additional protection | association. The CRC32c checksum is set by the sender of each SCTP | |||
against data corruption in the network. The receiver of an SCTP | packet to provide additional protection against data corruption in | |||
packet with an invalid CRC32c checksum silently discards the packet. | the network. The receiver of an SCTP packet with an invalid CRC32c | |||
checksum silently discards the packet. | ||||
2.5.7. Path Management | 1.5.7. Path Management | |||
The sending SCTP user is able to manipulate the set of transport | The sending SCTP user is able to manipulate the set of transport | |||
addresses used as destinations for SCTP packets through the | addresses used as destinations for SCTP packets through the | |||
primitives described in Section 11. The SCTP path management | primitives described in Section 11. The SCTP path management | |||
function monitors reachability through heartbeats when other packet | function monitors reachability through heartbeats when other packet | |||
traffic is inadequate to provide this information and advises the | traffic is inadequate to provide this information and advises the | |||
SCTP user when reachability of any transport address of the peer | SCTP user when reachability of any transport address of the peer | |||
endpoint changes. The path management function chooses the | endpoint changes. The path management function chooses the | |||
destination transport address for each outgoing SCTP packet based on | destination transport address for each outgoing SCTP packet based on | |||
the SCTP user's instructions and the currently perceived reachability | the SCTP user's instructions and the currently perceived reachability | |||
status of the eligible destination set. The path management function | status of the eligible destination set. The path management function | |||
is also responsible for reporting the eligible set of local transport | is also responsible for reporting the eligible set of local transport | |||
addresses to the peer endpoint during association startup, and for | addresses to the peer endpoint during association startup and for | |||
reporting the transport addresses returned from the peer endpoint to | reporting the transport addresses returned from the peer endpoint to | |||
the SCTP user. | the SCTP user. | |||
At association startup, a primary path is defined for each SCTP | At association startup, a primary path is defined for each SCTP | |||
endpoint, and is used for normal sending of SCTP packets. | endpoint and is used to send SCTP packets normally. | |||
On the receiving end, the path management is responsible for | On the receiving end, the path management is responsible for | |||
verifying the existence of a valid SCTP association to which the | verifying the existence of a valid SCTP association to which the | |||
inbound SCTP packet belongs before passing it for further processing. | inbound SCTP packet belongs before passing it for further processing. | |||
Note: Path Management and Packet Validation are done at the same | Note: Path Management and Packet Validation are done at the same | |||
time, so although described separately above, in reality they cannot | time; although described separately above, in reality, they cannot be | |||
be performed as separate items. | performed as separate items. | |||
2.6. Serial Number Arithmetic | 1.6. Serial Number Arithmetic | |||
It is essential to remember that the actual Transmission Sequence | It is essential to remember that the actual Transmission Sequence | |||
Number space is finite, though very large. This space ranges from 0 | 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 | to 2^32 - 1. Since the space is finite, all arithmetic dealing with | |||
Transmission Sequence Numbers MUST be performed modulo 2^32. This | Transmission Sequence Numbers MUST be performed modulo 2^32. This | |||
unsigned arithmetic preserves the relationship of sequence numbers as | unsigned arithmetic preserves the relationship of sequence numbers as | |||
they cycle from 2^32 - 1 to 0 again. There are some subtleties to | they cycle from 2^32 - 1 to 0 again. There are some subtleties to | |||
computer modulo arithmetic, so great care has to be taken in | computer modulo arithmetic, so great care has to be taken in | |||
programming the comparison of such values. When referring to TSNs, | programming the comparison of such values. When referring to TSNs, | |||
the symbol "<=" means "less than or equal" (modulo 2^32). | the symbol "<=" means "less than or equal" (modulo 2^32). | |||
Comparisons and arithmetic on TSNs in this document SHOULD use Serial | Comparisons and arithmetic on TSNs in this document SHOULD use Serial | |||
Number Arithmetic as defined in [RFC1982] where SERIAL_BITS = 32. | Number Arithmetic, as defined in [RFC1982], where SERIAL_BITS = 32. | |||
An endpoint SHOULD NOT transmit a DATA chunk with a TSN that is more | 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. | than 2^31 - 1 above the beginning TSN of its current send window. | |||
Doing so will cause problems in comparing TSNs. | Doing so will cause problems in comparing TSNs. | |||
Transmission Sequence Numbers wrap around when they reach 2^32 - 1. | Transmission Sequence Numbers wrap around when they reach 2^32 - 1. | |||
That is, the next TSN a DATA chunk MUST use after transmitting TSN = | That is, the next TSN a DATA chunk MUST use after transmitting TSN = | |||
2^32 - 1 is TSN = 0. | 2^32 - 1 is TSN = 0. | |||
Any arithmetic done on Stream Sequence Numbers SHOULD use Serial | Any arithmetic done on Stream Sequence Numbers SHOULD use Serial | |||
Number Arithmetic as defined in [RFC1982] where SERIAL_BITS = 16. | Number Arithmetic, as defined in [RFC1982], where SERIAL_BITS = 16. | |||
All other arithmetic and comparisons in this document use normal | All other arithmetic and comparisons in this document use normal | |||
arithmetic. | arithmetic. | |||
2.7. Changes from RFC 4960 | 1.7. Changes from RFC 4960 | |||
SCTP was originally defined in [RFC4960], which this document | SCTP was originally defined in [RFC4960], which this document | |||
obsoletes, if approved. Readers interested in the details of the | obsoletes. Readers interested in the details of the various changes | |||
various changes that this document incorporates are asked to consult | that this document incorporates are asked to consult [RFC8540]. | |||
[RFC8540]. | ||||
In addition to these and further editorial changes, the following | In addition to these and further editorial changes, the following | |||
changes have been incorporated in this document: | changes have been incorporated in this document: | |||
* Update references. | * Update references. | |||
* Improve the language related to requirements levels. | * Improve the language related to requirements levels. | |||
* Allow the ASSOCIATE primitive to take multiple remote addresses; | * Allow the ASSOCIATE primitive to take multiple remote addresses; | |||
also refer to the Socket API specification. | also refer to the socket API specification. | |||
* Refer to the PLPMTUD specification for path MTU discovery. | * Refer to the Packetization Layer Path MTU Discovery (PLPMTUD) | |||
specification for path MTU discovery. | ||||
* Move the description of ICMP handling from an Appendix to the main | * Move the description of ICMP handling from the Appendix to the | |||
text. | main text. | |||
* Remove the Appendix describing ECN handling from the document. | * Remove the Appendix describing Explicit Congestion Notification | |||
(ECN) handling from the document. | ||||
* Describe the packet size handling more precisely by introducing | * Describe the packet size handling more precisely by introducing | |||
PMTU, PMDCS and AMDCS. | PMTU, PMDCS, and AMDCS. | |||
* Add the definition of control chunk. | * Add the definition of control chunk. | |||
* Improve the description of the handling of INIT and INIT ACK | * Improve the description of the handling of INIT and INIT ACK | |||
chunks with invalid mandatory parameters. | chunks with invalid mandatory parameters. | |||
* Allow using L > 1 for Appropriate Byte Counting (ABC) during slow | * Allow using L > 1 for Appropriate Byte Counting (ABC) during slow | |||
start. | start. | |||
* Explicitly describe the reinitialization of the congestion | * Explicitly describe the reinitialization of the congestion | |||
controller on route changes. | controller on route changes. | |||
* Improve the terminology to make clear that this specification does | * Improve the terminology to make it clear that this specification | |||
not describe a full mesh architecture. | does not describe a full mesh architecture. | |||
* Improve the description of sequence number generation | * Improve the description of sequence number generation | |||
(Transmission Sequence Number and Stream Sequence Number). | (Transmission Sequence Number and Stream Sequence Number). | |||
* Improve the description of reneging. | * Improve the description of reneging. | |||
* Don't require the change of the cumulative TSN ACK anymore for | * Don't require the change of the Cumulative TSN Ack anymore for | |||
increasing the congestion window. This improves the consistency | increasing the congestion window. This improves the consistency | |||
with the handling in congestion avoidance. | with the handling in congestion avoidance. | |||
* Improve the description of the State Cookie. | * Improve the description of the State Cookie. | |||
* Fix the API for retrieving messages in case of association | * Fix the API for retrieving messages in case of association | |||
failures. | failures. | |||
2. Conventions | ||||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | ||||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | ||||
"OPTIONAL" in this document are to be interpreted as described in BCP | ||||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | ||||
capitals, as shown here. | ||||
3. SCTP Packet Format | 3. SCTP Packet Format | |||
An SCTP packet is composed of a common header and chunks. A chunk | An SCTP packet is composed of a common header and chunks. A chunk | |||
contains either control information or user data. | contains either control information or user data. | |||
The SCTP packet format is shown below: | The SCTP packet format is shown below: | |||
0 1 2 3 | 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 | 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 | | | Common Header | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Chunk #1 | | | Chunk #1 | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ... | | | ... | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Chunk #n | | | Chunk #n | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
INIT, INIT ACK and SHUTDOWN COMPLETE chunks MUST NOT be bundled with | INIT, INIT ACK, and SHUTDOWN COMPLETE chunks MUST NOT be bundled with | |||
any other chunk into an SCTP packet. All other chunks MAY be bundled | any other chunk into an SCTP packet. All other chunks MAY be bundled | |||
to form an SCTP packet that does not exceed the PMTU. See | to form an SCTP packet that does not exceed the PMTU. See | |||
Section 6.10 for more details on chunk bundling. | Section 6.10 for more details on chunk bundling. | |||
If a user data message does not fit into one SCTP packet it can be | If a user data message does not fit into one SCTP packet, it can be | |||
fragmented into multiple chunks using the procedure defined in | fragmented into multiple chunks using the procedure defined in | |||
Section 6.9. | Section 6.9. | |||
All integer fields in an SCTP packet MUST be transmitted in network | All integer fields in an SCTP packet MUST be transmitted in network | |||
byte order, unless otherwise stated. | byte order, unless otherwise stated. | |||
3.1. SCTP Common Header Field Descriptions | 3.1. SCTP Common Header Field Descriptions | |||
0 1 2 3 | 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 | 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 | |||
skipping to change at page 19, line 44 ¶ | skipping to change at line 872 ¶ | |||
| Source Port Number | Destination Port Number | | | Source Port Number | Destination Port Number | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Verification Tag | | | Verification Tag | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Checksum | | | Checksum | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
Source Port Number: 16 bits (unsigned integer) | Source Port Number: 16 bits (unsigned integer) | |||
This is the SCTP sender's port number. It can be used by the | This is the SCTP sender's port number. It can be used by the | |||
receiver in combination with the source IP address, the SCTP | receiver in combination with the source IP address, the SCTP | |||
destination port, and possibly the destination IP address to | Destination Port Number, and possibly the destination IP address | |||
identify the association to which this packet belongs. The source | to identify the association to which this packet belongs. The | |||
port number 0 MUST NOT be used. | Source Port Number 0 MUST NOT be used. | |||
Destination Port Number: 16 bits (unsigned integer) | Destination Port Number: 16 bits (unsigned integer) | |||
This is the SCTP port number to which this packet is destined. | This is the SCTP port number to which this packet is destined. | |||
The receiving host will use this port number to de-multiplex the | The receiving host will use this port number to de-multiplex the | |||
SCTP packet to the correct receiving endpoint/application. The | SCTP packet to the correct receiving endpoint/application. The | |||
destination port number 0 MUST NOT be used. | Destination Port Number 0 MUST NOT be used. | |||
Verification Tag: 32 bits (unsigned integer) | Verification Tag: 32 bits (unsigned integer) | |||
The receiver of an SCTP packet uses the Verification Tag to | The receiver of an SCTP packet uses the Verification Tag to | |||
validate the sender of this packet. On transmit, the value of the | validate the sender of this packet. On transmit, the value of the | |||
Verification Tag MUST be set to the value of the Initiate Tag | Verification Tag MUST be set to the value of the Initiate Tag | |||
received from the peer endpoint during the association | received from the peer endpoint during the association | |||
initialization, with the following exceptions: | initialization, with the following exceptions: | |||
* A packet containing an INIT chunk MUST have a zero Verification | * A packet containing an INIT chunk MUST have a zero Verification | |||
Tag. | Tag. | |||
* A packet containing a SHUTDOWN COMPLETE chunk with the T bit | * A packet containing a SHUTDOWN COMPLETE chunk with the T bit | |||
set MUST have the Verification Tag copied from the packet with | set MUST have the Verification Tag copied from the packet with | |||
the SHUTDOWN ACK chunk. | the SHUTDOWN ACK chunk. | |||
* A packet containing an ABORT chunk MAY have the verification | * A packet containing an ABORT chunk MAY have the Verification | |||
tag copied from the packet that caused the ABORT chunk to be | Tag copied from the packet that caused the ABORT chunk to be | |||
sent. For details see Section 8.4 and Section 8.5. | sent. For details, see Sections 8.4 and 8.5. | |||
Checksum: 32 bits (unsigned integer) | Checksum: 32 bits (unsigned integer) | |||
This field contains the checksum of the SCTP packet. Its | This field contains the checksum of the SCTP packet. Its | |||
calculation is discussed in Section 6.8. SCTP uses the CRC32c | calculation is discussed in Section 6.8. SCTP uses the CRC32c | |||
algorithm as described in Appendix A for calculating the checksum. | algorithm as described in Appendix A for calculating the checksum. | |||
3.2. Chunk Field Descriptions | 3.2. Chunk Field Descriptions | |||
The figure below illustrates the field format for the chunks to be | The figure below illustrates the field format for the chunks to be | |||
transmitted in the SCTP packet. Each chunk is formatted with a Chunk | 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 | Type field, a Chunk Flags field, a Chunk Length field, and a Chunk | |||
Value field. | Value field. | |||
0 1 2 3 | 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 | 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 Type | Chunk Flags | Chunk Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
\ \ | \ \ | |||
/ Chunk Value / | / Chunk Value / | |||
\ \ | \ \ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
Chunk Type: 8 bits (unsigned integer) | Chunk Type: 8 bits (unsigned integer) | |||
This field identifies the type of information contained in the | This field identifies the type of information contained in the | |||
Chunk Value field. It takes a value from 0 to 254. The value of | Chunk Value field. It takes a value from 0 to 254. The value of | |||
255 is reserved for future use as an extension field. | 255 is reserved for future use as an extension field. | |||
The values of Chunk Types are defined as follows: | The values of Chunk Types defined in this document are as follows: | |||
+==========+===========================================+ | +==========+===========================================+ | |||
| ID Value | Chunk Type | | | ID Value | Chunk Type | | |||
+==========+===========================================+ | +==========+===========================================+ | |||
| 0 | Payload Data (DATA) | | | 0 | Payload Data (DATA) | | |||
+----------+-------------------------------------------+ | +----------+-------------------------------------------+ | |||
| 1 | Initiation (INIT) | | | 1 | Initiation (INIT) | | |||
+----------+-------------------------------------------+ | +----------+-------------------------------------------+ | |||
| 2 | Initiation Acknowledgement (INIT ACK) | | | 2 | Initiation Acknowledgement (INIT ACK) | | |||
+----------+-------------------------------------------+ | +----------+-------------------------------------------+ | |||
skipping to change at page 21, line 40 ¶ | skipping to change at line 964 ¶ | |||
| 11 | Cookie Acknowledgement (COOKIE ACK) | | | 11 | Cookie Acknowledgement (COOKIE ACK) | | |||
+----------+-------------------------------------------+ | +----------+-------------------------------------------+ | |||
| 12 | Reserved for Explicit Congestion | | | 12 | Reserved for Explicit Congestion | | |||
| | Notification Echo (ECNE) | | | | Notification Echo (ECNE) | | |||
+----------+-------------------------------------------+ | +----------+-------------------------------------------+ | |||
| 13 | Reserved for Congestion Window Reduced | | | 13 | Reserved for Congestion Window Reduced | | |||
| | (CWR) | | | | (CWR) | | |||
+----------+-------------------------------------------+ | +----------+-------------------------------------------+ | |||
| 14 | Shutdown Complete (SHUTDOWN COMPLETE) | | | 14 | Shutdown Complete (SHUTDOWN COMPLETE) | | |||
+----------+-------------------------------------------+ | +----------+-------------------------------------------+ | |||
| 15 to 62 | available | | | 15 to 62 | Unassigned | | |||
+----------+-------------------------------------------+ | +----------+-------------------------------------------+ | |||
| 63 | reserved for IETF-defined Chunk | | | 63 | Reserved for IETF-defined Chunk | | |||
| | Extensions | | | | Extensions | | |||
+----------+-------------------------------------------+ | +----------+-------------------------------------------+ | |||
| 64 to | available | | | 64 to | Unassigned | | |||
| 126 | | | | 126 | | | |||
+----------+-------------------------------------------+ | +----------+-------------------------------------------+ | |||
| 127 | reserved for IETF-defined Chunk | | | 127 | Reserved for IETF-defined Chunk | | |||
| | Extensions | | | | Extensions | | |||
+----------+-------------------------------------------+ | +----------+-------------------------------------------+ | |||
| 128 to | available | | | 128 to | Unassigned | | |||
| 190 | | | | 190 | | | |||
+----------+-------------------------------------------+ | +----------+-------------------------------------------+ | |||
| 191 | reserved for IETF-defined Chunk | | | 191 | Reserved for IETF-defined Chunk | | |||
| | Extensions | | | | Extensions | | |||
+----------+-------------------------------------------+ | +----------+-------------------------------------------+ | |||
| 192 to | available | | | 192 to | Unassigned | | |||
| 254 | | | | 254 | | | |||
+----------+-------------------------------------------+ | +----------+-------------------------------------------+ | |||
| 255 | reserved for IETF-defined Chunk | | | 255 | Reserved for IETF-defined Chunk | | |||
| | Extensions | | | | Extensions | | |||
+----------+-------------------------------------------+ | +----------+-------------------------------------------+ | |||
Table 1: Chunk Types | Table 1: Chunk Types | |||
Note: The ECNE and CWR chunk types are reserved for future use of | Note: The ECNE and CWR chunk types are reserved for future use of | |||
Explicit Congestion Notification (ECN). | Explicit Congestion Notification (ECN). | |||
Chunk Types are encoded such that the highest-order 2 bits specify | Chunk Types are encoded such that the highest-order 2 bits specify | |||
the action that is taken if the processing endpoint does not | the action that is taken if the processing endpoint does not | |||
recognize the Chunk Type. | recognize the Chunk Type. | |||
+----+--------------------------------------------------+ | +----+--------------------------------------------------+ | |||
| 00 | Stop processing this SCTP packet; discard the | | | 00 | Stop processing this SCTP packet and discard the | | |||
| | unrecognized chunk and all further chunks. | | | | unrecognized chunk and all further chunks. | | |||
+----+--------------------------------------------------+ | +----+--------------------------------------------------+ | |||
| 01 | Stop processing this SCTP packet, discard the | | | 01 | Stop processing this SCTP packet, discard the | | |||
| | unrecognized chunk and all further chunks, and | | | | unrecognized chunk and all further chunks, and | | |||
| | report the unrecognized chunk in an ERROR chunk | | | | report the unrecognized chunk in an ERROR chunk | | |||
| | using the 'Unrecognized Chunk Type' error cause. | | | | using the 'Unrecognized Chunk Type' error cause. | | |||
+----+--------------------------------------------------+ | +----+--------------------------------------------------+ | |||
| 10 | Skip this chunk and continue processing. | | | 10 | Skip this chunk and continue processing. | | |||
+----+--------------------------------------------------+ | +----+--------------------------------------------------+ | |||
| 11 | Skip this chunk and continue processing, but | | | 11 | Skip this chunk and continue processing, but | | |||
| | report it in an ERROR chunk using the | | | | report it in an ERROR chunk using the | | |||
| | 'Unrecognized Chunk Type' error cause. | | | | 'Unrecognized Chunk Type' error cause. | | |||
+----+--------------------------------------------------+ | +----+--------------------------------------------------+ | |||
Table 2: Processing of Unknown Chunks | Table 2: Processing of Unknown Chunks | |||
Chunk Flags: 8 bits | Chunk Flags: 8 bits | |||
The usage of these bits depends on the Chunk type as given by the | 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 | Chunk Type field. Unless otherwise specified, they are set to 0 | |||
on transmit and are ignored on receipt. | on transmit and are ignored on receipt. | |||
Chunk Length: 16 bits (unsigned integer) | Chunk Length: 16 bits (unsigned integer) | |||
This value represents the size of the chunk in bytes, including | This value represents the size of the chunk in bytes, including | |||
the Chunk Type, Chunk Flags, Chunk Length, and Chunk Value fields. | the Chunk Type, Chunk Flags, Chunk Length, and Chunk Value fields. | |||
Therefore, if the Chunk Value field is zero-length, the Length | 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 | field will be set to 4. The Chunk Length field does not count any | |||
chunk padding. However, it does include any padding of variable- | chunk padding. However, it does include any padding of variable- | |||
length parameters other than the last parameter in the chunk. | length parameters other than the last parameter in the chunk. | |||
skipping to change at page 23, line 36 ¶ | skipping to change at line 1053 ¶ | |||
SCTP-defined chunks are described in detail in Section 3.3. The | SCTP-defined chunks are described in detail in Section 3.3. The | |||
guidelines for IETF-defined chunk extensions can be found in | guidelines for IETF-defined chunk extensions can be found in | |||
Section 15.1 of this document. | Section 15.1 of this document. | |||
3.2.1. Optional/Variable-Length Parameter Format | 3.2.1. Optional/Variable-Length Parameter Format | |||
Chunk values of SCTP control chunks consist of a chunk-type-specific | Chunk values of SCTP control chunks consist of a chunk-type-specific | |||
header of required fields, followed by zero or more parameters. The | header of required fields, followed by zero or more parameters. The | |||
optional and variable-length parameters contained in a chunk are | optional and variable-length parameters contained in a chunk are | |||
defined in a Type-Length-Value format as shown below. | defined in a Type-Length-Value format, as shown below. | |||
0 1 2 3 | 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 | 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 Type | Parameter Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
\ \ | \ \ | |||
/ Parameter Value / | / Parameter Value / | |||
\ \ | \ \ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
skipping to change at page 24, line 32 ¶ | skipping to change at line 1096 ¶ | |||
If the length of the parameter is not a multiple of 4 bytes, the | 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 | 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 | field) with all zero bytes. The length of the padding is not | |||
included in the Parameter Length field. A sender MUST NOT pad with | included in the Parameter Length field. A sender MUST NOT pad with | |||
more than 3 bytes. The receiver MUST ignore the padding bytes. | more than 3 bytes. The receiver MUST ignore the padding bytes. | |||
The Parameter Types are encoded such that the highest-order 2 bits | The Parameter Types are encoded such that the highest-order 2 bits | |||
specify the action that is taken if the processing endpoint does not | specify the action that is taken if the processing endpoint does not | |||
recognize the Parameter Type. | recognize the Parameter Type. | |||
+----+-------------------------------------------------------+ | +----+--------------------------------------------------------+ | |||
| 00 | Stop processing this parameter; do not process any | | | 00 | Stop processing this parameter and do not process any | | |||
| | further parameters within this chunk. | | | | further parameters within this chunk. | | |||
+----+-------------------------------------------------------+ | +----+--------------------------------------------------------+ | |||
| 01 | Stop processing this parameter, do not process any | | | 01 | Stop processing this parameter, do not process any | | |||
| | further parameters within this chunk, and report the | | | | further parameters within this chunk, and report the | | |||
| | unrecognized parameter as described in Section 3.2.2. | | | | unrecognized parameter, as described in Section 3.2.2. | | |||
+----+-------------------------------------------------------+ | +----+--------------------------------------------------------+ | |||
| 10 | Skip this parameter and continue processing. | | | 10 | Skip this parameter and continue processing. | | |||
+----+-------------------------------------------------------+ | +----+--------------------------------------------------------+ | |||
| 11 | Skip this parameter and continue processing but | | | 11 | Skip this parameter and continue processing, but | | |||
| | report the unrecognized parameter as described in | | | | report the unrecognized parameter, as described in | | |||
| | Section 3.2.2. | | | | Section 3.2.2. | | |||
+----+-------------------------------------------------------+ | +----+--------------------------------------------------------+ | |||
Table 3: Processing of Unknown Parameters | Table 3: Processing of Unknown Parameters | |||
Please note that, when an INIT or INIT ACK chunk is received, in all | Please note that, when an INIT or INIT ACK chunk is received, in all | |||
four cases, an INIT ACK or COOKIE ECHO chunk is sent in response, | four cases, an INIT ACK or COOKIE ECHO chunk is sent in response, | |||
respectively. In the 00 or 01 case, the processing of the parameters | respectively. In the 00 or 01 case, the processing of the parameters | |||
after the unknown parameter is canceled, but no processing already | after the unknown parameter is canceled, but no processing already | |||
done is rolled back. | done is rolled back. | |||
The actual SCTP parameters are defined in the specific SCTP chunk | The actual SCTP parameters are defined in the specific SCTP chunk | |||
sections. The rules for IETF-defined parameter extensions are | sections. The rules for IETF-defined parameter extensions are | |||
defined in Section 15.3. Parameter types MUST be unique across all | defined in Section 15.3. Parameter types MUST be unique across all | |||
chunks. For example, the parameter type '5' is used to represent an | 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 | IPv4 address (see Section 3.3.2.1.1). The value '5' then is reserved | |||
across all chunks to represent an IPv4 address and MUST NOT be reused | across all chunks to represent an IPv4 address and MUST NOT be reused | |||
with a different meaning in any other chunk. | with a different meaning in any other chunk. | |||
3.2.2. Reporting of Unrecognized Parameters | 3.2.2. Reporting of Unrecognized Parameters | |||
If the receiver of an INIT chunk detects unrecognized parameters and | 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 | 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 | "Unrecognized Parameter" parameter(s) in the INIT ACK chunk sent in | |||
response to the INIT chunk. Note that if the receiver of the INIT | 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 | chunk is not going to establish an association (e.g., due to lack of | |||
resources), an "Unrecognized Parameter" error cause would not be | resources), an "Unrecognized Parameters" error cause would not be | |||
included with any ABORT chunk being sent to the sender of the INIT | included with any ABORT chunk being sent to the sender of the INIT | |||
chunk. | chunk. | |||
If the receiver of any other chunk (e.g., INIT ACK) detects | If the receiver of any other chunk (e.g., INIT ACK) detects | |||
unrecognized parameters and has to report them according to | unrecognized parameters and has to report them according to | |||
Section 3.2.1, it SHOULD bundle the ERROR chunk containing the | Section 3.2.1, it SHOULD bundle the ERROR chunk containing the | |||
"Unrecognized Parameters" error cause with the chunk sent in response | "Unrecognized Parameters" error cause with the chunk sent in response | |||
(e.g., COOKIE ECHO). If the receiver of an INIT ACK chunk cannot | (e.g., COOKIE ECHO). If the receiver of an INIT ACK chunk cannot | |||
bundle the COOKIE ECHO chunk with the ERROR chunk, the ERROR chunk | bundle the COOKIE ECHO chunk with the ERROR chunk, the ERROR chunk | |||
MAY be sent separately but not before the COOKIE ACK chunk has been | MAY be sent separately but not before the COOKIE ACK chunk has been | |||
skipping to change at page 27, line 7 ¶ | skipping to change at line 1208 ¶ | |||
of a user message. | of a user message. | |||
E bit: 1 bit | E bit: 1 bit | |||
The (E)nding fragment bit, if set, indicates the last fragment of | The (E)nding fragment bit, if set, indicates the last fragment of | |||
a user message. | a user message. | |||
Length: 16 bits (unsigned integer) | Length: 16 bits (unsigned integer) | |||
This field indicates the length of the DATA chunk in bytes from | 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 | 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 | excluding any padding. A DATA chunk with one byte of user data | |||
will have Length set to 17 (indicating 17 bytes). | will have the Length field set to 17 (indicating 17 bytes). | |||
A DATA chunk with a User Data field of length L will have the | 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 | Length field set to (16 + L) (indicating 16 + L bytes) where L | |||
MUST be greater than 0. | MUST be greater than 0. | |||
TSN: 32 bits (unsigned integer) | TSN: 32 bits (unsigned integer) | |||
This value represents the TSN for this DATA chunk. The valid | 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 | range of TSN is from 0 to 4294967295 (2^32 - 1). TSN wraps back | |||
to 0 after reaching 4294967295. | to 0 after reaching 4294967295. | |||
skipping to change at page 27, line 38 ¶ | skipping to change at line 1239 ¶ | |||
Payload Protocol Identifier: 32 bits (unsigned integer) | Payload Protocol Identifier: 32 bits (unsigned integer) | |||
This value represents an application (or upper layer) specified | This value represents an application (or upper layer) specified | |||
protocol identifier. This value is passed to SCTP by its upper | protocol identifier. This value is passed to SCTP by its upper | |||
layer and sent to its peer. This identifier is not used by SCTP | 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 | but can be used by certain network entities, as well as by the | |||
peer application, to identify the type of information being | peer application, to identify the type of information being | |||
carried in this DATA chunk. This field MUST be sent even in | carried in this DATA chunk. This field MUST be sent even in | |||
fragmented DATA chunks (to make sure it is available for agents 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 | the middle of the network). Note that this field is not touched | |||
by an SCTP implementation; The upper layer is responsible for the | by an SCTP implementation; the upper layer is responsible for the | |||
host to network byte order conversion of this field. | host to network byte order conversion of this field. | |||
The value 0 indicates that no application identifier is specified | The value 0 indicates that no application identifier is specified | |||
by the upper layer for this payload data. | by the upper layer for this payload data. | |||
User Data: variable length | User Data: variable length | |||
This is the payload user data. The implementation MUST pad the | 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 | 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 | padding MUST NOT be included in the Length field. A sender MUST | |||
never add more than 3 bytes of padding. | never add more than 3 bytes of padding. | |||
An unfragmented user message MUST have both the B and E bits set to | An unfragmented user message MUST have both the B and E bits set to | |||
1. Setting both B and E bits to 0 indicates a middle fragment of a | 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: | multi-fragment user message, as summarized in the following table: | |||
+---+---+-------------------------------------------+ | +===+===+===========================================+ | |||
| B | E | Description | | | B | E | Description | | |||
+---+---+-------------------------------------------+ | +===+===+===========================================+ | |||
| 1 | 0 | First piece of a fragmented user message | | | 1 | 0 | First piece of a fragmented user message | | |||
+---+---+-------------------------------------------+ | +---+---+-------------------------------------------+ | |||
| 0 | 0 | Middle piece of a fragmented user message | | | 0 | 0 | Middle piece of a fragmented user message | | |||
+---+---+-------------------------------------------+ | +---+---+-------------------------------------------+ | |||
| 0 | 1 | Last piece of a fragmented user message | | | 0 | 1 | Last piece of a fragmented user message | | |||
+---+---+-------------------------------------------+ | +---+---+-------------------------------------------+ | |||
| 1 | 1 | Unfragmented message | | | 1 | 1 | Unfragmented message | | |||
+---+---+-------------------------------------------+ | +---+---+-------------------------------------------+ | |||
Table 4: Fragment Description Flags | Table 4: Fragment Description Flags | |||
skipping to change at page 29, line 27 ¶ | skipping to change at line 1306 ¶ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
\ \ | \ \ | |||
/ Optional/Variable-Length Parameters / | / Optional/Variable-Length Parameters / | |||
\ \ | \ \ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
The following parameters are specified for the INIT chunk. Unless | The following parameters are specified for the INIT chunk. Unless | |||
otherwise noted, each parameter MUST only be included once in the | otherwise noted, each parameter MUST only be included once in the | |||
INIT chunk. | INIT chunk. | |||
+-----------------------------------+-----------+ | +===================================+===========+ | |||
| Fixed Length Parameter | Status | | | Fixed-Length Parameter | Status | | |||
+-----------------------------------+-----------+ | +===================================+===========+ | |||
| Initiate Tag | Mandatory | | | Initiate Tag | Mandatory | | |||
+-----------------------------------+-----------+ | +-----------------------------------+-----------+ | |||
| Advertised Receiver Window Credit | Mandatory | | | Advertised Receiver Window Credit | Mandatory | | |||
+-----------------------------------+-----------+ | +-----------------------------------+-----------+ | |||
| Number of Outbound Streams | Mandatory | | | Number of Outbound Streams | Mandatory | | |||
+-----------------------------------+-----------+ | +-----------------------------------+-----------+ | |||
| Number of Inbound Streams | Mandatory | | | Number of Inbound Streams | Mandatory | | |||
+-----------------------------------+-----------+ | +-----------------------------------+-----------+ | |||
| Initial TSN | Mandatory | | | Initial TSN | Mandatory | | |||
+-----------------------------------+-----------+ | +-----------------------------------+-----------+ | |||
Table 5: Fixed Length Parameters of INIT Chunks | Table 5: Fixed-Length Parameters of INIT Chunks | |||
+-----------------------------------+------------+----------------+ | +===================================+============+================+ | |||
| Variable Length Parameter | Status | Type Value | | | Variable-Length Parameter | Status | Type Value | | |||
+-----------------------------------+------------+----------------+ | +===================================+============+================+ | |||
| IPv4 Address (Note 1) | Optional | 5 | | | IPv4 Address (Note 1) | Optional | 5 | | |||
+-----------------------------------+------------+----------------+ | +-----------------------------------+------------+----------------+ | |||
| IPv6 Address (Note 1) | Optional | 6 | | | IPv6 Address (Note 1) | Optional | 6 | | |||
+-----------------------------------+------------+----------------+ | +-----------------------------------+------------+----------------+ | |||
| Cookie Preservative | Optional | 9 | | | Cookie Preservative | Optional | 9 | | |||
+-----------------------------------+------------+----------------+ | +-----------------------------------+------------+----------------+ | |||
| Reserved for ECN Capable (Note 2) | Optional | 32768 (0x8000) | | | Reserved for ECN Capable (Note 2) | Optional | 32768 (0x8000) | | |||
+-----------------------------------+------------+----------------+ | +-----------------------------------+------------+----------------+ | |||
| Host Name Address (Note 3) | Deprecated | 11 | | | Host Name Address (Note 3) | Deprecated | 11 | | |||
+-----------------------------------+------------+----------------+ | +-----------------------------------+------------+----------------+ | |||
| Supported Address Types (Note 4) | Optional | 12 | | | Supported Address Types (Note 4) | Optional | 12 | | |||
+-----------------------------------+------------+----------------+ | +-----------------------------------+------------+----------------+ | |||
Table 6: Variable Length Parameters of INIT Chunks | Table 6: Variable-Length Parameters of INIT Chunks | |||
Note 1: The INIT chunks can contain multiple addresses that can be | Note 1: The INIT chunks can contain multiple addresses that can be | |||
IPv4 and/or IPv6 in any combination. | IPv4 and/or IPv6 in any combination. | |||
Note 2: The ECN Capable field is reserved for future use of Explicit | Note 2: The ECN Capable field is reserved for future use of Explicit | |||
Congestion Notification. | Congestion Notification. | |||
Note 3: An INIT chunk MUST NOT contain the Host Name Address | Note 3: An INIT chunk MUST NOT contain the Host Name Address | |||
parameter. The receiver of an INIT chunk containing a Host Name | parameter. The receiver of an INIT chunk containing a Host Name | |||
Address parameter MUST send an ABORT chunk and MAY include an | Address parameter MUST send an ABORT chunk and MAY include an | |||
skipping to change at page 31, line 46 ¶ | skipping to change at line 1412 ¶ | |||
A receiver of an INIT chunk with the OS value set to 0 MUST | A receiver of an INIT chunk with the OS value set to 0 MUST | |||
discard the packet, SHOULD send a packet in response containing an | discard the packet, SHOULD send a packet in response containing an | |||
ABORT chunk and using the Initiate Tag as the Verification Tag, | ABORT chunk and using the Initiate Tag as the Verification Tag, | |||
and MUST NOT change the state of any existing association. | and MUST NOT change the state of any existing association. | |||
Number of Inbound Streams (MIS): 16 bits (unsigned integer) | Number of Inbound Streams (MIS): 16 bits (unsigned integer) | |||
Defines the maximum number of streams the sender of this INIT | Defines the maximum number of streams the sender of this INIT | |||
chunk allows the peer end to create in this association. The | chunk allows the peer end to create in this association. The | |||
value 0 MUST NOT be used. | value 0 MUST NOT be used. | |||
Note: There is no negotiation of the actual number of streams but | Note: There is no negotiation of the actual number of streams; | |||
instead the two endpoints will use the min(requested, offered). | instead, the two endpoints will use the min(requested, offered). | |||
See Section 5.1.1 for details. | See Section 5.1.1 for details. | |||
A receiver of an INIT chunk with the MIS value set to 0 MUST | A receiver of an INIT chunk with the MIS value set to 0 MUST | |||
discard the packet, SHOULD send a packet in response containing an | discard the packet, SHOULD send a packet in response containing an | |||
ABORT chunk and using the Initiate Tag as the Verification Tag, | ABORT chunk and using the Initiate Tag as the Verification Tag, | |||
and MUST NOT change the state of any existing association. | and MUST NOT change the state of any existing association. | |||
Initial TSN (I-TSN): 32 bits (unsigned integer) | Initial TSN (I-TSN): 32 bits (unsigned integer) | |||
Defines the initial TSN that the sender of the INIT chunk will | Defines the TSN that the sender of the INIT chunk will use | |||
use. The valid range is from 0 to 4294967295 and the Initial TSN | initially. The valid range is from 0 to 4294967295 and the | |||
SHOULD be set to a random value in that range. The methods | Initial TSN SHOULD be set to a random value in that range. The | |||
described in [RFC4086] can be used for the Initial TSN | methods described in [RFC4086] can be used for the Initial TSN | |||
randomization. | randomization. | |||
3.3.2.1. Optional or Variable-Length Parameters in INIT chunks | 3.3.2.1. Optional or Variable-Length Parameters in INIT chunks | |||
The following parameters follow the Type-Length-Value format as | The following parameters follow the Type-Length-Value format as | |||
defined in Section 3.2.1. Any Type-Length-Value fields MUST be | defined in Section 3.2.1. Any Type-Length-Value fields MUST be | |||
placed after the fixed-length fields. (The fixed-length fields are | placed after the fixed-length fields. (The fixed-length fields are | |||
defined in the previous section.) | defined in the previous section.) | |||
3.3.2.1.1. IPv4 Address (5) | 3.3.2.1.1. IPv4 Address (5) | |||
skipping to change at page 33, line 7 ¶ | skipping to change at line 1466 ¶ | |||
| | | | | | |||
| IPv6 Address | | | IPv6 Address | | |||
| | | | | | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
IPv6 Address: 128 bits (unsigned integer) | IPv6 Address: 128 bits (unsigned integer) | |||
Contains an IPv6 [RFC8200] address of the sending endpoint. It is | Contains an IPv6 [RFC8200] address of the sending endpoint. It is | |||
binary encoded. | binary encoded. | |||
A sender MUST NOT use an IPv4-mapped IPv6 address [RFC4291], but | A sender MUST NOT use an IPv4-mapped IPv6 address [RFC4291] but | |||
SHOULD instead use an IPv4 Address parameter for an IPv4 address. | SHOULD instead use an IPv4 Address parameter for an IPv4 address. | |||
Combined with the Source Port Number in the SCTP common header, the | Combined with the Source Port Number in the SCTP common header, the | |||
value passed in an IPv4 or IPv6 Address parameter indicates a | value passed in an IPv4 or IPv6 Address parameter indicates a | |||
transport address the sender of the INIT chunk will support for the | transport address the sender of the INIT chunk will support for the | |||
association being initiated. That is, during the life time of this | association being initiated. That is, during the life time of this | |||
association, this IP address can appear in the source address field | association, this IP address can appear in the source address field | |||
of an IP datagram sent from the sender of the INIT chunk, and can be | of an IP datagram sent from the sender of the INIT chunk and can be | |||
used as a destination address of an IP datagram sent from the | used as a destination address of an IP datagram sent from the | |||
receiver of the INIT chunk. | receiver of the INIT chunk. | |||
More than one IP Address parameter can be included in an INIT chunk | More than one IP Address parameter can be included in an INIT chunk | |||
when the sender of the INIT chunk is multi-homed. Moreover, a multi- | when the sender of the INIT chunk is multi-homed. Moreover, a multi- | |||
homed endpoint might have access to different types of network; thus, | homed endpoint might have access to different types of network; thus, | |||
more than one address type can be present in one INIT chunk, i.e., | 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. | IPv4 and IPv6 addresses are allowed in the same INIT chunk. | |||
If the INIT chunk contains at least one IP Address parameter, then | If the INIT chunk contains at least one IP Address parameter, then | |||
skipping to change at page 33, line 41 ¶ | skipping to change at line 1500 ¶ | |||
the received IP datagram as its sole destination address for the | the received IP datagram as its sole destination address for the | |||
association. | association. | |||
Note that not using any IP Address parameters in the INIT and INIT | Note that not using any IP Address parameters in the INIT and INIT | |||
ACK chunk is a way to make an association more likely to work in | ACK chunk is a way to make an association more likely to work in | |||
combination with Network Address Translation (NAT). | combination with Network Address Translation (NAT). | |||
3.3.2.1.3. Cookie Preservative (9) | 3.3.2.1.3. Cookie Preservative (9) | |||
The sender of the INIT chunk uses this parameter to suggest to the | The sender of the INIT chunk uses this parameter to suggest to the | |||
receiver of the INIT chunk a longer life-span for the State Cookie. | receiver of the INIT chunk a longer life span for the State Cookie. | |||
0 1 2 3 | 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 | 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 | | | Type = 9 | Length = 8 | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Suggested Cookie Life-Span Increment (msec.) | | | Suggested Cookie Life-Span Increment (msec.) | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
Suggested Cookie Life-Span Increment: 32 bits (unsigned integer) | Suggested Cookie Life-Span Increment: 32 bits (unsigned integer) | |||
This parameter indicates to the receiver how much increment in | This parameter indicates to the receiver how much increment in | |||
milliseconds the sender wishes the receiver to add to its default | milliseconds the sender wishes the receiver to add to its default | |||
cookie life-span. | cookie life span. | |||
This optional parameter MAY be added to the INIT chunk by the | This optional parameter MAY be added to the INIT chunk by the | |||
sender when it reattempts establishing an association with a peer | sender when it reattempts establishing an association with a peer | |||
to which its previous attempt of establishing the association | to which its previous attempt of establishing the association | |||
failed due to a stale cookie operation error. The receiver MAY | failed due to a stale cookie operation error. The receiver MAY | |||
choose to ignore the suggested cookie life-span increase for its | choose to ignore the suggested cookie life span increase for its | |||
own security reasons. | own security reasons. | |||
3.3.2.1.4. Host Name Address (11) | 3.3.2.1.4. Host Name Address (11) | |||
The sender of an INIT chunk or INIT ACK chunk MUST NOT include this | The sender of an INIT chunk or INIT ACK chunk MUST NOT include this | |||
parameter. The usage of the Host Name Address parameter is | parameter. The usage of the Host Name Address parameter is | |||
deprecated. The receiver of an INIT chunk or an INIT ACK containing | deprecated. The receiver of an INIT chunk or an INIT ACK containing | |||
a Host Name Address parameter MUST send an ABORT chunk and MAY | a Host Name Address parameter MUST send an ABORT chunk and MAY | |||
include an "Unresolvable Address" error cause. | include an "Unresolvable Address" error cause. | |||
skipping to change at page 34, line 42 ¶ | skipping to change at line 1549 ¶ | |||
Host Name: variable length | Host Name: variable length | |||
This field contains a host name in "host name syntax" per | This field contains a host name in "host name syntax" per | |||
Section 2.1 of [RFC1123]. The method for resolving the host name | Section 2.1 of [RFC1123]. The method for resolving the host name | |||
is out of scope of SCTP. | is out of scope of SCTP. | |||
At least one null terminator is included in the Host Name string | At least one null terminator is included in the Host Name string | |||
and MUST be included in the length. | and MUST be included in the length. | |||
3.3.2.1.5. Supported Address Types (12) | 3.3.2.1.5. Supported Address Types (12) | |||
The sender of INIT chunk uses this parameter to list all the address | The sender of the INIT chunk uses this parameter to list all the | |||
types it can support. | address types it can support. | |||
0 1 2 3 | 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 | 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 | | | Type = 12 | Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Address Type #1 | Address Type #2 | | | Address Type #1 | Address Type #2 | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ...... | | | ...... | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+ | |||
Address Type: 16 bits (unsigned integer) | Address Type: 16 bits (unsigned integer) | |||
This is filled with the type value of the corresponding address | This is filled with the type value of the corresponding address | |||
TLV (e.g., 5 for indicating IPv4, 6 for indicating IPv6). The | TLV (e.g., 5 for indicating IPv4, and 6 for indicating IPv6). The | |||
value indicating the Host Name Address parameter MUST NOT be used | value indicating the Host Name Address parameter MUST NOT be used | |||
when sending this parameter and MUST be ignored when receiving | when sending this parameter and MUST be ignored when receiving | |||
this parameter. | this parameter. | |||
3.3.3. Initiation Acknowledgement (INIT ACK) (2) | 3.3.3. Initiation Acknowledgement (INIT ACK) (2) | |||
The INIT ACK chunk is used to acknowledge the initiation of an SCTP | The INIT ACK chunk is used to acknowledge the initiation of an SCTP | |||
association. The format of the INIT ACK chunk is shown below: | association. The format of the INIT ACK chunk is shown below: | |||
0 1 2 3 | 0 1 2 3 | |||
skipping to change at page 36, line 5 ¶ | skipping to change at line 1596 ¶ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
\ \ | \ \ | |||
/ Optional/Variable-Length Parameters / | / Optional/Variable-Length Parameters / | |||
\ \ | \ \ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
The parameter part of INIT ACK is formatted similarly to the INIT | The parameter part of INIT ACK is formatted similarly to the INIT | |||
chunk. The following parameters are specified for the INIT ACK | chunk. The following parameters are specified for the INIT ACK | |||
chunk: | chunk: | |||
+-----------------------------------+-----------+ | +===================================+===========+ | |||
| Fixed Length Parameter | Status | | | Fixed-Length Parameter | Status | | |||
+-----------------------------------+-----------+ | +===================================+===========+ | |||
| Initiate Tag | Mandatory | | | Initiate Tag | Mandatory | | |||
+-----------------------------------+-----------+ | +-----------------------------------+-----------+ | |||
| Advertised Receiver Window Credit | Mandatory | | | Advertised Receiver Window Credit | Mandatory | | |||
+-----------------------------------+-----------+ | +-----------------------------------+-----------+ | |||
| Number of Outbound Streams | Mandatory | | | Number of Outbound Streams | Mandatory | | |||
+-----------------------------------+-----------+ | +-----------------------------------+-----------+ | |||
| Number of Inbound Streams | Mandatory | | | Number of Inbound Streams | Mandatory | | |||
+-----------------------------------+-----------+ | +-----------------------------------+-----------+ | |||
| Initial TSN | Mandatory | | | Initial TSN | Mandatory | | |||
+-----------------------------------+-----------+ | +-----------------------------------+-----------+ | |||
Table 7: Fixed Length Parameters of INIT ACK | Table 7: Fixed-Length Parameters of INIT ACK | |||
Chunks | Chunks | |||
It uses two extra variable parameters: The State Cookie and the | It uses two extra variable parameters: the State Cookie and the | |||
Unrecognized Parameter: | Unrecognized Parameter. | |||
+-----------------------------------+------------+----------------+ | +===================================+============+================+ | |||
| Variable Length Parameter | Status | Type Value | | | Variable-Length Parameter | Status | Type Value | | |||
+-----------------------------------+------------+----------------+ | +===================================+============+================+ | |||
| State Cookie | Mandatory | 7 | | | State Cookie | Mandatory | 7 | | |||
+-----------------------------------+------------+----------------+ | +-----------------------------------+------------+----------------+ | |||
| IPv4 Address (Note 1) | Optional | 5 | | | IPv4 Address (Note 1) | Optional | 5 | | |||
+-----------------------------------+------------+----------------+ | +-----------------------------------+------------+----------------+ | |||
| IPv6 Address (Note 1) | Optional | 6 | | | IPv6 Address (Note 1) | Optional | 6 | | |||
+-----------------------------------+------------+----------------+ | +-----------------------------------+------------+----------------+ | |||
| Unrecognized Parameter | Optional | 8 | | | Unrecognized Parameter | Optional | 8 | | |||
+-----------------------------------+------------+----------------+ | +-----------------------------------+------------+----------------+ | |||
| Reserved for ECN Capable (Note 2) | Optional | 32768 (0x8000) | | | Reserved for ECN Capable (Note 2) | Optional | 32768 (0x8000) | | |||
+-----------------------------------+------------+----------------+ | +-----------------------------------+------------+----------------+ | |||
| Host Name Address (Note 3) | Deprecated | 11 | | | Host Name Address (Note 3) | Deprecated | 11 | | |||
+-----------------------------------+------------+----------------+ | +-----------------------------------+------------+----------------+ | |||
Table 8: Variable Length Parameters of INIT ACK Chunks | Table 8: Variable-Length Parameters of INIT ACK Chunks | |||
Note 1: The INIT ACK chunks can contain any number of IP address | Note 1: The INIT ACK chunks can contain any number of IP Address | |||
parameters that can be IPv4 and/or IPv6 in any combination. | parameters that can be IPv4 and/or IPv6 in any combination. | |||
Note 2: The ECN Capable field is reserved for future use of Explicit | Note 2: The ECN Capable field is reserved for future use of Explicit | |||
Congestion Notification. | Congestion Notification. | |||
Note 3: An INIT ACK chunk MUST NOT contain the Host Name Address | Note 3: An INIT ACK chunk MUST NOT contain the Host Name Address | |||
parameter. The receiver of INIT ACK chunks containing a Host Name | parameter. The receiver of INIT ACK chunks containing a Host Name | |||
Address parameter MUST send an ABORT chunk and MAY include an | Address parameter MUST send an ABORT chunk and MAY include an | |||
"Unresolvable Address" error cause. | "Unresolvable Address" error cause. | |||
skipping to change at page 37, line 19 ¶ | skipping to change at line 1659 ¶ | |||
The receiver of the INIT ACK chunk records the value of the | The receiver of the INIT ACK chunk records the value of the | |||
Initiate Tag parameter. This value MUST be placed into the | Initiate Tag parameter. This value MUST be placed into the | |||
Verification Tag field of every SCTP packet that the receiver of | Verification Tag field of every SCTP packet that the receiver of | |||
the INIT ACK chunk transmits within this association. | the INIT ACK chunk transmits within this association. | |||
The Initiate Tag MUST NOT take the value 0. See Section 5.3.1 for | The Initiate Tag MUST NOT take the value 0. See Section 5.3.1 for | |||
more on the selection of the Initiate Tag value. | more on the selection of the Initiate Tag value. | |||
If an endpoint in the COOKIE-WAIT state receives an INIT ACK chunk | If an endpoint in the COOKIE-WAIT state receives an INIT ACK chunk | |||
with the Initiate Tag set to 0, it MUST destroy the TCB and SHOULD | with the Initiate Tag set to 0, it MUST destroy the TCB and SHOULD | |||
send an ABORT chunk with the T bit set. If such an INIT-ACK chunk | send an ABORT chunk with the T bit set. If such an INIT ACK chunk | |||
is received in any state other than CLOSED or COOKIE-WAIT, it | is received in any state other than CLOSED or COOKIE-WAIT, it | |||
SHOULD be discarded silently (see Section 5.2.3). | SHOULD be discarded silently (see Section 5.2.3). | |||
Advertised Receiver Window Credit (a_rwnd): 32 bits (unsigned | Advertised Receiver Window Credit (a_rwnd): 32 bits (unsigned | |||
integer) | integer) | |||
This value represents the dedicated buffer space, in number of | This value represents the dedicated buffer space, in number of | |||
bytes, the sender of the INIT ACK chunk has reserved in | bytes, the sender of the INIT ACK chunk has reserved in | |||
association with this window. | association with this window. | |||
The Advertised Receiver Window Credit MUST NOT be smaller than | The Advertised Receiver Window Credit MUST NOT be smaller than | |||
skipping to change at page 38, line 7 ¶ | skipping to change at line 1691 ¶ | |||
of a_rwnd it sends in SACK chunks. | of a_rwnd it sends in SACK chunks. | |||
Number of Outbound Streams (OS): 16 bits (unsigned integer) | Number of Outbound Streams (OS): 16 bits (unsigned integer) | |||
Defines the number of outbound streams the sender of this INIT ACK | Defines the number of outbound streams the sender of this INIT ACK | |||
chunk wishes to create in this association. The value of 0 MUST | chunk wishes to create in this association. The value of 0 MUST | |||
NOT be used, and the value MUST NOT be greater than the MIS value | NOT be used, and the value MUST NOT be greater than the MIS value | |||
sent in the INIT chunk. | sent in the INIT chunk. | |||
If an endpoint in the COOKIE-WAIT state receives an INIT ACK chunk | If an endpoint in the COOKIE-WAIT state receives an INIT ACK chunk | |||
with the OS value set to 0, it MUST destroy the TCB and SHOULD | with the OS value set to 0, it MUST destroy the TCB and SHOULD | |||
send an ABORT chunk. If such an INIT-ACK chunk is received in any | send an ABORT chunk. If such an INIT ACK chunk is received in any | |||
state other than CLOSED or COOKIE-WAIT, it SHOULD be discarded | state other than CLOSED or COOKIE-WAIT, it SHOULD be discarded | |||
silently (see Section 5.2.3). | silently (see Section 5.2.3). | |||
Number of Inbound Streams (MIS): 16 bits (unsigned integer) | Number of Inbound Streams (MIS): 16 bits (unsigned integer) | |||
Defines the maximum number of streams the sender of this INIT ACK | Defines the maximum number of streams the sender of this INIT ACK | |||
chunk allows the peer end to create in this association. The | chunk allows the peer end to create in this association. The | |||
value 0 MUST NOT be used. | value 0 MUST NOT be used. | |||
Note: There is no negotiation of the actual number of streams but | Note: There is no negotiation of the actual number of streams, but | |||
instead the two endpoints will use the min(requested, offered). | instead the two endpoints will use the min(requested, offered). | |||
See Section 5.1.1 for details. | See Section 5.1.1 for details. | |||
If an endpoint in the COOKIE-WAIT state receives an INIT ACK chunk | If an endpoint in the COOKIE-WAIT state receives an INIT ACK chunk | |||
with the MIS value set to 0, it MUST destroy the TCB and SHOULD | with the MIS value set to 0, it MUST destroy the TCB and SHOULD | |||
send an ABORT chunk. If such an INIT-ACK chunk is received in any | send an ABORT chunk. If such an INIT ACK chunk is received in any | |||
state other than CLOSED or COOKIE-WAIT, it SHOULD be discarded | state other than CLOSED or COOKIE-WAIT, it SHOULD be discarded | |||
silently (see Section 5.2.3). | silently (see Section 5.2.3). | |||
Initial TSN (I-TSN): 32 bits (unsigned integer) | Initial TSN (I-TSN): 32 bits (unsigned integer) | |||
Defines the initial TSN that the sender of the INIT ACK chunk will | Defines the TSN that the sender of the INIT ACK chunk will use | |||
use. The valid range is from 0 to 4294967295 and the Initial TSN | initially. The valid range is from 0 to 4294967295 and the | |||
SHOULD be set to a random value in that range. The methods | Initial TSN SHOULD be set to a random value in that range. The | |||
described in [RFC4086] can be used for the Initial TSN | methods described in [RFC4086] can be used for the Initial TSN | |||
randomization. | randomization. | |||
Implementation Note: An implementation MUST be prepared to receive an | Implementation Note: An implementation MUST be prepared to receive an | |||
INIT ACK chunk that is quite large (more than 1500 bytes) due to the | INIT ACK chunk that is quite large (more than 1500 bytes) due to the | |||
variable size of the State Cookie and the variable address list. For | variable size of the State Cookie and the variable address list. For | |||
example if a responder to the INIT chunk has 1000 IPv4 addresses it | example, if a responder to the INIT chunk has 1000 IPv4 addresses it | |||
wishes to send, it would need at least 8,000 bytes to encode this in | wishes to send, it would need at least 8,000 bytes to encode this in | |||
the INIT ACK chunk. | the INIT ACK chunk. | |||
If an INIT ACK chunk is received with all mandatory parameters that | If an INIT ACK chunk is received with all mandatory parameters that | |||
are specified for the INIT ACK chunk, then the receiver SHOULD | are specified for the INIT ACK chunk, then the receiver SHOULD | |||
process the INIT ACK chunk and send back a COOKIE ECHO chunk. The | process the INIT ACK chunk and send back a COOKIE ECHO chunk. The | |||
receiver of the INIT ACK chunk MAY bundle an ERROR chunk with the | receiver of the INIT ACK chunk MAY bundle an ERROR chunk with the | |||
COOKIE ECHO chunk. However, restrictive implementations MAY send | COOKIE ECHO chunk. However, restrictive implementations MAY send | |||
back an ABORT chunk in response to the INIT ACK chunk. | back an ABORT chunk in response to the INIT ACK chunk. | |||
In combination with the Source Port carried in the SCTP common | In combination with the Source Port Number carried in the SCTP common | |||
header, each IP Address parameter in the INIT ACK chunk indicates to | header, each IP Address parameter in the INIT ACK chunk indicates to | |||
the receiver of the INIT ACK chunk a valid transport address | the receiver of the INIT ACK chunk a valid transport address | |||
supported by the sender of the INIT ACK chunk for the life time of | supported by the sender of the INIT ACK chunk for the life time of | |||
the association being initiated. | the association being initiated. | |||
If the INIT ACK chunk contains at least one IP Address parameter, | If the INIT ACK chunk contains at least one IP Address parameter, | |||
then the source address of the IP datagram containing the INIT ACK | then the source address of the IP datagram containing the INIT ACK | |||
chunk and any additional address(es) provided within the INIT ACK | chunk and any additional address(es) provided within the INIT ACK | |||
chunk MAY be used as destinations by the receiver of the INIT ACK | chunk MAY be used as destinations by the receiver of the INIT ACK | |||
chunk. If the INIT ACK chunk does not contain any IP Address | chunk. If the INIT ACK chunk does not contain any IP Address | |||
parameters, the receiver of the INIT ACK chunk MUST use the source | parameters, the receiver of the INIT ACK chunk MUST use the source | |||
address associated with the received IP datagram as its sole | address associated with the received IP datagram as its sole | |||
destination address for the association. | destination address for the association. | |||
The State Cookie and Unrecognized Parameters use the Type-Length- | The State Cookie and Unrecognized Parameters use the Type-Length- | |||
Value format as defined in Section 3.2.1 and are described below. | 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 | The other fields are defined in the same way as their counterparts in | |||
INIT chunk. | the INIT chunk. | |||
3.3.3.1. Optional or Variable-Length Parameters in INIT ACK chunks | 3.3.3.1. Optional or Variable-Length Parameters in INIT ACK Chunks | |||
The State Cookie and Unrecognized Parameters use the Type-Length- | The State Cookie and Unrecognized Parameters use the Type-Length- | |||
Value format as defined in Section 3.2.1 and are described below. | Value format, as defined in Section 3.2.1, and are described below. | |||
The IPv4 Address Parameter is described in Section 3.3.2.1.1, and the | The IPv4 Address parameter is described in Section 3.3.2.1.1, and the | |||
IPv6 Address Parameter is described in Section 3.3.2.1.2. The Host | IPv6 Address parameter is described in Section 3.3.2.1.2. The Host | |||
Name Address Parameter is described in Section 3.3.2.1.4 and MUST NOT | Name Address parameter is described in Section 3.3.2.1.4 and MUST NOT | |||
be included in an INIT ACK chunk. Any Type-Length-Value fields MUST | be included in an INIT ACK chunk. Any Type-Length-Value fields MUST | |||
be placed after the fixed-length fields. (The fixed-length fields | be placed after the fixed-length fields. (The fixed-length fields | |||
are defined in the previous section.) | are defined in the previous section.) | |||
3.3.3.1.1. State Cookie (7) | 3.3.3.1.1. State Cookie (7) | |||
0 1 2 3 | 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 | 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 | Length | | | Type = 7 | Length | | |||
skipping to change at page 40, line 15 ¶ | skipping to change at line 1796 ¶ | |||
0 1 2 3 | 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 | 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 | Length | | | Type = 8 | Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
/ Unrecognized Parameter / | / Unrecognized Parameter / | |||
\ \ | \ \ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
Unrecognized Parameter: variable length | Unrecognized Parameter: variable length | |||
The parameter value field will contain an unrecognized parameter | The Parameter Value field will contain an unrecognized parameter | |||
copied from the INIT chunk complete with Parameter Type, Length, | copied from the INIT chunk complete with Parameter Type, Length, | |||
and Value fields. | and Value fields. | |||
3.3.4. Selective Acknowledgement (SACK) (3) | 3.3.4. Selective Acknowledgement (SACK) (3) | |||
This chunk is sent to the peer endpoint to acknowledge received DATA | This chunk is sent to the peer endpoint to acknowledge received DATA | |||
chunks and to inform the peer endpoint of gaps in the received | chunks and to inform the peer endpoint of gaps in the received | |||
subsequences of DATA chunks as represented by their TSNs. | subsequences of DATA chunks as represented by their TSNs. | |||
The SACK chunk MUST contain the Cumulative TSN Ack, Advertised | The SACK chunk MUST contain the Cumulative TSN Ack, Advertised | |||
skipping to change at page 42, line 19 ¶ | skipping to change at line 1890 ¶ | |||
These fields contain the Gap Ack Blocks. They are repeated for | 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 | 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 | the Number of Gap Ack Blocks field. All DATA chunks with TSNs | |||
greater than or equal to (Cumulative TSN Ack + Gap Ack Block | greater than or equal to (Cumulative TSN Ack + Gap Ack Block | |||
Start) and less than or equal to (Cumulative TSN Ack + Gap Ack | 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 | Block End) of each Gap Ack Block are assumed to have been received | |||
correctly. | correctly. | |||
Gap Ack Block Start: 16 bits (unsigned integer) | Gap Ack Block Start: 16 bits (unsigned integer) | |||
Indicates the Start offset TSN for this Gap Ack Block. To | Indicates the Start offset TSN for this Gap Ack Block. To | |||
calculate the actual TSN number the Cumulative TSN Ack is added to | calculate the actual TSN number, the Cumulative TSN Ack is added | |||
this offset number. This calculated TSN identifies the lowest TSN | to this offset number. This calculated TSN identifies the lowest | |||
in this Gap Ack Block that has been received. | TSN in this Gap Ack Block that has been received. | |||
Gap Ack Block End: 16 bits (unsigned integer) | Gap Ack Block End: 16 bits (unsigned integer) | |||
Indicates the End offset TSN for this Gap Ack Block. To calculate | Indicates the End offset TSN for this Gap Ack Block. To calculate | |||
the actual TSN number, the Cumulative TSN Ack is added to this | the actual TSN number, the Cumulative TSN Ack is added to this | |||
offset number. This calculated TSN identifies the highest TSN in | offset number. This calculated TSN identifies the highest TSN in | |||
this Gap Ack Block that has been received. | this Gap Ack Block that has been received. | |||
For example, assume that the receiver has the following DATA | For example, assume that the receiver has the following DATA | |||
chunks newly arrived at the time when it decides to send a | chunks newly arrived at the time when it decides to send a | |||
Selective ACK, | Selective ACK: | |||
------------ | ------------ | |||
| TSN = 17 | | | TSN = 17 | | |||
------------ | ------------ | |||
| | <- still missing | | | <- still missing | |||
------------ | ------------ | |||
| TSN = 15 | | | TSN = 15 | | |||
------------ | ------------ | |||
| TSN = 14 | | | TSN = 14 | | |||
------------ | ------------ | |||
| | <- still missing | | | <- still missing | |||
------------ | ------------ | |||
| TSN = 12 | | | TSN = 12 | | |||
------------ | ------------ | |||
| TSN = 11 | | | TSN = 11 | | |||
------------ | ------------ | |||
| TSN = 10 | | | TSN = 10 | | |||
------------ | ------------ | |||
then the parameter part of the SACK chunk MUST be constructed as | Then, the parameter part of the SACK chunk MUST be constructed as | |||
follows (assuming the new a_rwnd is set to 4660 by the sender): | follows (assuming the new a_rwnd is set to 4660 by the sender): | |||
+-------------------+-------------------+ | +-------------------+-------------------+ | |||
| Cumulative TSN Ack = 12 | | | Cumulative TSN Ack = 12 | | |||
+-------------------+-------------------+ | +-------------------+-------------------+ | |||
| a_rwnd = 4660 | | | a_rwnd = 4660 | | |||
+-------------------+-------------------+ | +-------------------+-------------------+ | |||
| num of block = 2 | num of dup = 0 | | | num of block = 2 | num of dup = 0 | | |||
+-------------------+-------------------+ | +-------------------+-------------------+ | |||
|block #1 start = 2 | block #1 end = 3 | | |block #1 start = 2 | block #1 end = 3 | | |||
skipping to change at page 43, line 27 ¶ | skipping to change at line 1944 ¶ | |||
|block #2 start = 5 | block #2 end = 5 | | |block #2 start = 5 | block #2 end = 5 | | |||
+-------------------+-------------------+ | +-------------------+-------------------+ | |||
Duplicate TSN: 32 bits (unsigned integer) | Duplicate TSN: 32 bits (unsigned integer) | |||
Indicates the number of times a TSN was received in duplicate | Indicates the number of times a TSN was received in duplicate | |||
since the last SACK chunk was sent. Every time a receiver gets a | since the last SACK chunk was sent. Every time a receiver gets a | |||
duplicate TSN (before sending the SACK chunk), it adds it to the | duplicate TSN (before sending the SACK chunk), it adds it to the | |||
list of duplicates. The duplicate count is reinitialized to zero | list of duplicates. The duplicate count is reinitialized to zero | |||
after sending each SACK chunk. | after sending each SACK chunk. | |||
For example, if a receiver were to get the TSN 19 three times it | For example, if a receiver were to get the TSN 19 three times, it | |||
would list 19 twice in the outbound SACK chunk. After sending the | would list 19 twice in the outbound SACK chunk. After sending the | |||
SACK chunk, if it received yet one more TSN 19 it would list 19 as | SACK chunk, if it received yet one more TSN 19, it would list 19 | |||
a duplicate once in the next outgoing SACK chunk. | as a duplicate once in the next outgoing SACK chunk. | |||
3.3.5. Heartbeat Request (HEARTBEAT) (4) | 3.3.5. Heartbeat Request (HEARTBEAT) (4) | |||
An endpoint SHOULD send a HEARTBEAT (HB) chunk to its peer endpoint | An endpoint SHOULD send a HEARTBEAT (HB) chunk to its peer endpoint | |||
to probe the reachability of a particular destination transport | to probe the reachability of a particular destination transport | |||
address defined in the present association. | address defined in the present association. | |||
The parameter field contains the Heartbeat Information, which is a | The parameter field contains the Heartbeat Information, which is a | |||
variable-length opaque data structure understood only by the sender. | variable-length opaque data structure understood only by the sender. | |||
skipping to change at page 44, line 11 ¶ | skipping to change at line 1977 ¶ | |||
Chunk Flags: 8 bits | Chunk Flags: 8 bits | |||
Set to 0 on transmit and ignored on receipt. | Set to 0 on transmit and ignored on receipt. | |||
Heartbeat Length: 16 bits (unsigned integer) | Heartbeat Length: 16 bits (unsigned integer) | |||
Set to the size of the chunk in bytes, including the chunk header | Set to the size of the chunk in bytes, including the chunk header | |||
and the Heartbeat Information field. | and the Heartbeat Information field. | |||
Heartbeat Information: variable length | Heartbeat Information: variable length | |||
Defined as a variable-length parameter using the format described | Defined as a variable-length parameter using the format described | |||
in Section 3.2.1, i.e.: | in Section 3.2.1, that is: | |||
+---------------------+-----------+------------+ | +=====================+===========+============+ | |||
| Variable Parameters | Status | Type Value | | | Variable Parameters | Status | Type Value | | |||
+---------------------+-----------+------------+ | +=====================+===========+============+ | |||
| Heartbeat Info | Mandatory | 1 | | | Heartbeat Info | Mandatory | 1 | | |||
+---------------------+-----------+------------+ | +---------------------+-----------+------------+ | |||
Table 9: Variable Length Parameters of | Table 9: Variable-Length Parameters of | |||
HEARTBEAT Chunks | HEARTBEAT Chunks | |||
0 1 2 3 | 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 | 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 | | | Heartbeat Info Type = 1 | HB Info Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
/ Sender-Specific Heartbeat Info / | / Sender-Specific Heartbeat Info / | |||
\ \ | \ \ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
The Sender-Specific Heartbeat Info field SHOULD include | The Sender-Specific Heartbeat Info field SHOULD include | |||
information about the sender's current time when this HEARTBEAT | information about the sender's current time when this HEARTBEAT | |||
chunk is sent and the destination transport address to which this | chunk is sent and the destination transport address to which this | |||
HEARTBEAT chunk is sent (see Section 8.3). This information is | HEARTBEAT chunk is sent (see Section 8.3). This information is | |||
simply reflected back by the receiver in the HEARTBEAT ACK chunk | simply reflected back by the receiver in the HEARTBEAT ACK chunk | |||
(see Section 3.3.6). Note also that the HEARTBEAT chunk is both | (see Section 3.3.6). Note also that the HEARTBEAT chunk is both | |||
for reachability checking and for path verification (see | for reachability checking and for path verification (see | |||
Section 5.4). When a HEARTBEAT chunk is being used for path | Section 5.4). When a HEARTBEAT chunk is being used for path | |||
verification purposes, it MUST include a random nonce of length | verification purposes, it MUST include a random nonce of length 64 | |||
64-bit or longer ([RFC4086] provides some information on | bits or longer ([RFC4086] provides some information on randomness | |||
randomness guidelines). | guidelines). | |||
3.3.6. Heartbeat Acknowledgement (HEARTBEAT ACK) (5) | 3.3.6. Heartbeat Acknowledgement (HEARTBEAT ACK) (5) | |||
An endpoint MUST send this chunk to its peer endpoint as a response | An endpoint MUST send this chunk to its peer endpoint as a response | |||
to a HEARTBEAT chunk (see Section 8.3). A packet containing the | to a HEARTBEAT chunk (see Section 8.3). A packet containing the | |||
HEARTBEAT ACK chunk is always sent to the source IP address of the IP | HEARTBEAT ACK chunk is always sent to the source IP address of the IP | |||
datagram containing the HEARTBEAT chunk to which this HEARTBEAT ACK | datagram containing the HEARTBEAT chunk to which this HEARTBEAT ACK | |||
chunk is responding. | chunk is responding. | |||
The parameter field contains a variable-length opaque data structure. | The parameter field contains a variable-length opaque data structure. | |||
skipping to change at page 45, line 27 ¶ | skipping to change at line 2041 ¶ | |||
Heartbeat Ack Length: 16 bits (unsigned integer) | Heartbeat Ack Length: 16 bits (unsigned integer) | |||
Set to the size of the chunk in bytes, including the chunk header | Set to the size of the chunk in bytes, including the chunk header | |||
and the Heartbeat Information field. | and the Heartbeat Information field. | |||
Heartbeat Information: variable length | Heartbeat Information: variable length | |||
This field MUST contain the Heartbeat Info parameter (as defined | This field MUST contain the Heartbeat Info parameter (as defined | |||
in Section 3.3.5) of the Heartbeat Request to which this Heartbeat | in Section 3.3.5) of the Heartbeat Request to which this Heartbeat | |||
Acknowledgement is responding. | Acknowledgement is responding. | |||
+---------------------+-----------+------------+ | +=====================+===========+============+ | |||
| Variable Parameters | Status | Type Value | | | Variable Parameters | Status | Type Value | | |||
+---------------------+-----------+------------+ | +=====================+===========+============+ | |||
| Heartbeat Info | Mandatory | 1 | | | Heartbeat Info | Mandatory | 1 | | |||
+---------------------+-----------+------------+ | +---------------------+-----------+------------+ | |||
Table 10: Variable Length Parameters of | Table 10: Variable-Length Parameters of | |||
HEARTBEAT ACK Chunks | HEARTBEAT ACK Chunks | |||
3.3.7. Abort Association (ABORT) (6) | 3.3.7. Abort Association (ABORT) (6) | |||
The ABORT chunk is sent to the peer of an association to close the | The ABORT chunk is sent to the peer of an association to close the | |||
association. The ABORT chunk MAY contain Cause Parameters to inform | association. The ABORT chunk MAY contain error causes to inform the | |||
the receiver about the reason of the abort. DATA chunks MUST NOT be | receiver about the reason of the abort. DATA chunks MUST NOT be | |||
bundled with ABORT chunks. Control chunks (except for INIT, INIT | bundled with ABORT chunks. Control chunks (except for INIT, INIT | |||
ACK, and SHUTDOWN COMPLETE) MAY be bundled with an ABORT chunk, but | ACK, and SHUTDOWN COMPLETE) MAY be bundled with an ABORT chunk, but | |||
they MUST be placed before the ABORT chunk in the SCTP packet, | they MUST be placed before the ABORT chunk in the SCTP packet; | |||
otherwise they will be ignored by the receiver. | otherwise, they will be ignored by the receiver. | |||
If an endpoint receives an ABORT chunk with a format error or no TCB | If an endpoint receives an ABORT chunk with a format error or no TCB | |||
is found, it MUST silently discard it. Moreover, under any | is found, it MUST silently discard it. Moreover, under any | |||
circumstances, an endpoint that receives an ABORT chunk MUST NOT | circumstances, an endpoint that receives an ABORT chunk MUST NOT | |||
respond to that ABORT chunk by sending an ABORT chunk of its own. | respond to that ABORT chunk by sending an ABORT chunk of its own. | |||
0 1 2 3 | 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 | 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 | | | Type = 6 | Reserved |T| Length | | |||
skipping to change at page 49, line 5 ¶ | skipping to change at line 2188 ¶ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Cause Code | Cause Length | | | Cause Code | Cause Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
/ Cause-Specific Information / | / Cause-Specific Information / | |||
\ \ | \ \ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
Cause Code: 16 bits (unsigned integer) | Cause Code: 16 bits (unsigned integer) | |||
Defines the type of error conditions being reported. | Defines the type of error conditions being reported. | |||
+-------+----------------------------------------------+ | +=======+==============================================+ | |||
| Value | Cause Code | | | Value | Cause Code | | |||
+-------+----------------------------------------------+ | +=======+==============================================+ | |||
| 1 | Invalid Stream Identifier | | | 1 | Invalid Stream Identifier | | |||
+-------+----------------------------------------------+ | +-------+----------------------------------------------+ | |||
| 2 | Missing Mandatory Parameter | | | 2 | Missing Mandatory Parameter | | |||
+-------+----------------------------------------------+ | +-------+----------------------------------------------+ | |||
| 3 | Stale Cookie Error | | | 3 | Stale Cookie | | |||
+-------+----------------------------------------------+ | +-------+----------------------------------------------+ | |||
| 4 | Out of Resource | | | 4 | Out of Resource | | |||
+-------+----------------------------------------------+ | +-------+----------------------------------------------+ | |||
| 5 | Unresolvable Address | | | 5 | Unresolvable Address | | |||
+-------+----------------------------------------------+ | +-------+----------------------------------------------+ | |||
| 6 | Unrecognized Chunk Type | | | 6 | Unrecognized Chunk Type | | |||
+-------+----------------------------------------------+ | +-------+----------------------------------------------+ | |||
| 7 | Invalid Mandatory Parameter | | | 7 | Invalid Mandatory Parameter | | |||
+-------+----------------------------------------------+ | +-------+----------------------------------------------+ | |||
| 8 | Unrecognized Parameters | | | 8 | Unrecognized Parameters | | |||
+-------+----------------------------------------------+ | +-------+----------------------------------------------+ | |||
| 9 | No User Data | | | 9 | No User Data | | |||
+-------+----------------------------------------------+ | +-------+----------------------------------------------+ | |||
| 10 | Cookie Received While Shutting Down | | | 10 | Cookie Received While Shutting Down | | |||
+-------+----------------------------------------------+ | +-------+----------------------------------------------+ | |||
| 11 | Restart of an Association with New Addresses | | | 11 | Restart of an Association with New Addresses | | |||
+-------+----------------------------------------------+ | +-------+----------------------------------------------+ | |||
| 12 | User Initiated Abort | | | 12 | User-Initiated Abort | | |||
+-------+----------------------------------------------+ | +-------+----------------------------------------------+ | |||
| 13 | Protocol Violation | | | 13 | Protocol Violation | | |||
+-------+----------------------------------------------+ | +-------+----------------------------------------------+ | |||
Table 11: Cause Code | Table 11: Cause Code | |||
Cause Length: 16 bits (unsigned integer) | Cause Length: 16 bits (unsigned integer) | |||
Set to the size of the parameter in bytes, including the Cause | Set to the size of the parameter in bytes, including the Cause | |||
Code, Cause Length, and Cause-Specific Information fields. | Code, Cause Length, and Cause-Specific Information fields. | |||
Cause-Specific Information: variable length | Cause-Specific Information: variable length | |||
This field carries the details of the error condition. | This field carries the details of the error condition. | |||
Section 3.3.10.1 - Section 3.3.10.13 define error causes for SCTP. | Sections 3.3.10.1 - 3.3.10.13 define error causes for SCTP. | |||
Guidelines for the IETF to define new error cause values are | Guidelines for the IETF to define new error cause values are | |||
discussed in Section 15.4. | discussed in Section 15.4. | |||
3.3.10.1. Invalid Stream Identifier (1) | 3.3.10.1. Invalid Stream Identifier (1) | |||
Indicates that the endpoint received a DATA chunk sent using a | Indicates that the endpoint received a DATA chunk sent using a | |||
nonexistent stream. | nonexistent stream. | |||
0 1 2 3 | 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 | 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 | |||
skipping to change at page 50, line 45 ¶ | skipping to change at line 2276 ¶ | |||
| Missing Param Type #N-1 | Missing Param Type #N | | | Missing Param Type #N-1 | Missing Param Type #N | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
Number of Missing params: 32 bits (unsigned integer) | Number of Missing params: 32 bits (unsigned integer) | |||
This field contains the number of parameters contained in the | This field contains the number of parameters contained in the | |||
Cause-Specific Information field. | Cause-Specific Information field. | |||
Missing Param Type: 16 bits (unsigned integer) | Missing Param Type: 16 bits (unsigned integer) | |||
Each field will contain the missing mandatory parameter number. | Each field will contain the missing mandatory parameter number. | |||
3.3.10.3. Stale Cookie Error (3) | 3.3.10.3. Stale Cookie (3) | |||
Indicates the receipt of a valid State Cookie that has expired. | Indicates the receipt of a valid State Cookie that has expired. | |||
0 1 2 3 | 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 | 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 = 3 | Cause Length = 8 | | | Cause Code = 3 | Cause Length = 8 | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Measure of Staleness (usec.) | | | Measure of Staleness (usec.) | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
skipping to change at page 53, line 37 ¶ | skipping to change at line 2400 ¶ | |||
0 1 2 3 | 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 | 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 = 9 | Cause Length = 8 | | | Cause Code = 9 | Cause Length = 8 | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| TSN | | | TSN | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
TSN: 32 bits (unsigned integer) | TSN: 32 bits (unsigned integer) | |||
This parameter contains the TSN of the DATA chunk received with no | This parameter contains the TSN of the DATA chunk received with no | |||
user data field. | User Data field. | |||
This cause code is normally returned in an ABORT chunk (see | This cause code is normally returned in an ABORT chunk (see | |||
Section 6.2). | Section 6.2). | |||
3.3.10.10. Cookie Received While Shutting Down (10) | 3.3.10.10. Cookie Received While Shutting Down (10) | |||
A COOKIE ECHO chunk was received while the endpoint was in the | A COOKIE ECHO chunk was received while the endpoint was in the | |||
SHUTDOWN-ACK-SENT state. This error is usually returned in an ERROR | SHUTDOWN-ACK-SENT state. This error is usually returned in an ERROR | |||
chunk bundled with the retransmitted SHUTDOWN ACK chunk. | chunk bundled with the retransmitted SHUTDOWN ACK chunk. | |||
skipping to change at page 54, line 46 ¶ | skipping to change at line 2458 ¶ | |||
| Cause Code = 12 | Cause Length | | | Cause Code = 12 | Cause Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
/ Upper Layer Abort Reason / | / Upper Layer Abort Reason / | |||
\ \ | \ \ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
3.3.10.13. Protocol Violation (13) | 3.3.10.13. Protocol Violation (13) | |||
This error cause MAY be included in ABORT chunks that are sent | This error cause MAY be included in ABORT chunks that are sent | |||
because an SCTP endpoint detects a protocol violation of the peer | 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 | that is not covered by the error causes described in Sections | |||
to Section 3.3.10.12. An implementation MAY provide additional | 3.3.10.1 - 3.3.10.12. An implementation MAY provide additional | |||
information specifying what kind of protocol violation has been | information specifying what kind of protocol violation has been | |||
detected. | detected. | |||
0 1 2 3 | 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 | 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 | | | Cause Code = 13 | Cause Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
/ Additional Information / | / Additional Information / | |||
\ \ | \ \ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
3.3.11. Cookie Echo (COOKIE ECHO) (10) | 3.3.11. Cookie Echo (COOKIE ECHO) (10) | |||
This chunk is used only during the initialization of an association. | 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 | It is sent by the initiator of an association to its peer to complete | |||
the initialization process. This chunk MUST precede any DATA chunk | the initialization process. This chunk MUST precede any DATA chunk | |||
sent within the association, but MAY be bundled with one or more DATA | sent within the association but MAY be bundled with one or more DATA | |||
chunks in the same packet. | chunks in the same packet. | |||
0 1 2 3 | 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 | 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 | | | Type = 10 | Chunk Flags | Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
/ Cookie / | / Cookie / | |||
\ \ | \ \ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
skipping to change at page 56, line 9 ¶ | skipping to change at line 2513 ¶ | |||
Note: A Cookie Echo does not contain a State Cookie parameter; | Note: A Cookie Echo does not contain a State Cookie parameter; | |||
instead, the data within the State Cookie's Parameter Value | instead, the data within the State Cookie's Parameter Value | |||
becomes the data within the Cookie Echo's Chunk Value. This | becomes the data within the Cookie Echo's Chunk Value. This | |||
allows an implementation to change only the first 2 bytes of the | allows an implementation to change only the first 2 bytes of the | |||
State Cookie parameter to become a COOKIE ECHO chunk. | State Cookie parameter to become a COOKIE ECHO chunk. | |||
3.3.12. Cookie Acknowledgement (COOKIE ACK) (11) | 3.3.12. Cookie Acknowledgement (COOKIE ACK) (11) | |||
This chunk is used only during the initialization of an association. | This chunk is used only during the initialization of an association. | |||
It is used to acknowledge the receipt of a COOKIE ECHO chunk. This | It is used to acknowledge the receipt of a COOKIE ECHO chunk. This | |||
chunk MUST precede any DATA or SACK chunk sent within the | chunk MUST precede any DATA or SACK chunk sent within the association | |||
association, but MAY be bundled with one or more DATA chunks or SACK | but MAY be bundled with one or more DATA chunks or SACK chunk's in | |||
chunk's in the same SCTP packet. | the same SCTP packet. | |||
0 1 2 3 | 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 | 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 | | | Type = 11 | Chunk Flags | Length = 4 | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
Chunk Flags: 8 bits | Chunk Flags: 8 bits | |||
Set to 0 on transmit and ignored on receipt. | Set to 0 on transmit and ignored on receipt. | |||
skipping to change at page 56, line 46 ¶ | skipping to change at line 2550 ¶ | |||
Chunk Flags: 8 bits | Chunk Flags: 8 bits | |||
Reserved: 7 bits | Reserved: 7 bits | |||
Set to 0 on transmit and ignored on receipt. | Set to 0 on transmit and ignored on receipt. | |||
T bit: 1 bit | T bit: 1 bit | |||
The T bit is set to 0 if the sender filled in the Verification | The T bit is set to 0 if the sender filled in the Verification | |||
Tag expected by the peer. If the Verification Tag is | Tag expected by the peer. If the Verification Tag is | |||
reflected, the T bit MUST be set to 1. Reflecting means that | reflected, the T bit MUST be set to 1. Reflecting means that | |||
the sent Verification Tag is the same as the received one. | the sent Verification Tag is the same as the received one. | |||
Note: Special rules apply to this chunk for verification, please see | Note: Special rules apply to this chunk for verification; please see | |||
Section 8.5.1 for details. | Section 8.5.1 for details. | |||
4. SCTP Association State Diagram | 4. SCTP Association State Diagram | |||
During the life time of an SCTP association, the SCTP endpoint's | During the life time of an SCTP association, the SCTP endpoint's | |||
association progresses from one state to another in response to | association progresses from one state to another in response to | |||
various events. The events that might potentially advance an | various events. The events that might potentially advance an | |||
association's state include: | association's state include: | |||
* SCTP user primitive calls, e.g., [ASSOCIATE], [SHUTDOWN], [ABORT], | * SCTP user primitive calls, e.g., [ASSOCIATE], [SHUTDOWN], or | |||
[ABORT], | ||||
* Reception of INIT, COOKIE ECHO, ABORT, SHUTDOWN, etc., control | * reception of INIT, COOKIE ECHO, ABORT, SHUTDOWN, etc., and control | |||
chunks, or | chunks, or | |||
* Some timeout events. | * some timeout events. | |||
The state diagram in the figures below illustrates state changes, | The state diagram in the figures below illustrates state changes, | |||
together with the causing events and resulting actions. Note that | together with the causing events and resulting actions. Note that | |||
some of the error conditions are not shown in the state diagram. | some of the error conditions are not shown in the state diagram. | |||
Full descriptions of all special cases are found in the text. | Full descriptions of all special cases are found in the text. | |||
Note: Chunk names are given in all capital letters, while parameter | Note: Chunk names are given in all capital letters, while parameter | |||
names have the first letter capitalized, e.g., COOKIE ECHO chunk type | names have the first letter capitalized, e.g., COOKIE ECHO chunk type | |||
vs. State Cookie parameter. If more than one event/message can occur | vs. State Cookie parameter. If more than one event/message can occur | |||
that causes a state transition, it is labeled (A), (B). | that causes a state transition, it is labeled (A) or (B). | |||
----- -------- (from any state) | ----- -------- (from any state) | |||
/ \ /receive ABORT [ABORT] | / \ /receive ABORT [ABORT] | |||
receive INIT | | |-------------- or ---------- | receive INIT | | |-------------- or ---------- | |||
---------------------| v v delete TCB send ABORT | ---------------------| v v delete TCB send ABORT | |||
generate State Cookie \ +---------+ delete TCB | generate State Cookie \ +---------+ delete TCB | |||
send INIT ACK ---| CLOSED | | send INIT ACK ---| CLOSED | | |||
+---------+ | +---------+ | |||
/ \ | / \ | |||
/ \ [ASSOCIATE] | / \ [ASSOCIATE] | |||
skipping to change at page 59, line 35 ¶ | skipping to change at line 2681 ¶ | |||
The following applies: | The following applies: | |||
1) If the State Cookie in the received COOKIE ECHO chunk is invalid | 1) If the State Cookie in the received COOKIE ECHO chunk is invalid | |||
(i.e., failed to pass the integrity check), the receiver MUST | (i.e., failed to pass the integrity check), the receiver MUST | |||
silently discard the packet. Or, if the received State Cookie is | silently discard the packet. Or, if the received State Cookie is | |||
expired (see Section 5.1.5), the receiver MUST send back an ERROR | expired (see Section 5.1.5), the receiver MUST send back an ERROR | |||
chunk. In either case, the receiver stays in the CLOSED state. | chunk. In either case, the receiver stays in the CLOSED state. | |||
2) If the T1-init timer expires, the endpoint MUST retransmit the | 2) If the T1-init timer expires, the endpoint MUST retransmit the | |||
INIT chunk and restart the T1-init timer without changing state. | INIT chunk and restart the T1-init timer. The endpoint stays in | |||
This MUST be repeated up to 'Max.Init.Retransmits' times. After | the COOKIE-WAIT state. This MUST be repeated up to | |||
that, the endpoint MUST abort the initialization process and | 'Max.Init.Retransmits' times. After that, the endpoint MUST | |||
report the error to the SCTP user. | abort the initialization process and report the error to the SCTP | |||
user. | ||||
3) If the T1-cookie timer expires, the endpoint MUST retransmit | 3) If the T1-cookie timer expires, the endpoint MUST retransmit | |||
COOKIE ECHO chunk and restart the T1-cookie timer without | COOKIE ECHO chunk and restart the T1-cookie timer. The endpoint | |||
changing state. This MUST be repeated up to | stays in the COOKIE-ECHOED state. This MUST be repeated up to | |||
'Max.Init.Retransmits' times. After that, the endpoint MUST | 'Max.Init.Retransmits' times. After that, the endpoint MUST | |||
abort the initialization process and report the error to the SCTP | abort the initialization process and report the error to the SCTP | |||
user. | user. | |||
4) In the SHUTDOWN-SENT state, the endpoint MUST acknowledge any | 4) In the SHUTDOWN-SENT state, the endpoint MUST acknowledge any | |||
received DATA chunks without delay. | received DATA chunks without delay. | |||
5) In the SHUTDOWN-RECEIVED state, the endpoint MUST NOT accept any | 5) In the SHUTDOWN-RECEIVED state, the endpoint MUST NOT accept any | |||
new send requests from its SCTP user. | new send requests from its SCTP user. | |||
skipping to change at page 61, line 9 ¶ | skipping to change at line 2747 ¶ | |||
INIT chunk, "A" MUST provide its Verification Tag (Tag_A) in the | INIT chunk, "A" MUST provide its Verification Tag (Tag_A) in the | |||
Initiate Tag field. Tag_A SHOULD be a random number in the range | 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). | of 1 to 4294967295 (see Section 5.3.1 for Tag value selection). | |||
After sending the INIT chunk, "A" starts the T1-init timer and | After sending the INIT chunk, "A" starts the T1-init timer and | |||
enters the COOKIE-WAIT state. | enters the COOKIE-WAIT state. | |||
B) "Z" responds immediately with an INIT ACK chunk. The destination | B) "Z" responds immediately with an INIT ACK chunk. The destination | |||
IP address of the INIT ACK chunk MUST be set to the source IP | IP address of the INIT ACK chunk MUST be set to the source IP | |||
address of the INIT chunk to which this INIT ACK chunk is | address of the INIT chunk to which this INIT ACK chunk is | |||
responding. In the response, besides filling in other | responding. In the response, besides filling in other | |||
parameters, "Z" MUST set the Verification Tag field to Tag_A, and | parameters, "Z" MUST set the Verification Tag field to Tag_A and | |||
also provide its own Verification Tag (Tag_Z) in the Initiate Tag | also provide its own Verification Tag (Tag_Z) in the Initiate Tag | |||
field. | field. | |||
Moreover, "Z" MUST generate and send along with the INIT ACK | Moreover, "Z" MUST generate and send along with the INIT ACK | |||
chunk a State Cookie. See Section 5.1.3 for State Cookie | chunk a State Cookie. See Section 5.1.3 for State Cookie | |||
generation. | generation. | |||
After sending an INIT ACK chunk with the State Cookie parameter, | After sending an INIT ACK chunk with the State Cookie parameter, | |||
"Z" MUST NOT allocate any resources or keep any states for the | "Z" MUST NOT allocate any resources or keep any states for the | |||
new association. Otherwise, "Z" will be vulnerable to resource | new association. Otherwise, "Z" will be vulnerable to resource | |||
attacks. | attacks. | |||
C) Upon reception of the INIT ACK chunk from "Z", "A" stops the | C) Upon reception of the INIT ACK chunk from "Z", "A" stops the | |||
T1-init timer and leaves the COOKIE-WAIT state. "A" then sends | T1-init timer and leaves the COOKIE-WAIT state. "A" then sends | |||
the State Cookie received in the INIT ACK chunk in a COOKIE ECHO | the State Cookie received in the INIT ACK chunk in a COOKIE ECHO | |||
chunk, starts the T1-cookie timer, and enters the COOKIE-ECHOED | chunk, starts the T1-cookie timer, and enters the COOKIE-ECHOED | |||
state. | state. | |||
The COOKIE ECHO chunk MAY be bundled with any pending outbound | The COOKIE ECHO chunk MAY be bundled with any pending outbound | |||
DATA chunks, but it MUST be the first chunk in the packet and | DATA chunks, but it MUST be the first chunk in the packet and, | |||
until the COOKIE ACK chunk is returned the sender MUST NOT send | until the COOKIE ACK chunk is returned, the sender MUST NOT send | |||
any other packets to the peer. | any other packets to the peer. | |||
D) Upon reception of the COOKIE ECHO chunk, endpoint "Z" replies | D) Upon reception of the COOKIE ECHO chunk, endpoint "Z" replies | |||
with a COOKIE ACK chunk after building a TCB and moving to the | with a COOKIE ACK chunk after building a TCB and moving to the | |||
ESTABLISHED state. A COOKIE ACK chunk MAY be bundled with any | ESTABLISHED state. A COOKIE ACK chunk MAY be bundled with any | |||
pending DATA chunks (and/or SACK chunks), but the COOKIE ACK | pending DATA chunks (and/or SACK chunks), but the COOKIE ACK | |||
chunk MUST be the first chunk in the packet. | chunk MUST be the first chunk in the packet. | |||
Implementation Note: An implementation can choose to send the | Implementation Note: An implementation can choose to send the | |||
Communication Up notification to the SCTP user upon reception of | COMMUNICATION UP notification to the SCTP user upon reception of | |||
a valid COOKIE ECHO chunk. | a valid COOKIE ECHO chunk. | |||
E) Upon reception of the COOKIE ACK chunk, endpoint "A" moves from | E) Upon reception of the COOKIE ACK chunk, endpoint "A" moves from | |||
the COOKIE-ECHOED state to the ESTABLISHED state, stopping the | the COOKIE-ECHOED state to the ESTABLISHED state, stopping the | |||
T1-cookie timer. It can also notify its ULP about the successful | T1-cookie timer. It can also notify its ULP about the successful | |||
establishment of the association with a Communication Up | establishment of the association with a COMMUNICATION UP | |||
notification (see Section 11). | notification (see Section 11). | |||
An INIT or INIT ACK chunk MUST NOT be bundled with any other chunk. | 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 | They MUST be the only chunks present in the SCTP packets that carry | |||
them. | them. | |||
An endpoint MUST send the INIT ACK chunk to the IP address from which | An endpoint MUST send the INIT ACK chunk to the IP address from which | |||
it received the INIT chunk. | it received the INIT chunk. | |||
T1-init timer and T1-cookie timer SHOULD follow the same rules given | The T1-init timer and T1-cookie timer SHOULD follow the same rules | |||
in Section 6.3. If the application provided multiple IP addresses of | given in Section 6.3. If the application provided multiple IP | |||
the peer, there SHOULD be a T1-init and T1-cookie timer for each | addresses of the peer, there SHOULD be a T1-init and T1-cookie timer | |||
address of the peer. Retransmissions of INIT chunks and COOKIE ECHO | for each address of the peer. Retransmissions of INIT chunks and | |||
chunks SHOULD use all addresses of the peer similar to | COOKIE ECHO chunks SHOULD use all addresses of the peer similar to | |||
retransmissions of DATA chunks. | retransmissions of DATA chunks. | |||
If an endpoint receives an INIT, INIT ACK, or COOKIE ECHO chunk but | If an endpoint receives an INIT, INIT ACK, or COOKIE ECHO chunk but | |||
decides not to establish the new association due to missing mandatory | decides not to establish the new association due to missing mandatory | |||
parameters in the received INIT or INIT ACK chunk, invalid parameter | parameters in the received INIT or INIT ACK chunk, invalid parameter | |||
values, or lack of local resources, it SHOULD respond with an ABORT | 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 | chunk. It SHOULD also specify the cause of abort, such as the type | |||
of the missing mandatory parameters, etc., by including the error | of the missing mandatory parameters, etc., by including an error | |||
cause parameters with the ABORT chunk. The Verification Tag field in | cause in the ABORT chunk. The Verification Tag field in the common | |||
the common header of the outbound SCTP packet containing the ABORT | header of the outbound SCTP packet containing the ABORT chunk MUST be | |||
chunk MUST be set to the Initiate Tag value of the received INIT or | set to the Initiate Tag value of the received INIT or INIT ACK chunk | |||
INIT ACK chunk this ABORT chunk is responding to. | this ABORT chunk is responding to. | |||
Note that a COOKIE ECHO chunk that does not pass the integrity check | Note that a COOKIE ECHO chunk that does not pass the integrity check | |||
is not considered an 'invalid mandatory parameter' and requires | is not considered an 'invalid mandatory parameter' and requires | |||
special handling; see Section 5.1.5. | special handling; see Section 5.1.5. | |||
After the reception of the first DATA chunk in an association the | After the reception of the first DATA chunk in an association, the | |||
endpoint MUST immediately respond with a SACK chunk to acknowledge | endpoint MUST immediately respond with a SACK chunk to acknowledge | |||
the DATA chunk. Subsequent acknowledgements SHOULD be done as | the DATA chunk. Subsequent acknowledgements SHOULD be done as | |||
described in Section 6.2. | described in Section 6.2. | |||
When the TCB is created, each endpoint MUST set its internal | When the TCB is created, each endpoint MUST set its internal | |||
Cumulative TSN Ack Point to the value of its transmitted Initial TSN | Cumulative TSN Ack Point to the value of its transmitted Initial TSN | |||
minus one. | minus one. | |||
Implementation Note: The IP addresses and SCTP port are generally | Implementation Note: The IP addresses and SCTP port are generally | |||
used as the key to find the TCB within an SCTP instance. | used as the key to find the TCB within an SCTP instance. | |||
5.1.1. Handle Stream Parameters | 5.1.1. Handle Stream Parameters | |||
In the INIT and INIT ACK chunks, the sender of the chunk MUST | 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 | indicate the number of outbound streams (OS) it wishes to have in the | |||
the association, as well as the maximum inbound streams (MISs) it | association, as well as the maximum inbound streams (MIS) it will | |||
will accept from the other endpoint. | accept from the other endpoint. | |||
After receiving the stream configuration information from the other | After receiving the stream configuration information from the other | |||
side, each endpoint MUST perform the following check: If the peer's | 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 | MIS is less than the endpoint's OS, meaning that the peer is | |||
incapable of supporting all the outbound streams the endpoint wants | incapable of supporting all the outbound streams the endpoint wants | |||
to configure, the endpoint MUST use MIS outbound streams and MAY | to configure, the endpoint MUST use MIS outbound streams and MAY | |||
report any shortage to the upper layer. The upper layer can then | report any shortage to the upper layer. The upper layer can then | |||
choose to abort the association if the resource shortage is | choose to abort the association if the resource shortage is | |||
unacceptable. | unacceptable. | |||
skipping to change at page 63, line 22 ¶ | skipping to change at line 2857 ¶ | |||
5.1.2. Handle Address Parameters | 5.1.2. Handle Address Parameters | |||
During the association initialization, an endpoint uses the following | During the association initialization, an endpoint uses the following | |||
rules to discover and collect the destination transport address(es) | rules to discover and collect the destination transport address(es) | |||
of its peer. | of its peer. | |||
A) If there are no address parameters present in the received INIT | A) If there are no address parameters present in the received INIT | |||
or INIT ACK chunk, the endpoint MUST take the source IP address | or INIT ACK chunk, the endpoint MUST take the source IP address | |||
from which the chunk arrives and record it, in combination with | from which the chunk arrives and record it, in combination with | |||
the SCTP source port number, as the only destination transport | the SCTP Source Port Number, as the only destination transport | |||
address for this peer. | address for this peer. | |||
B) If there is a Host Name Address parameter present in the received | B) If there is a Host Name Address parameter present in the received | |||
INIT or INIT ACK chunk, the endpoint MUST immediately send an | INIT or INIT ACK chunk, the endpoint MUST immediately send an | |||
ABORT chunk and MAY include an "Unresolvable Address" error cause | ABORT chunk and MAY include an "Unresolvable Address" error cause | |||
to its peer. The ABORT chunk SHOULD be sent to the source IP | to its peer. The ABORT chunk SHOULD be sent to the source IP | |||
address from which the last peer packet was received. | address from which the last peer packet was received. | |||
C) If there are only IPv4/IPv6 addresses present in the 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 | INIT or INIT ACK chunk, the receiver MUST derive and record all | |||
the transport addresses from the received chunk AND the source IP | the transport addresses from the received chunk AND the source IP | |||
address that sent the INIT or INIT ACK chunk. The transport | address that sent the INIT or INIT ACK chunk. The transport | |||
addresses are derived by the combination of SCTP source port | addresses are derived by the combination of SCTP Source Port | |||
(from the common header) and the IP Address parameter(s) carried | Number (from the common header) and the IP Address parameter(s) | |||
in the INIT or INIT ACK chunk and the source IP address of the IP | carried in the INIT or INIT ACK chunk and the source IP address | |||
datagram. The receiver SHOULD use only these transport addresses | of the IP datagram. The receiver SHOULD use only these transport | |||
as destination transport addresses when sending subsequent | addresses as destination transport addresses when sending | |||
packets to its peer. | subsequent packets to its peer. | |||
D) An INIT or INIT ACK chunk MUST be treated as belonging to an | D) An INIT or INIT ACK chunk MUST be treated as belonging to an | |||
already established association (or one in the process of being | already established association (or one in the process of being | |||
established) if the use of any of the valid address parameters | established) if the use of any of the valid address parameters | |||
contained within the chunk would identify an existing TCB. | contained within the chunk would identify an existing TCB. | |||
Implementation Note: In some cases (e.g., when the implementation | Implementation Note: In some cases (e.g., when the implementation | |||
does not control the source IP address that is used for | does not control the source IP address that is used for | |||
transmitting), an endpoint might need to include in its INIT or INIT | transmitting), an endpoint might need to include in its INIT or INIT | |||
ACK chunk all possible IP addresses from which packets to the peer | ACK chunk all possible IP addresses from which packets to the peer | |||
skipping to change at page 64, line 29 ¶ | skipping to change at line 2912 ¶ | |||
reinitiation by using a 'Supported Address Types' parameter in the | reinitiation by using a 'Supported Address Types' parameter in the | |||
new INIT chunk to indicate what types of address it prefers. | new INIT chunk to indicate what types of address it prefers. | |||
If an SCTP endpoint that only supports either IPv4 or IPv6 receives | 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, | 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 | it MUST use all the addresses belonging to the supported address | |||
family. The other addresses MAY be ignored. The endpoint SHOULD NOT | family. The other addresses MAY be ignored. The endpoint SHOULD NOT | |||
respond with any kind of error indication. | respond with any kind of error indication. | |||
If an SCTP endpoint lists in the 'Supported Address Types' parameter | If an SCTP endpoint lists in the 'Supported Address Types' parameter | |||
either IPv4 or IPv6, but uses the other family for sending the packet | 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 | 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 | family in the INIT chunk, then the address family that is not listed | |||
in the 'Supported Address Types' parameter SHOULD also be considered | in the 'Supported Address Types' parameter SHOULD also be considered | |||
as supported by the receiver of the INIT chunk. The receiver of the | as supported by the receiver of the INIT chunk. The receiver of the | |||
INIT chunk SHOULD NOT respond with any kind of error indication. | INIT chunk SHOULD NOT respond with any kind of error indication. | |||
5.1.3. Generating State Cookie | 5.1.3. Generating State Cookie | |||
When sending an INIT ACK chunk as a response to an INIT chunk, the | When sending an INIT ACK chunk as a response to an INIT chunk, the | |||
sender of INIT ACK chunk creates a State Cookie and sends it in the | sender of the INIT ACK chunk creates a State Cookie and sends it in | |||
State Cookie parameter of the INIT ACK chunk. Inside this State | the State Cookie parameter of the INIT ACK chunk. Inside this State | |||
Cookie, the sender MUST include a MAC (see [RFC2104] for an example) | Cookie, the sender MUST include a MAC (see [RFC2104] for an example) | |||
to provide integrity protection on the State Cookie. The State | to provide integrity protection on the State Cookie. The State | |||
Cookie SHOULD also contain a timestamp on when the State Cookie is | Cookie SHOULD also contain a timestamp on when the State Cookie is | |||
created, and the lifespan of the State Cookie, along with all the | created and the lifespan of the State Cookie, along with all the | |||
information necessary for it to establish the association including | information necessary for it to establish the association, including | |||
the port numbers and the verification tags. | the port numbers and the Verification Tags. | |||
The method used to generate the MAC is strictly a private matter for | The 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 | the receiver of the INIT chunk. The use of a MAC is mandatory to | |||
prevent denial-of-service attacks. MAC algorithms can have different | prevent denial-of-service attacks. MAC algorithms can have different | |||
performance depending on the platform. Choosing a high performance | performances depending on the platform. Choosing a high-performance | |||
MAC algorithm increases the resistance against cookie flooding | MAC algorithm increases the resistance against cookie flooding | |||
attacks. A MAC with acceptable security properties SHOULD be used. | attacks. A MAC with acceptable security properties SHOULD be used. | |||
The secret key SHOULD be random ([RFC4086] provides some information | The secret key SHOULD be random ([RFC4086] provides some information | |||
on randomness guidelines). The secret keys need to have an | on randomness guidelines). The secret keys need to have an | |||
appropriate size. The secret key SHOULD be changed reasonably | appropriate size. The secret key SHOULD be changed reasonably | |||
frequently (e.g., hourly), and the timestamp in the State Cookie MAY | frequently (e.g., hourly), and the timestamp in the State Cookie MAY | |||
be used to determine which key is used to verify the MAC. | be used to determine which key is used to verify the MAC. | |||
If the State Cookie is not encrypted, it MUST NOT contain information | If the State Cookie is not encrypted, it MUST NOT contain information | |||
which is not being envisioned to be shared. | that is not being envisioned to be shared. | |||
An implementation SHOULD make the cookie as small as possible to | An implementation SHOULD make the cookie as small as possible to | |||
ensure interoperability. | ensure interoperability. | |||
5.1.4. State Cookie Processing | 5.1.4. State Cookie Processing | |||
When an endpoint (in the COOKIE-WAIT state) receives an INIT ACK | When an endpoint (in the COOKIE-WAIT state) receives an INIT ACK | |||
chunk with a State Cookie parameter, it MUST immediately send a | chunk with a State Cookie parameter, it MUST immediately send a | |||
COOKIE ECHO chunk to its peer with the received State Cookie. The | 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 | sender MAY also add any pending DATA chunks to the packet after the | |||
COOKIE ECHO chunk. | COOKIE ECHO chunk. | |||
The endpoint MUST also start the T1-cookie timer after sending the | The endpoint MUST also start the T1-cookie timer after sending the | |||
COOKIE ECHO chunk. If the timer expires, the endpoint MUST | COOKIE ECHO chunk. If the timer expires, the endpoint MUST | |||
retransmit the COOKIE ECHO chunk and restart the T1-cookie timer. | retransmit the COOKIE ECHO chunk and restart the T1-cookie timer. | |||
This is repeated until either a COOKIE ACK chunk is received or | This is repeated until either a COOKIE ACK chunk is received or | |||
'Max.Init.Retransmits' (see Section 16) is reached causing the peer | 'Max.Init.Retransmits' (see Section 16) is reached, causing the peer | |||
endpoint to be marked unreachable (and thus the association enters | endpoint to be marked unreachable (and thus the association enters | |||
the CLOSED state). | the CLOSED state). | |||
5.1.5. State Cookie Authentication | 5.1.5. State Cookie Authentication | |||
When an endpoint receives a COOKIE ECHO chunk from another endpoint | When an endpoint receives a COOKIE ECHO chunk from another endpoint | |||
with which it has no association, it takes the following actions: | with which it has no association, it takes the following actions: | |||
1) Compute a MAC using the information carried in the State Cookie | 1) Compute a MAC using the information carried in the State Cookie | |||
and the secret key. The timestamp in the State Cookie MAY be | and the secret key. The timestamp in the State Cookie MAY be | |||
used to determine which secret key to use. If secrets are kept | used to determine which secret key to use. If secrets are kept | |||
only for a limited amount of time and the secret key to use is | only for a limited amount of time and the secret key to use is | |||
not available anymore, the packet containing the COOKIE ECHO | not available anymore, the packet containing the COOKIE ECHO | |||
chunk MUST be silently discarded. [RFC2104] can be used as a | chunk MUST be silently discarded. [RFC2104] can be used as a | |||
guideline for generating the MAC, | guideline for generating the MAC. | |||
2) Authenticate the State Cookie as one that it previously generated | 2) Authenticate the State Cookie as one that it previously generated | |||
by comparing the computed MAC against the one carried in the | by comparing the computed MAC against the one carried in the | |||
State Cookie. If this comparison fails, the SCTP packet, | State Cookie. If this comparison fails, the SCTP packet, | |||
including the COOKIE ECHO chunk and any DATA chunks, MUST be | including the COOKIE ECHO chunk and any DATA chunks, MUST be | |||
silently discarded, | silently discarded. | |||
3) Compare the port numbers and the Verification Tag contained | 3) Compare the port numbers and the Verification Tag contained | |||
within the COOKIE ECHO chunk to the actual port numbers and the | within the COOKIE ECHO chunk to the actual port numbers and the | |||
Verification Tag within the SCTP common header of the received | Verification Tag within the SCTP common header of the received | |||
packet. If these values do not match, the packet MUST be | packet. If these values do not match, the packet MUST be | |||
silently discarded. | silently discarded. | |||
4) Compare the creation timestamp in the State Cookie to the current | 4) Compare the creation timestamp in the State Cookie to the current | |||
local time. If the elapsed time is longer than the lifespan | local time. If the elapsed time is longer than the lifespan | |||
carried in the State Cookie, then the packet, including the | carried in the State Cookie, then the packet, including the | |||
skipping to change at page 66, line 41 ¶ | skipping to change at line 3020 ¶ | |||
COOKIE ACK chunk, the COOKIE ACK chunk MUST appear first in the | COOKIE ACK chunk, the COOKIE ACK chunk MUST appear first in the | |||
SCTP packet. | SCTP packet. | |||
If a COOKIE ECHO chunk is received from an endpoint with which the | If a COOKIE ECHO chunk is received from an endpoint with which the | |||
receiver of the COOKIE ECHO chunk has an existing association, the | receiver of the COOKIE ECHO chunk has an existing association, the | |||
procedures in Section 5.2 SHOULD be followed. | procedures in Section 5.2 SHOULD be followed. | |||
5.1.6. An Example of Normal Association Establishment | 5.1.6. An Example of Normal Association Establishment | |||
In the following example, "A" initiates the association and then | In the following example, "A" initiates the association and then | |||
sends a user message to "Z", then "Z" sends two user messages to "A" | sends a user message to "Z"; then, "Z" sends two user messages to "A" | |||
later (assuming no bundling or fragmentation occurs): | later (assuming no bundling or fragmentation occurs): | |||
Endpoint A Endpoint Z | Endpoint A Endpoint Z | |||
{app sets association with Z} | {app sets association with Z} | |||
(build TCB) | (build TCB) | |||
INIT [I-Tag=Tag_A | INIT [I-Tag=Tag_A | |||
& other info] ------\ | & other info] ------\ | |||
(Start T1-init timer) \ | (Start T1-init timer) \ | |||
(Enter COOKIE-WAIT state) \---> (compose Cookie_Z) | (Enter COOKIE-WAIT state) \---> (compose Cookie_Z) | |||
/-- INIT ACK [Veri Tag=Tag_A, | /-- INIT ACK [Veri Tag=Tag_A, | |||
skipping to change at page 67, line 49 ¶ | skipping to change at line 3067 ¶ | |||
\/ Strm=0,Seq=1 & user data 2] | \/ Strm=0,Seq=1 & user data 2] | |||
<------/\ | <------/\ | |||
\ | \ | |||
\------> | \------> | |||
Figure 4: A Setup Example | Figure 4: A Setup Example | |||
If the T1-init timer expires at "A" after the INIT or COOKIE ECHO | 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 | chunks are sent, the same INIT or COOKIE ECHO chunk with the same | |||
Initiate Tag (i.e., Tag_A) or State Cookie is retransmitted and the | Initiate Tag (i.e., Tag_A) or State Cookie is retransmitted and the | |||
timer restarted. This is repeated 'Max.Init.Retransmits' times | timer is restarted. This is repeated 'Max.Init.Retransmits' times | |||
before "A" considers "Z" unreachable and reports the failure to its | before "A" considers "Z" unreachable and reports the failure to its | |||
upper layer (and thus the association enters the CLOSED state). | upper layer (and thus the association enters the CLOSED state). | |||
When retransmitting the INIT chunk, the endpoint MUST follow the | When retransmitting the INIT chunk, the endpoint MUST follow the | |||
rules defined in Section 6.3 to determine the proper timer value. | rules defined in Section 6.3 to determine the proper timer value. | |||
5.2. Handle Duplicate or Unexpected INIT, INIT ACK, COOKIE ECHO, and | 5.2. Handle Duplicate or Unexpected INIT, INIT ACK, COOKIE ECHO, and | |||
COOKIE ACK Chunks | COOKIE ACK Chunks | |||
During the life time of an association (in one of the possible | During the life time of an association (in one of the possible | |||
states), an endpoint can receive from its peer endpoint one of the | states), an endpoint can receive from its peer endpoint one of the | |||
setup chunks (INIT, INIT ACK, COOKIE ECHO, and COOKIE ACK). The | setup chunks (INIT, INIT ACK, COOKIE ECHO, or COOKIE ACK). The | |||
receiver treats such a setup chunk as a duplicate and process it as | receiver treats such a setup chunk as a duplicate and process it as | |||
described in this section. | described in this section. | |||
Note: An endpoint will not receive the chunk unless the chunk was | Note: An endpoint will not receive the chunk unless the chunk was | |||
sent to an SCTP transport address and is from an SCTP transport | sent to an SCTP transport address and is from an SCTP transport | |||
address associated with this endpoint. Therefore, the endpoint | address associated with this endpoint. Therefore, the endpoint | |||
processes such a chunk as part of its current association. | processes such a chunk as part of its current association. | |||
The following scenarios can cause duplicated or unexpected chunks: | The following scenarios can cause duplicated or unexpected chunks: | |||
A) The peer has crashed without being detected, restarted itself, | A) the peer has crashed without being detected, restarted itself, | |||
and sent a new INIT chunk trying to restore the association, | and sent a new INIT chunk trying to restore the association, | |||
B) Both sides are trying to initialize the association at about the | B) both sides are trying to initialize the association at about the | |||
same time, | same time, | |||
C) The chunk is from a stale packet that was used to establish the | 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 | present association or a past association that is no longer in | |||
existence, | existence, | |||
D) The chunk is a false packet generated by an attacker, or | D) the chunk is a false packet generated by an attacker, or | |||
E) The peer never received the COOKIE ACK chunk and is | E) the peer never received the COOKIE ACK chunk and is | |||
retransmitting its COOKIE ECHO chunk. | retransmitting its COOKIE ECHO chunk. | |||
The rules in the following sections are applied in order to identify | The rules in the following sections are applied in order to identify | |||
and correctly handle these cases. | and correctly handle these cases. | |||
5.2.1. INIT Chunk Received in COOKIE-WAIT or COOKIE-ECHOED State (Item | 5.2.1. INIT Chunk Received in COOKIE-WAIT or COOKIE-ECHOED State (Item | |||
B) | B) | |||
This usually indicates an initialization collision, i.e., each | This usually indicates an initialization collision, i.e., each | |||
endpoint is attempting, at about the same time, to establish an | endpoint is attempting, at about the same time, to establish an | |||
skipping to change at page 69, line 18 ¶ | skipping to change at line 3133 ¶ | |||
2) The packet containing the INIT ACK chunk MUST only be sent to an | 2) The packet containing the INIT ACK chunk MUST only be sent to an | |||
address reported in the incoming INIT chunk. | address reported in the incoming INIT chunk. | |||
3) The packet containing the INIT ACK chunk SHOULD be sent to the | 3) The packet containing the INIT ACK chunk SHOULD be sent to the | |||
source address of the received packet containing the INIT chunk. | source address of the received packet containing the INIT chunk. | |||
Upon receipt of an INIT chunk in the COOKIE-ECHOED state, an endpoint | Upon receipt of an INIT chunk in the COOKIE-ECHOED state, an endpoint | |||
MUST respond with an INIT ACK chunk using the same parameters it sent | MUST respond with an INIT ACK chunk using the same parameters it sent | |||
in its original INIT chunk (including its Initiate Tag, unchanged), | in its original INIT chunk (including its Initiate Tag, unchanged), | |||
provided that no NEW address has been added to the forming | provided that no new address has been added to the forming | |||
association. If the INIT chunk indicates that a new address has been | association. If the INIT chunk indicates that a new address has been | |||
added to the association, then the entire INIT chunk MUST be | added to the association, then the entire INIT chunk MUST be | |||
discarded, and the state of the existing association SHOULD NOT be | discarded, and the state of the existing association SHOULD NOT be | |||
changed. An ABORT chunk SHOULD be sent in response that MAY include | changed. An ABORT chunk SHOULD be sent in a response that MAY | |||
the error 'Restart of an association with new addresses'. The error | include the "Restart of an Association with New Addresses" error | |||
SHOULD list the addresses that were added to the restarting | cause. The error SHOULD list the addresses that were added to the | |||
association. | restarting association. | |||
When responding in either state (COOKIE-WAIT or COOKIE-ECHOED) with | When responding in either state (COOKIE-WAIT or COOKIE-ECHOED) with | |||
an INIT ACK chunk, the original parameters are combined with those | an INIT ACK chunk, the original parameters are combined with those | |||
from the newly received INIT chunk. The endpoint MUST also generate | from the newly received INIT chunk. The endpoint MUST also generate | |||
a State Cookie with the INIT ACK chunk. The endpoint uses the | a State Cookie with the INIT ACK chunk. The endpoint uses the | |||
parameters sent in its INIT chunk to calculate the State Cookie. | parameters sent in its INIT chunk to calculate the State Cookie. | |||
After that, the endpoint MUST NOT change its state, the T1-init timer | After that, the endpoint MUST NOT change its state, the T1-init timer | |||
MUST be left running, and the corresponding TCB MUST NOT be | MUST be left running, and the corresponding TCB MUST NOT be | |||
destroyed. The normal procedures for handling State Cookies when a | destroyed. The normal procedures for handling State Cookies when a | |||
skipping to change at page 70, line 5 ¶ | skipping to change at line 3169 ¶ | |||
ECHOED, COOKIE-WAIT, and SHUTDOWN-ACK-SENT | ECHOED, COOKIE-WAIT, and SHUTDOWN-ACK-SENT | |||
Unless otherwise stated, upon receipt of an unexpected INIT chunk for | Unless otherwise stated, upon receipt of an unexpected INIT chunk for | |||
this association, the endpoint MUST generate an INIT ACK chunk with a | this association, the endpoint MUST generate an INIT ACK chunk with a | |||
State Cookie. Before responding, the endpoint MUST check to see if | State Cookie. Before responding, the endpoint MUST check to see if | |||
the unexpected INIT chunk adds new addresses to the association. If | the unexpected INIT chunk adds new addresses to the association. If | |||
new addresses are added to the association, the endpoint MUST respond | new addresses are added to the association, the endpoint MUST respond | |||
with an ABORT chunk, copying the 'Initiate Tag' of the unexpected | with an ABORT chunk, copying the 'Initiate Tag' of the unexpected | |||
INIT chunk into the 'Verification Tag' of the outbound packet | INIT chunk into the 'Verification Tag' of the outbound packet | |||
carrying the ABORT chunk. In the ABORT chunk, the error cause MAY be | carrying the ABORT chunk. In the ABORT chunk, the error cause MAY be | |||
set to 'restart of an association with new addresses'. The error | set to "Restart of an Association with New Addresses". The error | |||
SHOULD list the addresses that were added to the restarting | SHOULD list the addresses that were added to the restarting | |||
association. If no new addresses are added, when responding to the | association. If no new addresses are added, when responding to the | |||
INIT chunk in the outbound INIT ACK chunk, the endpoint MUST copy its | INIT chunk in the outbound INIT ACK chunk, the endpoint MUST copy its | |||
current Tie-Tags to a reserved place within the State Cookie and the | current Tie-Tags to a reserved place within the State Cookie and the | |||
association's TCB. We refer to these locations inside the cookie as | association's TCB. We refer to these locations inside the cookie as | |||
the Peer's-Tie-Tag and the Local-Tie-Tag. We will refer to the copy | 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 | within an association's TCB as the Local Tag and Peer's Tag. The | |||
outbound SCTP packet containing this INIT ACK chunk MUST carry a | outbound SCTP packet containing this INIT ACK chunk MUST carry a | |||
Verification Tag value equal to the Initiate Tag found in the | Verification Tag value equal to the Initiate Tag found in the | |||
unexpected INIT chunk. And the INIT ACK chunk MUST contain a new | unexpected INIT chunk. And the INIT ACK chunk MUST contain a new | |||
Initiate Tag (randomly generated; see Section 5.3.1). Other | Initiate Tag (randomly generated; see Section 5.3.1). Other | |||
parameters for the endpoint SHOULD be copied from the existing | parameters for the endpoint SHOULD be copied from the existing | |||
parameters of the association (e.g., number of outbound streams) into | parameters of the association (e.g., number of outbound streams) into | |||
the INIT ACK chunk and cookie. | the INIT ACK chunk and cookie. | |||
After sending the INIT ACK or ABORT chunk, the endpoint MUST take no | After sending the INIT ACK or ABORT chunk, the endpoint MUST take no | |||
further actions; i.e., the existing association, including its | further actions, i.e., the existing association, including its | |||
current state, and the corresponding TCB MUST NOT be changed. | current state, and the corresponding TCB MUST NOT be changed. | |||
Only when a TCB exists and the association is not in a COOKIE-WAIT or | 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 random | SHUTDOWN-ACK-SENT state are the Tie-Tags populated with a random | |||
value other than 0. For a normal association INIT chunk (i.e., the | value other than 0. For a normal association INIT chunk (i.e., the | |||
endpoint is in the CLOSED state), the Tie-Tags MUST be set to 0 | endpoint is in the CLOSED state), the Tie-Tags MUST be set to 0 | |||
(indicating that no previous TCB existed). | (indicating that no previous TCB existed). | |||
5.2.3. Unexpected INIT ACK Chunk | 5.2.3. Unexpected INIT ACK Chunk | |||
If an INIT ACK chunk is received by an endpoint in any state other | If an INIT ACK chunk is received by an endpoint in any state other | |||
than the COOKIE-WAIT or CLOSED state, the endpoint SHOULD discard the | than the COOKIE-WAIT or CLOSED state, the endpoint SHOULD discard the | |||
INIT ACK chunk. An unexpected INIT ACK chunk usually indicates the | INIT ACK chunk. An unexpected INIT ACK chunk usually indicates the | |||
processing of an old or duplicated INIT chunk. | processing of an old or duplicated INIT chunk. | |||
5.2.4. Handle a COOKIE ECHO Chunk when a TCB Exists | 5.2.4. Handle a COOKIE ECHO Chunk When a TCB Exists | |||
When a COOKIE ECHO chunk is received by an endpoint in any state for | 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 | an existing association (i.e., not in the CLOSED state), the | |||
rules are applied: | following rules are applied: | |||
1) Compute a MAC as described in step 1 of Section 5.1.5, | 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 | 2) Authenticate the State Cookie as described in step 2 of | |||
Section 5.1.5 (this is case C or D above). | Section 5.1.5 (this is case C or D above). | |||
3) Compare the timestamp in the State Cookie to the current time. | 3) Compare the timestamp in the State Cookie to the current time. | |||
If the State Cookie is older than the lifespan carried in the | If the State Cookie is older than the lifespan carried in the | |||
State Cookie and the Verification Tags contained in the State | State Cookie and the Verification Tags contained in the State | |||
Cookie do not match the current association's Verification Tags, | Cookie do not match the current association's Verification Tags, | |||
the packet, including the COOKIE ECHO chunk and any DATA chunks, | the packet, including the COOKIE ECHO chunk and any DATA chunks, | |||
SHOULD be discarded. The endpoint also MUST transmit an ERROR | SHOULD be discarded. The endpoint also MUST transmit an ERROR | |||
chunk with a "Stale Cookie" error cause to the peer endpoint | chunk with a "Stale Cookie" error cause to the peer endpoint | |||
(this is case C or D in Section 5.2). | (this is case C or D in Section 5.2). | |||
If both Verification Tags in the State Cookie match the | If both Verification Tags in the State Cookie match the | |||
Verification Tags of the current association, consider the State | Verification Tags of the current association, consider the State | |||
Cookie valid (this is case E in Section 5.2) even if the lifespan | Cookie valid (this is case E in Section 5.2), even if the | |||
is exceeded. | lifespan is exceeded. | |||
4) If the State Cookie proves to be valid, unpack the TCB into a | 4) If the State Cookie proves to be valid, unpack the TCB into a | |||
temporary TCB. | temporary TCB. | |||
5) Refer to Table 12 to determine the correct action to be taken. | 5) Refer to Table 12 to determine the correct action to be taken. | |||
+-----------+------------+---------------+----------------+--------+ | +===========+============+===============+================+========+ | |||
| Local Tag | Peer's Tag | Local-Tie-Tag | Peer's-Tie-Tag | Action | | | Local Tag | Peer's Tag | Local-Tie-Tag | Peer's-Tie-Tag | Action | | |||
+-----------+------------+---------------+----------------+--------+ | +===========+============+===============+================+========+ | |||
| X | X | M | M | (A) | | | X | X | M | M | (A) | | |||
+-----------+------------+---------------+----------------+--------+ | +-----------+------------+---------------+----------------+--------+ | |||
| M | X | A | A | (B) | | | M | X | A | A | (B) | | |||
+-----------+------------+---------------+----------------+--------+ | +-----------+------------+---------------+----------------+--------+ | |||
| M | 0 | A | A | (B) | | | M | 0 | A | A | (B) | | |||
+-----------+------------+---------------+----------------+--------+ | +-----------+------------+---------------+----------------+--------+ | |||
| X | M | 0 | 0 | (C) | | | X | M | 0 | 0 | (C) | | |||
+-----------+------------+---------------+----------------+--------+ | +-----------+------------+---------------+----------------+--------+ | |||
| M | M | A | A | (D) | | | M | M | A | A | (D) | | |||
+-----------+------------+---------------+----------------+--------+ | +-----------+------------+---------------+----------------+--------+ | |||
Table 12: Handling of a COOKIE ECHO Chunk when a TCB Exists | Table 12: Handling of a COOKIE ECHO Chunk When a TCB Exists | |||
Legend: | Legend: | |||
X - Tag does not match the existing TCB. | X - Tag does not match the existing TCB. | |||
M - Tag matches the existing TCB. | M - Tag matches the existing TCB. | |||
0 - Tag unknown (Peer's Tag not known yet / No tie-tag in cookie). | 0 - Tag unknown (Peer's Tag not known yet / No Tie-Tag in cookie). | |||
A - All cases, i.e., M, X, or 0. | A - All cases, i.e., M, X, or 0. | |||
For any case not shown in Table 12, the cookie SHOULD be silently | For any case not shown in Table 12, the cookie SHOULD be silently | |||
discarded. | discarded. | |||
Action | Action: | |||
A) In this case, the peer might have restarted. When the endpoint | A) In this case, the peer might have restarted. When the endpoint | |||
recognizes this potential 'restart', the existing session is | recognizes this potential 'restart', the existing session is | |||
treated the same as if it received an ABORT chunk followed by a | treated the same as if it received an ABORT chunk followed by a | |||
new COOKIE ECHO chunk with the following exceptions: | new COOKIE ECHO chunk with the following exceptions: | |||
* Any SCTP DATA chunks MAY be retained (this is an | * Any SCTP DATA chunks MAY be retained (this is an | |||
implementation-specific option). | implementation-specific option). | |||
* A notification of RESTART SHOULD be sent to the ULP instead of | * A RESTART notification SHOULD be sent to the ULP instead of a | |||
a "COMMUNICATION LOST" notification. | COMMUNICATION LOST notification. | |||
All the congestion control parameters (e.g., cwnd, ssthresh) | All the congestion control parameters (e.g., cwnd, ssthresh) | |||
related to this peer MUST be reset to their initial values (see | related to this peer MUST be reset to their initial values (see | |||
Section 6.2.1). | Section 6.2.1). | |||
After this, the endpoint enters the ESTABLISHED state. | After this, the endpoint enters the ESTABLISHED state. | |||
If the endpoint is in the SHUTDOWN-ACK-SENT state and recognizes | 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 | that the peer has restarted (Action A), it MUST NOT set up a new | |||
association but instead resend the SHUTDOWN ACK chunk and send an | association but instead resend the SHUTDOWN ACK chunk and send an | |||
skipping to change at page 72, line 41 ¶ | skipping to change at line 3301 ¶ | |||
send a COOKIE ACK chunk. | send a COOKIE ACK chunk. | |||
C) In this case, the local endpoint's cookie has arrived late. | C) In this case, the local endpoint's cookie has arrived late. | |||
Before it arrived, the local endpoint sent an INIT chunk and | Before it arrived, the local endpoint sent an INIT chunk and | |||
received an INIT ACK chunk and finally sent a COOKIE ECHO chunk | received an INIT ACK chunk and finally sent a COOKIE ECHO chunk | |||
with the peer's same tag but a new tag of its own. The cookie | with the peer's same tag but a new tag of its own. The cookie | |||
SHOULD be silently discarded. The endpoint SHOULD NOT change | SHOULD be silently discarded. The endpoint SHOULD NOT change | |||
states and SHOULD leave any timers running. | states and SHOULD leave any timers running. | |||
D) When both local and remote tags match, the endpoint SHOULD enter | D) When both local and remote tags match, the endpoint SHOULD enter | |||
the ESTABLISHED state, if it is in the COOKIE-ECHOED state. It | the ESTABLISHED state if it is in the COOKIE-ECHOED state. It | |||
SHOULD stop any T1-cookie timer that is running and send a COOKIE | SHOULD stop any T1-cookie timer that is running and send a COOKIE | |||
ACK chunk. | ACK chunk. | |||
Note: The "peer's Verification Tag" is the tag received in the | Note: The "peer's Verification Tag" is the tag received in the | |||
Initiate Tag field of the INIT or INIT ACK chunk. | Initiate Tag field of the INIT or INIT ACK chunk. | |||
5.2.4.1. An Example of a Association Restart | 5.2.4.1. An Example of an Association Restart | |||
In the following example, "A" initiates the association after a | In the following example, "A" initiates the association after a | |||
restart has occurred. Endpoint "Z" had no knowledge of the restart | restart has occurred. Endpoint "Z" had no knowledge of the restart | |||
until the exchange (i.e., Heartbeats had not yet detected the failure | until the exchange (i.e., Heartbeats had not yet detected the failure | |||
of "A") (assuming no bundling or fragmentation occurs): | of "A") (assuming no bundling or fragmentation occurs): | |||
Endpoint A Endpoint Z | Endpoint A Endpoint Z | |||
<-------------- Association is established----------------------> | <-------------- Association is established----------------------> | |||
Tag=Tag_A Tag=Tag_Z | Tag=Tag_A Tag=Tag_Z | |||
<---------------------------------------------------------------> | <---------------------------------------------------------------> | |||
{A crashes and restarts} | {A crashes and restarts} | |||
{app sets up a association with Z} | {app sets up an association with Z} | |||
(build TCB) | (build TCB) | |||
INIT [I-Tag=Tag_A' | INIT [I-Tag=Tag_A' | |||
& other info] --------\ | & other info] --------\ | |||
(Start T1-init timer) \ | (Start T1-init timer) \ | |||
(Enter COOKIE-WAIT state) \---> (find an existing TCB, | (Enter COOKIE-WAIT state) \---> (find an existing TCB, | |||
populate TieTags if needed, | populate TieTags if needed, | |||
compose Cookie_Z with Tie-Tags | compose Cookie_Z with Tie-Tags | |||
and other info) | and other info) | |||
/--- INIT ACK [Veri Tag=Tag_A', | /--- INIT ACK [Veri Tag=Tag_A', | |||
/ I-Tag=Tag_Z', | / I-Tag=Tag_Z', | |||
skipping to change at page 73, line 44 ¶ | skipping to change at line 3347 ¶ | |||
Tie-Tags in Cookie_Z match | Tie-Tags in Cookie_Z match | |||
Tie-Tags in TCB, | Tie-Tags in TCB, | |||
Tags do not match, i.e., | Tags do not match, i.e., | |||
case X X M M above, | case X X M M above, | |||
Announce Restart to ULP | Announce Restart to ULP | |||
and reset association). | and reset association). | |||
/---- COOKIE ACK | /---- COOKIE ACK | |||
(Cancel T1-init timer, <------/ | (Cancel T1-init timer, <------/ | |||
Enter ESTABLISHED state) | Enter ESTABLISHED state) | |||
{app sends 1st user data; strm 0} | {app sends 1st user data; strm 0} | |||
DATA [TSN=initial TSN_A | DATA [TSN=Initial TSN_A | |||
Strm=0,Seq=0 & user data]--\ | Strm=0,Seq=0 & user data]--\ | |||
(Start T3-rtx timer) \ | (Start T3-rtx timer) \ | |||
\-> | \-> | |||
/--- SACK [TSN Ack=init TSN_A,Block=0] | /--- SACK [TSN Ack=init TSN_A,Block=0] | |||
(Cancel T3-rtx timer) <------/ | (Cancel T3-rtx timer) <------/ | |||
Figure 5: A Restart Example | Figure 5: A Restart Example | |||
5.2.5. Handle Duplicate COOKIE ACK Chunk | 5.2.5. Handle Duplicate COOKIE ACK Chunk | |||
At any state other than COOKIE-ECHOED, an endpoint SHOULD silently | At any state other than COOKIE-ECHOED, an endpoint SHOULD silently | |||
discard a received COOKIE ACK chunk. | discard a received COOKIE ACK chunk. | |||
5.2.6. Handle Stale Cookie Error | 5.2.6. Handle Stale Cookie Error | |||
Receipt of an ERROR chunk with a "Stale Cookie" error cause indicates | Receipt of an ERROR chunk with a "Stale Cookie" error cause indicates | |||
one of a number of possible events: | one of a number of possible events: | |||
A) The association failed to completely setup before the State | A) The association failed to completely set up before the State | |||
Cookie issued by the sender was processed. | Cookie issued by the sender was processed. | |||
B) An old State Cookie was processed after setup completed. | B) An old State Cookie was processed after setup completed. | |||
C) An old State Cookie is received from someone that the receiver is | C) An old State Cookie is received from someone that the receiver is | |||
not interested in having an association with and the ABORT chunk | not interested in having an association with and the ABORT chunk | |||
was lost. | was lost. | |||
When processing an ERROR chunk with a "Stale Cookie" error cause an | When processing an ERROR chunk with a "Stale Cookie" error cause, an | |||
endpoint SHOULD first examine if an association is in the process of | 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. | 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, | In all cases, if the association is not in the COOKIE-ECHOED state, | |||
the ERROR chunk SHOULD be silently discarded. | the ERROR chunk SHOULD be silently discarded. | |||
If the association is in the COOKIE-ECHOED state, the endpoint MAY | If the association is in the COOKIE-ECHOED state, the endpoint MAY | |||
elect one of the following three alternatives. | elect one of the following three alternatives. | |||
1) Send a new INIT chunk to the endpoint to generate a new State | 1) Send a new INIT chunk to the endpoint to generate a new State | |||
Cookie and reattempt the setup procedure. | Cookie and reattempt the setup procedure. | |||
2) Discard the TCB and report to the upper layer the inability to | 2) Discard the TCB and report to the upper layer the inability to | |||
set up the association. | set up the association. | |||
3) Send a new INIT chunk to the endpoint, adding a Cookie | 3) Send a new INIT chunk to the endpoint, adding a Cookie | |||
Preservative parameter requesting an extension to the life time | Preservative parameter requesting an extension to the life time | |||
of the State Cookie. When calculating the time extension, an | of the State Cookie. When calculating the time extension, an | |||
implementation SHOULD use the RTT information measured based on | implementation SHOULD use the RTT information measured based on | |||
the previous COOKIE ECHO / ERROR chunk exchange, and SHOULD add | the previous COOKIE ECHO/ERROR chunk exchange and SHOULD add no | |||
no more than 1 second beyond the measured RTT, due to long State | more than 1 second beyond the measured RTT, due to long State | |||
Cookie life times making the endpoint more subject to a replay | Cookie life times making the endpoint more subject to a replay | |||
attack. | attack. | |||
5.3. Other Initialization Issues | 5.3. Other Initialization Issues | |||
5.3.1. Selection of Tag Value | 5.3.1. Selection of Tag Value | |||
Initiate Tag values SHOULD be selected from the range of 1 to 2^32 - | 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 | 1. It is very important that the Initiate Tag value be randomized to | |||
help protect against "man in the middle" and "sequence number" | help protect against off-path attacks. The methods described in | |||
attacks. The methods described in [RFC4086] can be used for the | [RFC4086] can be used for the Initiate Tag randomization. Careful | |||
Initiate Tag randomization. Careful selection of Initiate Tags is | selection of Initiate Tags is also necessary to prevent old duplicate | |||
also necessary to prevent old duplicate packets from previous | packets from previous associations being mistakenly processed as | |||
associations being mistakenly processed as belonging to the current | belonging to the current association. | |||
association. | ||||
Moreover, the Verification Tag value used by either endpoint in a | Moreover, the Verification Tag value used by either endpoint in a | |||
given association MUST NOT change during the life time of an | given association MUST NOT change during the life time of an | |||
association. A new Verification Tag value MUST be used each time the | association. A new Verification Tag value MUST be used each time the | |||
endpoint tears down and then reestablishes an association to the same | endpoint tears down and then reestablishes an association to the same | |||
peer. | peer. | |||
5.4. Path Verification | 5.4. Path Verification | |||
During association establishment, the two peers exchange a list of | During association establishment, the two peers exchange a list of | |||
skipping to change at page 77, line 22 ¶ | skipping to change at line 3512 ¶ | |||
SHUTDOWN-RECEIVED states. An incoming SACK chunk MAY be processed in | SHUTDOWN-RECEIVED states. An incoming SACK chunk MAY be processed in | |||
COOKIE-ECHOED. A SACK chunk in the CLOSED state is out of the blue | COOKIE-ECHOED. A SACK chunk in the CLOSED state is out of the blue | |||
and SHOULD be processed according to the rules in Section 8.4. A | and SHOULD be processed according to the rules in Section 8.4. A | |||
SACK chunk received in any other state SHOULD be discarded. | SACK chunk received in any other state SHOULD be discarded. | |||
For transmission efficiency, SCTP defines mechanisms for bundling of | For transmission efficiency, SCTP defines mechanisms for bundling of | |||
small user messages and fragmentation of large user messages. The | small user messages and fragmentation of large user messages. The | |||
following diagram depicts the flow of user messages through SCTP. | following diagram depicts the flow of user messages through SCTP. | |||
In this section, the term "data sender" refers to the endpoint that | In this section, the term "data sender" refers to the endpoint that | |||
transmits a DATA chunk and the term "data receiver" refers to the | transmits a DATA chunk, and the term "data receiver" refers to the | |||
endpoint that receives a DATA chunk. A data receiver will transmit | endpoint that receives a DATA chunk. A data receiver will transmit | |||
SACK chunks. | SACK chunks. | |||
+-------------------------+ | +-------------------------+ | |||
| User Messages | | | User Messages | | |||
+-------------------------+ | +-------------------------+ | |||
SCTP user ^ | | SCTP user ^ | | |||
==================|==|======================================= | ==================|==|======================================= | |||
| v (1) | | v (1) | |||
+------------------+ +---------------------+ | +------------------+ +---------------------+ | |||
skipping to change at page 78, line 18 ¶ | skipping to change at line 3552 ¶ | |||
Association Maximum DATA Chunk Size (AMDCS). The data receiver | Association Maximum DATA Chunk Size (AMDCS). The data receiver | |||
will normally reassemble the fragmented message from DATA chunks | will normally reassemble the fragmented message from DATA chunks | |||
before delivery to the user (see Section 6.9 for details). | before delivery to the user (see Section 6.9 for details). | |||
2) Multiple DATA and control chunks MAY be bundled by the sender | 2) Multiple DATA and control chunks MAY be bundled by the sender | |||
into a single SCTP packet for transmission, as long as the final | into a single SCTP packet for transmission, as long as the final | |||
size of the SCTP packet does not exceed the current PMTU. The | size of the SCTP packet does not exceed the current PMTU. The | |||
receiver will unbundle the packet back into the original chunks. | receiver will unbundle the packet back into the original chunks. | |||
Control chunks MUST come before DATA chunks in the packet. | Control chunks MUST come before DATA chunks in the packet. | |||
The fragmentation and bundling mechanisms, as detailed in Section 6.9 | The fragmentation and bundling mechanisms, as detailed in Sections | |||
and Section 6.10, are OPTIONAL to implement by the data sender, but | 6.9 and 6.10, are OPTIONAL to implement by the data sender, but they | |||
they MUST be implemented by the data receiver, i.e., an endpoint MUST | MUST be implemented by the data receiver, i.e., an endpoint MUST | |||
properly receive and process bundled or fragmented data. | properly receive and process bundled or fragmented data. | |||
6.1. Transmission of DATA Chunks | 6.1. Transmission of DATA Chunks | |||
This section specifies the rules for sending DATA chunks. In | This section specifies the rules for sending DATA chunks. In | |||
particular, it defines zero window probing, which is required to | particular, it defines zero window probing, which is required to | |||
avoid the indefinite stalling of an association in case of a loss of | avoid the indefinite stalling of an association in case of a loss of | |||
packets containing SACK chunks performing window updates. | packets containing SACK chunks performing window updates. | |||
This document is specified as if there is a single retransmission | This document is specified as if there is a single retransmission | |||
skipping to change at page 78, line 48 ¶ | skipping to change at line 3582 ¶ | |||
any destination transport address if its peer's rwnd indicates | any destination transport address if its peer's rwnd indicates | |||
that the peer has no buffer space (i.e., rwnd is smaller than the | that the peer has no buffer space (i.e., rwnd is smaller than the | |||
size of the next DATA chunk; see Section 6.2.1), except for zero | size of the next DATA chunk; see Section 6.2.1), except for zero | |||
window probes. | window probes. | |||
A zero window probe is a DATA chunk sent when the receiver has no | A zero window probe is a DATA chunk sent when the receiver has no | |||
buffer space. This rule allows the sender to probe for a change | buffer space. This rule allows the sender to probe for a change | |||
in rwnd that the sender missed due to the SACK chunks having been | in rwnd that the sender missed due to the SACK chunks having been | |||
lost in transit from the data receiver to the data sender. A | lost in transit from the data receiver to the data sender. A | |||
zero window probe MUST only be sent when the cwnd allows (see | zero window probe MUST only be sent when the cwnd allows (see | |||
Rule B below). A zero window probe SHOULD only be sent when all | rule B below). A zero window probe SHOULD only be sent when all | |||
outstanding DATA chunks have been cumulatively acknowledged and | outstanding DATA chunks have been cumulatively acknowledged and | |||
no DATA chunks are in flight. Senders MUST support zero window | no DATA chunks are in flight. Senders MUST support zero window | |||
probing. | probing. | |||
If the sender continues to receive SACK chunks from the peer | If the sender continues to receive SACK chunks from the peer | |||
while doing zero window probing, the unacknowledged window probes | while doing zero window probing, the unacknowledged window probes | |||
SHOULD NOT increment the error counter for the association or any | SHOULD NOT increment the error counter for the association or any | |||
destination transport address. This is because the receiver | destination transport address. This is because the receiver | |||
could keep its window closed for an indefinite time. Section 6.2 | could keep its window closed for an indefinite time. Section 6.2 | |||
describes the receiver behavior when it advertises a zero window. | describes the receiver behavior when it advertises a zero window. | |||
skipping to change at page 79, line 41 ¶ | skipping to change at line 3623 ¶ | |||
C) When the time comes for the sender to transmit, before sending | C) When the time comes for the sender to transmit, before sending | |||
new DATA chunks, the sender MUST first transmit any DATA chunks | new DATA chunks, the sender MUST first transmit any DATA chunks | |||
that are marked for retransmission (limited by the current cwnd). | that are marked for retransmission (limited by the current cwnd). | |||
D) When the time comes for the sender to transmit new DATA chunks, | D) When the time comes for the sender to transmit new DATA chunks, | |||
the protocol parameter 'Max.Burst' SHOULD be used to limit the | the protocol parameter 'Max.Burst' SHOULD be used to limit the | |||
number of packets sent. The limit MAY be applied by adjusting | number of packets sent. The limit MAY be applied by adjusting | |||
cwnd temporarily, as follows: | cwnd temporarily, as follows: | |||
if ((flightsize + Max.Burst * PMDCS) < cwnd) | if ((flightsize + Max.Burst * PMDCS) < cwnd) | |||
cwnd = flightsize + Max.Burst * PMDCS; | cwnd = flightsize + Max.Burst * PMDCS | |||
Or, it MAY be applied by strictly limiting the number of packets | Or, it MAY be applied by strictly limiting the number of packets | |||
emitted by the output routine. When calculating the number of | emitted by the output routine. When calculating the number of | |||
packets to transmit, and particularly when using the formula | packets to transmit, and particularly when using the formula | |||
above, cwnd SHOULD NOT be changed permanently. | above, cwnd SHOULD NOT be changed permanently. | |||
E) Then, the sender can send as many new DATA chunks as rule A and | E) Then, the sender can send as many new DATA chunks as rule A and | |||
rule B allow. | rule B allow. | |||
Multiple DATA chunks committed for transmission MAY be bundled in a | Multiple DATA chunks committed for transmission MAY be bundled in a | |||
skipping to change at page 80, line 22 ¶ | skipping to change at line 3650 ¶ | |||
congestion or retransmission). | congestion or retransmission). | |||
Before an endpoint transmits a DATA chunk, if any received DATA | Before an endpoint transmits a DATA chunk, if any received DATA | |||
chunks have not been acknowledged (e.g., due to delayed ack), the | chunks have not been acknowledged (e.g., due to delayed ack), the | |||
sender SHOULD create a SACK chunk and bundle it with the outbound | sender SHOULD create a SACK chunk and bundle it with the outbound | |||
DATA chunk, as long as the size of the final SCTP packet does not | DATA chunk, as long as the size of the final SCTP packet does not | |||
exceed the current PMTU. See Section 6.2. | exceed the current PMTU. See Section 6.2. | |||
When the window is full (i.e., transmission is disallowed by rule A | 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 | 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 | upper layer but MUST transmit no more DATA chunks until some or all | |||
of the outstanding DATA chunks are acknowledged and transmission is | of the outstanding DATA chunks are acknowledged and transmission is | |||
allowed by rule A and rule B again. | allowed by rule A and rule B again. | |||
Whenever a transmission or retransmission is made to any address, if | Whenever a transmission or retransmission is made to any address, if | |||
the T3-rtx timer of that address is not currently running, the sender | 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 | MUST start that timer. If the timer for that address is already | |||
running, the sender MUST restart the timer if the earliest (i.e., | running, the sender MUST restart the timer if the earliest (i.e., | |||
lowest TSN) outstanding DATA chunk sent to that address is being | lowest TSN) outstanding DATA chunk sent to that address is being | |||
retransmitted. Otherwise, the data sender MUST NOT restart the | retransmitted. Otherwise, the data sender MUST NOT restart the | |||
timer. | timer. | |||
When starting or restarting the T3-rtx timer, the timer value SHOULD | When starting or restarting the T3-rtx timer, the timer value SHOULD | |||
be adjusted according to the timer rules defined in Section 6.3.2 and | be adjusted according to the timer rules defined in Sections 6.3.2 | |||
Section 6.3.3. | and 6.3.3. | |||
The data sender MUST NOT use a TSN that is more than 2^31 - 1 above | The data sender MUST NOT use a TSN that is more than 2^31 - 1 above | |||
the beginning TSN of the current send window. | the beginning TSN of the current send window. | |||
For each stream, the data sender MUST NOT have more than 2^16 - 1 | For each stream, the data sender MUST NOT have more than 2^16 - 1 | |||
ordered user messages in the current send window. | ordered user messages in the current send window. | |||
Whenever the sender of a DATA chunk can benefit from the | Whenever the sender of a DATA chunk can benefit from the | |||
corresponding SACK chunk being sent back without delay, the sender | corresponding SACK chunk being sent back without delay, the sender | |||
MAY set the I bit in the DATA chunk header. Please note that why the | MAY set the I bit in the DATA chunk header. Please note that why the | |||
skipping to change at page 81, line 34 ¶ | skipping to change at line 3710 ¶ | |||
incoming DATA chunk. In either case, if such a DATA chunk is | incoming DATA chunk. In either case, if such a DATA chunk is | |||
dropped, the receiver MUST immediately send back a SACK chunk with | dropped, the receiver MUST immediately send back a SACK chunk with | |||
the current receive window showing only DATA chunks received and | the current receive window showing only DATA chunks received and | |||
accepted so far. The dropped DATA chunk(s) MUST NOT be included in | accepted so far. The dropped DATA chunk(s) MUST NOT be included in | |||
the SACK chunk, as they were not accepted. The receiver MUST also | the SACK chunk, as they were not accepted. The receiver MUST also | |||
have an algorithm for advertising its receive window to avoid | have an algorithm for advertising its receive window to avoid | |||
receiver silly window syndrome (SWS), as described in [RFC1122]. The | receiver silly window syndrome (SWS), as described in [RFC1122]. The | |||
algorithm can be similar to the one described in Section 4.2.3.3 of | algorithm can be similar to the one described in Section 4.2.3.3 of | |||
[RFC1122]. | [RFC1122]. | |||
The guidelines on delayed acknowledgement algorithm specified in | The guidelines on the delayed acknowledgement algorithm specified in | |||
Section 4.2 of [RFC5681] SHOULD be followed. Specifically, an | Section 4.2 of [RFC5681] SHOULD be followed. Specifically, an | |||
acknowledgement SHOULD be generated for at least every second packet | acknowledgement SHOULD be generated for at least every second packet | |||
(not every second DATA chunk) received, and SHOULD be generated | (not every second DATA chunk) received and SHOULD be generated within | |||
within 200 ms of the arrival of any unacknowledged DATA chunk. In | 200 ms of the arrival of any unacknowledged DATA chunk. In some | |||
some situations, it might be beneficial for an SCTP transmitter to be | situations, it might be beneficial for an SCTP transmitter to be more | |||
more conservative than the algorithms detailed in this document | conservative than the algorithms detailed in this document allow. | |||
allow. However, an SCTP transmitter MUST NOT be more aggressive in | However, an SCTP transmitter MUST NOT be more aggressive in sending | |||
sending SACK chunks than the following algorithms allow. | SACK chunks than the following algorithms allow. | |||
An SCTP receiver MUST NOT generate more than one SACK chunk for every | An SCTP receiver MUST NOT generate more than one SACK chunk for every | |||
incoming packet, other than to update the offered window as the | incoming packet, other than to update the offered window as the | |||
receiving application consumes new data. When the window opens up, | receiving application consumes new data. When the window opens up, | |||
an SCTP receiver SHOULD send additional SACK chunks to update the | an SCTP receiver SHOULD send additional SACK chunks to update the | |||
window even if no new data is received. The receiver MUST avoid | window even if no new data is received. The receiver MUST avoid | |||
sending a large number of window updates -- in particular, large | sending a large number of window updates -- in particular, large | |||
bursts of them. One way to achieve this is to send a window update | bursts of them. One way to achieve this is to send a window update | |||
only if the window can be increased by at least a quarter of the | only if the window can be increased by at least a quarter of the | |||
receive buffer size of the association. | receive buffer size of the association. | |||
skipping to change at page 86, line 6 ¶ | skipping to change at line 3923 ¶ | |||
iii) If the SACK chunk is missing a TSN that was previously | iii) If the SACK chunk is missing a TSN that was previously | |||
acknowledged via a Gap Ack Block (e.g., the data receiver | acknowledged via a Gap Ack Block (e.g., the data receiver | |||
reneged on the data), then consider the corresponding DATA | reneged on the data), then consider the corresponding DATA | |||
that might be possibly missing: Count one miss indication | that might be possibly missing: Count one miss indication | |||
towards Fast Retransmit as described in Section 7.2.4, and | towards Fast Retransmit as described in Section 7.2.4, and | |||
if no retransmit timer is running for the destination | if no retransmit timer is running for the destination | |||
address to which the DATA chunk was originally transmitted, | address to which the DATA chunk was originally transmitted, | |||
then T3-rtx is started for that destination address. | then T3-rtx is started for that destination address. | |||
iv) If the Cumulative TSN Ack matches or exceeds the Fast | iv) If the Cumulative TSN Ack matches or exceeds the Fast | |||
Recovery exitpoint (Section 7.2.4), Fast Recovery is | Recovery exit point (Section 7.2.4), Fast Recovery is | |||
exited. | exited. | |||
6.3. Management of Retransmission Timer | 6.3. Management of Retransmission Timer | |||
An SCTP endpoint uses a retransmission timer T3-rtx to ensure data | An SCTP endpoint uses a retransmission timer T3-rtx to ensure data | |||
delivery in the absence of any feedback from its peer. The duration | delivery in the absence of any feedback from its peer. The duration | |||
of this timer is referred to as RTO (retransmission timeout). | of this timer is referred to as RTO (retransmission timeout). | |||
When an endpoint's peer is multi-homed, the endpoint will calculate a | When an endpoint's peer is multi-homed, the endpoint will calculate a | |||
separate RTO for each different destination transport address of its | separate RTO for each different destination transport address of its | |||
skipping to change at page 86, line 34 ¶ | skipping to change at line 3951 ¶ | |||
6.3.1. RTO Calculation | 6.3.1. RTO Calculation | |||
The rules governing the computation of SRTT, RTTVAR, and RTO are as | The rules governing the computation of SRTT, RTTVAR, and RTO are as | |||
follows: | follows: | |||
C1) Until an RTT measurement has been made for a packet sent to the | C1) Until an RTT measurement has been made for a packet sent to the | |||
given destination transport address, set RTO to the protocol | given destination transport address, set RTO to the protocol | |||
parameter 'RTO.Initial'. | parameter 'RTO.Initial'. | |||
C2) When the first RTT measurement R is made, perform | C2) When the first RTT measurement R is made, perform: | |||
SRTT = R; | SRTT = R | |||
RTTVAR = R/2; | RTTVAR = R/2 | |||
RTO = SRTT + 4 * RTTVAR; | RTO = SRTT + 4 * RTTVAR | |||
C3) When a new RTT measurement R' is made, perform: | C3) When a new RTT measurement R' is made, perform: | |||
RTTVAR = (1 - RTO.Beta) * RTTVAR + RTO.Beta * |SRTT - R'|; | RTTVAR = (1 - RTO.Beta) * RTTVAR + RTO.Beta * |SRTT - R'| | |||
SRTT = (1 - RTO.Alpha) * SRTT + RTO.Alpha * R'; | SRTT = (1 - RTO.Alpha) * SRTT + RTO.Alpha * R' | |||
Note: The value of SRTT used in the update to RTTVAR is its | Note: The value of SRTT used in the update to RTTVAR is its | |||
value before updating SRTT itself using the second assignment. | value before updating SRTT itself using the second assignment. | |||
After the computation, update | After the computation, update: | |||
RTO = SRTT + 4 * RTTVAR; | RTO = SRTT + 4 * RTTVAR | |||
C4) When data is in flight and when allowed by rule C5 below, a new | 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 measurement MUST be made each round trip. Furthermore, new | |||
RTT measurements SHOULD be made no more than once per round trip | RTT measurements SHOULD be made no more than once per round trip | |||
for a given destination transport address. There are two | for a given destination transport address. There are two | |||
reasons for this recommendation: First, it appears that | reasons for this recommendation: First, it appears that | |||
measuring more frequently often does not in practice yield any | measuring more frequently often does not in practice yield any | |||
significant benefit [ALLMAN99]; second, if measurements are made | significant benefit [ALLMAN99]; second, if measurements are made | |||
more often, then the values of 'RTO.Alpha' and 'RTO.Beta' in | more often, then the values of 'RTO.Alpha' and 'RTO.Beta' in | |||
rule C3 above SHOULD be adjusted so that SRTT and RTTVAR still | 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 | 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 | round trips it takes them to reflect new values) as they would | |||
if making only one measurement per round-trip and using | if making only one measurement per round trip and using | |||
'RTO.Alpha' and 'RTO.Beta' as given in rule C3. However, the | 'RTO.Alpha' and 'RTO.Beta' as given in rule C3. However, the | |||
exact nature of these adjustments remains a research issue. | exact nature of these adjustments remains a research issue. | |||
C5) Karn's algorithm: RTT measurements MUST NOT be made using chunks | C5) Karn's algorithm: RTT measurements MUST NOT be made using chunks | |||
that were retransmitted (and thus for which it is ambiguous | that were retransmitted (and thus for which it is ambiguous | |||
whether the reply was for the first instance of the chunk or for | whether the reply was for the first instance of the chunk or for | |||
a later instance). | a later instance). | |||
RTT measurements SHOULD only be made using a DATA chunk with TSN | RTT measurements SHOULD only be made using a DATA chunk with TSN | |||
r, if no DATA chunk with TSN less than or equal to r was | r if no DATA chunk with TSN less than or equal to r was | |||
retransmitted since the DATA chunk with TSN r was sent first. | retransmitted since the DATA chunk with TSN r was sent first. | |||
C6) Whenever RTO is computed, if it is less than 'RTO.Min' seconds | 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 | 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 | rule is that RTOs that do not have a high minimum value are | |||
susceptible to unnecessary timeouts [ALLMAN99]. | susceptible to unnecessary timeouts [ALLMAN99]. | |||
C7) A maximum value MAY be placed on RTO provided it is at least | C7) A maximum value MAY be placed on RTO, provided it is at least | |||
'RTO.max' seconds. | 'RTO.Max' seconds. | |||
There is no requirement for the clock granularity G used for | There is no requirement for the clock granularity G used for | |||
computing RTT measurements and the different state variables, other | computing RTT measurements and the different state variables, other | |||
than: | than: | |||
G1) Whenever RTTVAR is computed, if RTTVAR == 0, then adjust RTTVAR | G1) Whenever RTTVAR is computed, if RTTVAR == 0, then adjust RTTVAR | |||
= G. | = G. | |||
Experience [ALLMAN99] has shown that finer clock granularities (less | Experience [ALLMAN99] has shown that finer clock granularities (less | |||
than 100 msec) perform somewhat better than more coarse | than 100 msec) perform somewhat better than more coarse | |||
skipping to change at page 89, line 11 ¶ | skipping to change at line 4068 ¶ | |||
(Cancel T3-rtx timer) <-------------- SACK [TSN Ack=8,Block=0] | (Cancel T3-rtx timer) <-------------- SACK [TSN Ack=8,Block=0] | |||
Figure 8: Timer Rule Examples | Figure 8: Timer Rule Examples | |||
6.3.3. Handle T3-rtx Expiration | 6.3.3. Handle T3-rtx Expiration | |||
Whenever the retransmission timer T3-rtx expires for a destination | Whenever the retransmission timer T3-rtx expires for a destination | |||
address, do the following: | address, do the following: | |||
E1) For the destination address for which the timer expires, adjust | E1) For the destination address for which the timer expires, adjust | |||
its ssthresh with rules defined in Section 7.2.3 and set the | its ssthresh with rules defined in Section 7.2.3 and set cwnd = | |||
cwnd = PMDCS. | PMDCS. | |||
E2) For the destination address for which the timer expires, set RTO | E2) For the destination address for which the timer expires, set RTO | |||
= RTO * 2 ("back off the timer"). The maximum value discussed | = RTO * 2 ("back off the timer"). The maximum value discussed | |||
in rule C7 above ('RTO.max') MAY be used to provide an upper | in rule C7 above ('RTO.Max') MAY be used to provide an upper | |||
bound to this doubling operation. | bound to this doubling operation. | |||
E3) Determine how many of the earliest (i.e., lowest TSN) | E3) Determine how many of the earliest (i.e., lowest TSN) | |||
outstanding DATA chunks for the address for which the T3-rtx has | outstanding DATA chunks for the address for which the T3-rtx has | |||
expired will fit into a single SCTP packet, subject to the PMTU | expired will fit into a single SCTP packet, subject to the PMTU | |||
corresponding to the destination transport address to which the | corresponding to the destination transport address to which the | |||
retransmission is being sent (this might be different from the | retransmission is being sent (this might be different from the | |||
address for which the timer expires; see Section 6.4). Call | address for which the timer expires; see Section 6.4). Call | |||
this value K. Bundle and retransmit those K DATA chunks in a | this value K. Bundle and retransmit those K DATA chunks in a | |||
single packet to the destination endpoint. | single packet to the destination endpoint. | |||
E4) Start the retransmission timer T3-rtx on the destination address | E4) Start the retransmission timer T3-rtx on the destination address | |||
to which the retransmission is sent, if rule R1 above indicates | 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 | 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 | one for the destination address to which the retransmission is | |||
sent, which, when the receiver is multi-homed, might be | sent, which, when the receiver is multi-homed, might be | |||
different from the destination address for which the timer | different from the destination address for which the timer | |||
expired (see Section 6.4 below). | expired (see Section 6.4 below). | |||
After retransmitting, once a new RTT measurement is obtained (which | After retransmitting, once a new RTT measurement is obtained (which | |||
can happen only when new data has been sent and acknowledged, per | can happen only when new data has been sent and acknowledged, per | |||
rule C5, or for a measurement made from a HEARTBEAT chunk; see | rule C5, or for a measurement made from a HEARTBEAT chunk; see | |||
Section 8.3), the computation in rule C3 is performed, including the | Section 8.3), the computation in rule C3 is performed, including the | |||
skipping to change at page 90, line 21 ¶ | skipping to change at line 4125 ¶ | |||
rule R1 indicates to do so. | rule R1 indicates to do so. | |||
6.4. Multi-Homed SCTP Endpoints | 6.4. Multi-Homed SCTP Endpoints | |||
An SCTP endpoint is considered multi-homed if there is more than one | An SCTP endpoint is considered multi-homed if there is more than one | |||
transport address that can be used as a destination address to reach | transport address that can be used as a destination address to reach | |||
that endpoint. | that endpoint. | |||
Moreover, the ULP of an endpoint selects one of the multiple | Moreover, the ULP of an endpoint selects one of the multiple | |||
destination addresses of a multi-homed peer endpoint as the primary | destination addresses of a multi-homed peer endpoint as the primary | |||
path (see Section 5.1.2 and Section 11.1 for details). | path (see Sections 5.1.2 and 11.1 for details). | |||
By default, an endpoint SHOULD always transmit to the primary path, | By default, an endpoint SHOULD always transmit to the primary path, | |||
unless the SCTP user explicitly specifies the destination transport | unless the SCTP user explicitly specifies the destination transport | |||
address (and possibly source transport address) to use. | address (and possibly source transport address) to use. | |||
An endpoint SHOULD transmit reply chunks (e.g., INIT ACK, COOKIE ACK, | An endpoint SHOULD transmit reply chunks (e.g., INIT ACK, COOKIE ACK, | |||
HEARTBEAT ACK) in response to control chunks to the same destination | and HEARTBEAT ACK) in response to control chunks to the same | |||
transport address from which it received the control chunk to which | destination transport address from which it received the control | |||
it is replying. | chunk to which it is replying. | |||
The selection of the destination transport address for packets | The selection of the destination transport address for packets | |||
containing SACK chunks is implementation dependent. However, an | containing SACK chunks is implementation dependent. However, an | |||
endpoint SHOULD NOT vary the destination transport address of a SACK | endpoint SHOULD NOT vary the destination transport address of a SACK | |||
chunk when it receives DATA chunks coming from the same source | chunk when it receives DATA chunks coming from the same source | |||
address. | address. | |||
When acknowledging multiple DATA chunks received in packets from | When acknowledging multiple DATA chunks received in packets from | |||
different source addresses in a single SACK chunk, the SACK chunk MAY | different source addresses in a single SACK chunk, the SACK chunk MAY | |||
be transmitted to one of the destination transport addresses from | be transmitted to one of the destination transport addresses from | |||
skipping to change at page 91, line 29 ¶ | skipping to change at line 4178 ¶ | |||
destination address and the old destination address to which the data | destination address and the old destination address to which the data | |||
chunk was last sent is adjusted accordingly. | chunk was last sent is adjusted accordingly. | |||
6.4.1. Failover from an Inactive Destination Address | 6.4.1. Failover from an Inactive Destination Address | |||
Some of the transport addresses of a multi-homed SCTP endpoint might | Some of the transport addresses of a multi-homed SCTP endpoint might | |||
become inactive due to either the occurrence of certain error | become inactive due to either the occurrence of certain error | |||
conditions (see Section 8.2) or adjustments from the SCTP user. | conditions (see Section 8.2) or adjustments from the SCTP user. | |||
When there is outbound data to send and the primary path becomes | When there is outbound data to send and the primary path becomes | |||
inactive (e.g., due to failures), or where the SCTP user explicitly | inactive (e.g., due to failures) or where the SCTP user explicitly | |||
requests to send data to an inactive destination transport address, | requests to send data to an inactive destination transport address | |||
before reporting an error to its ULP, the SCTP endpoint SHOULD try to | before reporting an error to its ULP, the SCTP endpoint SHOULD try to | |||
send the data to an alternate active destination transport address if | send the data to an alternate active destination transport address if | |||
one exists. | one exists. | |||
When retransmitting data that timed out, if the endpoint is multi- | When retransmitting data that timed out, if the endpoint is multi- | |||
homed, it needs to consider each source-destination address pair in | homed, it needs to consider each source-destination address pair in | |||
its retransmission selection policy. When retransmitting timed-out | its retransmission selection policy. When retransmitting timed-out | |||
data, the endpoint SHOULD attempt to pick the most divergent source- | data, the endpoint SHOULD attempt to pick the most divergent source- | |||
destination pair from the original source-destination pair to which | destination pair from the original source-destination pair to which | |||
the packet was transmitted. | the packet was transmitted. | |||
skipping to change at page 92, line 19 ¶ | skipping to change at line 4209 ¶ | |||
SHOULD acknowledge the reception of the DATA chunk following the | SHOULD acknowledge the reception of the DATA chunk following the | |||
normal procedure, immediately send an ERROR chunk with cause set to | normal procedure, immediately send an ERROR chunk with cause set to | |||
"Invalid Stream Identifier" (see Section 3.3.10), and discard the | "Invalid Stream Identifier" (see Section 3.3.10), and discard the | |||
DATA chunk. The endpoint MAY bundle the ERROR chunk and the SACK | DATA chunk. The endpoint MAY bundle the ERROR chunk and the SACK | |||
chunk in the same packet. | chunk in the same packet. | |||
The Stream Sequence Number in all the outgoing streams MUST start | The Stream Sequence Number in all the outgoing streams MUST start | |||
from 0 when the association is established. The Stream Sequence | from 0 when the association is established. The Stream Sequence | |||
Number of an outgoing stream MUST be incremented by 1 for each | Number of an outgoing stream MUST be incremented by 1 for each | |||
ordered user message sent on that outgoing stream. In particular, | ordered user message sent on that outgoing stream. In particular, | |||
when the Stream Sequence Number reaches the value 65535 the next | when the Stream Sequence Number reaches the value 65535, the next | |||
Stream Sequence Number MUST be set to 0. For unordered user messages | Stream Sequence Number MUST be set to 0. For unordered user | |||
the Stream Sequence Number MUST NOT be changed. | messages, the Stream Sequence Number MUST NOT be changed. | |||
6.6. Ordered and Unordered Delivery | 6.6. Ordered and Unordered Delivery | |||
Within a stream, an endpoint MUST deliver DATA chunks received with | 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 | 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 | their Stream Sequence Number. If DATA chunks arrive out of order of | |||
their Stream Sequence Number, the endpoint MUST hold the received | their Stream Sequence Number, the endpoint MUST hold the received | |||
DATA chunks from delivery to the ULP until they are reordered. | DATA chunks from delivery to the ULP until they are reordered. | |||
However, an SCTP endpoint can indicate that no ordered delivery is | However, an SCTP endpoint can indicate that no ordered delivery is | |||
skipping to change at page 93, line 32 ¶ | skipping to change at line 4271 ¶ | |||
Multiple gaps can be reported in one single SACK chunk (see | Multiple gaps can be reported in one single SACK chunk (see | |||
Section 3.3.4). | Section 3.3.4). | |||
When its peer is multi-homed, the SCTP endpoint SHOULD always try to | When its peer is multi-homed, the SCTP endpoint SHOULD always try to | |||
send the SACK chunk to the same destination address from which the | send the SACK chunk to the same destination address from which the | |||
last DATA chunk was received. | last DATA chunk was received. | |||
Upon the reception of a SACK chunk, the endpoint MUST remove all DATA | Upon the reception of a SACK chunk, the endpoint MUST remove all DATA | |||
chunks that have been acknowledged by the SACK chunk's Cumulative TSN | chunks that have been acknowledged by the SACK chunk's Cumulative TSN | |||
Ack from its transmit queue. All DATA chunks with TSNs not included | Ack from its transmit queue. All DATA chunks with TSNs not included | |||
in the Gap Ack Blocks that are smaller than the highest acknowledged | in the Gap Ack Blocks that are smaller than the highest-acknowledged | |||
TSN reported in the SACK chunk MUST be treated as "missing" by the | TSN reported in the SACK chunk MUST be treated as "missing" by the | |||
sending endpoint. The number of "missing" reports for each | sending endpoint. The number of "missing" reports for each | |||
outstanding DATA chunk MUST be recorded by the data sender to make | outstanding DATA chunk MUST be recorded by the data sender to make | |||
retransmission decisions. See Section 7.2.4 for details. | retransmission decisions. See Section 7.2.4 for details. | |||
The following example shows the use of SACK chunk to report a gap. | The following example shows the use of SACK chunk to report a gap. | |||
Endpoint A Endpoint Z | Endpoint A Endpoint Z | |||
{App sends 3 messages; strm 0} | {App sends 3 messages; strm 0} | |||
DATA [TSN=6,Strm=0,Seq=2] ---------------> (ack delayed) | DATA [TSN=6,Strm=0,Seq=2] ---------------> (ack delayed) | |||
skipping to change at page 94, line 20 ¶ | skipping to change at line 4294 ¶ | |||
DATA [TSN=7,Strm=0,Seq=3] --------> X (lost) | DATA [TSN=7,Strm=0,Seq=3] --------> X (lost) | |||
DATA [TSN=8,Strm=0,Seq=4] ---------------> (gap detected, | DATA [TSN=8,Strm=0,Seq=4] ---------------> (gap detected, | |||
immediately send ack) | immediately send ack) | |||
/----- SACK [TSN Ack=6,Block=1, | /----- SACK [TSN Ack=6,Block=1, | |||
/ Start=2,End=2] | / Start=2,End=2] | |||
<-----/ | <-----/ | |||
(remove 6 from out-queue, | (remove 6 from out-queue, | |||
and mark 7 as "1" missing report) | and mark 7 as "1" missing report) | |||
Figure 9: Reporting a Gap using SACK Chunk | Figure 9: Reporting a Gap Using SACK Chunk | |||
The maximum number of Gap Ack Blocks that can be reported within a | The maximum number of Gap Ack Blocks that can be reported within a | |||
single SACK chunk is limited by the current PMTU. When a single SACK | single SACK chunk is limited by the current PMTU. When a single SACK | |||
chunk cannot cover all the Gap Ack Blocks needed to be reported due | chunk cannot cover all the Gap Ack Blocks needed to be reported due | |||
to the PMTU limitation, the endpoint MUST send only one SACK chunk. | to the PMTU limitation, the endpoint MUST send only one SACK chunk. | |||
This single SACK chunk MUST report the Gap Ack Blocks from the lowest | This single SACK chunk MUST report the Gap Ack Blocks from the lowest | |||
to highest TSNs, within the size limit set by the PMTU, and leave the | to highest TSNs, within the size limit set by the PMTU, and leave the | |||
remaining highest TSN numbers unacknowledged. | remaining highest TSN numbers unacknowledged. | |||
6.8. CRC32c Checksum Calculation | 6.8. CRC32c Checksum Calculation | |||
When sending an SCTP packet, the endpoint MUST strengthen the data | When sending an SCTP packet, the endpoint MUST strengthen the data | |||
integrity of the transmission by including the CRC32c checksum value | integrity of the transmission by including the CRC32c checksum value | |||
calculated on the packet, as described below. | calculated on the packet, as described below. | |||
After the packet is constructed (containing the SCTP common header | After the packet is constructed (containing the SCTP common header | |||
and one or more control or DATA chunks), the transmitter MUST | and one or more control or DATA chunks), the transmitter MUST: | |||
1) fill in the proper Verification Tag in the SCTP common header and | 1) fill in the proper Verification Tag in the SCTP common header and | |||
initialize the checksum field to 0, | initialize the checksum field to 0, | |||
2) calculate the CRC32c checksum of the whole packet, including the | 2) calculate the CRC32c checksum of the whole packet, including the | |||
SCTP common header and all the chunks (refer to Appendix A for | SCTP common header and all the chunks (refer to Appendix A for | |||
details of the CRC32c algorithm); and | details of the CRC32c algorithm), and | |||
3) put the resultant value into the checksum field in the common | 3) put the resultant value into the checksum field in the common | |||
header, and leave the rest of the bits unchanged. | header and leave the rest of the bits unchanged. | |||
When an SCTP packet is received, the receiver MUST first check the | When an SCTP packet is received, the receiver MUST first check the | |||
CRC32c checksum as follows: | CRC32c checksum as follows: | |||
1) Store the received CRC32c checksum value aside. | 1) Store the received CRC32c checksum value aside. | |||
2) Replace the 32 bits of the checksum field in the received SCTP | 2) Replace the 32 bits of the checksum field in the received SCTP | |||
packet with 0 and calculate a CRC32c checksum value of the whole | packet with 0 and calculate a CRC32c checksum value of the whole | |||
received packet. | received packet. | |||
skipping to change at page 95, line 33 ¶ | skipping to change at line 4356 ¶ | |||
endpoint supports fragmentation, it MUST fragment a user message if | endpoint supports fragmentation, it MUST fragment a user message if | |||
the size of the user message to be sent causes the outbound SCTP | the size of the user message to be sent causes the outbound SCTP | |||
packet size to exceed the current PMTU. An endpoint that does not | packet size to exceed the current PMTU. An endpoint that does not | |||
support fragmentation and is requested to send a user message such | support fragmentation and is requested to send a user message such | |||
that the outbound SCTP packet size would exceed the current PMTU MUST | that the outbound SCTP packet size would exceed the current PMTU MUST | |||
return an error to its upper layer and MUST NOT attempt to send the | return an error to its upper layer and MUST NOT attempt to send the | |||
user message. | user message. | |||
An SCTP implementation MAY provide a mechanism to the upper layer | An SCTP implementation MAY provide a mechanism to the upper layer | |||
that disables fragmentation when sending DATA chunks. When | that disables fragmentation when sending DATA chunks. When | |||
fragmentation of DATA chunks is disabeled, the SCTP implementation | fragmentation of DATA chunks is disabled, the SCTP implementation | |||
MUST behave in the same way an implementation that does not support | MUST behave in the same way an implementation that does not support | |||
fragmentation, i.e., it rejects calls that would result in sending | fragmentation, i.e., it rejects calls that would result in sending | |||
SCTP packets that exceed the current PMTU. | SCTP packets that exceed the current PMTU. | |||
Implementation Note: In this error case, the SEND primitive discussed | Implementation Note: In this error case, the SEND primitive discussed | |||
in Section 11.1 would need to return an error to the upper layer. | in Section 11.1.5 would need to return an error to the upper layer. | |||
If its peer is multi-homed, the endpoint SHOULD choose a DATA chunk | If its peer is multi-homed, the endpoint SHOULD choose a DATA chunk | |||
size smaller than or equal to the AMDCS. | size smaller than or equal to the AMDCS. | |||
Once a user message is fragmented, it cannot be re-fragmented. | Once a user message is fragmented, it cannot be re-fragmented. | |||
Instead, if the PMTU has been reduced, then IP fragmentation MUST be | Instead, if the PMTU has been reduced, then IP fragmentation MUST be | |||
used. Therefore, an SCTP association can fail if IP fragmentation is | used. Therefore, an SCTP association can fail if IP fragmentation is | |||
not working on any path. Please see Section 7.3 for details of PMTU | not working on any path. Please see Section 7.3 for details of PMTU | |||
discovery. | discovery. | |||
skipping to change at page 96, line 25 ¶ | skipping to change at line 4393 ¶ | |||
smaller than or equal to the AMDCS. | smaller than or equal to the AMDCS. | |||
2) The transmitter MUST then assign, in sequence, a separate TSN to | 2) The transmitter MUST then assign, in sequence, a separate TSN to | |||
each of the DATA chunks in the series. The transmitter assigns | each of the DATA chunks in the series. The transmitter assigns | |||
the same Stream Sequence Number to each of the DATA chunks. If | the same Stream Sequence Number to each of the DATA chunks. If | |||
the user indicates that the user message is to be delivered using | the user indicates that the user message is to be delivered using | |||
unordered delivery, then the U flag of each DATA chunk of the | unordered delivery, then the U flag of each DATA chunk of the | |||
user message MUST be set to 1. | user message MUST be set to 1. | |||
3) The transmitter MUST also set the B/E bits of the first DATA | 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 | chunk in the series to 10, the B/E bits of the last DATA chunk in | |||
in the series to '01', and the B/E bits of all other DATA chunks | the series to 01, and the B/E bits of all other DATA chunks in | |||
in the series to '00'. | the series to 00. | |||
An endpoint MUST recognize fragmented DATA chunks by examining the B/ | An endpoint MUST recognize fragmented DATA chunks by examining the B/ | |||
E bits in each of the received DATA chunks, and queue the fragmented | E bits in each of the received DATA chunks and queue the fragmented | |||
DATA chunks for reassembly. Once the user message is reassembled, | DATA chunks for reassembly. Once the user message is reassembled, | |||
SCTP passes the reassembled user message to the specific stream for | SCTP passes the reassembled user message to the specific stream for | |||
possible reordering and final dispatching. | possible reordering and final dispatching. | |||
If the data receiver runs out of buffer space while still waiting for | If the data receiver runs out of buffer space while still waiting for | |||
more fragments to complete the reassembly of the message, it SHOULD | more fragments to complete the reassembly of the message, it SHOULD | |||
dispatch part of its inbound message through a partial delivery API | dispatch part of its inbound message through a partial delivery API | |||
(see Section 11), freeing some of its receive buffer space so that | (see Section 11), freeing some of its receive buffer space so that | |||
the rest of the message can be received. | the rest of the message can be received. | |||
skipping to change at page 97, line 21 ¶ | skipping to change at line 4434 ¶ | |||
DATA chunks are transmitted before SHUTDOWN or SHUTDOWN ACK chunks, | DATA chunks are transmitted before SHUTDOWN or SHUTDOWN ACK chunks, | |||
DATA chunks cannot be bundled with 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 | 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., | 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 | the SCTP packet is too short to contain all the bytes of the chunk as | |||
indicated by the chunk length. | indicated by the chunk length. | |||
An endpoint MUST process received chunks in their order in the | An endpoint MUST process received chunks in their order in the | |||
packet. The receiver uses the Chunk Length field to determine 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 | 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 | fact that all chunks end on a 4-byte boundary. If the receiver | |||
detects a partial chunk, it MUST drop the chunk. | detects a partial chunk, it MUST drop the chunk. | |||
An endpoint MUST NOT bundle INIT, INIT ACK, or SHUTDOWN COMPLETE | An endpoint MUST NOT bundle INIT, INIT ACK, or SHUTDOWN COMPLETE | |||
chunks with any other chunks. | chunks with any other chunks. | |||
7. Congestion Control | 7. Congestion Control | |||
Congestion control is one of the basic functions in SCTP. To manage | Congestion control is one of the basic functions in SCTP. To manage | |||
congestion, the mechanisms and algorithms in this section are to be | congestion, the mechanisms and algorithms in this section are to be | |||
employed. | employed. | |||
Implementation Note: As far as its specific performance requirements | Implementation Note: As far as its specific performance requirements | |||
are met, an implementation is always allowed to adopt a more | are met, an implementation is always allowed to adopt a more | |||
conservative congestion control algorithm than the one defined below. | conservative congestion control algorithm than the one defined below. | |||
The congestion control algorithms used by SCTP are based on | The congestion control algorithms used by SCTP are based on | |||
[RFC5681]. This section describes how the algorithms defined in | [RFC5681]. This section describes how the algorithms defined in | |||
[RFC5681] are adapted for use in SCTP. We first list differences in | [RFC5681] are adapted for use in SCTP. We first list differences in | |||
protocol designs between TCP and SCTP, and then describe SCTP's | protocol designs between TCP and SCTP and then describe SCTP's | |||
congestion control scheme. The description will use the same | congestion control scheme. The description will use the same | |||
terminology as in TCP congestion control whenever appropriate. | terminology as in TCP congestion control whenever appropriate. | |||
SCTP congestion control is always applied to the entire association, | SCTP congestion control is always applied to the entire association | |||
and not to individual streams. | and not to individual streams. | |||
7.1. SCTP Differences from TCP Congestion Control | 7.1. SCTP Differences from TCP Congestion Control | |||
Gap Ack Blocks in the SCTP SACK chunk carry the same semantic meaning | Gap Ack Blocks in the SCTP SACK chunk carry the same semantic meaning | |||
as the TCP SACK. TCP considers the information carried in the SACK | as the TCP SACK. TCP considers the information carried in the SACK | |||
as advisory information only. SCTP considers the information carried | as advisory information only. SCTP considers the information carried | |||
in the Gap Ack Blocks in the SACK chunk as advisory. In SCTP, any | in the Gap Ack Blocks in the SACK chunk as advisory. In SCTP, any | |||
DATA chunk that has been acknowledged by a SACK chunk, including DATA | DATA chunk that has been acknowledged by a SACK chunk, including DATA | |||
that arrived at the receiving end out of order, is not considered | that arrived at the receiving end out of order, is not considered | |||
skipping to change at page 98, line 25 ¶ | skipping to change at line 4481 ¶ | |||
Cumulative TSN Ack field in the SACK chunk). Consequently, the value | Cumulative TSN Ack field in the SACK chunk). Consequently, the value | |||
of cwnd controls the amount of outstanding data, rather than (as in | of cwnd controls the amount of outstanding data, rather than (as in | |||
the case of non-SACK TCP) the upper bound between the highest | the case of non-SACK TCP) the upper bound between the highest | |||
acknowledged sequence number and the latest DATA chunk that can be | acknowledged sequence number and the latest DATA chunk that can be | |||
sent within the congestion window. SCTP SACK leads to different | sent within the congestion window. SCTP SACK leads to different | |||
implementations of Fast Retransmit and Fast Recovery than non-SACK | implementations of Fast Retransmit and Fast Recovery than non-SACK | |||
TCP. As an example, see [FALL96]. | TCP. As an example, see [FALL96]. | |||
The biggest difference between SCTP and TCP, however, is multi- | The biggest difference between SCTP and TCP, however, is multi- | |||
homing. SCTP is designed to establish robust communication | homing. SCTP is designed to establish robust communication | |||
associations between two endpoints each of which might be reachable | associations between two endpoints, each of which might be reachable | |||
by more than one transport address. Potentially different addresses | by more than one transport address. Potentially different addresses | |||
might lead to different data paths between the two endpoints; thus, | might lead to different data paths between the two endpoints; thus, | |||
ideally one needs a separate set of congestion control parameters for | ideally, one needs a separate set of congestion control parameters | |||
each of the paths. The treatment here of congestion control for | for each of the paths. The treatment here of congestion control for | |||
multi-homed receivers is new with SCTP and might require refinement | multi-homed receivers is new with SCTP and might require refinement | |||
in the future. The current algorithms make the following | in the future. The current algorithms make the following | |||
assumptions: | assumptions: | |||
* The sender usually uses the same destination address until being | * The sender usually uses the same destination address until being | |||
instructed by the upper layer to do otherwise; however, SCTP MAY | instructed by the upper layer to do otherwise; however, SCTP MAY | |||
change to an alternate destination in the event an address is | change to an alternate destination in the event an address is | |||
marked inactive (see Section 8.2). Also, SCTP MAY retransmit to a | marked inactive (see Section 8.2). Also, SCTP MAY retransmit to a | |||
different transport address than the original transmission. | different transport address than the original transmission. | |||
skipping to change at page 99, line 6 ¶ | skipping to change at line 4511 ¶ | |||
timeout. | timeout. | |||
* For each of the destination addresses, an endpoint does slow start | * For each of the destination addresses, an endpoint does slow start | |||
upon the first transmission to that address. | upon the first transmission to that address. | |||
Note: TCP guarantees in-sequence delivery of data to its upper-layer | Note: TCP guarantees in-sequence delivery of data to its upper-layer | |||
protocol within a single TCP session. This means that when TCP | protocol within a single TCP session. This means that when TCP | |||
notices a gap in the received sequence number, it waits until the gap | notices a gap in the received sequence number, it waits until the gap | |||
is filled before delivering the data that was received with sequence | is filled before delivering the data that was received with sequence | |||
numbers higher than that of the missing data. On the other hand, | 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 | 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 | 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 | particular stream (i.e., the missing DATA chunks are for a different | |||
stream) or if unordered delivery is indicated. Although this does | stream) or if unordered delivery is indicated. Although this does | |||
not affect cwnd, it might affect rwnd calculation. | not affect cwnd, it might affect rwnd calculation. | |||
7.2. SCTP Slow-Start and Congestion Avoidance | 7.2. SCTP Slow-Start and Congestion Avoidance | |||
The slow-start and congestion avoidance algorithms MUST be used by an | The slow-start and congestion avoidance algorithms MUST be used by an | |||
endpoint to control the amount of data being injected into the | endpoint to control the amount of data being injected into the | |||
network. The congestion control in SCTP is employed in regard to the | network. The congestion control in SCTP is employed in regard to the | |||
skipping to change at page 99, line 44 ¶ | skipping to change at line 4549 ¶ | |||
Note: This variable is maintained on a per-destination-address | Note: This variable is maintained on a per-destination-address | |||
basis. | basis. | |||
* Slow-start threshold (ssthresh, in bytes), which is used by the | * Slow-start threshold (ssthresh, in bytes), which is used by the | |||
sender to distinguish slow-start and congestion avoidance phases. | sender to distinguish slow-start and congestion avoidance phases. | |||
Note: This variable is maintained on a per-destination-address | Note: This variable is maintained on a per-destination-address | |||
basis. | basis. | |||
SCTP also requires one additional control variable, | SCTP also requires one additional control variable, | |||
partial_bytes_acked, which is used during congestion avoidance phase | partial_bytes_acked, which is used during the congestion avoidance | |||
to facilitate cwnd adjustment. | phase to facilitate cwnd adjustment. | |||
Unlike TCP, an SCTP sender MUST keep a set of these control variables | Unlike TCP, an SCTP sender MUST keep a set of the control variables | |||
cwnd, ssthresh, and partial_bytes_acked for EACH destination address | cwnd, ssthresh, and partial_bytes_acked for EACH destination address | |||
of its peer (when its peer is multi-homed). When calculating one of | of its peer (when its peer is multi-homed). When calculating one of | |||
these variables, the length of the DATA chunk including the padding | these variables, the length of the DATA chunk, including the padding, | |||
SHOULD be used. | SHOULD be used. | |||
Only one rwnd is kept for the whole association (no matter if the | Only one rwnd is kept for the whole association (no matter if the | |||
peer is multi-homed or has a single address). | peer is multi-homed or has a single address). | |||
7.2.1. Slow-Start | 7.2.1. Slow-Start | |||
Beginning data transmission into a network with unknown conditions or | Beginning data transmission into a network with unknown conditions or | |||
after a sufficiently long idle period requires SCTP to probe the | after a sufficiently long idle period requires SCTP to probe the | |||
network to determine the available capacity. The slow-start | network to determine the available capacity. The slow-start | |||
algorithm is used for this purpose at the beginning of a transfer, or | algorithm is used for this purpose at the beginning of a transfer or | |||
after repairing loss detected by the retransmission timer. | after repairing loss detected by the retransmission timer. | |||
* The initial cwnd before data transmission MUST be set to min(4 * | * The initial cwnd before data transmission MUST be set to min(4 * | |||
PMDCS, max(2 * PMDCS, 4404)) bytes if the peer address is an IPv4 | PMDCS, max(2 * PMDCS, 4404)) bytes if the peer address is an IPv4 | |||
address and to min(4 * PMDCS, max(2 * PMDCS, 4344)) bytes if the | address and to min(4 * PMDCS, max(2 * PMDCS, 4344)) bytes if the | |||
peer address is an IPv6 address. | peer address is an IPv6 address. | |||
* The initial cwnd after a retransmission timeout MUST be no more | * The initial cwnd after a retransmission timeout MUST be no more | |||
than PMDCS, and only one packet is allowed to be in flight until | than PMDCS, and only one packet is allowed to be in flight until | |||
successful acknowledgement. | successful acknowledgement. | |||
* The initial value of ssthresh SHOULD be arbitrarily high (e.g., | * The initial value of ssthresh SHOULD be arbitrarily high (e.g., | |||
the size of the largest possible advertised window). | the size of the largest-possible advertised window). | |||
* Whenever cwnd is greater than zero, the endpoint is allowed to | * Whenever cwnd is greater than zero, the endpoint is allowed to | |||
have cwnd bytes of data outstanding on that transport address. A | have cwnd bytes of data outstanding on that transport address. A | |||
limited overbooking as described in Section 6.1 B) SHOULD be | limited overbooking as described in rule B in Section 6.1 SHOULD | |||
supported. | be supported. | |||
* When cwnd is less than or equal to ssthresh, an SCTP endpoint MUST | * 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 | use the slow-start algorithm to increase cwnd only if the current | |||
congestion window is being fully utilized, and the data sender is | congestion window is being fully utilized and the data sender is | |||
not in Fast Recovery. Only when these two conditions are met can | not in Fast Recovery. Only when these two conditions are met can | |||
the cwnd be increased; otherwise, the cwnd MUST NOT be increased. | the cwnd be increased; otherwise, the cwnd MUST NOT be increased. | |||
If these conditions are met, then cwnd MUST be increased by, at | If these conditions are met, then cwnd MUST be increased by, at | |||
most, the lesser of | most, the lesser of | |||
1. the total size of the previously outstanding DATA chunk(s) | 1. the total size of the previously outstanding DATA chunk(s) | |||
acknowledged, and | acknowledged and | |||
2. L times the destination's PMDCS. | 2. L times the destination's PMDCS. | |||
The first upper bound protects against the ACK-Splitting attack | The first upper bound protects against the ACK-Splitting attack | |||
outlined in [SAVAGE99]. The positive integer L SHOULD be 1, and | outlined in [SAVAGE99]. The positive integer L SHOULD be 1 and | |||
MAY be larger than 1. See [RFC3465] for details of choosing L. | MAY be larger than 1. See [RFC3465] for details of choosing L. | |||
In instances where its peer endpoint is multi-homed, if an | In instances where its peer endpoint is multi-homed, if an | |||
endpoint receives a SACK chunk that results in updating the cwnd, | endpoint receives a SACK chunk that results in updating the cwnd, | |||
then it SHOULD update its cwnd (or cwnds) apportioned to the | then it SHOULD update its cwnd (or cwnds) apportioned to the | |||
destination addresses to which it transmitted the acknowledged | destination addresses to which it transmitted the acknowledged | |||
data. | data. | |||
* While the endpoint does not transmit data on a given transport | * While the endpoint does not transmit data on a given transport | |||
address, the cwnd of the transport address SHOULD be adjusted to | address, the cwnd of the transport address SHOULD be adjusted to | |||
skipping to change at page 103, line 5 ¶ | skipping to change at line 4698 ¶ | |||
In the absence of data loss, an endpoint performs delayed | In the absence of data loss, an endpoint performs delayed | |||
acknowledgement. However, whenever an endpoint notices a hole in the | acknowledgement. However, whenever an endpoint notices a hole in the | |||
arriving TSN sequence, it SHOULD start sending a SACK chunk back | arriving TSN sequence, it SHOULD start sending a SACK chunk back | |||
every time a packet arrives carrying data until the hole is filled. | every time a packet arrives carrying data until the hole is filled. | |||
Whenever an endpoint receives a SACK chunk that indicates that some | Whenever an endpoint receives a SACK chunk that indicates that some | |||
TSNs are missing, it SHOULD wait for two further miss indications | TSNs are missing, it SHOULD wait for two further miss indications | |||
(via subsequent SACK chunks for a total of three missing reports) on | (via subsequent SACK chunks for a total of three missing reports) on | |||
the same TSNs before taking action with regard to Fast Retransmit. | the same TSNs before taking action with regard to Fast Retransmit. | |||
Miss indications SHOULD follow the HTNA (Highest TSN Newly | Miss indications SHOULD follow the Highest TSN Newly Acknowledged | |||
Acknowledged) algorithm. For each incoming SACK chunk, miss | (HTNA) algorithm. For each incoming SACK chunk, miss indications are | |||
indications are incremented only for missing TSNs prior to the | incremented only for missing TSNs prior to the HTNA in the SACK | |||
highest TSN newly acknowledged in the SACK chunk. A newly | chunk. A newly acknowledged DATA chunk is one not previously | |||
acknowledged DATA chunk is one not previously acknowledged in a SACK | acknowledged in a SACK chunk. If an endpoint is in Fast Recovery and | |||
chunk. If an endpoint is in Fast Recovery and a SACK chunks arrives | a SACK chunks arrives that advances the Cumulative TSN Ack Point, the | |||
that advances the Cumulative TSN Ack Point, the miss indications are | miss indications are incremented for all TSNs reported missing in the | |||
incremented for all TSNs reported missing in the SACK chunk. | SACK chunk. | |||
When the third consecutive miss indication is received for a TSN(s), | When the third consecutive miss indication is received for one or | |||
the data sender does the following: | more TSNs, the data sender does the following: | |||
1) Mark the DATA chunk(s) with three miss indications for | 1) Mark the DATA chunk(s) with three miss indications for | |||
retransmission. | retransmission. | |||
2) If not in Fast Recovery, adjust the ssthresh and cwnd of the | 2) If not in Fast Recovery, adjust the ssthresh and cwnd of the | |||
destination address(es) to which the missing DATA chunks were | destination address(es) to which the missing DATA chunks were | |||
last sent, according to the formula described in Section 7.2.3. | last sent, according to the formula described in Section 7.2.3. | |||
3) If not in Fast Recovery, determine how many of the earliest | 3) If not in Fast Recovery, determine how many of the earliest | |||
(i.e., lowest TSN) DATA chunks marked for retransmission will fit | (i.e., lowest TSN) DATA chunks marked for retransmission will fit | |||
into a single packet, subject to constraint of the PMTU of the | into a single packet, subject to constraint of the PMTU of the | |||
destination transport address to which the packet is being sent. | destination transport address to which the packet is being sent. | |||
Call this value K. Retransmit those K DATA chunks in a single | Call this value K. Retransmit those K DATA chunks in a single | |||
packet. When a Fast Retransmit is being performed, the sender | packet. When a Fast Retransmit is being performed, the sender | |||
SHOULD ignore the value of cwnd and SHOULD NOT delay | SHOULD ignore the value of cwnd and SHOULD NOT delay | |||
retransmission for this single packet. | retransmission for this single packet. | |||
4) Restart the T3-rtx timer only if the last SACK chunk acknowledged | 4) Restart the T3-rtx timer only if the last SACK chunk acknowledged | |||
the lowest outstanding TSN number sent to that address, or the | the lowest outstanding TSN number sent to that address or the | |||
endpoint is retransmitting the first outstanding DATA chunk sent | endpoint is retransmitting the first outstanding DATA chunk sent | |||
to that address. | to that address. | |||
5) Mark the DATA chunk(s) as being fast retransmitted and thus | 5) Mark the DATA chunk(s) as being fast retransmitted and thus | |||
ineligible for a subsequent Fast Retransmit. Those TSNs marked | ineligible for a subsequent Fast Retransmit. Those TSNs marked | |||
for retransmission due to the Fast-Retransmit algorithm that did | for retransmission due to the Fast-Retransmit algorithm that did | |||
not fit in the sent datagram carrying K other TSNs are also | not fit in the sent datagram carrying K other TSNs are also | |||
marked as ineligible for a subsequent Fast Retransmit. However, | marked as ineligible for a subsequent Fast Retransmit. However, | |||
as they are marked for retransmission they will be retransmitted | as they are marked for retransmission, they will be retransmitted | |||
later on as soon as cwnd allows. | later on as soon as cwnd allows. | |||
6) If not in Fast Recovery, enter Fast Recovery and mark the highest | 6) If not in Fast Recovery, enter Fast Recovery and mark the highest | |||
outstanding TSN as the Fast Recovery exit point. When a SACK | outstanding TSN as the Fast Recovery exit point. When a SACK | |||
chunk acknowledges all TSNs up to and including this exit point, | chunk acknowledges all TSNs up to and including this exit point, | |||
Fast Recovery is exited. While in Fast Recovery, the ssthresh | Fast Recovery is exited. While in Fast Recovery, the ssthresh | |||
and cwnd SHOULD NOT change for any destinations due to a | and cwnd SHOULD NOT change for any destinations due to a | |||
subsequent Fast Recovery event (i.e., one SHOULD NOT reduce the | subsequent Fast Recovery event (i.e., one SHOULD NOT reduce the | |||
cwnd further due to a subsequent Fast Retransmit). | cwnd further due to a subsequent Fast Retransmit). | |||
Note: Before the above adjustments, if the received SACK chunk also | Note: Before the above adjustments, if the received SACK chunk also | |||
acknowledges new DATA chunks and advances the Cumulative TSN Ack | acknowledges new DATA chunks and advances the Cumulative TSN Ack | |||
Point, the cwnd adjustment rules defined in Section 7.2.1 and | Point, the cwnd adjustment rules defined in Sections 7.2.1 and 7.2.2 | |||
Section 7.2.2 MUST be applied first. | MUST be applied first. | |||
7.2.5. Reinitialization | 7.2.5. Reinitialization | |||
During the lifetime of an SCTP association events can happen, which | During the lifetime of an SCTP association, events can happen that | |||
result in using the network under unknown new conditions. When | result in using the network under unknown new conditions. When | |||
detected by an SCTP implementation, the congestion control MUST be | detected by an SCTP implementation, the congestion control MUST be | |||
reinitialized. | reinitialized. | |||
7.2.5.1. Change of Differentiated Services Code Points | 7.2.5.1. Change of Differentiated Services Code Points | |||
SCTP implementations MAY allow an application to configure the | SCTP implementations MAY allow an application to configure the | |||
Differentiated Services Code Point (DSCP) used for sending packets. | Differentiated Services Code Point (DSCP) used for sending packets. | |||
If a DSCP change might result in outgoing packets being queued in | If a DSCP change might result in outgoing packets being queued in | |||
different queues, the congestion control parameters for all affected | different queues, the congestion control parameters for all affected | |||
skipping to change at page 104, line 45 ¶ | skipping to change at line 4787 ¶ | |||
[RFC8899], [RFC8201], and [RFC1191] specify "Packetization Layer Path | [RFC8899], [RFC8201], and [RFC1191] specify "Packetization Layer Path | |||
MTU Discovery", whereby an endpoint maintains an estimate of PMTU | MTU Discovery", whereby an endpoint maintains an estimate of PMTU | |||
along a given Internet path and refrains from sending packets along | along a given Internet path and refrains from sending packets along | |||
that path that exceed the PMTU, other than occasional attempts to | that path that exceed the PMTU, other than occasional attempts to | |||
probe for a change in the PMTU. [RFC8899] is thorough in its | probe for a change in the PMTU. [RFC8899] is thorough in its | |||
discussion of the PMTU discovery mechanism and strategies for | discussion of the PMTU discovery mechanism and strategies for | |||
determining the current end-to-end PMTU setting as well as detecting | determining the current end-to-end PMTU setting as well as detecting | |||
changes in this value. | changes in this value. | |||
An endpoint SHOULD apply these techniques, and SHOULD do so on a per- | An endpoint SHOULD apply these techniques and SHOULD do so on a per- | |||
destination-address basis. | destination-address basis. | |||
There are two important SCTP-specific points regarding PMTU | There are two important SCTP-specific points regarding PMTU | |||
discovery: | discovery: | |||
1) SCTP associations can span multiple addresses. An endpoint MUST | 1) SCTP associations can span multiple addresses. An endpoint MUST | |||
maintain separate PMTU estimates for each destination address of | maintain separate PMTU estimates for each destination address of | |||
its peer. | its peer. | |||
2) The sender SHOULD track an AMDCS that will be the smallest PMDCS | 2) The sender SHOULD track an AMDCS that will be the smallest PMDCS | |||
discovered for all of the peer's destination addresses. When | discovered for all of the peer's destination addresses. When | |||
fragmenting messages into multiple parts this AMDCS SHOULD be | fragmenting messages into multiple parts, this AMDCS SHOULD be | |||
used to calculate the size of each DATA chunk. This will allow | used to calculate the size of each DATA chunk. This will allow | |||
retransmissions to be seamlessly sent to an alternate address | retransmissions to be seamlessly sent to an alternate address | |||
without encountering IP fragmentation. | without encountering IP fragmentation. | |||
8. Fault Management | 8. Fault Management | |||
8.1. Endpoint Failure Detection | 8.1. Endpoint Failure Detection | |||
An endpoint SHOULD keep a counter on the total number of consecutive | An endpoint SHOULD keep a counter on the total number of consecutive | |||
retransmissions to its peer (this includes data retransmissions to | retransmissions to its peer (this includes data retransmissions to | |||
skipping to change at page 106, line 50 ¶ | skipping to change at line 4886 ¶ | |||
chosen and used as the new destination transport address. | chosen and used as the new destination transport address. | |||
8.3. Path Heartbeat | 8.3. Path Heartbeat | |||
By default, an SCTP endpoint SHOULD monitor the reachability of the | By default, an SCTP endpoint SHOULD monitor the reachability of the | |||
idle destination transport address(es) of its peer by sending a | idle destination transport address(es) of its peer by sending a | |||
HEARTBEAT chunk periodically to the destination transport | HEARTBEAT chunk periodically to the destination transport | |||
address(es). The sending of HEARTBEAT chunks MAY begin upon reaching | address(es). The sending of HEARTBEAT chunks MAY begin upon reaching | |||
the ESTABLISHED state and is discontinued after sending either a | the ESTABLISHED state and is discontinued after sending either a | |||
SHUTDOWN chunk or SHUTDOWN ACK chunk. A receiver of a HEARTBEAT | SHUTDOWN chunk or SHUTDOWN ACK chunk. A receiver of a HEARTBEAT | |||
chunks MUST respond to a HEARTBEAT chunk with a HEARTBEAT ACK chunk | chunk MUST respond to a HEARTBEAT chunk with a HEARTBEAT ACK chunk | |||
after entering the COOKIE-ECHOED state (sender of the INIT chunk) or | after entering the COOKIE-ECHOED state (sender of the INIT chunk) or | |||
the ESTABLISHED state (receiver of the INIT chunk), up until reaching | the ESTABLISHED state (receiver of the INIT chunk), up until reaching | |||
the SHUTDOWN-SENT state (sender of the SHUTDOWN chunk) or the | the SHUTDOWN-SENT state (sender of the SHUTDOWN chunk) or the | |||
SHUTDOWN-ACK-SENT state (receiver of the SHUTDOWN chunk). | SHUTDOWN-ACK-SENT state (receiver of the SHUTDOWN chunk). | |||
A destination transport address is considered "idle" if no new chunk | A destination transport address is considered "idle" if no new chunk | |||
that can be used for updating path RTT (usually including first | that can be used for updating path RTT (usually including first | |||
transmission DATA, INIT, COOKIE ECHO, or HEARTBEAT chunks, etc.) and | transmission DATA, INIT, COOKIE ECHO, or HEARTBEAT chunks, etc.) and | |||
no HEARTBEAT chunk has been sent to it within the current heartbeat | no HEARTBEAT chunk has been sent to it within the current heartbeat | |||
period of that address. This applies to both active and inactive | period of that address. This applies to both active and inactive | |||
skipping to change at page 107, line 48 ¶ | skipping to change at line 4933 ¶ | |||
The sender of the HEARTBEAT chunk SHOULD include in the Heartbeat | The sender of the HEARTBEAT chunk SHOULD include in the Heartbeat | |||
Information field of the chunk the current time when the packet is | Information field of the chunk the current time when the packet is | |||
sent and the destination address to which the packet is sent. | sent and the destination address to which the packet is sent. | |||
Implementation Note: An alternative implementation of the heartbeat | Implementation Note: An alternative implementation of the heartbeat | |||
mechanism that can be used is to increment the error counter variable | mechanism that can be used is to increment the error counter variable | |||
every time a HEARTBEAT chunk is sent to a destination. Whenever a | every time a HEARTBEAT chunk is sent to a destination. Whenever a | |||
HEARTBEAT ACK chunk arrives, the sender SHOULD clear the error | HEARTBEAT ACK chunk arrives, the sender SHOULD clear the error | |||
counter of the destination that the HEARTBEAT chunk was sent to. | counter of the destination that the HEARTBEAT chunk was sent to. | |||
This in effect would clear the previously stroked error (and any | This, in effect, would clear the previously stroked error (and any | |||
other error counts as well). | other error counts as well). | |||
The receiver of the HEARTBEAT chunk SHOULD immediately respond with a | The receiver of the HEARTBEAT chunk SHOULD immediately respond with a | |||
HEARTBEAT ACK chunk that contains the Heartbeat Information TLV, | HEARTBEAT ACK chunk that contains the Heartbeat Information TLV, | |||
together with any other received TLVs, copied unchanged from the | together with any other received TLVs, copied unchanged from the | |||
received HEARTBEAT chunk. | received HEARTBEAT chunk. | |||
Upon the receipt of the HEARTBEAT ACK chunk, the sender of the | Upon the receipt of the HEARTBEAT ACK chunk, the sender of the | |||
HEARTBEAT chunk SHOULD clear the error counter of the destination | HEARTBEAT chunk SHOULD clear the error counter of the destination | |||
transport address to which the HEARTBEAT chunk was sent and mark the | transport address to which the HEARTBEAT chunk was sent and mark the | |||
skipping to change at page 108, line 27 ¶ | skipping to change at line 4958 ¶ | |||
SHOULD also clear the association overall error count (as defined in | SHOULD also clear the association overall error count (as defined in | |||
Section 8.1). | Section 8.1). | |||
The receiver of the HEARTBEAT ACK chunk SHOULD also perform an RTT | The receiver of the HEARTBEAT ACK chunk SHOULD also perform an RTT | |||
measurement for that destination transport address using the time | measurement for that destination transport address using the time | |||
value carried in the HEARTBEAT ACK chunk. | value carried in the HEARTBEAT ACK chunk. | |||
On an idle destination address that is allowed to heartbeat, it is | On an idle destination address that is allowed to heartbeat, it is | |||
RECOMMENDED that a HEARTBEAT chunk is sent once per RTO of that | RECOMMENDED that a HEARTBEAT chunk is sent once per RTO of that | |||
destination address plus the protocol parameter 'HB.interval', with | destination address plus the protocol parameter 'HB.interval', with | |||
jittering of +/- 50% of the RTO value, and exponential backoff of the | jittering of +/- 50% of the RTO value and exponential backoff of the | |||
RTO if the previous HEARTBEAT chunk is unanswered. | RTO if the previous HEARTBEAT chunk is unanswered. | |||
A primitive is provided for the SCTP user to change the 'HB.interval' | 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 | and turn on or off the heartbeat on a given destination address. The | |||
'HB.interval' set by the SCTP user is added to the RTO of that | 'HB.interval' set by the SCTP user is added to the RTO of that | |||
destination (including any exponential backoff). Only one heartbeat | destination (including any exponential backoff). Only one heartbeat | |||
SHOULD be sent each time the heartbeat timer expires (if multiple | SHOULD be sent each time the heartbeat timer expires (if multiple | |||
destinations are idle). It is an implementation decision on how to | destinations are idle). It is an implementation decision on how to | |||
choose which of the candidate idle destinations to heartbeat to (if | choose which of the candidate idle destinations to heartbeat to (if | |||
more than one destination is idle). | more than one destination is idle). | |||
skipping to change at page 109, line 7 ¶ | skipping to change at line 4984 ¶ | |||
ABORT chunk for any reason and the ABORT chunk is lost, the local | ABORT chunk for any reason and the ABORT chunk is lost, the local | |||
endpoint will only discover the lost ABORT chunk by sending a DATA | endpoint will only discover the lost ABORT chunk by sending a DATA | |||
chunk or HEARTBEAT chunk (thus causing the peer to send another ABORT | chunk or HEARTBEAT chunk (thus causing the peer to send another ABORT | |||
chunk). This is to be considered when tuning the heartbeat timer. | chunk). This is to be considered when tuning the heartbeat timer. | |||
If the sending of HEARTBEAT chunks is disabled, only sending DATA | If the sending of HEARTBEAT chunks is disabled, only sending DATA | |||
chunks to the association will discover a lost ABORT chunk from the | chunks to the association will discover a lost ABORT chunk from the | |||
peer. | peer. | |||
8.4. Handle "Out of the Blue" Packets | 8.4. Handle "Out of the Blue" Packets | |||
An SCTP packet is called an "out of the blue" (OOTB) packet if it is | 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 | correctly formed (i.e., passed the receiver's CRC32c check; see | |||
Section 6.8), but the receiver is not able to identify the | Section 6.8), but the receiver is not able to identify the | |||
association to which this packet belongs. | association to which this packet belongs. | |||
The receiver of an OOTB packet does the following: | The receiver of an OOTB packet does the following: | |||
1) If the OOTB packet is to or from a non-unicast address, a | 1) If the OOTB packet is to or from a non-unicast address, a | |||
receiver SHOULD silently discard the packet. Otherwise, | receiver SHOULD silently discard the packet. Otherwise, | |||
2) If the OOTB packet contains an ABORT chunk, the receiver MUST | 2) If the OOTB packet contains an ABORT chunk, the receiver MUST | |||
skipping to change at page 109, line 45 ¶ | skipping to change at line 5022 ¶ | |||
chunk. When sending the SHUTDOWN COMPLETE chunk, the receiver of | chunk. When sending the SHUTDOWN COMPLETE chunk, the receiver of | |||
the OOTB packet MUST fill in the Verification Tag field of the | the OOTB packet MUST fill in the Verification Tag field of the | |||
outbound packet with the Verification Tag received in the | outbound packet with the Verification Tag received in the | |||
SHUTDOWN ACK chunk and set the T bit in the Chunk Flags to | SHUTDOWN ACK chunk and set the T bit in the Chunk Flags to | |||
indicate that the Verification Tag is reflected. Otherwise, | indicate that the Verification Tag is reflected. Otherwise, | |||
6) If the packet contains a SHUTDOWN COMPLETE chunk, the receiver | 6) If the packet contains a SHUTDOWN COMPLETE chunk, the receiver | |||
SHOULD silently discard the packet and take no further action. | SHOULD silently discard the packet and take no further action. | |||
Otherwise, | Otherwise, | |||
7) If the packet contains a ERROR chunk with the "Stale Cookie" | 7) If the packet contains an ERROR chunk with the "Stale Cookie" | |||
error cause or a COOKIE ACK chunk, the SCTP packet SHOULD be | error cause or a COOKIE ACK chunk, the SCTP packet SHOULD be | |||
silently discarded. Otherwise, | silently discarded. Otherwise, | |||
8) The receiver SHOULD respond to the sender of the OOTB packet with | 8) The receiver SHOULD respond to the sender of the OOTB packet with | |||
an ABORT chunk. When sending the ABORT chunk, the receiver of | an ABORT chunk. When sending the ABORT chunk, the receiver of | |||
the OOTB packet MUST fill in the Verification Tag field of the | the OOTB packet MUST fill in the Verification Tag field of the | |||
outbound packet with the value found in the Verification Tag | 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 | field of the OOTB packet and set the T bit in the Chunk Flags to | |||
indicate that the Verification Tag is reflected. After sending | indicate that the Verification Tag is reflected. After sending | |||
this ABORT chunk, the receiver of the OOTB packet MUST discard | this ABORT chunk, the receiver of the OOTB packet MUST discard | |||
skipping to change at page 110, line 26 ¶ | skipping to change at line 5052 ¶ | |||
When sending an SCTP packet, the endpoint MUST fill in the | When sending an SCTP packet, the endpoint MUST fill in the | |||
Verification Tag field of the outbound packet with the tag value in | Verification Tag field of the outbound packet with the tag value in | |||
the Initiate Tag parameter of the INIT or INIT ACK chunk received | the Initiate Tag parameter of the INIT or INIT ACK chunk received | |||
from its peer. | from its peer. | |||
When receiving an SCTP packet, the endpoint MUST ensure that the | When receiving an SCTP packet, the endpoint MUST ensure that the | |||
value in the Verification Tag field of the received SCTP packet | value in the Verification Tag field of the received SCTP packet | |||
matches its own tag. If the received Verification Tag value does not | matches its own tag. If the received Verification Tag value does not | |||
match the receiver's own tag value, the receiver MUST silently | match the receiver's own tag value, the receiver MUST silently | |||
discard the packet and MUST NOT process it any further except for | discard the packet and MUST NOT process it any further, except for | |||
those cases listed in Section 8.5.1 below. | those cases listed in Section 8.5.1 below. | |||
8.5.1. Exceptions in Verification Tag Rules | 8.5.1. Exceptions in Verification Tag Rules | |||
A) Rules for packets carrying an INIT chunk: | A) Rules for packets carrying an INIT chunk: | |||
* The sender MUST set the Verification Tag of the packet to 0. | * The sender MUST set the Verification Tag of the packet to 0. | |||
* When an endpoint receives an SCTP packet with the Verification | * When an endpoint receives an SCTP packet with the Verification | |||
Tag set to 0, it SHOULD verify that the packet contains only an | Tag set to 0, it SHOULD verify that the packet contains only an | |||
INIT chunk. Otherwise, the receiver MUST silently discard the | INIT chunk. Otherwise, the receiver MUST silently discard the | |||
packet. | packet. | |||
B) Rules for packets carrying an ABORT chunk: | B) Rules for packets carrying an ABORT chunk: | |||
* The endpoint MUST always fill in the Verification Tag field of | * The endpoint MUST always fill in the Verification Tag field of | |||
the outbound packet with the destination endpoint's tag value, | the outbound packet with the destination endpoint's tag value | |||
if it is known. | if it is known. | |||
* If the ABORT chunk is sent in response to an OOTB packet, the | * If the ABORT chunk is sent in response to an OOTB packet, the | |||
endpoint MUST follow the procedure described in Section 8.4. | endpoint MUST follow the procedure described in Section 8.4. | |||
* The receiver of an ABORT chunk MUST accept the packet if the | * The receiver of an ABORT chunk MUST accept the packet if the | |||
Verification Tag field of the packet matches its own tag and | 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 | 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 | T bit is set in the Chunk Flags. Otherwise, the receiver MUST | |||
silently discard the packet and take no further action. | silently discard the packet and take no further action. | |||
C) Rules for packets carrying a SHUTDOWN COMPLETE chunk: | C) Rules for packets carrying a SHUTDOWN COMPLETE chunk: | |||
* When sending a SHUTDOWN COMPLETE chunk, if the receiver of the | * When sending a SHUTDOWN COMPLETE chunk, if the receiver of the | |||
SHUTDOWN ACK chunk has a TCB, then the destination endpoint's | SHUTDOWN ACK chunk has a TCB, then the destination endpoint's | |||
tag MUST be used, and the T bit MUST NOT be set. Only where no | 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 | TCB exists SHOULD the sender use the Verification Tag from the | |||
SHUTDOWN ACK chunk, and MUST set the T bit. | SHUTDOWN ACK chunk and MUST set the T bit. | |||
* The receiver of a SHUTDOWN COMPLETE chunk accepts the packet if | * The receiver of a SHUTDOWN COMPLETE chunk accepts the packet if | |||
the Verification Tag field of the packet matches its own tag | 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 | 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 | the T bit is set in the Chunk Flags. Otherwise, the receiver | |||
MUST silently discard the packet and take no further action. | MUST silently discard the packet and take no further action. | |||
An endpoint MUST ignore the SHUTDOWN COMPLETE chunk if it is | An endpoint MUST ignore the SHUTDOWN COMPLETE chunk if it is | |||
not in the SHUTDOWN-ACK-SENT state. | not in the SHUTDOWN-ACK-SENT state. | |||
D) Rules for packets carrying a COOKIE ECHO chunk: | D) Rules for packets carrying a COOKIE ECHO chunk: | |||
* When sending a COOKIE ECHO chunk, the endpoint MUST use the | * When sending a COOKIE ECHO chunk, the endpoint MUST use the | |||
value of the Initiate Tag received in the INIT ACK chunk. | value of the Initiate Tag received in the INIT ACK chunk. | |||
* The receiver of a COOKIE ECHO chunk follows the procedures in | * The receiver of a COOKIE ECHO chunk follows the procedures in | |||
Section 5. | Section 5. | |||
E) Rules for packets carrying a SHUTDOWN ACK chunk: | E) Rules for packets carrying a SHUTDOWN ACK chunk: | |||
* If the receiver is in COOKIE-ECHOED or COOKIE-WAIT state the | * If the receiver is in COOKIE-ECHOED or COOKIE-WAIT state, the | |||
procedures in Section 8.4 SHOULD be followed; in other words, | procedures in Section 8.4 SHOULD be followed; in other words, | |||
it is treated as an OOTB packet. | it is treated as an OOTB packet. | |||
9. Termination of Association | 9. Termination of Association | |||
An endpoint SHOULD terminate its association when it exits from | An endpoint SHOULD terminate its association when it exits from | |||
service. An association can be terminated by either abort or | service. An association can be terminated by either abort or | |||
shutdown. An abort of an association is abortive by definition in | shutdown. An abort of an association is abortive by definition in | |||
that any data pending on either end of the association is discarded | that any data pending on either end of the association is discarded | |||
and not delivered to the peer. A shutdown of an association is | and not delivered to the peer. A shutdown of an association is | |||
considered a graceful close where all data in queue by either | considered a graceful close where all data in queue by either | |||
endpoint is delivered to the respective peers. However, in the case | endpoint is delivered to the respective peers. However, in the case | |||
of a shutdown, SCTP does not support a half-open state (like TCP) | of a shutdown, SCTP does not support a half-open state (like TCP), | |||
wherein one side might continue sending data while the other end is | wherein one side might continue sending data while the other end is | |||
closed. When either endpoint performs a shutdown, the association on | closed. When either endpoint performs a shutdown, the association on | |||
each peer will stop accepting new data from its user and only deliver | 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. | data in queue at the time of sending or receiving the SHUTDOWN chunk. | |||
9.1. Abort of an Association | 9.1. Abort of an Association | |||
When an endpoint decides to abort an existing association, it MUST | When an endpoint decides to abort an existing association, it MUST | |||
send an ABORT chunk to its peer endpoint. The sender MUST fill in | 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 | the peer's Verification Tag in the outbound packet and MUST NOT | |||
skipping to change at page 112, line 36 ¶ | skipping to change at line 5152 ¶ | |||
9.2. Shutdown of an Association | 9.2. Shutdown of an Association | |||
Using the SHUTDOWN primitive (see Section 11.1), the upper layer of | Using the SHUTDOWN primitive (see Section 11.1), the upper layer of | |||
an endpoint in an association can gracefully close the association. | an endpoint in an association can gracefully close the association. | |||
This will allow all outstanding DATA chunks from the peer of the | This will allow all outstanding DATA chunks from the peer of the | |||
shutdown initiator to be delivered before the association terminates. | shutdown initiator to be delivered before the association terminates. | |||
Upon receipt of the SHUTDOWN primitive from its upper layer, the | Upon receipt of the SHUTDOWN primitive from its upper layer, the | |||
endpoint enters the SHUTDOWN-PENDING state and remains there until | endpoint enters the SHUTDOWN-PENDING state and remains there until | |||
all outstanding data has been acknowledged by its peer. The endpoint | all outstanding data has been acknowledged by its peer. The endpoint | |||
accepts no new data from its upper layer, but retransmits data to the | accepts no new data from its upper layer but retransmits data to the | |||
peer endpoint if necessary to fill gaps. | peer endpoint if necessary to fill gaps. | |||
Once all its outstanding data has been acknowledged, the endpoint | Once all its outstanding data has been acknowledged, the endpoint | |||
sends a SHUTDOWN chunk to its peer including in the Cumulative TSN | sends a SHUTDOWN chunk to its peer, including in the Cumulative TSN | |||
Ack field the last sequential TSN it has received from the peer. It | Ack field the last sequential TSN it has received from the peer. It | |||
SHOULD then start the T2-shutdown timer and enter the SHUTDOWN-SENT | SHOULD then start the T2-shutdown timer and enter the SHUTDOWN-SENT | |||
state. If the timer expires, the endpoint MUST resend the SHUTDOWN | state. If the timer expires, the endpoint MUST resend the SHUTDOWN | |||
chunk with the updated last sequential TSN received from its peer. | chunk with the updated last sequential TSN received from its peer. | |||
The rules in Section 6.3 MUST be followed to determine the proper | 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 | timer value for T2-shutdown. To indicate any gaps in TSN, the | |||
endpoint MAY also bundle a SACK chunk with the SHUTDOWN chunk in the | endpoint MAY also bundle a SACK chunk with the SHUTDOWN chunk in the | |||
same SCTP packet. | same SCTP packet. | |||
skipping to change at page 113, line 41 ¶ | skipping to change at line 5203 ¶ | |||
receiver MUST continue to follow normal data transmission procedures | receiver MUST continue to follow normal data transmission procedures | |||
defined in Section 6, until all outstanding DATA chunks are | defined in Section 6, until all outstanding DATA chunks are | |||
acknowledged; however, the SHUTDOWN chunk receiver MUST NOT accept | acknowledged; however, the SHUTDOWN chunk receiver MUST NOT accept | |||
new data from its SCTP user. | new data from its SCTP user. | |||
While in the SHUTDOWN-SENT state, the SHUTDOWN chunk sender MUST | While in the SHUTDOWN-SENT state, the SHUTDOWN chunk sender MUST | |||
immediately respond to each received packet containing one or more | immediately respond to each received packet containing one or more | |||
DATA chunks with a SHUTDOWN chunk and restart the T2-shutdown timer. | DATA chunks with a SHUTDOWN chunk and restart the T2-shutdown timer. | |||
If a SHUTDOWN chunk by itself cannot acknowledge all of the received | 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 | 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 | larger than the cumulative TSN and thus gaps exist in the TSN | |||
sequence), or if duplicate TSNs have been received, then a SACK chunk | sequence) or if duplicate TSNs have been received, then a SACK chunk | |||
MUST also be sent. | MUST also be sent. | |||
The sender of the SHUTDOWN chunk MAY also start an overall guard | The sender of the SHUTDOWN chunk MAY also start an overall guard | |||
timer T5-shutdown-guard to bound the overall time for the shutdown | timer T5-shutdown-guard to bound the overall time for the shutdown | |||
sequence. At the expiration of this timer, the sender SHOULD abort | sequence. At the expiration of this timer, the sender SHOULD abort | |||
the association by sending an ABORT chunk. If the T5-shutdown-guard | 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 | timer is used, it SHOULD be set to the RECOMMENDED value of 5 times | |||
'RTO.Max'. | 'RTO.Max'. | |||
If the receiver of the SHUTDOWN chunk has no more outstanding DATA | If the receiver of the SHUTDOWN chunk has no more outstanding DATA | |||
skipping to change at page 115, line 13 ¶ | skipping to change at line 5271 ¶ | |||
in Section 8.4. The sender of the INIT chunk lets T1-init continue | in Section 8.4. The sender of the INIT chunk lets T1-init continue | |||
running and remains in the COOKIE-WAIT or COOKIE-ECHOED state. | running and remains in the COOKIE-WAIT or COOKIE-ECHOED state. | |||
Normal T1-init timer expiration will cause the INIT or COOKIE chunk | Normal T1-init timer expiration will cause the INIT or COOKIE chunk | |||
to be retransmitted and thus start a new association. | to be retransmitted and thus start a new association. | |||
If a SHUTDOWN chunk is received in the COOKIE-WAIT or COOKIE ECHOED | If a SHUTDOWN chunk is received in the COOKIE-WAIT or COOKIE ECHOED | |||
state, the SHUTDOWN chunk SHOULD be silently discarded. | state, the SHUTDOWN chunk SHOULD be silently discarded. | |||
If an endpoint is in the SHUTDOWN-SENT state and receives a SHUTDOWN | If an endpoint is in the SHUTDOWN-SENT state and receives a SHUTDOWN | |||
chunk from its peer, the endpoint SHOULD respond immediately with a | chunk from its peer, the endpoint SHOULD respond immediately with a | |||
SHUTDOWN ACK chunk to its peer, and move into the SHUTDOWN-ACK-SENT | SHUTDOWN ACK chunk to its peer and move into the SHUTDOWN-ACK-SENT | |||
state restarting its T2-shutdown timer. | state, restarting its T2-shutdown timer. | |||
If an endpoint is in the SHUTDOWN-ACK-SENT state and receives a | If an endpoint is in the SHUTDOWN-ACK-SENT state and receives a | |||
SHUTDOWN ACK, it MUST stop the T2-shutdown timer, send a SHUTDOWN | SHUTDOWN ACK, it MUST stop the T2-shutdown timer, send a SHUTDOWN | |||
COMPLETE chunk to its peer, and remove all record of the association. | COMPLETE chunk to its peer, and remove all record of the association. | |||
10. ICMP Handling | 10. ICMP Handling | |||
Whenever an ICMP message is received by an SCTP endpoint, the | Whenever an ICMP message is received by an SCTP endpoint, the | |||
following procedures MUST be followed to ensure proper utilization of | following procedures MUST be followed to ensure proper utilization of | |||
the information being provided by layer 3. | the information being provided by layer 3. | |||
skipping to change at page 116, line 21 ¶ | skipping to change at line 5319 ¶ | |||
the peer, continue with ICMP7. If the ICMP message is too | the peer, continue with ICMP7. If the ICMP message is too | |||
short or the chunk type or the Initiate Tag does not match, | short or the chunk type or the Initiate Tag does not match, | |||
silently discard the packet. | silently discard the packet. | |||
ICMP7) If the ICMP message is either an ICMPv6 message of type | ICMP7) If the ICMP message is either an ICMPv6 message of type | |||
"Packet Too Big" or an ICMPv4 message of type "Destination | "Packet Too Big" or an ICMPv4 message of type "Destination | |||
Unreachable" and code "Fragmentation Needed", an | Unreachable" and code "Fragmentation Needed", an | |||
implementation SHOULD process this information as defined for | implementation SHOULD process this information as defined for | |||
PMTU discovery. | PMTU discovery. | |||
ICMP8) If the ICMP code is an "Unrecognized Next Header Type | ICMP8) If the ICMP code is "Unrecognized Next Header Type | |||
Encountered" or a "Protocol Unreachable", an implementation | Encountered" or "Protocol Unreachable", an implementation | |||
MUST treat this message as an abort with the T bit set if it | 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 | does not contain an INIT chunk. If it does contain an INIT | |||
chunk and the association is in the COOKIE-WAIT state, handle | chunk and the association is in the COOKIE-WAIT state, handle | |||
the ICMP message like an ABORT chunk. | the ICMP message like an ABORT chunk. | |||
ICMP9) If the ICMP type is "Destination Unreachable", the | ICMP9) If the ICMP type is "Destination Unreachable", the | |||
implementation MAY move the destination to the unreachable | implementation MAY move the destination to the unreachable | |||
state or, alternatively, increment the path error counter. | state or, alternatively, increment the path error counter. | |||
SCTP MAY provide information to the upper layer indicating | SCTP MAY provide information to the upper layer indicating | |||
the reception of ICMP messages when reporting a network | the reception of ICMP messages when reporting a network | |||
status change. | status change. | |||
These procedures differ from [RFC1122] and from its requirements for | These procedures differ from [RFC1122] and from its requirements for | |||
processing of port-unreachable messages and the requirements that an | processing of port-unreachable messages and the requirements that an | |||
implementation MUST abort associations in response to a "protocol | implementation MUST abort associations in response to a protocol | |||
unreachable" message. Port-unreachable messages are not processed, | unreachable message. Port-unreachable messages are not processed, | |||
since an implementation will send an ABORT chunk, not a port | since an implementation will send an ABORT chunk, not a port- | |||
unreachable. The stricter handling of the "protocol unreachable" | unreachable message. The stricter handling of the protocol | |||
message is due to security concerns for hosts that do not support | unreachable message is due to security concerns for hosts that do not | |||
SCTP. | support SCTP. | |||
11. Interface with Upper Layer | 11. Interface with Upper Layer | |||
The Upper Layer Protocols (ULPs) request services by passing | The Upper Layer Protocols (ULPs) request services by passing | |||
primitives to SCTP and receive notifications from SCTP for various | primitives to SCTP and receive notifications from SCTP for various | |||
events. | events. | |||
The primitives and notifications described in this section can be | The primitives and notifications described in this section can be | |||
used as a guideline for implementing SCTP. The following functional | used as a guideline for implementing SCTP. The following functional | |||
description of ULP interface primitives is shown for illustrative | description of ULP interface primitives is shown for illustrative | |||
purposes. Different SCTP implementations can have different ULP | purposes. Different SCTP implementations can have different ULP | |||
interfaces. However, all SCTP implementations are expected to | interfaces. However, all SCTP implementations are expected to | |||
provide a certain minimum set of services to guarantee that all SCTP | provide a certain minimum set of services to guarantee that all SCTP | |||
implementations can support the same protocol hierarchy. | implementations can support the same protocol hierarchy. | |||
Please note that this section is informational only. | Please note that this section is informational only. | |||
[RFC6458] and the Socket API Considerations section of [RFC7053] | [RFC6458] and Section 7 ("Socket API Considerations") of [RFC7053] | |||
define an extension of the socket API for SCTP as described in this | define an extension of the socket API for SCTP as described in this | |||
document. | document. | |||
11.1. ULP-to-SCTP | 11.1. ULP-to-SCTP | |||
The following sections functionally characterize a ULP/SCTP | The following sections functionally characterize a ULP/SCTP | |||
interface. The notation used is similar to most procedure or | interface. The notation used is similar to most procedure or | |||
function calls in high-level languages. | function calls in high-level languages. | |||
The ULP primitives described below specify the basic functions that | The ULP primitives described below specify the basic functions that | |||
SCTP performs to support inter-process communication. Individual | SCTP performs to support inter-process communication. Individual | |||
implementations define their own exact format, and provide | implementations define their own exact format and provide | |||
combinations or subsets of the basic functions in single calls. | combinations or subsets of the basic functions in single calls. | |||
11.1.1. Initialize | 11.1.1. Initialize | |||
INITIALIZE ([local port],[local eligible address list]) | INITIALIZE ([local port],[local eligible address list]) | |||
-> local SCTP instance name | -> local SCTP instance name | |||
This primitive allows SCTP to initialize its internal data structures | This primitive allows SCTP to initialize its internal data structures | |||
and allocate necessary resources for setting up its operation | and allocate necessary resources for setting up its operation | |||
environment. Once SCTP is initialized, ULP can communicate directly | environment. Once SCTP is initialized, ULP can communicate directly | |||
skipping to change at page 118, line 22 ¶ | skipping to change at line 5413 ¶ | |||
ASSOCIATE(local SCTP instance name, | ASSOCIATE(local SCTP instance name, | |||
initial destination transport addr list, outbound stream count) | initial destination transport addr list, outbound stream count) | |||
-> association id [,destination transport addr list] | -> association id [,destination transport addr list] | |||
[,outbound stream count] | [,outbound stream count] | |||
This primitive allows the upper layer to initiate an association to a | This primitive allows the upper layer to initiate an association to a | |||
specific peer endpoint. | specific peer endpoint. | |||
The peer endpoint is specified by one or more of the transport | The peer endpoint is specified by one or more of the transport | |||
addresses that defines the endpoint (see Section 2.3). If the local | addresses that defines the endpoint (see Section 1.3). If the local | |||
SCTP instance has not been initialized, the ASSOCIATE is considered | SCTP instance has not been initialized, the ASSOCIATE is considered | |||
an error. | an error. | |||
An association id, which is a local handle to the SCTP association, | An association id, which is a local handle to the SCTP association, | |||
will be returned on successful establishment of the association. If | will be returned on successful establishment of the association. If | |||
SCTP is not able to open an SCTP association with the peer endpoint, | SCTP is not able to open an SCTP association with the peer endpoint, | |||
an error is returned. | an error is returned. | |||
Other association parameters can be returned, including the complete | Other association parameters can be returned, including the complete | |||
destination transport addresses of the peer as well as the outbound | destination transport addresses of the peer as well as the outbound | |||
stream count of the local endpoint. One of the transport addresses | stream count of the local endpoint. One of the transport addresses | |||
from the returned destination addresses will be selected by the local | from the returned destination addresses will be selected by the local | |||
endpoint as default primary path for sending SCTP packets to this | endpoint as the default primary path for sending SCTP packets to this | |||
peer. The returned "destination transport addr list" can be used by | peer. The returned "destination transport addr list" can be used by | |||
the ULP to change the default primary path or to force sending a | the ULP to change the default primary path or to force sending a | |||
packet to a specific transport address. | packet to a specific transport address. | |||
Implementation Note: If ASSOCIATE primitive is implemented as a | Implementation Note: If the ASSOCIATE primitive is implemented as a | |||
blocking function call, the ASSOCIATE primitive can return | blocking function call, the ASSOCIATE primitive can return | |||
association parameters in addition to the association id upon | association parameters in addition to the association id upon | |||
successful establishment. If ASSOCIATE primitive is implemented as a | successful establishment. If ASSOCIATE primitive is implemented as a | |||
non-blocking call, only the association id is returned and | non-blocking call, only the association id is returned and | |||
association parameters are passed using the COMMUNICATION UP | association parameters are passed using the COMMUNICATION UP | |||
notification. | notification. | |||
Mandatory attributes: | Mandatory attributes: | |||
local SCTP instance name: obtained from the INITIALIZE operation. | local SCTP instance name: obtained from the INITIALIZE operation. | |||
skipping to change at page 120, line 4 ¶ | skipping to change at line 5487 ¶ | |||
code is returned. | code is returned. | |||
Mandatory attributes: | Mandatory attributes: | |||
association id: local handle to the SCTP association. | association id: local handle to the SCTP association. | |||
Optional attributes: | Optional attributes: | |||
Upper Layer Abort Reason: reason of the abort to be passed to the | Upper Layer Abort Reason: reason of the abort to be passed to the | |||
peer. | peer. | |||
11.1.5. Send | 11.1.5. Send | |||
SEND(association id, buffer address, byte count [,context] | SEND(association id, buffer address, byte count [,context] | |||
[,stream id] [,life time] [,destination transport address] | [,stream id] [,life time] [,destination transport address] | |||
[,unordered flag] [,no-bundle flag] [,payload protocol-id] | [,unordered flag] [,no-bundle flag] [,payload protocol-id] | |||
[,sack-immediately flag]) -> result | [,sack-immediately flag]) -> result | |||
This is the main method to send user data via SCTP. | This is the main method to send user data via SCTP. | |||
Mandatory attributes: | Mandatory attributes: | |||
association id: local handle to the SCTP association. | association id: local handle to the SCTP association. | |||
buffer address: the location where the user message to be | buffer address: the location where the user message to be | |||
transmitted is stored. | transmitted is stored. | |||
byte count: the size of the user data in number of bytes. | byte count: the size of the user data in number of bytes. | |||
Optional attributes: | Optional attributes: | |||
context: an optional information provided that will be carried in | context: optional information provided that will be carried in | |||
the sending failure notification to the ULP if the | the SEND FAILURE notification to the ULP if the transportation | |||
transportation of this user message fails. | of this user message fails. | |||
stream id: to indicate which stream to send the data on. If not | stream id: indicates which stream to send the data on. If not | |||
specified, stream 0 will be used. | specified, stream 0 will be used. | |||
life time: specifies the life time of the user data. The user | life time: specifies the life time of the user data. The user | |||
data will not be sent by SCTP after the life time expires. | data will not be sent by SCTP after the life time expires. | |||
This parameter can be used to avoid efforts to transmit stale | This parameter can be used to avoid efforts to transmit stale | |||
user messages. SCTP notifies the ULP if the data cannot be | user messages. SCTP notifies the ULP if the data cannot be | |||
initiated to transport (i.e., sent to the destination via | initiated to transport (i.e., sent to the destination via | |||
SCTP's SEND primitive) within the life time variable. However, | SCTP's SEND primitive) within the life time variable. However, | |||
the user data will be transmitted if SCTP has attempted to | the user data will be transmitted if SCTP has attempted to | |||
transmit a chunk before the life time expired. | transmit a chunk before the life time expired. | |||
Implementation Note: In order to better support the data life | Implementation Note: In order to better support the data life | |||
time option, the transmitter can hold back the assigning of the | time option, the transmitter can hold back the assigning of the | |||
TSN number to an outbound DATA chunk to the last moment. And, | TSN number to an outbound DATA chunk to the last moment. And, | |||
for implementation simplicity, once a TSN number has been | for implementation simplicity, once a TSN number has been | |||
assigned the sender considers the send of this DATA chunk as | assigned, the sender considers the send of this DATA chunk as | |||
committed, overriding any life time option attached to the DATA | committed, overriding any life time option attached to the DATA | |||
chunk. | chunk. | |||
destination transport address: specified as one of the | destination transport address: specified as one of the | |||
destination transport addresses of the peer endpoint to which | destination transport addresses of the peer endpoint to which | |||
this packet is sent. Whenever possible, SCTP uses this | this packet is sent. Whenever possible, SCTP uses this | |||
destination transport address for sending the packets, instead | destination transport address for sending the packets, instead | |||
of the current primary path. | of the current primary path. | |||
unordered flag: this flag, if present, indicates that the user | unordered flag: this flag, if present, indicates that the user | |||
skipping to change at page 121, line 15 ¶ | skipping to change at line 5546 ¶ | |||
peer (i.e., the U flag is set to 1 on all DATA chunks carrying | peer (i.e., the U flag is set to 1 on all DATA chunks carrying | |||
this message). | this message). | |||
no-bundle flag: instructs SCTP not to delay the sending of DATA | no-bundle flag: instructs SCTP not to delay the sending of DATA | |||
chunks for this user data just to allow it to be bundled with | chunks for this user data just to allow it to be bundled with | |||
other outbound DATA chunks. When faced with network | other outbound DATA chunks. When faced with network | |||
congestion, SCTP might still bundle the data, even when this | congestion, SCTP might still bundle the data, even when this | |||
flag is present. | flag is present. | |||
payload protocol-id: a 32-bit unsigned integer that is to be | payload protocol-id: a 32-bit unsigned integer that is to be | |||
passed to the peer indicating the type of payload protocol data | passed to the peer, indicating the type of payload protocol | |||
being transmitted. Note that the upper layer is responsible | data being transmitted. Note that the upper layer is | |||
for the host to network byte order conversion of this field, | responsible for the host to network byte order conversion of | |||
which is passed by SCTP as 4 bytes of opaque data. | this field, which is passed by SCTP as 4 bytes of opaque data. | |||
sack-immediately flag: set the I bit on the last DATA chunk used | sack-immediately flag: set the I bit on the last DATA chunk used | |||
for the user message to be transmitted. | for the user message to be transmitted. | |||
11.1.6. Set Primary | 11.1.6. Set Primary | |||
SETPRIMARY(association id, destination transport address, | SETPRIMARY(association id, destination transport address, | |||
[source transport address]) -> result | [source transport address]) -> result | |||
Instructs the local SCTP to use the specified destination transport | Instructs the local SCTP to use the specified destination transport | |||
address as the primary path for sending packets. | address as the primary path for sending packets. | |||
The result of attempting this operation is returned. If the | The result of attempting this operation is returned. If the | |||
specified destination transport address is not present in the | specified destination transport address is not present in the | |||
"destination transport address list" returned earlier in an associate | "destination transport address list" returned earlier in an ASSOCIATE | |||
command or communication up notification, an error is returned. | primitive or COMMUNICATION UP notification, an error is returned. | |||
Mandatory attributes: | Mandatory attributes: | |||
association id: local handle to the SCTP association. | association id: local handle to the SCTP association. | |||
destination transport address: specified as one of the transport | destination transport address: specified as one of the transport | |||
addresses of the peer endpoint, which is used as the primary | addresses of the peer endpoint, which is used as the primary | |||
address for sending packets. This overrides the current | address for sending packets. This overrides the current | |||
primary address information maintained by the local SCTP | primary address information maintained by the local SCTP | |||
endpoint. | endpoint. | |||
skipping to change at page 122, line 4 ¶ | skipping to change at line 5582 ¶ | |||
address for sending packets. This overrides the current | address for sending packets. This overrides the current | |||
primary address information maintained by the local SCTP | primary address information maintained by the local SCTP | |||
endpoint. | endpoint. | |||
Optional attributes: | Optional attributes: | |||
source transport address: optionally, some implementations can | source transport address: optionally, some implementations can | |||
allow you to set the default source address placed in all | allow you to set the default source address placed in all | |||
outgoing IP datagrams. | outgoing IP datagrams. | |||
11.1.7. Receive | 11.1.7. Receive | |||
RECEIVE(association id, buffer address, buffer size [,stream id]) | RECEIVE(association id, buffer address, buffer size [,stream id]) | |||
-> byte count [,transport address] [,stream id] | -> byte count [,transport address] [,stream id] | |||
[,stream sequence number] [,partial flag] [,payload protocol-id] | [,stream sequence number] [,partial flag] [,payload protocol-id] | |||
This primitive reads the first user message in the SCTP in-queue into | This primitive reads the first user message in the SCTP in-queue into | |||
the buffer specified by ULP, if there is one available. The size of | the buffer specified by ULP, if there is one available. The size of | |||
the message read, in bytes, will be returned. It might, depending on | the message read, in bytes, will be returned. It might, depending on | |||
the specific implementation, also return other information such as | the specific implementation, also return other information, such as | |||
the sender's address, the stream id on which it is received, whether | the sender's address, the stream id on which it is received, whether | |||
there are more messages available for retrieval, etc. For ordered | there are more messages available for retrieval, etc. For ordered | |||
messages, their Stream Sequence Number might also be returned. | messages, their Stream Sequence Number might also be returned. | |||
Depending upon the implementation, if this primitive is invoked when | Depending upon the implementation, if this primitive is invoked when | |||
no message is available the implementation returns an indication of | no message is available, the implementation returns an indication of | |||
this condition or blocks the invoking process until data does become | this condition or blocks the invoking process until data does become | |||
available. | available. | |||
Mandatory attributes: | Mandatory attributes: | |||
association id: local handle to the SCTP association | association id: local handle to the SCTP association. | |||
buffer address: the memory location indicated by the ULP to store | buffer address: the memory location indicated by the ULP to store | |||
the received message. | the received message. | |||
buffer size: the maximum size of data to be received, in bytes. | buffer size: the maximum size of data to be received, in bytes. | |||
Optional attributes: | Optional attributes: | |||
stream id: to indicate which stream to receive the data on. | stream id: to indicate which stream to receive the data on. | |||
stream sequence number: the Stream Sequence Number assigned by | stream sequence number: the Stream Sequence Number assigned by | |||
skipping to change at page 124, line 22 ¶ | skipping to change at line 5697 ¶ | |||
This value is added to the RTO of the destination transport | This value is added to the RTO of the destination transport | |||
address. This value, if present, affects all destinations. | address. This value, if present, affects all destinations. | |||
11.1.10. Request Heartbeat | 11.1.10. Request Heartbeat | |||
REQUESTHEARTBEAT(association id, destination transport address) | REQUESTHEARTBEAT(association id, destination transport address) | |||
-> result | -> result | |||
Instructs the local endpoint to perform a heartbeat on the specified | Instructs the local endpoint to perform a heartbeat on the specified | |||
destination transport address of the given association. The returned | destination transport address of the given association. The returned | |||
result indicates whether the transmission of the HEARTBEAT chunk | result indicates whether the transmission of the HEARTBEAT chunk to | |||
chunk to the destination address is successful. | the destination address is successful. | |||
Mandatory attributes: | Mandatory attributes: | |||
association id: local handle to the SCTP association. | association id: local handle to the SCTP association. | |||
destination transport address: the transport address of the | destination transport address: the transport address of the | |||
association on which a heartbeat is issued. | association on which a heartbeat is issued. | |||
Optional attributes: | Optional attributes: | |||
None. | None. | |||
skipping to change at page 125, line 42 ¶ | skipping to change at line 5765 ¶ | |||
-> result | -> result | |||
This primitive allows the local SCTP to customize the protocol | This primitive allows the local SCTP to customize the protocol | |||
parameters. | parameters. | |||
Mandatory attributes: | Mandatory attributes: | |||
association id: local handle to the SCTP association. | association id: local handle to the SCTP association. | |||
protocol parameter list: the specific names and values of the | protocol parameter list: the specific names and values of the | |||
protocol parameters (e.g., 'Association.Max.Retrans' (see | protocol parameters (e.g., 'Association.Max.Retrans' (see | |||
Section 16), or other parameters like the DSCP) that the SCTP | Section 16) or other parameters like the DSCP) that the SCTP | |||
user wishes to customize. | user wishes to customize. | |||
Optional attributes: | Optional attributes: | |||
destination transport address: some of the protocol parameters | destination transport address: some of the protocol parameters | |||
might be set on a per destination transport address basis. | might be set on a per-destination-transport-address basis. | |||
11.1.14. Receive Unsent Message | 11.1.14. Receive Unsent Message | |||
RECEIVE_UNSENT(data retrieval id, buffer address, buffer size | RECEIVE_UNSENT(data retrieval id, buffer address, buffer size | |||
[,stream id] [, stream sequence number] [,partial flag] | [,stream id] [, stream sequence number] [,partial flag] | |||
[,payload protocol-id]) | [,payload protocol-id]) | |||
This primitive reads a user message, which has never been sent, into | This primitive reads a user message that has never been sent into the | |||
the buffer specified by ULP. | buffer specified by ULP. | |||
Mandatory attributes: | Mandatory attributes: | |||
data retrieval id: the identification passed to the ULP in the | data retrieval id: the identification passed to the ULP in the | |||
failure notification. | SEND FAILURE notification. | |||
buffer address: the memory location indicated by the ULP to store | buffer address: the memory location indicated by the ULP to store | |||
the received message. | the received message. | |||
buffer size: the maximum size of data to be received, in bytes. | buffer size: the maximum size of data to be received, in bytes. | |||
Optional attributes: | Optional attributes: | |||
stream id: this is a return value that is set to indicate which | stream id: this is a return value that is set to indicate which | |||
stream the data was sent to. | stream the data was sent to. | |||
stream sequence number: this value is returned indicating the | stream sequence number: this value is returned, indicating the | |||
Stream Sequence Number that was associated with the message. | Stream Sequence Number that was associated with the message. | |||
partial flag: if this returned flag is set to 1, then this | partial flag: if this returned flag is set to 1, then this | |||
message is a partial delivery of the whole message. When this | message is a partial delivery of the whole message. When this | |||
flag is set, the stream id and stream sequence number | flag is set, the stream id and stream sequence number | |||
accompanies this primitive. When this flag is set to 0, it | accompanies this primitive. When this flag is set to 0, it | |||
indicates that no more deliveries will be received for this | indicates that no more deliveries will be received for this | |||
stream sequence number. | stream sequence number. | |||
payload protocol-id: The 32 bit unsigned integer that was set to | payload protocol-id: The 32-bit unsigned integer that was set to | |||
be sent to the peer indicating the type of payload protocol of | be sent to the peer, indicating the type of payload protocol of | |||
the received data. | the received data. | |||
11.1.15. Receive Unacknowledged Message | 11.1.15. Receive Unacknowledged Message | |||
RECEIVE_UNACKED(data retrieval id, buffer address, buffer size, | RECEIVE_UNACKED(data retrieval id, buffer address, buffer size, | |||
[,stream id] [,stream sequence number] [,partial flag] | [,stream id] [,stream sequence number] [,partial flag] | |||
[,payload protocol-id]) | [,payload protocol-id]) | |||
This primitive reads a user message, which has been sent and has not | This primitive reads a user message that has been sent and has not | |||
been acknowledged by the peer, into the buffer specified by ULP. | been acknowledged by the peer into the buffer specified by ULP. | |||
Mandatory attributes: | Mandatory attributes: | |||
data retrieval id: the identification passed to the ULP in the | data retrieval id: the identification passed to the ULP in the | |||
failure notification. | SEND FAILURE notification. | |||
buffer address: the memory location indicated by the ULP to store | buffer address: the memory location indicated by the ULP to store | |||
the received message. | the received message. | |||
buffer size: the maximum size of data to be received, in bytes. | buffer size: the maximum size of data to be received, in bytes. | |||
Optional attributes: | Optional attributes: | |||
stream id: this is a return value that is set to indicate which | stream id: this is a return value that is set to indicate which | |||
stream the data was sent to. | stream the data was sent to. | |||
stream sequence number: this value is returned indicating the | stream sequence number: this value is returned, indicating the | |||
Stream Sequence Number that was associated with the message. | Stream Sequence Number that was associated with the message. | |||
partial flag: if this returned flag is set to 1, then this | partial flag: if this returned flag is set to 1, then this | |||
message is a partial delivery of the whole message. When this | message is a partial delivery of the whole message. When this | |||
flag is set, the stream id and stream sequence number | flag is set, the stream id and stream sequence number | |||
accompanies this primitive. When this flag is set to 0, it | accompanies this primitive. When this flag is set to 0, it | |||
indicates that no more deliveries will be received for this | indicates that no more deliveries will be received for this | |||
stream sequence number. | stream sequence number. | |||
payload protocol-id: the 32-bit unsigned integer that was sent to | payload protocol-id: the 32-bit unsigned integer that was sent to | |||
skipping to change at page 128, line 23 ¶ | skipping to change at line 5889 ¶ | |||
If a message cannot be delivered, SCTP invokes this notification on | If a message cannot be delivered, SCTP invokes this notification on | |||
the ULP. | the ULP. | |||
The following might optionally be passed with the notification: | The following might optionally be passed with the notification: | |||
association id: local handle to the SCTP association. | association id: local handle to the SCTP association. | |||
data retrieval id: an identification used to retrieve unsent and | data retrieval id: an identification used to retrieve unsent and | |||
unacknowledged data. | unacknowledged data. | |||
mode: Indicate whether no part of the message never has been sent or | mode: indicates whether no part of the message never has been sent | |||
if at least part of it has been sent but it is not completely | or if at least part of it has been sent but it is not completely | |||
acknowledged. | acknowledged. | |||
cause code: indicating the reason of the failure, e.g., size too | cause code: indicating the reason of the failure, e.g., size too | |||
large, message life time expiration, etc. | large, message life time expiration, etc. | |||
context: optional information associated with this message (see | context: optional information associated with this message (see | |||
Section 11.1.5). | Section 11.1.5). | |||
11.2.3. NETWORK STATUS CHANGE Notification | 11.2.3. NETWORK STATUS CHANGE Notification | |||
skipping to change at page 128, line 51 ¶ | skipping to change at line 5917 ¶ | |||
association id: local handle to the SCTP association. | association id: local handle to the SCTP association. | |||
destination transport address: this indicates the destination | destination transport address: this indicates the destination | |||
transport address of the peer endpoint affected by the change. | transport address of the peer endpoint affected by the change. | |||
new-status: this indicates the new status. | new-status: this indicates the new status. | |||
11.2.4. COMMUNICATION UP Notification | 11.2.4. COMMUNICATION UP Notification | |||
This notification is used when SCTP becomes ready to send or receive | This notification is used when SCTP becomes ready to send or receive | |||
user messages, or when a lost communication to an endpoint is | user messages or when a lost communication to an endpoint is | |||
restored. | restored. | |||
Implementation Note: If the ASSOCIATE primitive is implemented as a | Implementation Note: If the ASSOCIATE primitive is implemented as a | |||
blocking function call, the association parameters are returned as a | blocking function call, the association parameters are returned as a | |||
result of the ASSOCIATE primitive itself. In that case, | result of the ASSOCIATE primitive itself. In that case, the | |||
COMMUNICATION UP notification is optional at the association | COMMUNICATION UP notification is optional at the association | |||
initiator's side. | initiator's side. | |||
The following is passed with the notification: | The following is passed with the notification: | |||
association id: local handle to the SCTP association. | association id: local handle to the SCTP association. | |||
status: This indicates what type of event has occurred. | status: this indicates what type of event has occurred. | |||
destination transport address list: the complete set of transport | destination transport address list: the complete set of transport | |||
addresses of the peer. | addresses of the peer. | |||
outbound stream count: the maximum number of streams allowed to be | outbound stream count: the maximum number of streams allowed to be | |||
used in this association by the ULP. | used in this association by the ULP. | |||
inbound stream count: the number of streams the peer endpoint has | inbound stream count: the number of streams the peer endpoint has | |||
requested with this association (this might not be the same number | requested with this association (this might not be the same number | |||
as 'outbound stream count'). | as 'outbound stream count'). | |||
skipping to change at page 130, line 42 ¶ | skipping to change at line 6002 ¶ | |||
association id: local handle to the SCTP association. | association id: local handle to the SCTP association. | |||
12. Security Considerations | 12. Security Considerations | |||
12.1. Security Objectives | 12.1. Security Objectives | |||
As a common transport protocol designed to reliably carry time- | As a common transport protocol designed to reliably carry time- | |||
sensitive user messages, such as billing or signaling messages for | sensitive user messages, such as billing or signaling messages for | |||
telephony services, between two networked endpoints, SCTP has the | telephony services, between two networked endpoints, SCTP has the | |||
following security objectives. | following security objectives: | |||
* availability of reliable and timely data transport services | * availability of reliable and timely data transport services | |||
* integrity of the user-to-user information carried by SCTP | * integrity of the user-to-user information carried by SCTP | |||
12.2. SCTP Responses to Potential Threats | 12.2. SCTP Responses to Potential Threats | |||
SCTP could potentially be used in a wide variety of risk situations. | SCTP could potentially be used in a wide variety of risk situations. | |||
It is important for operators of systems running SCTP to analyze | It is important for operators of systems running SCTP to analyze | |||
their particular situations and decide on the appropriate counter- | their particular situations and decide on the appropriate counter- | |||
skipping to change at page 131, line 36 ¶ | skipping to change at line 6039 ¶ | |||
additional integrity protection is required. If this additional | additional integrity protection is required. If this additional | |||
protection were provided in the application layer, the SCTP header | protection were provided in the application layer, the SCTP header | |||
would remain vulnerable to deliberate integrity attacks. While the | would remain vulnerable to deliberate integrity attacks. While the | |||
existing SCTP mechanisms for detection of packet replays are | existing SCTP mechanisms for detection of packet replays are | |||
considered sufficient for normal operation, stronger protections are | considered sufficient for normal operation, stronger protections are | |||
needed to protect SCTP when the operating environment contains | needed to protect SCTP when the operating environment contains | |||
significant risk of deliberate attacks from a sophisticated | significant risk of deliberate attacks from a sophisticated | |||
adversary. | adversary. | |||
The SCTP Authentication extension SCTP-AUTH [RFC4895] MAY be used | The SCTP Authentication extension SCTP-AUTH [RFC4895] MAY be used | |||
when the threat environment requires stronger integrity protections, | when the threat environment requires stronger integrity protections | |||
but does not require confidentiality. | but does not require confidentiality. | |||
12.2.3. Protecting Confidentiality | 12.2.3. Protecting Confidentiality | |||
In most cases, the risk of breach of confidentiality applies to the | In most cases, the risk of breach of confidentiality applies to the | |||
signaling data payload, not to the SCTP or lower-layer protocol | signaling data payload, not to the SCTP or lower-layer protocol | |||
overheads. If that is true, encryption of the SCTP user data only | overheads. If that is true, encryption of the SCTP user data only | |||
might be considered. As with the supplementary checksum service, | might be considered. As with the supplementary checksum service, | |||
user data encryption MAY be performed by the SCTP user application. | user data encryption MAY be performed by the SCTP user application. | |||
[RFC6083] MAY be used for this. Alternately, the user application | [RFC6083] MAY be used for this. Alternately, the user application | |||
MAY use an implementation-specific API to request that the IP | MAY use an implementation-specific API to request that the IP | |||
Encapsulating Security Payload (ESP) [RFC4303] be used to provide | Encapsulating Security Payload (ESP) [RFC4303] be used to provide | |||
confidentiality and integrity. | confidentiality and integrity. | |||
Particularly for mobile users, the requirement for confidentiality | Particularly for mobile users, the requirement for confidentiality | |||
might include the masking of IP addresses and ports. In this case, | might include the masking of IP addresses and ports. In this case, | |||
ESP SHOULD be used instead of application-level confidentiality. If | ESP SHOULD be used instead of application-level confidentiality. If | |||
ESP is used to protect confidentiality of SCTP traffic, an ESP | ESP is used to protect confidentiality of SCTP traffic, an ESP | |||
cryptographic transform that includes cryptographic integrity | cryptographic transform that includes cryptographic integrity | |||
protection MUST be used, because if there is a confidentiality threat | protection MUST be used, because, if there is a confidentiality | |||
there will also be a strong integrity threat. | threat, there will also be a strong integrity threat. | |||
Regardless of where confidentiality is provided, the Internet Key | Regardless of where confidentiality is provided, the Internet Key | |||
Exchange Protocol version 2 (IKEv2) [RFC7296] SHOULD be used for key | Exchange Protocol version 2 (IKEv2) [RFC7296] SHOULD be used for key | |||
management of ESP. | management of ESP. | |||
Operators might consult [RFC4301] for more information on the | Operators might consult [RFC4301] for more information on the | |||
security services available at and immediately above the Internet | security services available at and immediately above the Internet | |||
Protocol layer. | Protocol layer. | |||
12.2.4. Protecting against Blind Denial-of-Service Attacks | 12.2.4. Protecting against Blind Denial-of-Service Attacks | |||
skipping to change at page 133, line 7 ¶ | skipping to change at line 6105 ¶ | |||
acceptance of new work. | acceptance of new work. | |||
* identification and removal of duplicate or stale queued requests | * identification and removal of duplicate or stale queued requests | |||
for service. | for service. | |||
* not responding to unexpected packets sent to non-unicast | * not responding to unexpected packets sent to non-unicast | |||
addresses. | addresses. | |||
Network equipment is expected to be capable of generating an alarm | Network equipment is expected to be capable of generating an alarm | |||
and log if a suspicious increase in traffic occurs. The log provides | and log if a suspicious increase in traffic occurs. The log provides | |||
information such as the identity of the incoming link and source | information, such as the identity of the incoming link and source | |||
address(es) used, which will help the network or SCTP system operator | address(es) used, which will help the network or SCTP system operator | |||
to take protective measures. Procedures are expected to be in place | to take protective measures. Procedures are expected to be in place | |||
for the operator to act on such alarms if a clear pattern of abuse | for the operator to act on such alarms if a clear pattern of abuse | |||
emerges. | emerges. | |||
The design of SCTP is resistant to flooding attacks, particularly in | 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 | 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 | commitment of resources at the responding SCTP node until the | |||
handshake is completed, and its use of a Verification Tag to prevent | handshake is completed, and its use of a Verification Tag to prevent | |||
insertion of extraneous packets into the flow of an established | insertion of extraneous packets into the flow of an established | |||
skipping to change at page 133, line 49 ¶ | skipping to change at line 6147 ¶ | |||
* by deliberately allowing the impersonation to be detected, thereby | * by deliberately allowing the impersonation to be detected, thereby | |||
provoking counter-measures that cause the impersonated node to be | provoking counter-measures that cause the impersonated node to be | |||
locked out of the target SCTP node. | locked out of the target SCTP node. | |||
* by interfering with an established association by inserting | * by interfering with an established association by inserting | |||
extraneous content such as a SHUTDOWN chunk. | extraneous content such as a SHUTDOWN chunk. | |||
SCTP reduces the risk of blind masquerade attacks through IP spoofing | SCTP reduces the risk of blind masquerade attacks through IP spoofing | |||
by use of the four-way startup handshake. Because the initial | by use of the four-way startup handshake. Because the initial | |||
exchange is memory-less, no lockout mechanism is triggered by blind | exchange is memoryless, no lockout mechanism is triggered by blind | |||
masquerade attacks. In addition, the packet containing the INIT ACK | masquerade attacks. In addition, the packet containing the INIT ACK | |||
chunk with the State Cookie is transmitted back to the IP address | chunk with the State Cookie is transmitted back to the IP address | |||
from which it received the packet containing the INIT chunk. Thus, | from which it received the packet containing the INIT chunk. Thus, | |||
the attacker would not receive the INIT ACK chunk containing the | the attacker would not receive the INIT ACK chunk containing the | |||
State Cookie. SCTP protects against insertion of extraneous packets | State Cookie. SCTP protects against insertion of extraneous packets | |||
into the flow of an established association by use of the | into the flow of an established association by use of the | |||
Verification Tag. | Verification Tag. | |||
Logging of received INIT chunks and abnormalities such as unexpected | Logging of received INIT chunks and abnormalities, such as unexpected | |||
INIT ACK chunks might be considered as a way to detect patterns of | INIT ACK chunks, might be considered as a way to detect patterns of | |||
hostile activity. However, the potential usefulness of such logging | hostile activity. However, the potential usefulness of such logging | |||
has to be weighed against the increased SCTP startup processing it | has to be weighed against the increased SCTP startup processing it | |||
implies, rendering the SCTP node more vulnerable to flooding attacks. | implies, rendering the SCTP node more vulnerable to flooding attacks. | |||
Logging is pointless without the establishment of operating | Logging is pointless without the establishment of operating | |||
procedures to review and analyze the logs on a routine basis. | procedures to review and analyze the logs on a routine basis. | |||
12.2.4.3. Improper Monopolization of Services | 12.2.4.3. Improper Monopolization of Services | |||
Attacks under this heading are performed openly and legitimately by | Attacks under this heading are performed openly and legitimately by | |||
the attacker. They are directed against fellow users of the target | the attacker. They are directed against fellow users of the target | |||
SCTP node or of the shared resources between the attacker and the | SCTP node or of the shared resources between the attacker and the | |||
target node. Possible attacks include the opening of a large number | target node. Possible attacks include the opening of a large number | |||
of associations between the attacker's node and the target, or | of associations between the attacker's node and the target or | |||
transfer of large volumes of information within a legitimately | transfer of large volumes of information within a legitimately | |||
established association. | established association. | |||
Policy limits are expected to be placed on the number of associations | Policy limits are expected to be placed on the number of associations | |||
per adjoining SCTP node. SCTP user applications are expected to be | per adjoining SCTP node. SCTP user applications are expected to be | |||
capable of detecting large volumes of illegitimate or "no-op" | capable of detecting large volumes of illegitimate or "no-op" | |||
messages within a given association and either logging or terminating | messages within a given association and either logging or terminating | |||
the association as a result, based on local policy. | the association as a result, based on local policy. | |||
12.3. SCTP Interactions with Firewalls | 12.3. SCTP Interactions with Firewalls | |||
skipping to change at page 134, line 46 ¶ | skipping to change at line 6193 ¶ | |||
fragment of a fragmented SCTP packet and unambiguously determine | fragment of a fragmented SCTP packet and unambiguously determine | |||
whether it corresponds to an INIT chunk (for further information, | whether it corresponds to an INIT chunk (for further information, | |||
please refer to [RFC1858]). Accordingly, we stress the requirements, | please refer to [RFC1858]). Accordingly, we stress the requirements, | |||
as stated in Section 3.1, that (1) an INIT chunk MUST NOT be bundled | as stated in Section 3.1, that (1) an INIT chunk MUST NOT be bundled | |||
with any other chunk in a packet and (2) a packet containing an INIT | with any other chunk in a packet and (2) a packet containing an INIT | |||
chunk MUST have a zero Verification Tag. The receiver of an INIT | chunk MUST have a zero Verification Tag. The receiver of an INIT | |||
chunk MUST silently discard the INIT chunk and all further chunks if | chunk MUST silently discard the INIT chunk and all further chunks if | |||
the INIT chunk is bundled with other chunks or the packet has a non- | the INIT chunk is bundled with other chunks or the packet has a non- | |||
zero Verification Tag. | zero Verification Tag. | |||
12.4. Protection of Non-SCTP-Capable Hosts | 12.4. Protection of Non-SCTP-capable Hosts | |||
To provide a non-SCTP-capable host with the same level of protection | To provide a non-SCTP-capable host with the same level of protection | |||
against attacks as for SCTP-capable ones, all SCTP implementations | against attacks as for SCTP-capable ones, all SCTP implementations | |||
MUST implement the ICMP handling described in Section 10. | MUST implement the ICMP handling described in Section 10. | |||
When an SCTP implementation receives a packet containing multiple | When an SCTP implementation receives a packet containing multiple | |||
control or DATA chunks and the processing of the packet would result | control or DATA chunks and the processing of the packet would result | |||
in sending multiple chunks in response, the sender of the response | in sending multiple chunks in response, the sender of the response | |||
chunk(s) MUST NOT send more than one packet containing chunks other | chunk(s) MUST NOT send more than one packet containing chunks other | |||
than DATA chunks. This requirement protects the network for | than DATA chunks. This requirement protects the network for | |||
triggering a packet burst in response to a single packet. If | triggering a packet burst in response to a single packet. If | |||
bundling is supported, multiple response chunks that fit into a | bundling is supported, multiple response chunks that fit into a | |||
single packet MAY be bundled together into one single response | single packet MAY be bundled together into one single response | |||
packet. If bundling is not supported, then the sender MUST NOT send | packet. If bundling is not supported, then the sender MUST NOT send | |||
more than one response chunk and MUST discard all other responses. | 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 | Note that this rule does not apply to a SACK chunk, since a SACK | |||
chunk is, in itself, a response to DATA chunks and a SACK chunk does | chunk is, in itself, a response to DATA chunks, and a SACK chunk does | |||
not require a response of more DATA chunks. | not require a response of more DATA chunks. | |||
An SCTP implementation MUST abort the association if it receives a | An SCTP implementation MUST abort the association if it receives a | |||
SACK chunk acknowledging a TSN that has not been sent. | SACK chunk acknowledging a TSN that has not been sent. | |||
An SCTP implementation that receives an INIT chunk that would require | An SCTP implementation that receives an INIT chunk that would require | |||
a large packet in response, due to the inclusion of multiple | a large packet in response, due to the inclusion of multiple | |||
"Unrecognized Parameter" parameters, MAY (at its discretion) elect to | "Unrecognized Parameter" parameters, MAY (at its discretion) elect to | |||
omit some or all of the "Unrecognized Parameter" parameters to reduce | omit some or all of the "Unrecognized Parameter" parameters to reduce | |||
the size of the INIT ACK chunk. Due to a combination of the size of | the size of the INIT ACK chunk. Due to a combination of the size of | |||
skipping to change at page 136, line 4 ¶ | skipping to change at line 6244 ¶ | |||
This section details a set of parameters that are expected to be | This section details a set of parameters that are expected to be | |||
contained within the TCB for an implementation. This section is for | contained within the TCB for an implementation. This section is for | |||
illustrative purposes and is not considered to be requirements on an | illustrative purposes and is not considered to be requirements on an | |||
implementation or as an exhaustive list of all parameters inside an | implementation or as an exhaustive list of all parameters inside an | |||
SCTP TCB. Each implementation might need its own additional | SCTP TCB. Each implementation might need its own additional | |||
parameters for optimization. | parameters for optimization. | |||
14.1. Parameters Necessary for the SCTP Instance | 14.1. Parameters Necessary for the SCTP Instance | |||
Associations: A list of current associations and mappings to the | Associations: A list of current associations and mappings to the | |||
data consumers for each association. This might be in the form of | data consumers for each association. This might be in | |||
a hash table or other implementation-dependent structure. The | the form of a hash table or other implementation- | |||
data consumers might be process identification information such as | dependent structure. The data consumers might be | |||
file descriptors, named pipe pointer, or table pointers dependent | process identification information, such as file | |||
on how SCTP is implemented. | 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. | Secret Key: A secret key used by this endpoint to compute the MAC. | |||
This SHOULD be a cryptographic quality random number with a | This SHOULD be a cryptographic quality random number | |||
sufficient length. Discussion in [RFC4086] can be helpful in | with a sufficient length. Discussion in [RFC4086] can | |||
selection of the key. | be helpful in selection of the key. | |||
Address List: The list of IP addresses that this instance has bound. | 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 | This information is passed to one's peer(s) in INIT | |||
chunks. | and INIT ACK chunks. | |||
SCTP Port: The local SCTP port number to which the endpoint is | SCTP Port: The local SCTP port number to which the endpoint is | |||
bound. | bound. | |||
14.2. Parameters Necessary per Association (i.e., the TCB) | 14.2. Parameters Necessary per Association (i.e., the TCB) | |||
Peer Verification Tag: Tag value to be sent in every packet and is | Peer Verification Tag: Tag value to be sent in every packet and is | |||
received in the INIT or INIT ACK chunk. | received in the INIT or INIT ACK chunk. | |||
My Verification Tag: Tag expected in every inbound packet and sent | My Verification Tag: Tag expected in every inbound packet and sent | |||
in the INIT or INIT ACK chunk. | in the INIT or INIT ACK chunk. | |||
State: COOKIE-WAIT, COOKIE-ECHOED, ESTABLISHED, SHUTDOWN-PENDING, | State: COOKIE-WAIT, COOKIE-ECHOED, ESTABLISHED, SHUTDOWN- | |||
SHUTDOWN-SENT, SHUTDOWN-RECEIVED, SHUTDOWN-ACK-SENT. | PENDING, SHUTDOWN-SENT, SHUTDOWN-RECEIVED, SHUTDOWN- | |||
ACK-SENT. | ||||
Note: No "CLOSED" state is illustrated since if a association is | Note: No "CLOSED" state is illustrated, since, if an | |||
"CLOSED" its TCB SHOULD be removed. | association is "CLOSED", its TCB SHOULD be removed. | |||
Peer Transport Address List: A list of SCTP transport addresses to | Peer Transport Address List: A list of SCTP transport addresses to | |||
which the peer is bound. This information is derived from the | which the peer is bound. This information is derived | |||
INIT or INIT ACK chunk and is used to associate an inbound packet | from the INIT or INIT ACK chunk and is used to | |||
with a given association. Normally, this information is hashed or | associate an inbound packet with a given association. | |||
keyed for quick lookup and access of the TCB. | Normally, this information is hashed or keyed for | |||
quick lookup and access of the TCB. | ||||
Primary Path: This is the current primary destination transport | Primary Path: This is the current primary destination transport | |||
address of the peer endpoint. It might also specify a source | address of the peer endpoint. It might also specify a | |||
transport address on this endpoint. | source transport address on this endpoint. | |||
Overall Error Count: The overall association error count. | Overall Error Count: The overall association error count. | |||
Overall Error Threshold: The threshold for this association that if | Overall Error Threshold: The threshold for this association that, if | |||
the Overall Error Count reaches will cause this association to be | the Overall Error Count reaches, will cause this | |||
torn down. | association to be torn down. | |||
Peer Rwnd: Current calculated value of the peer's rwnd. | Peer Rwnd: Current calculated value of the peer's rwnd. | |||
Next TSN: The next TSN number to be assigned to a new DATA chunk. | Next TSN: The next TSN number to be assigned to a new DATA | |||
This is sent in the INIT or INIT ACK chunk to the peer and | chunk. This is sent in the INIT or INIT ACK chunk to | |||
incremented each time a DATA chunk is assigned a TSN (normally | the peer and incremented each time a DATA chunk is | |||
just prior to transmit or during fragmentation). | assigned a TSN (normally, just prior to transmit or | |||
during fragmentation). | ||||
Last Rcvd TSN: This is the last TSN received in sequence. This | Last Rcvd TSN: This is the last TSN received in sequence. This | |||
value is set initially by taking the peer's initial TSN, received | value is set initially by taking the peer's Initial | |||
in the INIT or INIT ACK chunk, and subtracting one from it. | TSN, received in the INIT or INIT ACK chunk, and | |||
subtracting one from it. | ||||
Mapping Array: An array of bits or bytes indicating which out-of- | Mapping Array: An array of bits or bytes indicating which out-of- | |||
order TSNs have been received (relative to the Last Rcvd TSN). If | order TSNs have been received (relative to the Last | |||
no gaps exist, i.e., no out-of-order packets have been received, | Rcvd TSN). If no gaps exist, i.e., no out-of-order | |||
this array will be set to all zero. This structure might be in | packets have been received, this array will be set to | |||
the form of a circular buffer or bit array. | all zero. This structure might be in the form of a | |||
circular buffer or bit array. | ||||
Ack State: This flag indicates if the next received packet is to be | Ack State: This flag indicates if the next received packet is to | |||
responded to with a SACK chunk. This is initialized to 0. When a | be responded to with a SACK chunk. This is | |||
packet is received it is incremented. If this value reaches 2 or | initialized to 0. When a packet is received, it is | |||
more, a SACK chunk is sent and the value is reset to 0. Note: | incremented. If this value reaches 2 or more, a SACK | |||
This is used only when no DATA chunks are received out of order. | chunk is sent and the value is reset to 0. Note: This | |||
When DATA chunks are out of order, SACK chunks are not delayed | is used only when no DATA chunks are received out of | |||
(see Section 6). | order. When DATA chunks are out of order, SACK chunks | |||
are not delayed (see Section 6). | ||||
Inbound Streams: An array of structures to track the inbound | Inbound Streams: An array of structures to track the inbound | |||
streams, normally including the next sequence number expected and | streams, normally including the next sequence number | |||
possibly the stream number. | expected and possibly the stream number. | |||
Outbound Streams: An array of structures to track the outbound | Outbound Streams: An array of structures to track the outbound | |||
streams, normally including the next sequence number to be sent on | streams, normally including the next sequence number | |||
the stream. | to be sent on the stream. | |||
Reasm Queue: A reassembly queue. | Reasm Queue: A reassembly queue. | |||
Receive Buffer: A buffer to store received user data which has not | Receive Buffer: A buffer to store received user data that has not | |||
been delivered to the upper layer. | been delivered to the upper layer. | |||
Local Transport Address List: The list of local IP addresses bound | Local Transport Address List: The list of local IP addresses bound | |||
in to this association. | in to this association. | |||
Association Maximum DATA Chunk Size: The smallest Path Maximum DATA | Association Maximum DATA Chunk Size: The smallest Path Maximum DATA | |||
Chunk Size of all destination addresses. | Chunk Size of all destination addresses. | |||
14.3. Per Transport Address Data | 14.3. Per Transport Address Data | |||
For each destination transport address in the peer's address list | For each destination transport address in the peer's address list | |||
derived from the INIT or INIT ACK chunk, a number of data elements | derived from the INIT or INIT ACK chunk, a number of data elements | |||
need to be maintained including: | need to be maintained, including: | |||
Error Count: The current error count for this destination. | Error Count: The current error count for this destination. | |||
Error Threshold: Current error threshold for this destination, i.e., | Error Threshold: Current error threshold for this destination, i.e., | |||
what value marks the destination down if error count reaches this | what value marks the destination down if error count | |||
value. | reaches this value. | |||
cwnd: The current congestion window. | cwnd: The current congestion window. | |||
ssthresh: The current ssthresh value. | ssthresh: The current ssthresh value. | |||
RTO: The current retransmission timeout value. | RTO: The current retransmission timeout value. | |||
SRTT: The current smoothed round-trip time. | SRTT: The current smoothed round-trip time. | |||
RTTVAR: The current RTT variation. | RTTVAR: The current RTT variation. | |||
partial bytes acked: The tracking method for increase of cwnd when | partial bytes acked: The tracking method for increase of cwnd when | |||
in congestion avoidance mode (see Section 7.2.2). | in congestion avoidance mode (see Section 7.2.2). | |||
state: The current state of this destination, i.e., DOWN, UP, ALLOW- | state: The current state of this destination, i.e., DOWN, UP, | |||
HEARTBEAT, NO-HEARTBEAT, etc. | ALLOW-HEARTBEAT, NO-HEARTBEAT, etc. | |||
PMTU: The current known PMTU. | PMTU: The current known PMTU. | |||
PMDCS: The current known PMDCS. | PMDCS: The current known PMDCS. | |||
Per Destination Timer: A timer used by each destination. | Per Destination Timer: A timer used by each destination. | |||
RTO-Pending: A flag used to track if one of the DATA chunks sent to | 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 | this address is currently being used to compute an | |||
flag is 0, the next DATA chunk sent to this destination is | RTT. If this flag is 0, the next DATA chunk sent to | |||
expected to be used to compute an RTT and this flag is expected to | this destination is expected to be used to compute an | |||
be set. Every time the RTT calculation completes (i.e., the DATA | RTT and this flag is expected to be set. Every time | |||
chunk is acknowledged), clear this flag. | the RTT calculation completes (i.e., the DATA chunk is | |||
acknowledged), clear this flag. | ||||
last-time: The time to which this destination was last sent. This | last-time: The time to which this destination was last sent. | |||
can used be to determine if the sending of a HEARTBEAT chunk is | This can be used to determine if the sending of a | |||
needed. | HEARTBEAT chunk is needed. | |||
14.4. General Parameters Needed | 14.4. General Parameters Needed | |||
Out Queue: A queue of outbound DATA chunks. | Out Queue: A queue of outbound DATA chunks. | |||
In Queue: A queue of inbound DATA chunks. | In Queue: A queue of inbound DATA chunks. | |||
15. IANA Considerations | 15. IANA Considerations | |||
This document defines five registries that IANA maintains: | This document defines five registries that IANA maintains: | |||
skipping to change at page 139, line 26 ¶ | skipping to change at line 6410 ¶ | |||
* through definition of additional chunk flags, | * through definition of additional chunk flags, | |||
* through definition of additional parameter types, | * through definition of additional parameter types, | |||
* through definition of additional cause codes within ERROR chunks, | * through definition of additional cause codes within ERROR chunks, | |||
or | or | |||
* through definition of additional payload protocol identifiers. | * through definition of additional payload protocol identifiers. | |||
IANA is requested to perform the following updates for the above five | IANA has performed the following updates for the above five | |||
registries: | registries: | |||
* In the Chunk Types Registry replace in the Reference section the | * In the "Chunk Types" registry, IANA has replaced the registry | |||
reference to [RFC4960] and [RFC6096] by a reference to this | reference to [RFC4960] and [RFC6096] with a reference to this | |||
document. | document. | |||
Replace in the Notes section the reference to Section 3.2 of | In addition, in the Notes section, the reference to Section 3.2 of | |||
[RFC6096] by a reference to Section 15.2 of this document. | [RFC6096] has been updated with a reference to Section 15.2 of | |||
this document. | ||||
Finally replace each reference to [RFC4960] by a reference to this | Finally, each reference to [RFC4960] has been replaced with a | |||
document for the following chunk types: | reference to this document for the following chunk types: | |||
- Payload Data (DATA) | - Payload Data (DATA) | |||
- Initiation (INIT) | - Initiation (INIT) | |||
- Initiation Acknowledgement (INIT ACK) | - Initiation Acknowledgement (INIT ACK) | |||
- Selective Acknowledgement (SACK) | - Selective Acknowledgement (SACK) | |||
- Heartbeat Request (HEARTBEAT) | - Heartbeat Request (HEARTBEAT) | |||
skipping to change at page 140, line 4 ¶ | skipping to change at line 6437 ¶ | |||
- Initiation Acknowledgement (INIT ACK) | - Initiation Acknowledgement (INIT ACK) | |||
- Selective Acknowledgement (SACK) | - Selective Acknowledgement (SACK) | |||
- Heartbeat Request (HEARTBEAT) | - Heartbeat Request (HEARTBEAT) | |||
- Heartbeat Acknowledgement (HEARTBEAT ACK) | - Heartbeat Acknowledgement (HEARTBEAT ACK) | |||
- Abort (ABORT) | - Abort (ABORT) | |||
- Shutdown (SHUTDOWN) | - Shutdown (SHUTDOWN) | |||
- Shutdown Acknowledgement (SHUTDOWN ACK) | - Shutdown Acknowledgement (SHUTDOWN ACK) | |||
- Operation Error (ERROR) | - Operation Error (ERROR) | |||
- State Cookie (COOKIE ECHO) | - State Cookie (COOKIE ECHO) | |||
- Cookie Acknowledgement (COOKIE ACK) | - Cookie Acknowledgement (COOKIE ACK) | |||
- Reserved for Explicit Congestion Notification Echo (ECNE) | - Reserved for Explicit Congestion Notification Echo (ECNE) | |||
- Reserved for Congestion Window Reduced (CWR) | - Reserved for Congestion Window Reduced (CWR) | |||
- Shutdown Complete (SHUTDOWN COMPLETE) | - Shutdown Complete (SHUTDOWN COMPLETE) | |||
- Reserved for IETF-defined Chunk Extensions | - Reserved for IETF-defined Chunk Extensions | |||
* In the Chunk Parameter Types Registry replace in the Reference | * In the "Chunk Parameter Types" registry, IANA has replaced the | |||
section the reference to [RFC4960] by a reference to this | registry reference to [RFC4960] with a reference to this document. | |||
document. | ||||
Replace each reference to [RFC4960] by a reference to this | IANA has changed the name of the "Unrecognized Parameters" chunk | |||
document for the following chunk parameter types: | parameter type to "Unrecognized Parameter" in the "Chunk Parameter | |||
Types" registry. | ||||
In addition, each reference to [RFC4960] has been replaced with a | ||||
reference to this document for the following chunk parameter | ||||
types: | ||||
- Heartbeat Info | - Heartbeat Info | |||
- IPv4 Address | - IPv4 Address | |||
- IPv6 Address | - IPv6 Address | |||
- State Cookie | - State Cookie | |||
- Unrecognized Parameters | - Unrecognized Parameter | |||
- Cookie Preservative | - Cookie Preservative | |||
- Host Name Address | - Host Name Address | |||
- Supported Address Types | - Supported Address Types | |||
Add a reference to this document for the following chunk parameter | IANA has added a reference to this document for the following | |||
type: | chunk parameter type: | |||
- Reserved for ECN Capable (0x8000) | - Reserved for ECN Capable (0x8000) | |||
* In the Chunk Flags Registry replace in the Reference section the | Also, IANA has added the value 65535 to be reserved for IETF- | |||
reference to [RFC6096] by a reference to this document. | defined extensions. | |||
Replace each reference to [RFC4960] by a reference to this | * In the "Chunk Flags" registry, IANA replaced the registry | |||
document for the following DATA chunk flags: | reference to [RFC6096] with a reference to this document. | |||
In addition, each reference to [RFC4960] has been replaced with a | ||||
reference to this document for the following DATA chunk flags: | ||||
- E bit | - E bit | |||
- B bit | - B bit | |||
- U bit | - U bit | |||
Replace each reference to [RFC4960] by a reference to this | IANA has also replaced the reference to [RFC7053] with a reference | |||
document for the following ABORT chunk flags: | to this document for the following DATA chunk flag: | |||
- I bit | ||||
IANA has replaced the reference to [RFC4960] with a reference to | ||||
this document for the following ABORT chunk flag: | ||||
- T bit | - T bit | |||
Replace each reference to [RFC4960] by a reference to this | IANA has replaced the reference to [RFC4960] with a reference to | |||
document for the following SHUTDOWN COMPLETE chunk flags: | this document for the following SHUTDOWN COMPLETE chunk flag: | |||
- T bit | - T bit | |||
* In the Error Cause Codes Registry replace in the Reference section | * In the "Error Cause Codes" registry, IANA has replaced the | |||
the reference to [RFC6096] by a reference to this document. | registry reference to [RFC4960] with a reference to this document. | |||
Replace each reference to [RFC4960] by a reference to this | IANA has changed the name of the "User Initiated Abort" error | |||
document for the following cause codes: | cause to "User-Initiated Abort" and the name of the "Stale Cookie | |||
Error" error cause to "Stale Cookie" in the "Error Cause Codes" | ||||
registry. | ||||
In addition, each reference to [RFC4960] has been replaced with a | ||||
reference to this document for the following cause codes: | ||||
- Invalid Stream Identifier | - Invalid Stream Identifier | |||
- Missing Mandatory Parameter | - Missing Mandatory Parameter | |||
- Stale Cookie Error | - Stale Cookie | |||
- Out of Resource | - Out of Resource | |||
- Unresolvable Address | - Unresolvable Address | |||
- Unrecognized Chunk Type | - Unrecognized Chunk Type | |||
- Invalid Mandatory Parameter | - Invalid Mandatory Parameter | |||
- Unrecognized Parameters | - Unrecognized Parameters | |||
- No User Data | - No User Data | |||
- Cookie Received While Shutting Down | - Cookie Received While Shutting Down | |||
- Restart of an Association with New Addressess | - Restart of an Association with New Addresses | |||
Replace each reference to [RFC4460] by a reference to this | ||||
document for the following cause codes: | ||||
- User Initiated Abort | IANA has also replaced each reference to [RFC4460] with a | |||
reference to this document for the following cause codes: | ||||
- User-Initiated Abort | ||||
- Protocol Violation | - Protocol Violation | |||
* In the SCTP Payload Protocol Identifiers Registry replace in the | * In the "SCTP Payload Protocol Identifiers" registry, IANA has | |||
Reference section the reference to [RFC6096] by a reference to | replaced the registry reference to [RFC4960] with a reference to | |||
this document. | this document. | |||
Replace each reference to [RFC4960] by a reference to this | IANA has replaced the reference to [RFC4960] with a reference to | |||
document for the following SCTP payload protocol identifiers: | this document for the following SCTP payload protocol identifier: | |||
- Reserved by SCTP | - Reserved by SCTP | |||
SCTP requires that the IANA Port Numbers registry be opened for SCTP | SCTP requires that the IANA "Port Numbers" registry be opened for | |||
port registrations, Section 15.6 describes how. An IESG-appointed | SCTP port registrations; Section 15.6 describes how. An IESG- | |||
Expert Reviewer supports IANA in evaluating SCTP port allocation | appointed Expert Reviewer supports IANA in evaluating SCTP port | |||
requests. | allocation requests. | |||
IANA is requested to perform the following update for the Port Number | In the "Service Name and Transport Protocol Port Number Registry", | |||
registry. Replace each reference to [RFC4960] by a reference to this | IANA has replaced each reference to [RFC4960] with a reference to | |||
document for the following SCTP port numbers: | this document for the following SCTP port numbers: | |||
* 9 (discard) | * 9 (discard) | |||
* 20 (ftp-data) | * 20 (ftp-data) | |||
* 21 (ftp) | * 21 (ftp) | |||
* 22 (ssh) | * 22 (ssh) | |||
* 80 (http) | * 80 (http) | |||
* 179 (bgp) | * 179 (bgp) | |||
* 443 (https) | * 443 (https) | |||
Furthermore, IANA is requested to replace in the HTTP Digest | Furthermore, in the "Hypertext Transfer Protocol (HTTP) Digest | |||
Algorithm Values registry the reference to Appendix B of [RFC4960] to | Algorithm Values" registry, IANA has replaced the reference to | |||
Appendix A of this document. | Appendix B of [RFC4960] with a reference to Appendix A of this | |||
document. | ||||
IANA is also requested to replace in the ONC RPC Netids registry, | In addition, in the "ONC RPC Netids (Standards Action)" registry, | |||
each of the reference to [RFC4960] by a reference to this document | IANA has replaced each reference to [RFC4960] with a reference to | |||
for the following netids: | this document for the following netids: | |||
* sctp | * sctp | |||
* sctp6 | * sctp6 | |||
IANA is finally requested to replace in the IPFIX Information | In the "IPFIX Information Elements" registry, IANA has replaced each | |||
Elements registry, each of the reference to [RFC4960] by a reference | reference to [RFC4960] with a reference to this document for the | |||
to this document for the following elements with the name: | following elements with the name: | |||
* sourceTransportPort | * sourceTransportPort | |||
* destinationTransportPort | * destinationTransportPort | |||
* collectorTransportPort | * collectorTransportPort | |||
* exporterTransportPort | * exporterTransportPort | |||
* postNAPTSourceTransportPort | * postNAPTSourceTransportPort | |||
skipping to change at page 144, line 5 ¶ | skipping to change at line 6645 ¶ | |||
d) A detailed procedural description of the use of the new chunk | d) A detailed procedural description of the use of the new chunk | |||
type within the operation of the protocol. | type within the operation of the protocol. | |||
The last chunk type (255) is reserved for future extension if | The last chunk type (255) is reserved for future extension if | |||
necessary. | necessary. | |||
For each new chunk type, IANA creates a registration table for the | For each new chunk type, IANA creates a registration table for the | |||
chunk flags of that type. The procedure for registering particular | chunk flags of that type. The procedure for registering particular | |||
chunk flags is described in Section 15.2. | chunk flags is described in Section 15.2. | |||
15.2. IETF Chunk Flags Registration | 15.2. IETF-Defined Chunk Flags Registration | |||
The assignment of new chunk flags is done through an RFC Required | The assignment of new chunk flags is done through an RFC Required | |||
action, as defined in [RFC8126]. Documentation for the chunk flags | action, as defined in [RFC8126]. Documentation for the chunk flags | |||
MUST contain the following information: | MUST contain the following information: | |||
a) A name for the new chunk flag. | a) A name for the new chunk flag. | |||
b) A detailed procedural description of the use of the new chunk | b) A detailed procedural description of the use of the new chunk | |||
flag within the operation of the protocol. It MUST be considered | flag within the operation of the protocol. It MUST be considered | |||
that implementations not supporting the flag will send 0 on | that implementations not supporting the flag will send 0 on | |||
transmit and just ignore it on receipt. | transmit and just ignore it on receipt. | |||
IANA selects a chunk flags value. This MUST be one of 0x01, 0x02, | IANA selects a chunk flags value. This MUST be one of 0x01, 0x02, | |||
0x04, 0x08, 0x10, 0x20, 0x40, or 0x80, which MUST be unique within | 0x04, 0x08, 0x10, 0x20, 0x40, or 0x80, which MUST be unique within | |||
the chunk flag values for the specific chunk type. | the chunk flag values for the specific chunk type. | |||
15.3. IETF-Defined Chunk Parameter Extension | 15.3. IETF-Defined Chunk Parameter Extension | |||
The assignment of new chunk parameter type codes is done through an | The assignment of new chunk parameter type codes is done through an | |||
IETF Review action as defined in [RFC8126]. Documentation of the | IETF Review action, as defined in [RFC8126]. Documentation of the | |||
chunk parameter MUST contain the following information: | chunk parameter MUST contain the following information: | |||
a) Name of the parameter type. | a) Name of the parameter type. | |||
b) Detailed description of the structure of the parameter field. | b) Detailed description of the structure of the parameter field. | |||
This structure MUST conform to the general Type-Length-Value | This structure MUST conform to the general Type-Length-Value | |||
format described in Section 3.2.1. | format described in Section 3.2.1. | |||
c) Detailed definition of each component of the parameter value. | c) Detailed definition of each component of the parameter value. | |||
d) Detailed description of the intended use of this parameter type, | d) Detailed description of the intended use of this parameter type | |||
and an indication of whether and under what circumstances | and an indication of whether and under what circumstances | |||
multiple instances of this parameter type can be found within the | multiple instances of this parameter type can be found within the | |||
same chunk. | same chunk. | |||
e) Each parameter type MUST be unique across all chunks. | e) Each parameter type MUST be unique across all chunks. | |||
15.4. IETF-Defined Additional Error Causes | 15.4. IETF-Defined Additional Error Causes | |||
Additional cause codes can be allocated in the range 11 to 65535 | Additional cause codes can be allocated through a Specification | |||
through a Specification Required action as defined in [RFC8126]. | Required action as defined in [RFC8126]. Provided documentation MUST | |||
Provided documentation MUST include the following information: | include the following information: | |||
a) Name of the error condition. | a) Name of the error condition. | |||
b) Detailed description of the conditions under which an SCTP | b) Detailed description of the conditions under which an SCTP | |||
endpoint issues an ERROR (or ABORT) chunk with this cause code. | endpoint issues an ERROR (or ABORT) chunk with this cause code. | |||
c) Expected action by the SCTP endpoint that receives an ERROR (or | c) Expected action by the SCTP endpoint that receives an ERROR (or | |||
ABORT) chunk containing this cause code. | ABORT) chunk containing this cause code. | |||
d) Detailed description of the structure and content of data fields | d) Detailed description of the structure and content of data fields | |||
that accompany this cause code. | that accompany this cause code. | |||
The initial word (32 bits) of a cause code parameter MUST conform to | The initial word (32 bits) of a cause code parameter MUST conform to | |||
the format shown in Section 3.3.10, i.e.: | the format shown in Section 3.3.10, that is: | |||
* first 2 bytes contain the cause code value | * first 2 bytes contain the cause code value | |||
* last 2 bytes contain the length of the cause parameter. | * last 2 bytes contain the length of the error cause. | |||
15.5. Payload Protocol Identifiers | 15.5. Payload Protocol Identifiers | |||
The assignment of payload protocol identifier is done using the First | The assignment of payload protocol identifiers is done using the | |||
Come First Served policy as defined in [RFC8126]. | First Come First Served policy, as defined in [RFC8126]. | |||
Except for value 0, which is reserved to indicate an unspecified | Except for value 0, which is reserved to indicate an unspecified | |||
payload protocol identifier in a DATA chunk, an SCTP implementation | payload protocol identifier in a DATA chunk, an SCTP implementation | |||
will not be responsible for standardizing or verifying any payload | will not be responsible for standardizing or verifying any payload | |||
protocol identifiers; An SCTP implementation simply receives the | protocol identifiers. An SCTP implementation simply receives the | |||
identifier from the upper layer and carries it with the corresponding | identifier from the upper layer and carries it with the corresponding | |||
payload data. | payload data. | |||
The upper layer, i.e., the SCTP user, SHOULD standardize any specific | 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 | protocol identifier with IANA if it is so desired. The use of any | |||
specific payload protocol identifier is out of the scope of this | specific payload protocol identifier is out of the scope of this | |||
specification. | specification. | |||
15.6. Port Numbers Registry | 15.6. Port Numbers Registry | |||
SCTP services can use contact port numbers to provide service to | SCTP services can use contact port numbers to provide service to | |||
unknown callers, as in TCP and UDP. An IESG-appointed expert | unknown callers, as in TCP and UDP. An IESG-appointed Expert | |||
reviewer supports IANA in evaluating SCTP port allocation requests, | Reviewer supports IANA in evaluating SCTP port allocation requests, | |||
according to the procedure defined in [RFC8126]. The details of this | according to the procedure defined in [RFC8126]. The details of this | |||
process are defined in [RFC6335]. | process are defined in [RFC6335]. | |||
16. Suggested SCTP Protocol Parameter Values | 16. Suggested SCTP Protocol Parameter Values | |||
The following protocol parameters are RECOMMENDED: | The following protocol parameters are RECOMMENDED: | |||
RTO.Initial: 1 second | RTO.Initial: 1 second | |||
RTO.Min: 1 second | RTO.Min: 1 second | |||
RTO.Max: 60 seconds | RTO.Max: 60 seconds | |||
Max.Burst: 4 | Max.Burst: 4 | |||
RTO.Alpha: 1/8 | RTO.Alpha: 1/8 | |||
RTO.Beta: 1/4 | RTO.Beta: 1/4 | |||
Valid.Cookie.Life: 60 seconds | Valid.Cookie.Life: 60 seconds | |||
Association.Max.Retrans: 10 attempts | Association.Max.Retrans: 10 attempts | |||
Path.Max.Retrans: 5 attempts (per destination address) | Path.Max.Retrans: 5 attempts (per destination address) | |||
Max.Init.Retransmits: 8 attempts | Max.Init.Retransmits: 8 attempts | |||
HB.interval: 30 seconds | HB.interval: 30 seconds | |||
HB.Max.Burst: 1 | HB.Max.Burst: 1 | |||
SACK.Delay: 200 milliseconds | SACK.Delay: 200 milliseconds | |||
Implementation Note: The SCTP implementation can allow ULP to | Implementation Note: The SCTP implementation can allow ULP to | |||
customize some of these protocol parameters (see Section 11). | customize some of these protocol parameters (see Section 11). | |||
'RTO.Min' SHOULD be set as described above in this section. | 'RTO.Min' SHOULD be set as described above in this section. | |||
17. Acknowledgements | 17. References | |||
An undertaking represented by this updated document is not a small | ||||
feat and represents the summation of the initial co-authors of | ||||
[RFC2960]: 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 [RFC2960]: | ||||
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 co-authors of [RFC4460]: I. Arias-Rodriguez, K. Poon, | ||||
and A. Caro. | ||||
Then add to these the efforts of all the subsequent seven SCTP | ||||
interoperability tests and those who commented on [RFC4460] 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, 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. | ||||
Furthermore, you have [RFC4960], and those who have commented upon | ||||
that including Alfred Hönes and Ronnie Sellars. | ||||
Then, add the co-author of [RFC8540]: Maksim Proshin. | ||||
And people who have commented on [RFC8540]: Pontus Andersson, Eric | ||||
W. Biederman, Cedric Bonnet, Spencer Dawkins, Gorry Fairhurst, | ||||
Benjamin Kaduk, Mirja Kühlewind, Peter Lei, Gyula Marosi, Lionel | ||||
Morand, Jeff Morriss, Tom Petch, Kacheong Poon, Julien Pourtet, Irene | ||||
Rüngeler, Michael Welzl, and Qiaobing Xie. | ||||
And finally the people who have provided comments for this document | ||||
including Gorry Fairhurst, Martin Duke, Benjamin Kaduk, Tero Kivinen, | ||||
Eliot Lear, Marcelo Ricardo Leitner, David Mandelberg, John Mattsson, | ||||
Claudio Porfiri, Maksim Proshin, Ines Robles, Timo Völker, Magnus | ||||
Westerlund, and Zhouming. | ||||
Our thanks cannot be adequately expressed to all of you who have | ||||
participated in the coding, testing, and updating process of this | ||||
document. All we can say is, Thank You! | ||||
18. Normative References | 17.1. Normative References | |||
[ITU.V42.1994] | [ITU.V42.1994] | |||
International Telecommunications Union, "Error-correcting | International Telecommunications Union, "Error-correcting | |||
Procedures for DCEs Using Asynchronous-to-Synchronous | Procedures for DCEs Using Asynchronous-to-Synchronous | |||
Conversion", ITU-T Recommendation V.42, 1994. | Conversion", ITU-T Recommendation V.42, 1994. | |||
[RFC1122] Braden, R., Ed., "Requirements for Internet Hosts - | [RFC1122] Braden, R., Ed., "Requirements for Internet Hosts - | |||
Communication Layers", STD 3, RFC 1122, | Communication Layers", STD 3, RFC 1122, | |||
DOI 10.17487/RFC1122, October 1989, | DOI 10.17487/RFC1122, October 1989, | |||
<https://www.rfc-editor.org/info/rfc1122>. | <https://www.rfc-editor.org/info/rfc1122>. | |||
skipping to change at page 149, line 43 ¶ | skipping to change at line 6846 ¶ | |||
[RFC8201] McCann, J., Deering, S., Mogul, J., and R. Hinden, Ed., | [RFC8201] McCann, J., Deering, S., Mogul, J., and R. Hinden, Ed., | |||
"Path MTU Discovery for IP version 6", STD 87, RFC 8201, | "Path MTU Discovery for IP version 6", STD 87, RFC 8201, | |||
DOI 10.17487/RFC8201, July 2017, | DOI 10.17487/RFC8201, July 2017, | |||
<https://www.rfc-editor.org/info/rfc8201>. | <https://www.rfc-editor.org/info/rfc8201>. | |||
[RFC8899] Fairhurst, G., Jones, T., Tüxen, M., Rüngeler, I., and T. | [RFC8899] Fairhurst, G., Jones, T., Tüxen, M., Rüngeler, I., and T. | |||
Völker, "Packetization Layer Path MTU Discovery for | Völker, "Packetization Layer Path MTU Discovery for | |||
Datagram Transports", RFC 8899, DOI 10.17487/RFC8899, | Datagram Transports", RFC 8899, DOI 10.17487/RFC8899, | |||
September 2020, <https://www.rfc-editor.org/info/rfc8899>. | September 2020, <https://www.rfc-editor.org/info/rfc8899>. | |||
19. Informative References | 17.2. Informative References | |||
[FALL96] Fall, K. and S. Floyd, "Simulation-based Comparisons of | [FALL96] Fall, K. and S. Floyd, "Simulation-based Comparisons of | |||
Tahoe, Reno, and SACK TCP", SIGCOM 99, V. 26, N. 3, | Tahoe, Reno, and SACK TCP", SIGCOM 99, V. 26, N. 3, pp | |||
pp 5-21, July 1996. | 5-21, July 1996. | |||
[SAVAGE99] Savage, S., Cardwell, N., Wetherall, D., and T. Anderson, | [SAVAGE99] Savage, S., Cardwell, N., Wetherall, D., and T. Anderson, | |||
"TCP Congestion Control with a Misbehaving Receiver", ACM | "TCP Congestion Control with a Misbehaving Receiver", ACM | |||
Computer Communications Review 29(5), October 1999. | Computer Communications Review 29(5), October 1999. | |||
[ALLMAN99] Allman, M. and V. Paxson, "On Estimating End-to-End | [ALLMAN99] Allman, M. and V. Paxson, "On Estimating End-to-End | |||
Network Path Properties", SIGCOM 99, 1999. | Network Path Properties", SIGCOM 99, October 1999. | |||
[WILLIAMS93] | [WILLIAMS93] | |||
Williams, R., "A PAINLESS GUIDE TO CRC ERROR DETECTION | Williams, R., "A PAINLESS GUIDE TO CRC ERROR DETECTION | |||
ALGORITHMS", SIGCOM 99, August 1993, | ALGORITHMS", SIGCOM 99, August 1993, | |||
<http://www.geocities.com/SiliconValley/Pines/8659/ | <https://archive.org/stream/PainlessCRC/crc_v3.txt>. | |||
crc.htm>. | ||||
[RFC0768] Postel, J., "User Datagram Protocol", STD 6, RFC 768, | [RFC0768] Postel, J., "User Datagram Protocol", STD 6, RFC 768, | |||
DOI 10.17487/RFC0768, August 1980, | DOI 10.17487/RFC0768, August 1980, | |||
<https://www.rfc-editor.org/info/rfc768>. | <https://www.rfc-editor.org/info/rfc768>. | |||
[RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | |||
RFC 793, DOI 10.17487/RFC0793, September 1981, | RFC 793, DOI 10.17487/RFC0793, September 1981, | |||
<https://www.rfc-editor.org/info/rfc793>. | <https://www.rfc-editor.org/info/rfc793>. | |||
[RFC1858] Ziemba, G., Reed, D., and P. Traina, "Security | [RFC1858] Ziemba, G., Reed, D., and P. Traina, "Security | |||
skipping to change at page 152, line 25 ¶ | skipping to change at line 6966 ¶ | |||
[RFC8540] Stewart, R., Tuexen, M., and M. Proshin, "Stream Control | [RFC8540] Stewart, R., Tuexen, M., and M. Proshin, "Stream Control | |||
Transmission Protocol: Errata and Issues in RFC 4960", | Transmission Protocol: Errata and Issues in RFC 4960", | |||
RFC 8540, DOI 10.17487/RFC8540, February 2019, | RFC 8540, DOI 10.17487/RFC8540, February 2019, | |||
<https://www.rfc-editor.org/info/rfc8540>. | <https://www.rfc-editor.org/info/rfc8540>. | |||
Appendix A. CRC32c Checksum Calculation | Appendix A. CRC32c Checksum Calculation | |||
We define a 'reflected value' as one that is the opposite of the | 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 | normal bit order of the machine. The 32-bit CRC (Cyclic Redundancy | |||
Check) is calculated as described for CRC32c and uses the polynomial | 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 | 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 | +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 [ITU.V42.1994], | computed using a procedure similar to ETHERNET CRC [ITU.V42.1994], | |||
modified to reflect transport-level usage. | modified to reflect transport-level usage. | |||
CRC computation uses polynomial division. A message bit-string M is | CRC computation uses polynomial division. A message bit-string M is | |||
transformed to a polynomial, M(X), and the CRC is calculated from | transformed to a polynomial, M(X), and the CRC is calculated from | |||
M(X) using polynomial arithmetic. | M(X) using polynomial arithmetic. | |||
When CRCs are used at the link layer, the polynomial is derived from | 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- | on-the-wire bit ordering: the first bit 'on the wire' is the high- | |||
order coefficient. Since SCTP is a transport-level protocol, it | order coefficient. Since SCTP is a transport-level protocol, it | |||
cannot know the actual serial-media bit ordering. Moreover, | cannot know the actual serial-media bit ordering. Moreover, | |||
different links in the path between SCTP endpoints can use different | different links in the path between SCTP endpoints can use different | |||
link-level bit orders. | link-level bit orders. | |||
A convention therefore is established for mapping SCTP transport | A convention therefore is established for mapping SCTP transport | |||
messages to polynomials for purposes of CRC computation. The bit- | messages to polynomials for purposes of CRC computation. The bit- | |||
ordering for mapping SCTP messages to polynomials is that bytes are | ordering for mapping SCTP messages to polynomials is that bytes are | |||
taken most-significant first, but within each byte, bits are taken | taken most-significant first, but, within each byte, bits are taken | |||
least-significant first. The first byte of the message provides the | least-significant first. The first byte of the message provides the | |||
eight highest coefficients. Within each byte, the least-significant | eight highest coefficients. Within each byte, the least-significant | |||
SCTP bit gives the most-significant polynomial coefficient within | SCTP bit gives the most-significant polynomial coefficient within | |||
that byte, and the most-significant SCTP bit is the least-significant | that byte, and the most-significant SCTP bit is the least-significant | |||
polynomial coefficient in that byte. (This bit ordering is sometimes | polynomial coefficient in that byte. (This bit ordering is sometimes | |||
called 'mirrored' or 'reflected' [WILLIAMS93].) CRC polynomials are | called 'mirrored' or 'reflected' [WILLIAMS93].) CRC polynomials are | |||
to be transformed back into SCTP transport-level byte values, using a | to be transformed back into SCTP transport-level byte values, using a | |||
consistent mapping. | consistent mapping. | |||
The SCTP transport-level CRC value can be calculated as follows: | The SCTP transport-level CRC value can be calculated as follows: | |||
* CRC input data are assigned to a byte stream, numbered from 0 to | * CRC input data is assigned to a byte stream, numbered from 0 to | |||
N-1. | N-1. | |||
* The transport-level byte stream is mapped to a polynomial value. | * 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 | An N-byte PDU with j bytes numbered 0 to N-1 is considered as | |||
coefficients of a polynomial M(x) of order 8*N-1, with bit 0 of | coefficients of a polynomial M(x) of order 8*N-1, with bit 0 of | |||
byte j being coefficient x^(8*(N-j)-8), and bit 7 of byte j being | byte j being coefficient x^(8*(N-j)-8) and bit 7 of byte j being | |||
coefficient x^(8*(N-j)-1). | coefficient x^(8*(N-j)-1). | |||
* The CRC remainder register is initialized with all 1s and the CRC | * The CRC remainder register is initialized with all 1s and the CRC | |||
is computed with an algorithm that simultaneously multiplies by | is computed with an algorithm that simultaneously multiplies by | |||
x^32 and divides by the CRC polynomial. | x^32 and divides by the CRC polynomial. | |||
* The polynomial is multiplied by x^32 and divided by G(x), the | * The polynomial is multiplied by x^32 and divided by G(x), the | |||
generator polynomial, producing a remainder R(x) of degree less | generator polynomial, producing a remainder R(x) of degree less | |||
than or equal to 31. | than or equal to 31. | |||
skipping to change at page 154, line 32 ¶ | skipping to change at line 7059 ¶ | |||
COOKIE ECHO chunks. These special-case exchanges represent small | COOKIE ECHO chunks. These special-case exchanges represent small | |||
packets and will minimize the effect of the checksum calculation. | packets and will minimize the effect of the checksum calculation. | |||
The following non-normative sample code is taken from an open-source | The following non-normative sample code is taken from an open-source | |||
CRC generator [WILLIAMS93], using the "mirroring" technique and | CRC generator [WILLIAMS93], using the "mirroring" technique and | |||
yielding a lookup table for SCTP CRC32c with 256 entries, each 32 | yielding a lookup table for SCTP CRC32c with 256 entries, each 32 | |||
bits wide. While neither especially slow nor especially fast, as | bits wide. While neither especially slow nor especially fast, as | |||
software table-lookup CRCs go, it has the advantage of working on | software table-lookup CRCs go, it has the advantage of working on | |||
both big-endian and little-endian CPUs, using the same (host-order) | both big-endian and little-endian CPUs, using the same (host-order) | |||
lookup tables, and using only the predefined ntohl() and htonl() | lookup tables, and using only the predefined ntohl() and htonl() | |||
operations. The code is somewhat modified from [WILLIAMS93], to | operations. The code is somewhat modified from [WILLIAMS93] to | |||
ensure portability between big-endian and little-endian | ensure portability between big-endian and little-endian | |||
architectures, use fixed sized types to allow portability between | architectures, use fixed-sized types to allow portability between | |||
32-bit and 64-bit platforms, and general C code improvements. (Note | 32-bit and 64-bit platforms, and use general C code improvements. | |||
that if the byte endian-ness of the target architecture is known to | (Note that, if the byte endian-ness of the target architecture is | |||
be little-endian, the final bit-reversal and byte-reversal steps can | known to be little endian, the final bit-reversal and byte-reversal | |||
be folded into a single operation.) | steps can be folded into a single operation.) | |||
<CODE BEGINS> | <CODE BEGINS> | |||
/****************************************************************/ | /****************************************************************/ | |||
/* Note: The definitions for Ross Williams's table generator */ | /* Note: The definitions for Ross Williams's table generator */ | |||
/* would be TB_WIDTH=4, TB_POLY=0x1EDC6F41, TB_REVER=TRUE. */ | /* would be TB_WIDTH=4, TB_POLY=0x1EDC6F41, TB_REVER=TRUE. */ | |||
/* For Mr. Williams's direct calculation code, use the settings */ | /* For Mr. Williams's direct calculation code, use the settings */ | |||
/* cm_width=32, cm_poly=0x1EDC6F41, cm_init=0xFFFFFFFF, */ | /* cm_width=32, cm_poly=0x1EDC6F41, cm_init=0xFFFFFFFF, */ | |||
/* cm_refin=TRUE, cm_refot=TRUE, cm_xorot=0x00000000. */ | /* cm_refin=TRUE, cm_refot=TRUE, cm_xorot=0x00000000. */ | |||
/****************************************************************/ | /****************************************************************/ | |||
skipping to change at page 159, line 34 ¶ | skipping to change at line 7302 ¶ | |||
/* save and zero checksum */ | /* save and zero checksum */ | |||
message = (SCTP_message *)buffer; | message = (SCTP_message *)buffer; | |||
original_crc32 = ntohl(message->common_header.checksum); | original_crc32 = ntohl(message->common_header.checksum); | |||
message->common_header.checksum = 0L; | message->common_header.checksum = 0L; | |||
crc32 = generate_crc32c(buffer, length); | crc32 = generate_crc32c(buffer, length); | |||
return ((original_crc32 == crc32) ? 1 : -1); | return ((original_crc32 == crc32) ? 1 : -1); | |||
} | } | |||
<CODE ENDS> | <CODE ENDS> | |||
Acknowledgements | ||||
An undertaking represented by this updated document is not a small | ||||
feat and represents the summation of the initial coauthors of | ||||
[RFC2960]: 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 [RFC2960]: | ||||
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 coauthors of [RFC4460]: I. Arias-Rodriguez, K. Poon, | ||||
and A. Caro. | ||||
Then, add to these the efforts of all the subsequent seven SCTP | ||||
interoperability tests and those who commented on [RFC4460], 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, 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 actually should have been a | ||||
coauthor of [RFC4460] 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. | ||||
Furthermore, you have [RFC4960] and those who have commented upon | ||||
that, including Alfred Hönes and Ronnie Sellars. | ||||
Then, add the coauthor of [RFC8540]: Maksim Proshin. | ||||
And people who have commented on [RFC8540]: Pontus Andersson, Eric | ||||
W. Biederman, Cedric Bonnet, Spencer Dawkins, Gorry Fairhurst, | ||||
Benjamin Kaduk, Mirja Kühlewind, Peter Lei, Gyula Marosi, Lionel | ||||
Morand, Jeff Morriss, Tom Petch, Kacheong Poon, Julien Pourtet, Irene | ||||
Rüngeler, Michael Welzl, and Qiaobing Xie. | ||||
And, finally, the people who have provided comments for this | ||||
document, including Gorry Fairhurst, Martin Duke, Benjamin Kaduk, | ||||
Tero Kivinen, Eliot Lear, Marcelo Ricardo Leitner, David Mandelberg, | ||||
John Preuß Mattsson, Claudio Porfiri, Maksim Proshin, Ines Robles, | ||||
Timo Völker, Magnus Westerlund, and Zhouming. | ||||
Our thanks cannot be adequately expressed to all of you who have | ||||
participated in the coding, testing, and updating process of this | ||||
document. All we can say is, Thank You! | ||||
Authors' Addresses | Authors' Addresses | |||
Randall R. Stewart | Randall R. Stewart | |||
Netflix, Inc. | Netflix, Inc. | |||
2455 Heritage Green Ave | 2455 Heritage Green Ave | |||
Davenport, FL 33837 | Davenport, FL 33837 | |||
United States | United States of America | |||
Email: randall@lakerest.net | Email: randall@lakerest.net | |||
Michael Tüxen | Michael Tüxen | |||
Münster University of Applied Sciences | Münster University of Applied Sciences | |||
Stegerwaldstrasse 39 | Stegerwaldstrasse 39 | |||
48565 Steinfurt | 48565 Steinfurt | |||
Germany | Germany | |||
Email: tuexen@fh-muenster.de | Email: tuexen@fh-muenster.de | |||
Karen E. E. Nielsen | Karen E. E. Nielsen | |||
Kamstrup A/S | Kamstrup A/S | |||
Industrivej 28 | Industrivej 28 | |||
DK-8660 Skanderborg | DK-8660 Skanderborg | |||
Denmark | Denmark | |||
Email: kee@kamstrup.com | Email: kee@kamstrup.com | |||
End of changes. 431 change blocks. | ||||
938 lines changed or deleted | 966 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |