Skip to main content

3.3. SCTP块定义 (SCTP Chunk Definitions)

本节定义了不同SCTP块类型的格式.

3.3.1. 有效载荷数据 (Payload Data, DATA) (0)

DATA块必须 (MUST) 使用以下格式:

     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位

应设置为全"0"并由接收方忽略.

U位: 1位

无序位 (Unordered bit),如果设置为"1",表示这是一个无序DATA块,并且没有为此DATA块分配流序列号 (Stream Sequence Number). 因此,接收方必须 (MUST) 忽略流序列号字段.

重组后(如有必要),无序DATA块必须 (MUST) 由接收方分派到上层,而无需任何重新排序尝试.

如果无序用户消息被分片,则消息的每个片段必须 (MUST) 将其U位设置为"1".

B位: 1位

开始片段位 (Beginning fragment bit),如果设置,表示用户消息的第一个片段.

E位: 1位

结束片段位 (Ending fragment bit),如果设置,表示用户消息的最后一个片段.

未分片的用户消息应将B位和E位都设置为"1". 将B位和E位都设置为"0"表示多片段用户消息的中间片段,如下表所总结:

            B E                  描述
============================================================
| 1 0 | 分片用户消息的第一片段 |
+----------------------------------------------------------+
| 0 0 | 分片用户消息的中间片段 |
+----------------------------------------------------------+
| 0 1 | 分片用户消息的最后片段 |
+----------------------------------------------------------+
| 1 1 | 未分片的消息 |
============================================================
| 表1: 片段描述标志 |
============================================================

当用户消息被分片为多个块时,接收方使用TSN来重组消息. 这意味着分片用户消息的每个片段的TSN必须 (MUST) 严格连续.

长度 (Length): 16位(无符号整数)

此字段指示DATA块的长度(以字节为单位),从类型字段的开头到用户数据字段的末尾,不包括任何填充. 具有一个字节用户数据的DATA块的长度将设置为17(表示17个字节).

用户数据字段长度为L的DATA块将长度字段设置为(16 + L)(表示16+L字节),其中L必须 (MUST) 大于0.

TSN: 32位(无符号整数)

此值表示此DATA块的TSN(传输序列号,Transmission Sequence Number). TSN的有效范围为0到4294967295(2**32 - 1). TSN在达到4294967295后回绕到0.

流标识符S (Stream Identifier S): 16位(无符号整数)

标识以下用户数据所属的流.

流序列号n (Stream Sequence Number n): 16位(无符号整数)

此值表示流S内以下用户数据的流序列号. 有效范围为0到65535.

当用户消息被SCTP分片以进行传输时,相同的流序列号必须 (MUST) 携带在消息的每个片段中.

有效载荷协议标识符 (Payload Protocol Identifier): 32位(无符号整数)

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

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

用户数据 (User Data): 可变长度

这是有效载荷用户数据. 实现必须 (MUST) 用全零字节将数据末尾填充到4字节边界. 任何填充不得 (MUST NOT) 包含在长度字段中. 发送方绝不能 (MUST never) 添加超过3个字节的填充.

3.3.2. 初始化 (Initiation, INIT) (1)

此块用于在两个端点之间发起SCTP关联. INIT块的格式如下所示:

     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块包含以下参数. 除非另有说明,否则每个参数在INIT块中只能 (MUST) 包含一次.

         固定参数                        状态
----------------------------------------------
Initiate Tag 强制
Advertised Receiver Window Credit 强制
Number of Outbound Streams 强制
Number of Inbound Streams 强制
Initial TSN 强制

可变参数 状态 类型值
-------------------------------------------------------------
IPv4 Address (注1) 可选 5
IPv6 Address (注1) 可选 6
Cookie Preservative 可选 9
Reserved for ECN Capable (注2) 可选 32768 (0x8000)
Host Name Address (注3) 可选 11
Supported Address Types (注4) 可选 12

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

注2: ECN Capable字段保留供将来使用显式拥塞通知.

注3: INIT块不得 (MUST NOT) 包含多个主机名地址参数. 此外,INIT的发送方不得 (MUST NOT) 在INIT中将任何其他地址类型与主机名地址组合. 如果接收到的INIT块中存在主机名地址参数,则INIT的接收方必须 (MUST) 忽略任何其他地址类型.

