SCTP(4)
๐ SCTP(4) ๐
okay so bestie, this is the SCTP(4) page from the Kernel Interfaces Manual, and it's literally all about the Internet Stream Control Transmission Protocol. It's giving reliable, message-oriented, multi-homed, multi-streamed networking realness, and we're gonna vibe through every single detail. No cap. ๐
โจ NAME โจ
sctp โ Internet Stream Control Transmission Protocol
๐ฆ SYNOPSIS ๐ฆ
options SCTP
options SCTP_SUPPORT
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/sctp.h>
int
socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP);
int
socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
๐ธ DESCRIPTION ๐ธ
The SCTP protocol provides reliable, flow-controlled, two-way transmission of data. It is a message oriented protocol and can support the SOCK_STREAM and SOCK_SEQPACKET abstractions. SCTP uses the standard Internet address format and, in addition, provides a per-host collection of โport addressesโ. Thus, each address is composed of an Internet address specifying the host and network, with a specific SCTP port on the host identifying the peer entity. iconic. ๐
There are two models of programming in SCTP. The first uses the SOCK_STREAM abstraction. In this abstraction sockets utilizing the SCTP protocol are either โactiveโ or โpassiveโ. Active sockets initiate connections to passive sockets. By default, SCTP sockets are created active; to create a passive socket, the listen(2) system call must be used after binding the socket with the bind(2) or sctp_bindx(3) system calls. Only passive sockets may use the accept(2) call to accept incoming connections. Only active sockets may use the connect(2) call to initiate connections. the way that works is so main character energy. ๐
The other abstraction SOCK_SEQPACKET provides a โconnectionlessโ mode of operation in that the user may send to an address (using any of the valid send calls that carry a socket address) and an association will be setup implicitly by the underlying SCTP transport stack. This abstraction is the only one capable of sending data on the third leg of the four-way handshake. A user must still call listen(2) to allow the socket to accept connections. Calling listen(2) however does not restrict the user from still initiating implicit connections to other peers. ๐
The SCTP protocol directly supports multi-homing. So when binding a socket with the โwildcardโ address INADDR_ANY, the SCTP stack will inform the peer about all of the local addresses that are deemed in scope of the peer. The peer will then possibly have multiple paths to reach the local host. paths on paths on paths ๐ฃ๏ธ
The SCTP transport protocol is also multi-streamed. Multi-streaming refers to the ability to send sub-ordered flows of messages. A user performs this by specifying a specific stream in one of the extended send calls such as the sctp_send(3) function call. Sending messages on different streams will allow parallel delivery of data i.e., a message loss in stream 1 will not block the delivery of messages sent in stream 2. fr fr, stream 2 stays unbothered. โจ
The SCTP transport protocol also provides a unordered service as well. The unordered service allows a message to be sent and delivered with no regard to the ordering of any other message. it's giving chaos, but make it intentional. ๐
The SCTP kernel implementation may either be compiled into the kernel, or loaded dynamically as a module. To support dynamic loading of the stack, the kernel must be compiled with options SCTP_SUPPORT. iykyk. ๐
๐ Extensions ๐
The FreeBSD implementation of SCTP also supports the following extensions:
- sctp partial reliability โ This extension allows one to have message be skipped and not delivered based on some user specified parameters.
- sctp dynamic addressing โ This extension allows addresses to be added and deleted dynamically from an existing association.
- sctp authentication โ This extension allows the user to authenticate specific peer chunks (including data) to validate that the peer who sent the message is in fact the peer who setup the association. A shared key option is also provided for so that two stacks can pre-share keys.
- packet drop โ Some routers support a special satellite protocol that will report losses due to corruption. This allows retransmissions without subsequent loss in bandwidth utilization.
- stream reset โ This extension allows a user on either side to reset the stream sequence numbers used by any or all streams.
๐ Socket Options ๐
SCTP supports a number of socket options which can be set with setsockopt(2) and tested with getsockopt(2) or sctp_opt_info(3):
SCTP_NODELAYโ Under most circumstances, SCTP sends data when it is presented; when outstanding data has not yet been acknowledged, it gathers small amounts of output to be sent in a single packet once an acknowledgement is received. For some clients, such as window systems that send a stream of mouse events which receive no replies, this packetization may cause significant delays. The boolean optionSCTP_NODELAYdefeats this algorithm. no more tiny-packet lag, bestie. ๐SCTP_RTOINFOโ This option returns specific information about an associations โRetransmission Time Outโ. It can also be used to change the default values.SCTP_ASSOCINFOโ This option returns specific information about the requested association.SCTP_INITMSGโ This option allows you to get or set the default sending parameters when an association is implicitly setup. It allows you to change such things as the maximum number of streams allowed inbound and the number of streams requested of the peer.SCTP_AUTOCLOSEโ For the one-to-many model (SOCK_SEQPACKET) associations are setup implicitly. This option allows the user to specify a default number of idle seconds to allow the association be maintained. After the idle timer (where no user message have been sent or have been received from the peer) the association will be gracefully closed. The default for this value is0, or unlimited (i.e., no automatic close). so it just chills forever unless you say otherwise. ๐SCTP_SET_PEER_PRIMARY_ADDRโ The dynamic address extension allows a peer to also request a particular address of its be made into the primary address. This option allows the caller to make such a request to a peer. Note that if the peer does not also support the dynamic address extension, this call will fail. Note the caller must provide a valid local address that the peer has been told about during association setup or dynamically.SCTP_PRIMARY_ADDRโ This option allows the setting of the primary address that the caller wishes to send to. The caller provides the address of a peer that is to be made primary.SCTP_ADAPTATION_LAYERโ The dynamic address extension also allows a user to pass a 32 bit opaque value upon association setup. This option allows a user to set or get this value.SCTP_DISABLE_FRAGMENTSโ By default SCTP will fragment user messages into multiple pieces that will fit on the network and then later, upon reception, reassemble the pieces into a single user message. If this option is enabled instead, any send that exceeds the path maximum transfer unit (P-MTU) will fail and the message will NOT be sent. so dramatic, but also important. ๐ญSCTP_PEER_ADDR_PARAMSโ This option will allow a user to set or get specific peer address parameters.SCTP_DEFAULT_SEND_PARAMโ When a user does not use one of the extended send calls (e.g.,sctp_sendmsg(3)) a set of default values apply to each send. These values include things like the stream number to send to as well as the per-protocol id. This option lets a caller both get and set these values. If the user changes these default values, then these new values will be used as the default whenever no information is provided by the sender (i.e., the non-extended API is used).SCTP_EVENTSโ SCTP has non-data events that it can communicate to its application. By default these are all disabled since they arrive in the data path with a special flagMSG_NOTIFICATIONset upon the received message. This option lets a caller both get what events are current being received as well as set different events that they may be interested in receiving.SCTP_I_WANT_MAPPED_V4_ADDRโ SCTP supports both IPV4 and IPV6. An association may span both IPV4 and IPV6 addresses since SCTP is multi-homed. By default, when opening an IPV6 socket, when data arrives on the socket from a peer's V4 address the V4 address will be presented with an address family ofAF_INET. If this is undesirable, then this option can be enabled which will then convert all V4 addresses into mapped V6 representations. mapping the vibe, as one does. ๐งSCTP_MAXSEGโ By default SCTP chooses its message fragmentation point based upon the smallest P-MTU of the peer. This option lets the caller set it to a smaller value. Note that while the user can change this value, if the P-MTU is smaller than the value set by the user, then the P-MTU value will override any user setting. peer says no, basically. โญSCTP_DELAYED_ACK_TIMEโ This option lets the user both set and get the delayed ack time (in milliseconds) that SCTP is using. The default is200milliseconds.SCTP_PARTIAL_DELIVERY_POINTโ SCTP at times may need to start delivery of a very large message before the entire message has arrived. By default SCTP waits until the incoming message is larger than one fourth of the receive buffer. This option allows the stacks value to be overridden with a smaller value. big message, small patience, customizable. ๐SCTP_FRAGMENT_INTERLEAVEโ okay so bestie, you know how SCTP sometimes kicks off partial delivery (it's literally the thing we were just talking about ๐ )? Normally, the reads that follow keep handing you the rest of that same message, blocking if they have to, until the whole message is read. Which sounds fine until you realise that other messages may have totally arrived and be ready to go, just sitting there stuck behind the message being partially delivered ๐ญ. Turn this option on and it changes: when a partial delivery message has no more data to be received, a later read can return a different message that's ready for delivery. By default this is off, because you the user have to be using the extended API's to even tell the difference between messages (via the stream and stream sequence number). So like, don't rawdog it with the basic API, fr fr ๐ซถSCTP_AUTH_CHUNKโ by default, only the dynamic addressing chunks get authenticated. This option lets you request that an additional chunk be authenticated too โจ. Heads up: successive calls to this option work and keep adding more chunks that require authentication โ it stacks ๐. And it only effects future associations, not existing ones. Past associations said no thanks ๐SCTP_AUTH_KEYโ lets you specify a shared key that can later be used to authenticate a peer ๐SCTP_HMAC_IDENTโ get or set the list of HMAC algorithms used to authenticate peers ๐ง. The HMAC values are in priority order, where the first HMAC identifier is the most preferred and the last is the least preferred. First place wins, periodt ๐SCTP_AUTH_ACTIVE_KEYโ makes a key active for the generation of authentication information. Big caveat: the peer must have the same key or else the data will be discarded ๐. Matching keys or nothing, bestie.SCTP_AUTH_DELETE_KEYโ lets you delete an old key ๐๏ธSCTP_USE_EXT_RECVINFOโ the sockets api document allows an extended send/receive information structure, and that extended structure includes additional fields related to the next message to be received (after the current receive completes) โ but only if such information is known ๐. By default the system will not pass this information. This option is how you ask for it, bestie, you just have to say the word ๐ซถSCTP_AUTO_ASCONFโ by default, when bound to all address and the system administrator has enables automatic dynamic addresses, the SCTP stack will automatically generate address changes into add and delete requests to any peers by setting this option to true. This option lets an endpoint disable that behavior. Main character energy: opting out of the group chat ๐ชSCTP_MAXBURSTโ by default SCTP implements micro-burst control so that as the congestion window opens up, no large burst of packets can be generated ๐. The default burst limit is four. This option lets you change that value. Four is the vibe until you decide otherwise ๐SCTP_CONTEXTโ many sctp extended calls have a context field. That context field is a 32 bit opaque value that will be returned in send failures ๐ฎ. This option lets the caller set the default context value to use when none is provided by the user.SCTP_EXPLICIT_EORโ by default, a single send is a complete message, and SCTP generates an implied record boundary. If this option is enabled, then all sends are part of the same message until the user indicates an end of record with the special flagSCTP_EORpassed in thesctp_sndrcvinfoflags field ๐. This effectively makes all sends part of the same message until the user specifies differently. Which means: a caller must NOT change the stream number until after theSCTP_EORis passed to SCTP, else an error will be returned ๐ญ. Do not test this, I'm begging.SCTP_STATUSโ a read-only option that returns various status information about the specified association ๐SCTP_GET_PEER_ADDR_INFOโ this read-only option returns information about a peer address ๐SCTP_PEER_AUTH_CHUNKSโ this read-only option returns a list of the chunks the peer requires to be authenticated ๐SCTP_LOCAL_AUTH_CHUNKSโ this read-only option returns a list of the locally required chunks that must be authenticated ๐SCTP_RESET_STREAMSโ used to cause a stream sequence number, or all stream sequence numbers, to be reset ๐. Note that the peer SCTP endpoint must also support the stream reset extension as well โ it takes two, bestie ๐ค
๐ MIB Variables ๐
The SCTP protocol implements a number of variables in the net.inet.sctp branch of the sysctl(3) MIB. It's giving control panel ๐๏ธโจ
๐ Congestion Control ๐
default_cc_moduleโ default congestion control module. Default value is 0. The minimum is 0, and the maximum is 3. A value of0enables the default congestion control algorithm. A value of1enables the High Speed congestion control algorithm. A value of2enables the HTCP congestion control algorithm. A value of3enables the data center congestion control (DCCC) algorithm ๐ฆinitial_cwndโ defines the initial congestion window size in MTUs ๐cwnd_maxburstโ use congestion control instead of 'blind' logic to limit maximum burst when sending. Default value is 1. May be set to0or1.ecn_enableโ enable Explicit Congestion Notification (ECN). Default value is 1. May be set to0or1.rttvar_steady_stepโ number of identical bandwidth measurements DCCC takes to try step down the congestion window. Default value is 20. The minimum is 0, and the maximum is 65535.rttvar_eqretโ whether DCCC reduces the congestion window size when round-trip time and bandwidth remain unchanged. Default value is 0. May be set to0or1.rttvar_bwโ shift amount DCCC uses for bandwidth smoothing on round-trip-time calculation. Default value is 4. The minimum is 0, and the maximum is 32.rttvar_rttโ shift amount DCCC uses for round-trip-time smoothing on round-trip-time calculation. Default value is 5. The minimum is 0, and the maximum is 32.use_dcccecnโ enable ECN when using DCCC. Default value is 1. May be set to0or1.
๐ธ Misc ๐ธ
getcredโ get theucredof a SCTP connection ๐ชชassoclistโ list of active SCTP associations ๐statsโ SCTP statistics (struct sctp_stat) ๐diag_info_codeโ diagnostic information error cause code ๐blackholeโ enable SCTP blackholing. Seeblackhole(4)for more details ๐ณ๏ธsendall_limitโ maximum message size (in bytes) that can be transmitted withSCTP_SENDALLflags set ๐ฆbuffer_splittingโ enable send/receive buffer splitting โ๏ธvtag_time_waitโ vtag wait time in seconds,0to disable โณnat_friendly_initโ enable sending of the NAT-friendly SCTP option on INITs ๐enable_sack_immediatelyโ enable sending of the SACK-IMMEDIATELY bit โกudp_tunneling_portโ set the SCTP/UDP tunneling port ๐mobility_fasthandoffโ enable SCTP fast handoff ๐โโ๏ธmobility_baseโ enable SCTP base mobility ๐ถโโ๏ธdefault_frag_interleaveโ default fragment interleave level ๐งฉdefault_ss_moduleโ default stream scheduling module ๐๏ธlog_levelโ Ltrace/KTR trace logging level ๐max_retran_chunkโ number of retransmissions of a DATA chunk before an association is aborted ๐min_residualโ minimum residual data chunk in second part of split ๐ฐstrict_data_orderโ enforce strict data ordering, abort if control inside data ๐จabort_at_limitโ abort when one-to-one hits qlimit ๐hb_max_burstโ confirmation heartbeat max burst ๐do_sctp_drainโ flush chunks in receive queues with TSN higher than the cumulative TSN if the system is low on mbufs ๐ฐmax_chained_mbufsโ default max number of small mbufs on a chain โ๏ธabc_l_varโ SCTP ABC max increase per SACK (L) ๐nat_friendlyโ SCTP NAT friendly operation ๐กcmt_use_dacโ CMT DAC on/off flag ๐cmt_on_offโ CMT settings ๐๏ธoutgoing_streamsโ default number of outgoing streams ๐คincoming_streamsโ default number of incoming streams ๐ฅadd_more_on_outputโ when space-wise is it worthwhile to try to add more to a socket send buffer ๐คpath_pf_thresholdโ default potentially failed threshold โ ๏ธpath_rtx_maxโ default maximum of retransmissions per path ๐ฃ๏ธassoc_rtx_maxโ default maximum number of retransmissions per association ๐init_rtx_maxโ default maximum number of retransmissions for INIT chunks ๐ฑvalid_cookie_lifeโ default cookie lifetime in seconds ๐ชinit_rto_maxโ default maximum retransmission timeout during association setup in ms โฑ๏ธrto_initialโ default initial retransmission timeout in ms โฑ๏ธrto_minโ default minimum retransmission timeout in ms โฑ๏ธrto_maxโ default maximum retransmission timeout in ms โฑ๏ธsecret_lifetimeโ default secret lifetime in seconds ๐คซshutdown_guard_timeโ shutdown guard timer in seconds (0means 5 times RTO.Max) ๐ก๏ธpmtu_raise_timeโ default PMTU raise timer in seconds ๐heartbeat_intervalโ default heartbeat interval in ms ๐asoc_resourceโ max number of cached resources in an association ๐๏ธsys_resourceโ max number of cached resources in the system ๐ขsack_freqโ default SACK frequency ๐ขdelayed_sack_timeโ default delayed SACK timer in ms โฐchunkscaleโ tunable for scaling of number of chunks and messages ๐min_split_pointโ minimum size when splitting a chunk ๐ชpcbhashsizeโ tunable for PCB hash table sizes #๏ธโฃtcbhashsizeโ tunable for TCB hash table sizes #๏ธโฃmaxchunksโ default max chunks on queue per association ๐งบfr_maxburstโ default max burst for SCTP endpoints when fast retransmitting ๐ฅmaxburstโ default max burst for SCTP endpoints ๐ฅpeer_chkohโ amount to debit peers rwnd per chunk sent ๐ธstrict_sacksโ enable SCTP Strict SACK checking ๐pktdrop_enableโ enable SCTP PKTDROP ๐๏ธnrsack_enableโ enable SCTP NR-SACK โจreconfig_enableโ turns on SCTP RE-CONFIG ๐ bestie this is the one that lets you shuffle streams and addresses around mid-connection, and it's off until you say so.asconf_enableโ turns on SCTP ASCONF. yes it's a real acronym, yes it's giving very serious protocol energy ๐auth_enableโ turns on SCTP AUTH. security girlies rise ๐ซถpr_enableโ turns on PR-SCTP (that's Partial Reliability, and no, "partial reliability" is not a metaphor for your ex) โจauto_asconfโ turns on SCTP Auto-ASCONF. it does the ASCONF thing for you automatically, lowkey the laziest and best option here ๐ธrecvspaceโ the maximum incoming SCTP buffer size. how much love (data) you're willing to receive at once ๐sendspaceโ the maximum outgoing SCTP buffer size. how much you're willing to put out into the world ๐
๐ SEE ALSO
okay so if you wanna go deeper (and you do, you're a scholar), go read these icons:
accept(2)bind(2)connect(2)listen(2)sctp_bindx(3)sctp_connectx(3)sctp_opt_info(3)sctp_recvmsg(3)sctp_sendmsg(3)blackhole(4)
periodt. that's the whole reading list ๐
๐ BUGS
the sctp kernel module cannot be unloaded.
not "shouldn't", not "usually won't" โ cannot. once it's in, it's in. it's giving main character who never leaves the party ๐ญ you can't rmmod your way out of this one, so load it with intention. no cap.
and that's the whole page, bestie!! this one shipped from Debian on July 9, 2020 and it's filed under SCTP(4) โ go forth and slay your sockets ๐
โจ๐ฆ
๐ฆ where this page comes from
- debian bookworm: freebsd-manpages 12.2-1 ยท BSD-2-Clause-FreeBSD AND BSD-4-Clause
- debian trixie: freebsd-manpages 12.2-2 ยท BSD-2-Clause-FreeBSD AND BSD-4-Clause
- ubuntu jammy: freebsd-manpages 12.2-1 ยท BSD-2-Clause-FreeBSD AND BSD-4-Clause
- ubuntu noble: freebsd-manpages 12.2-1 ยท BSD-2-Clause-FreeBSD AND BSD-4-Clause
- ubuntu questing: freebsd-manpages 12.2-2
- ubuntu resolute: freebsd-manpages 12.2-2build1 ยท BSD-2-Clause-FreeBSD AND BSD-4-Clause
- ubuntu stonking: freebsd-manpages 12.2-2build1 ยท BSD-2-Clause-FreeBSD AND BSD-4-Clause
- Copyright (c) 2006, Randall Stewart
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms