ietf-corpus

rfc-9260

Stream Control Transmission Protocol

R. Stewart, M. Tüxen, K. Nielsen
date2022-06 streamIETF areawit wgtsvwg statusPROPOSED STANDARD pages133 canonicalhttps://www.rfc-editor.org/rfc/rfc9260 doi10.17487/RFC9260 errataview
This document describes the Stream Control Transmission Protocol (SCTP) and obsoletes RFC 4960. It incorporates the specification of the chunk flags registry from RFC 6096 and the specification of the I bit of DATA chunks from RFC 7053. Therefore, RFCs 6096 and 7053 are also obsoleted by this document. In addition, RFCs 4460 and 8540, which describe errata for SCTP, are obsoleted by this document. SCTP was originally designed to transport Public Switched Telephone Network (PSTN) signaling messages over IP networks. It is also suited to be used for other applications, for example, WebRTC. SCTP is a reliable transport protocol operating on top of a connectionless packet network, such as IP. It offers the following services to its users: The design of SCTP includes appropriate congestion avoidance behavior and resistance to flooding and masquerade attacks.

obsoletes

Extracted elements (31)

design-rationale §1.5.7

SCTP natively supports multi-homing: each endpoint may advertise multiple IP addresses during INIT/INIT ACK exchange, and the association spans all source/destination combinations. This provides network-level fault tolerance unavailable in TCP, at the cost of a broader association concept than a single TCP connection.

sctp, multipath

design-rationale §1.1

SCTP provides multiple independent streams within a single association to avoid head-of-line blocking: while one stream waits for the next in-sequence message, delivery from other streams proceeds unimpeded. This was a primary motivation over TCP for PSTN signaling transport.

sctp

design-rationale §1.5.1

SCTP uses a four-way handshake (INIT / INIT ACK with State Cookie / COOKIE ECHO / COOKIE ACK) rather than a three-way handshake, making the responder effectively stateless until the COOKIE ECHO is validated. This was chosen to provide protection against SYN-flood-style resource exhaustion attacks, similar to the mechanism described by Karn and Simpson in RFC 2522.

sctp, security

design-rationale §1.5.4

TSN-based acknowledgement is kept functionally separate from Stream Sequence Number-based ordered delivery so that reliable retransmission and sequenced stream delivery operate independently without blocking each other.

sctp

interoperability-note §3.3.2.1.2

Omitting IP Address parameters from INIT and INIT ACK chunks—so only the source IP of the IP datagram is used as the peer address—makes an SCTP association more likely to work correctly through Network Address Translation (NAT) devices.

sctp, nat

normative-requirement §3.3.2.1.2 MUST NOT

A sender MUST NOT use an IPv4-mapped IPv6 address in the IPv6 Address parameter (Type=6) and SHOULD instead use the IPv4 Address parameter (Type=5) for any IPv4 address.

sctp, ip

normative-requirement §1.6 MUST

All arithmetic on Transmission Sequence Numbers MUST be performed modulo 2^32. An endpoint SHOULD NOT transmit a DATA chunk with a TSN more than 2^31 - 1 above the beginning TSN of its current send window, as doing so causes TSN comparison problems.

sctp

normative-requirement §3 MUST

All integer fields in an SCTP packet MUST be transmitted in network byte order (big-endian) unless otherwise stated.

sctp

normative-requirement §3.2.2 MUST

Any time a COOKIE ECHO chunk is sent in a packet, it MUST be the first chunk in that packet.

sctp

normative-requirement §3.3.2 MUST

If the Initiate Tag in a received INIT chunk equals 0, the receiver MUST silently discard the packet. If a_rwnd is less than 1500, or OS or MIS equals 0, the receiver MUST discard the packet and SHOULD send an ABORT chunk using the Initiate Tag as the Verification Tag.

sctp, security

normative-requirement §3 MUST NOT

INIT, INIT ACK, and SHUTDOWN COMPLETE chunks MUST NOT be bundled with any other chunk in a single SCTP packet. All other chunks MAY be bundled provided the resulting packet does not exceed the PMTU.

sctp

normative-requirement §3.3.2.1.4 MUST NOT

The Host Name Address parameter (Type=11) is deprecated; senders of INIT or INIT ACK chunks MUST NOT include it. A receiver of an INIT or INIT ACK containing this parameter MUST send an ABORT chunk and MAY include an 'Unresolvable Address' error cause.

sctp

normative-requirement §3.3.1 MUST

The Payload Protocol Identifier field MUST be sent in every DATA chunk including fragmented ones; SCTP does not interpret this field, so the upper layer is responsible for host-to-network byte order conversion.

sctp

normative-requirement §3.1 MUST

The Verification Tag in the SCTP common header MUST be set to the Initiate Tag received from the peer during association setup. Three exceptions apply: INIT chunks MUST have a zero tag; SHUTDOWN COMPLETE with T-bit set copies the tag from the SHUTDOWN ACK packet; ABORT MAY copy the tag from the triggering packet.

sctp, security

normative-requirement §3.3.1 MUST

When a user message is fragmented, the TSNs assigned to its fragments MUST be strictly sequential, all fragments MUST carry the same Stream Sequence Number, and each fragment of an unordered message MUST have its U bit set to 1.

sctp

protocol-element §3.2

Chunk Type values 0–14 are assigned (DATA, INIT, INIT ACK, SACK, HEARTBEAT, HEARTBEAT ACK, ABORT, SHUTDOWN, SHUTDOWN ACK, ERROR, COOKIE ECHO, COOKIE ACK, reserved ECNE/CWR, SHUTDOWN COMPLETE). The high-order 2 bits of an unrecognized Chunk Type encode the action: 00=stop/discard, 01=stop/discard/report, 10=skip, 11=skip/report.

sctp

protocol-element §3.3.4

The SACK chunk (Type=3) acknowledges DATA chunks via a Cumulative TSN Ack, an Advertised Receiver Window Credit (a_rwnd), and zero or more Gap Ack Blocks identifying out-of-order TSNs received after a gap. Gap Ack Blocks SHOULD be isolated so that the TSN just before and after each block has not been received.

sctp, congestion

protocol-element §3.3.3.1.1

The State Cookie is a mandatory variable-length parameter (Type=7) in the INIT ACK that encodes all association state plus a Message Authentication Code (MAC), enabling the responder to be stateless until the COOKIE ECHO arrives and is validated.

sctp, security

protocol-element §3.2.1

The two high-order bits of an unrecognized Parameter Type encode the handling action: 00=stop processing this chunk, 01=stop and report, 10=skip, 11=skip and report. Parameter types MUST be unique across all chunk types; for example, Type 5 always means IPv4 Address regardless of which chunk carries it.

sctp

registry §15.2

IANA maintains the 'SCTP Chunk Flags' registry (Section 15.2), introduced from RFC 6096. Each chunk type has its own flags sub-registry; flag bits not defined for a given chunk type MUST be set to 0 on transmit and are ignored on receipt.

sctp, registry

registry §15.3

IANA maintains the 'SCTP Chunk Parameter Types' registry (Section 15.3) and the 'SCTP Payload Protocol Identifiers' registry (Section 15.5). Parameter types MUST be unique across all chunk types. Payload Protocol Identifier 0 indicates no application identifier; all other values are application-assigned and opaque to SCTP.

sctp, registry

registry §15.1

IANA maintains the 'SCTP Chunk Types' registry (Section 15.1). Values 0–14 are assigned by this document; values 63, 127, 191, and 255 are reserved for IETF-defined chunk extensions. Remaining values are unassigned.

sctp, registry

security-consideration §12.2.4.2

The 32-bit Verification Tag, chosen randomly at association startup, protects against blind masquerade attacks: packets arriving without the correct Verification Tag are silently discarded, preventing an off-path attacker from injecting data or control chunks into an established association.

sctp, security

security-consideration §1.5.6

The CRC32c checksum in the SCTP common header provides protection against data corruption in the network. A receiver of an SCTP packet with an invalid CRC32c value MUST silently discard the packet.

sctp, security

security-consideration §12.2.4.1

The State Cookie mechanism in the four-way handshake protects against flooding (SYN-flood-style) attacks by keeping the responder stateless until the COOKIE ECHO is validated, so an attacker cannot exhaust responder resources by sending many INIT chunks.

sctp, security

state-machine §4

The SCTP association state machine defines eight states: CLOSED, COOKIE-WAIT (INIT sent), COOKIE-ECHOED (COOKIE ECHO sent), ESTABLISHED (data transfer), SHUTDOWN-PENDING, SHUTDOWN-SENT, SHUTDOWN-RECEIVED, and SHUTDOWN-ACK-SENT. Transitions are triggered by sending or receiving INIT, INIT ACK, COOKIE ECHO, COOKIE ACK, SHUTDOWN, SHUTDOWN ACK, and SHUTDOWN COMPLETE chunks.

sctp

wire-format §3.2

Each SCTP chunk begins with a Chunk Type (8-bit), Chunk Flags (8-bit), and Chunk Length (16-bit, inclusive of header but not padding), followed by variable-length Chunk Value. The total chunk length MUST be a multiple of 4 bytes; zero-byte padding is added by the sender and not counted in Chunk Length.

sctp

wire-format §3.2.1

Optional and variable-length parameters use a TLV format: Parameter Type (16-bit), Parameter Length (16-bit, inclusive), and variable-length Parameter Value. Total parameter length MUST be a multiple of 4 bytes; padding is not counted in Parameter Length and MUST be ignored by the receiver.

sctp

wire-format §3.3.1

The DATA chunk (Type=0) contains flags I (Immediate), U (Unordered), B (Beginning fragment), E (Ending fragment), a 32-bit TSN, 16-bit Stream Identifier, 16-bit Stream Sequence Number, 32-bit Payload Protocol Identifier, and variable-length user data. The user data length L MUST be greater than 0.

sctp

wire-format §3.3.2

The INIT chunk (Type=1) carries five mandatory fixed-length fields: Initiate Tag (32-bit, nonzero), a_rwnd (32-bit, minimum 1500), Number of Outbound Streams (16-bit, nonzero), Number of Inbound Streams (16-bit, nonzero), and Initial TSN (32-bit), followed by optional TLV parameters.

sctp

wire-format §3.1

The SCTP Common Header consists of four fields: Source Port Number (16-bit), Destination Port Number (16-bit), Verification Tag (32-bit), and Checksum (32-bit CRC32c). Both port numbers MUST NOT be 0.

sctp, security