注4: 此参数(如果存在)指定发送端点可以支持的所有地址类型. 缺少此参数表示发送端点可以支持任何地址类型.

实现注意事项: 如果收到的INIT块包含已知参数,但这些参数不是INIT块的可选参数,则接收方应该 (SHOULD) 处理INIT块并发送回INIT ACK. INIT块的接收方可以 (MAY) 稍后将ERROR块与COOKIE ACK块打包在一起. 但是,限制性实现可以 (MAY) 发送回ABORT块以响应INIT块.

INIT中的块标志字段是保留的,发送方应将其中的所有位设置为0,接收方应忽略. INIT中的参数序列可以按任何顺序处理.

发起标签 (Initiate Tag): 32位(无符号整数)

INIT的接收方(响应端)记录发起标签参数的值. 此值必须 (MUST) 放入接收方在此关联中传输的每个SCTP数据包的验证标签字段中.

发起标签允许具有除0之外的任何值. 有关标签值选择的更多信息,请参见第5.3.1节.

如果发现接收到的INIT块中的发起标签值为0,则接收方必须 (MUST) 将其视为错误并通过传输ABORT来关闭关联.

通告的接收方窗口信用 (Advertised Receiver Window Credit, a_rwnd): 32位(无符号整数)

此值表示INIT的发送方为此窗口保留的专用缓冲区空间(以字节数表示). 在关联的生命周期内,此缓冲区空间不应 (SHOULD NOT) 减少(即,不应从此关联中取走专用缓冲区); 但是,端点可以 (MAY) 更改它在SACK块中发送的a_rwnd值.

出站流数 (Number of Outbound Streams, OS): 16位(无符号整数)

定义此INIT块的发送方希望在此关联中创建的出站流数. 不得 (MUST NOT) 使用值0.

注意: 接收到OS值设置为0的INIT的接收方应该 (SHOULD) 中止关联.

入站流数 (Number of Inbound Streams, MIS): 16位(无符号整数)

定义此INIT块的发送方允许对等端在此关联中创建的最大流数. 不得 (MUST NOT) 使用值0.

注意: 实际流数没有协商,而是两个端点将使用min(requested, offered). 有关详细信息,请参见第5.1.1节.

注意: 接收到MIS值为0的INIT的接收方应该 (SHOULD) 中止关联.

初始TSN (Initial TSN, I-TSN): 32位(无符号整数)

定义发送方将使用的初始TSN. 有效范围为0到4294967295. 此字段可以 (MAY) 设置为发起标签字段的值.

3.3.2.1. INIT中的可选/可变长度参数 (Optional/Variable-Length Parameters in INIT)

以下参数遵循第3.2.1节中定义的类型-长度-值格式. 任何类型-长度-值字段必须 (MUST) 在上一节中定义的固定长度字段之后.

IPv4地址参数 (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地址: 32位(无符号整数)

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

IPv6地址参数 (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地址: 128位(无符号整数)

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

注意: 发送方不得 (MUST NOT) 使用IPv4映射的IPv6地址 [RFC4291],而应该为IPv4地址使用IPv4地址参数.

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

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

如果INIT包含至少一个IP地址参数,则包含INIT块的IP数据报的源地址和INIT内提供的任何其他地址可以被接收INIT的端点用作目标. 如果INIT不包含任何IP地址参数,则接收INIT的端点必须 (MUST) 使用与接收到的IP数据报关联的源地址作为关联的唯一目标地址.

注意: 在INIT和INIT ACK中不使用任何IP地址参数是使关联更有可能跨NAT盒工作的替代方案.

Cookie保护参数 (Cookie Preservative) (9)

INIT的发送方应使用此参数向INIT的接收方建议更长的状态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.) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

建议的Cookie生命周期增量 (Suggested Cookie Life-Span Increment): 32位(无符号整数)

此参数向接收方指示发送方希望接收方向其默认cookie生命周期添加多少增量(以毫秒为单位).

当发送方重新尝试与对等方建立关联时,应将此可选参数添加到INIT块中,该关联之前由于过时cookie操作错误而失败. 接收方可以 (MAY) 出于自身安全原因选择忽略建议的cookie生命周期增加.


: 本文件包含第3.3.1和3.3.2节. 其余的块定义(3.3.3及以后)将在后续文档中继续.