跳到主要内容

3.3. SCTP Chunk 定义

本节定义不同 SCTP chunk type 的格式.

3.3.1. Payload Data (DATA) (0)

DATA chunk 必须使用以下格式:

     0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 0 | Reserved|U|B|E| Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TSN |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Stream Identifier S | Stream Sequence Number n |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload Protocol Identifier |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\ \
/ User Data (seq n of Stream S) /
\ \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Reserved: 5 bits

应设置为全 '0', 接收方忽略.

U bit: 1 bit

(U)nordered bit 如果设置为 '1', 表示这是一个无序 DATA chunk, 并且没有为该 DATA chunk 分配 Stream Sequence Number. 因此, 接收方必须忽略 Stream Sequence Number 字段.

重组后 (如有必要), 无序 DATA chunk 必须由接收方分派给上层, 不尝试重新排序.

如果无序用户消息被分片, 该消息每个分片的 U bit 必须设置为 '1'.

B bit: 1 bit

(B)eginning fragment bit 如果置位, 表示用户消息的第一个分片.

E bit: 1 bit

(E)nding fragment bit 如果置位, 表示用户消息的最后一个分片.

未分片用户消息应同时将 B bit 和 E bit 设置为 '1'. 将 B bit 和 E bit 同时设置为 '0' 表示多分片用户消息的中间分片, 如下表所示:

            B E                  Description
============================================================
| 1 0 | First piece of a fragmented user message |
+----------------------------------------------------------+
| 0 0 | Middle piece of a fragmented user message |
+----------------------------------------------------------+
| 0 1 | Last piece of a fragmented user message |
+----------------------------------------------------------+
| 1 1 | Unfragmented message |
============================================================
| Table 1: Fragment Description Flags |
============================================================

当用户消息被分片为多个 chunk 时, 接收方使用 TSN 重组该消息. 这意味着被分片用户消息的各分片 TSN 必须严格连续.

Length: 16 bits (unsigned integer)

该字段表示 DATA chunk 的字节长度, 从 type 字段开头到 User Data 字段结尾, 不包括任何填充. 带有 1 字节用户数据的 DATA chunk 的 Length 设置为 17 (表示 17 字节).

User Data 字段长度为 L 的 DATA chunk, 其 Length 字段设置为 (16 + L) (表示 16+L 字节), 其中 L 必须大于 0.

TSN: 32 bits (unsigned integer)

该值表示此 DATA chunk 的 TSN. TSN 的有效范围为 0 到 4294967295 (2**32 - 1). TSN 达到 4294967295 后回绕到 0.

Stream Identifier S: 16 bits (unsigned integer)

标识后续用户数据所属的流.

Stream Sequence Number n: 16 bits (unsigned integer)

该值表示后续用户数据在流 S 内的 Stream Sequence Number. 有效范围为 0 到 65535.

当用户消息由 SCTP 分片以便传输时, 该消息的每个分片中必须携带相同的 Stream Sequence Number.

Payload Protocol Identifier: 32 bits (unsigned integer)

该值表示由应用 (或上层) 指定的协议标识符. 此值由上层传给 SCTP, 并发送给对端. SCTP 不使用此标识符, 但某些网络实体以及对端应用可使用它来标识该 DATA chunk 中承载的信息类型. 即使在分片 DATA chunk 中也必须发送此字段 (以确保网络中间代理可使用它). 注意, SCTP 实现不会修改此字段; 因此, 其字节序不一定是大端序. 上层负责对此字段进行任何字节序转换.

值 0 表示上层未为此载荷数据指定应用标识符.

User Data: variable length

这是载荷用户数据. 实现必须使用全零字节将数据末尾填充到 4 字节边界. 任何填充不得包含在 Length 字段中. 发送方不得添加超过 3 字节的填充.

3.3.2. Initiation (INIT) (1)

该 chunk 用于在两个端点之间发起 SCTP 关联. INIT chunk 格式如下:

     0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 1 | Chunk Flags | Chunk Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Initiate Tag |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Advertised Receiver Window Credit (a_rwnd) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Number of Outbound Streams | Number of Inbound Streams |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Initial TSN |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\ \
/ Optional/Variable-Length Parameters /
\ \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

INIT chunk 包含以下参数. 除非另有说明, 每个参数必须在 INIT chunk 中只包含一次.

         Fixed Parameters                     Status
----------------------------------------------
Initiate Tag Mandatory
Advertised Receiver Window Credit Mandatory
Number of Outbound Streams Mandatory
Number of Inbound Streams Mandatory
Initial TSN Mandatory

Variable Parameters Status Type Value
-------------------------------------------------------------
IPv4 Address (Note 1) Optional 5
IPv6 Address (Note 1) Optional 6
Cookie Preservative Optional 9
Reserved for ECN Capable (Note 2) Optional 32768 (0x8000)
Host Name Address (Note 3) Optional 11
Supported Address Types (Note 4) Optional 12

注 1: INIT chunk 可包含多个地址, 这些地址可以是 IPv4 和/或 IPv6 的任意组合.

注 2: ECN Capable 字段保留用于将来的 Explicit Congestion Notification.

注 3: INIT chunk 不得包含超过一个 Host Name Address 参数. 此外, INIT 发送方不得在 INIT 中将任何其他地址类型与 Host Name Address 组合. 如果收到的 INIT chunk 中存在 Host Name Address 参数, INIT 接收方必须忽略任何其他地址类型.

注 4: 该参数出现时指定发送端点可支持的所有地址类型. 没有该参数表示发送端点可支持任何地址类型.

实现注: 如果收到的 INIT chunk 带有已知参数, 但这些参数不是 INIT chunk 的可选参数, 则接收方应该处理该 INIT chunk 并返回 INIT ACK. INIT chunk 的接收方可以稍后将 ERROR chunk 与 COOKIE ACK chunk 捆绑. 然而, 限制性实现可以以 ABORT chunk 响应 INIT chunk.

INIT 中的 Chunk Flags 字段保留, 发送方应将其中所有 bit 设置为 0, 接收方忽略. INIT 中的参数序列可按任意顺序处理.

Initiate Tag: 32 bits (unsigned integer)

INIT 的接收方 (响应端) 记录 Initiate Tag 参数的值. 该值必须放入 INIT 接收方在此关联内发送的每个 SCTP 分组的 Verification Tag 字段中.

Initiate Tag 允许取除 0 以外的任意值. 关于 tag 值选择的更多信息见 Section 5.3.1.

如果收到的 INIT chunk 中 Initiate Tag 的值为 0, 接收方必须将其视为错误, 并通过发送 ABORT 关闭关联.

Advertised Receiver Window Credit (a_rwnd): 32 bits (unsigned integer)

该值表示 INIT 发送方为此窗口关联保留的专用缓冲区空间, 以字节数表示. 在关联生命周期内, 此缓冲区空间不应该减少 (即不应从该关联取走专用缓冲区); 然而, 端点可以改变其在 SACK chunk 中发送的 a_rwnd 值.

Number of Outbound Streams (OS): 16 bits (unsigned integer)

定义此 INIT chunk 的发送方希望在该关联中创建的出站流数量. 值 0 不得使用.

注: 收到 OS 值为 0 的 INIT 时, 接收方应该中止该关联.

Number of Inbound Streams (MIS): 16 bits (unsigned integer)

定义此 INIT chunk 的发送方允许对端在该关联中创建的最大流数量. 值 0 不得使用.

注: 实际流数量并不通过协商得到, 两个端点将使用 min(requested, offered). 详见 Section 5.1.1.

注: 收到 MIS 值为 0 的 INIT 时, 接收方应该中止该关联.

Initial TSN (I-TSN): 32 bits (unsigned integer)

定义发送方将使用的初始 TSN. 有效范围为 0 到 4294967295. 该字段可以设置为 Initiate Tag 字段的值.

3.3.2.1. INIT 中的可选/可变长度参数

以下参数遵循 Section 3.2.1 中定义的 Type-Length-Value 格式. 任何 Type-Length-Value 字段必须位于上一节定义的固定长度字段之后.

IPv4 Address Parameter (5)

     0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 5 | Length = 8 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv4 Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

IPv4 Address: 32 bits (unsigned integer)

包含发送端点的 IPv4 地址. 它采用二进制编码.

IPv6 Address Parameter (6)

     0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 6 | Length = 20 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| IPv6 Address |
| |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

IPv6 Address: 128 bits (unsigned integer)

包含发送端点的 IPv6 [RFC2460] 地址. 它采用二进制编码.

注: 发送方不得使用 IPv4-mapped IPv6 address [RFC4291], 而应为 IPv4 地址使用 IPv4 Address 参数.

与 SCTP 公共头部中的 Source Port Number 结合时, IPv4 或 IPv6 Address 参数中传递的值表示 INIT 发送方将为正在发起的关联支持的传输地址. 也就是说, 在该关联生命周期内, 此 IP 地址可出现在 INIT 发送方发送的 IP 数据报的源地址字段中, 并且可用作 INIT 接收方发送的 IP 数据报的目的地址.

当 INIT 发送方为多宿主时, INIT chunk 中可包含多个 IP Address 参数. 此外, 多宿主端点可能可访问不同类型的网络; 因此一个 INIT chunk 中可存在多种地址类型, 即 IPv4 和 IPv6 地址允许出现在同一个 INIT chunk 中.

如果 INIT 至少包含一个 IP Address 参数, 则包含 INIT chunk 的 IP 数据报的源地址以及 INIT 中提供的任何附加地址都可由接收 INIT 的端点用作目的地. 如果 INIT 不包含任何 IP Address 参数, 接收 INIT 的端点必须使用收到的 IP 数据报关联的源地址作为该关联的唯一目的地址.

注意, 在 INIT 和 INIT ACK 中不使用任何 IP Address 参数, 是一种让关联更可能跨越 NAT 设备工作的替代方法.

Cookie Preservative (9)

INIT 发送方应使用此参数向 INIT 接收方建议 State Cookie 具有更长生命周期.

     0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = 9 | Length = 8 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Suggested Cookie Life-Span Increment (msec.) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Suggested Cookie Life-Span Increment: 32 bits (unsigned integer)

该参数以毫秒为单位向接收方指示发送方希望接收方在其默认 cookie 生命周期上增加多少.

当发送方重新尝试与某个对端建立关联, 且之前的关联建立尝试因 stale cookie 操作错误而失败时, 发送方应将此可选参数添加到 INIT chunk. 出于自身安全原因, 接收方可以选择忽略建议的 cookie 生命周期增加量.


: 本文档包含 Section 3.3.1 和 Section 3.3.2. 其余 chunk 定义 (3.3.3 及以后) 将在后续文档中继续.