TCP/IP:SCTP报文格式
Posted rtoax
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP/IP:SCTP报文格式相关的知识,希望对你有一定的参考价值。
目录
SCTP通用报文格式
SCTP ( Stream Control Transmission Protocol ),即流媒体控制传输协议,是一种可靠的基于无连接数据包网络如IP网络之上传输协议。他被设计用来在IP网络上传输PSTN在窄带信令消息,同时也能支持宽带信令消息的传输。
SCTP可以看作OSI层次结构中的传输层,它的上层作为SCTP用户应用,下层为分组网络IP层。
SCTP报文格式
一个SCTP分组含了一个公共的分组头(Common Header)和若干数据块(Chunk),每个数据块中既可以包含控制信息,也可以包含用户数据。
除了INIT、INIT ACK和SHUTDOWN COMPLETE数据块外,其他类型的多个数据块可以捆绑在一个SCTP分组中,以满足对MTU大小的要求。当然,这些数据块也可以不与其他数据块捆绑在一个分组中。如果一个用户消息不能放在一个SCTP分组中,这个消息可以被分成若干个数据块。
字段 | 长度 | 描述 |
---|---|---|
Source Port Number | 16比特的无符号整数 | 源端口号,识别SCTP发送端点的SCTP端口号。接收方可以使用源端口号、源IP地址、目的端口号和目的IP地址标识该SCTP分组所属的偶联。 |
Destination Port Number | 16比特的无符号整数 | 目的端口号,为目的端点的SCTP端口号。接收主机可以使用目的端口号将SCTP分组复用到正确的端点或应用中。 |
Verification Tag | 32比特的无符号整数 | 验证标签是偶联建立时,本端端点为这个偶联生成一个随机标识。偶联建立过程中,双方会交换这个TAG,到了数据传递时,发送端必须在公共分组头中带上对端的这个TAG,以备校验。
|
Checksum | 32比特的无符号整数 | SCTP通过对用户数据使用ADLER-32算法,计算出一个32位的校验码,带在数据报中,在接收端进行同样的运算,通过检查校验码是否相等来验证用户数据是否遭到破坏。 |
Chunk Type | 8比特的无符号整数 | 块类型定义在块值(Chunk Value)中消息所属的类型。包括:INIT、INIT ACK、SACK、ABORT、ERROR、SHUTDOWN、COOKIE ACK等13种数据块类型。 该参数的取值范围为0~254,255留作今后的扩展。 数据块类型字段的编码分配如下:
Chunk type的高两位bit指示了收端不认识对应的chunk type的处理原则:
|
Chunk Flags | 8比特的无符号整数 | 块标志位用法由块类型决定。除非被置为其他值,块标记在传送过程中会被置0而且接收端点会忽视块标记。 |
Chunk Length | 16比特的无符号整数 | 块长度用来表示包括块类型、块标记、块长度和块值在内的字节数,长度使用二进制表示。 |
Chunk Value | 变长 | 块值字段是在该数据块中真正传送的信息,内容由数据块类型决定。块值的长度为不定长。 |
SCTP报文交互流程
参考标准
标准 | 描述 |
---|---|
RFC 2960 | Stream Control Transmission Protocol |
https://download.csdn.net/download/Rong_Toa/18930681
SCTP ABORT报文格式
中止(ABORT)数据块的格式
SCTP端点发送ABORT数据块来中止到对等端的偶联,ABORT数据块中可以包含原因参数用来通知接收ABORT数据块的一方中止该偶联的原因。DATA数据块不能同ABORT数据块捆绑在一个SCTP分组中。控制数据块(除INIT、INIT ACK和SHUTDOWN COMPLETE)均可以同ABORT进行捆绑在一个SCTP分组中,但这些控制块都应放在SCTP分组中的ABORT数据块之前,否则这些控制数据块将被接收方忽略。
如果一个端点收到了格式错误或与不存在的偶联相关的ABORT消息,则应当舍弃该消息。此外,在任何情况下,端点收到一个ABORT消息后,都不能通过发送ABORT消息作为响应。
- Reserved:7比特,在发送方设置为全0,并在接收方忽略。
- T (1bit):当发送方有一个TCB被破坏时则该T比特设置为0,如果发送方没有TCB,则把该比特设置为1。
- Length (16bit无符号整数):设置为该数据块的长度,包括数据块头和所有包含的差错原因字段。
ABORT数据块还可以包含0个或多个差错原因参数
报文示例
SCTP COOKIE ACK格式
COOKIE证实(COOKIE ACK)数据块的格式
这个数据块只在启动偶联时使用,它用来证实收到COOKIE EHCO数据块。这个数据块必须在该偶联上发送任何DATA或SACK数据块前发送,但这个数据块可以与一个或多个DATA或SACK数据块捆绑在一个SCTP分组中发送。COOKIE ACK数据块中没有其他参数。
COOKIE ACK数据块中只包含数据块标志(8bit),在发送方设置为全0,并在接收方忽略。
报文示例
SCTP COOKIE ECHO数据块格式
状态COOKIE(COOKIE ECHO)数据块的格式
该数据块只在启动偶联时使用,它由偶联的发起者发送到对端点,用来完成启动过程。这个数据块必须在该偶联上发送的DATA数据块前发送,但可以同其他的DATA数据块捆绑到同一个SCTP分组中。
- Chunk Flags(8bit):在发送方设置为全0,在接收方忽略。
- Length:(16bit的无符号整数):设置为该数据块长度的字节数,包括4字节的数据块头和COOKIE的长度。
- Cookie(可变长度):该字段必须包含从前一个INIT ACK数据块的状态COOKIE参数中收到的准确的COOKIE,使用COOKIE时应尽可能的小从而保证互操作性。
报文示例
SCTP DATA数据块格式
净荷数据(DATA)数据块的格式
字段 | 长度 | 描述 |
---|---|---|
Reserved | 5比特 | 预留,应当设置为全0,在接收方忽略。 |
U | 1比特 | U比特称为非顺序比特。如果该比特设置为1,则指示这是一个非顺序的DATA数据块,不需要给该数据块分配流顺序号码,所有接收方必须忽略流顺序号码。在重新组装完成后(如果需要),非顺序的数据块不需要尝试任何重新排序的过程,可以由接收方直接递交到高层;如果一个非顺序的用户消息被分段,则消息的每个分段中的U比特必须被设置为1。 |
B | 1比特 | B比特称为分段开始比特。如果该比特被设置,则指示这是用户消息的第一个分段。 |
E | 1比特 | E比特称为分段结束比特。如果该比特被设置,则指示这是用户消息的最后一个分段。一个未分段的用户消息应当把所有的B和E比特设置为1。如果B和E比特都设置为0,则表明这是一个分段的用户消息的一个中间分段。当用户消息被分段到多个数据块中,接收方需要使用TSN对消息进行重组,这意味着给分段的用户消息的每个分段都必须要使用连续的TSN。 BE比特的取值含义如下:
|
Length | 16比特无符号整数 | 该字段用来指示DATA数据块从类型字段开始到用户数据字段结束之间的字节数,但不包含任何填充字节,如果DATA数据块的用户数据字段为0,则长度字段设为16。 |
TSN | 32比特无符号整数 | 该值表示该数据块的TSN,TSN的有效值从0~2 -1。TSN的值达到4294967295后将回转到0。 |
Stream Identifier S | 16比特无符号整数 | 该字段用来识别用户数据属于的流。 |
Stream Sequence Number n | 16比特无符号整数 | 该值用来表示所在流中的用户数据的顺序号码。该字段的有效值为0~65535。当一个用户消息被SCTP分段后,则必须在消息的每个分段中都带有相同的流顺序号码。 |
Payload Protocol Identifier | 32比特无符号整数 | 该值表示一个应用(或上层协议)特定的协议标识符。这个值由高层协议传递到SCTP并发送到对等层。这个标识符不由SCTP使用,但却可以由特定的网络实体或对等的应用来识别在DATA数据块中携带的信息类型。甚至在每个分段的DATA数据块中也应包含该字段(以确保对网络中间的代理可用)。0表示高层未对该协议净荷规定应用标识符。其中“M2UA”协议净荷使用编码2;“M3UA”协议净荷使用编码3;“SUA”协议净荷使用编码4;“M2PA”协议净荷使用的编码待定。 |
User Data | 变长 | 用来携带用户数据净荷。该字段必须被填充为4字节的整数情,发送方填充的字节数应不超过3个字节,接收方忽略所有的填充字节。 |
报文示例
SCTP ERROR数据块格式
操作差错(ERROR)数据块的格式
SCTP端点发送该数据块向其对端点通知一些特定的差错情况。该数据块中可以包含一个或多个差错原因。一般操作差错不一定被看作是致命的,致命差错情况的报告一般使用ABORT数据块。
- 数据块标志位(8bit):在发送方设置为全0,并在接收方忽略。
- 可变长度(16bit无符号整数):设置为该数据块的字节数,包括数据块头和所有包含的差错原因字段的长度。
- 差错原因:可变长度的参数。
-
原因编码 (16bit无符号整数):
定义了被报告的差错情况的类型。
原因编码 描述 1 无效的流标识符 2 丢失必备参数 3 过期的Cookie差错 4 资源耗尽 5 无法解析的地址 6 不识别的数据块类型 7 无效的必备参数 8 不识别的参数 9 无用户数据 10 关闭阶段收到COOKIE 11 使用新的地址重新启动偶联 - 原因长度(16bit无符号整数):设置为该参数的字节数,包括原因编码、原因长度和原因特定的信息字段。
- 原因特定的信息:可变长度,该字段用来携带差错的详细情况。
原因编码 | 含义 | 字段格式 |
---|---|---|
1 | 无效的流标识符 | 差错原因无效的流识别符用来指示端点收到了一个关于不存在的流的DATA数据块。
|
2 | 丢失必备参数 | 丢失必备参数差错原因用来指示一个或多个必备的参数在收到的INIT或INIT ACK数据块中丢失。
|
3 | 过期的Cookie差错 | 过期的COOKIE差错原因参数用来指示收到的有效的State Cookie已经过期了。
|
4 | 资源耗尽 | 资源耗尽差错原因用来指示发送方的资源已经耗尽,通常情况下该查错原因与ABORT数据块一起发送。 |
5 | 不可解析的地址 | U不可解析的地址用来指示发送方不能解析特定的地址参数(即发送方不支持该类地址类型),通常情况下该查错原因与ABORT数据块一起发送。
|
6 | 不识别的数据块类型 | 如果接收方不理解数据块且数据块类型比特中的高位比特设为1,则把不识别的数据块类型错误返回给数据块的产生者
|
7 | 无效的必备参数 | 当一个必备参数被设置成无效值时,则向INIT或INITACK的生成者返回无效的必备参数差错。 |
8 | 不识别的参数 | 如果接收方不能识别INIT ACK数据块中一个或多个任选参数,则向INIT ACK数据块的产生者返回不识别的参数的差错原因。
|
9 | 无用户数据 | 如果收到的DATA数据块中未包含用户数据,则把这个差错原因返回给DATA数据块的产生者。
|
10 | 关闭期间收到Cookie | 当端点处于SHUTDOWN-ACK-SENT状态时,又收到COOKIE ECHO时则发送该差错原因。返回这个差错原因的ERROR数据块通常与重发的SHUTDOWN ACK数据块捆绑在一起发送。 |
11 | 使用新地址重新启动偶联 | 当在现存的偶联上收到了COOKIE ECHO数据块,而COOKIE ECHO数据块又向该偶联中增加了先前没有的地址,此时使用该错误原因,并把新增加的地址作为差错信息在该参数中传送,这个差错原因通常都在ABORT中发送,用来拒绝COOKIE ECHO数据块。 |
SCTP HEARTBEAT数据块格式
HeartBeat请求(HEARTBEAT)数据块的格式
SCTP端点通过向对端点发送这个数据块用来检测定义在该偶联上到特定目的地传送地址的可达性。
参数字段包含HEARTBEAT信息,它是一个可变长度的非透明数据结构,其信息通常只需要发送方明白即可。
- Chunk Flags (8bit):在发送方设置为全0,并在接收方忽略。
- HEARTBEAT Length(16bit):设置为数据块长度的字节数,包括数据块头和HEARTBEAT信息字段。
- HEABTBEAT Information TLV:当该HEARTBEAT数据块发送到目的地传送地址时,发送方特定的HEARTBEAT信息字段通常包括关于发送方当前的时间信息。
报文示例
SCTP HEARTBEAT ACK数据块格式
HeartBeat证实(HEARTBEAT ACK)数据块的格式
SCTP端点在收到对端点发来的HEARTBEAT数据块后,则发送该数据块作为响应。HeartBeat证实总是向包含HEARTBEAT数据块的IP数据报中的起源IP地址发送,来作为对该HEARTBEAT数据块的响应。
- 数据块标志(8bit):在发送方设置为全0,并在接收方忽略。
- HEARTBEAT长度(16bit):设置为数据块长度的字节数,包括数据块头和HEARTBEAT信息字段。
- HEABTBEAT信息:可变长度,该字段的内容应当把HEARTBEAT请求数据块中的HEARTBEAT信息参数作为回送的响应,该参数字段包含一个可变长度的非透明的数据结构。
报文示例
SCTP INIT数据块格式
Initiation (INIT)数据块格式
该数据块用来启动两个SCTP端点间的一个偶联,其格式如下:
字段 | 长度 | 描述 |
---|---|---|
启动标签 | 32比特无符号整数 | INIT的接收方(响应端)记录启动标签参数的值。这个值必须被放置到INIT的接收方发送的与该偶联相关的每个SCTP分组中的验证标签字段中。启动标签允许除0以外的的任何值。如果在收到的INIT数据块中的启动标签为0,则接收方必须作为错误处理,并且发送ABORT数据块中止该偶联。 |
A通告的接收方窗口信用(a_rwnd) | 32比特无符号整数 | 表示指定的缓冲区的容量,用字节数表示,为INIT发送方为偶联预留的窗口大小。在偶联存活期间,这个缓冲区的容量不应减少(即不应把该偶联的专用缓冲区取走),但端点可以在发送的SACK数据块中修改a_rwnd的值。 |
输出流数量 | 16比特无符号整数 | 用来定义发送INIT数据块的一方希望在该偶联中创建的输出流的数量。该值不允许为0,接收方收到该参数为0的INIT数据块后应中止该偶联。 |
输入流数量 | 16比特无符号整数 | 定义了发送这个INIT块的一方允许对端在该偶联中所创建的流的数量。该值不允许为0,接收方收到该参数为0的INIT数据块后应中止该偶联。 |
初始的TSN | 32比特无符号整数 | 定义发送方将使用的初始的TSN,该值可以设置为启动标签字段的值。 |
任选/可变长参数 | 可变长度 |
|
报文示例
SCTP INIT ACK数据块格式
Format of Initiation Acknowledgement (INIT ACK)
INIT ACK数据块用来确认SCTP偶联的启动。
INIT ACK的参数部分与INIT数据块的参数部分相同,它额外还使用两个的可变长度的参数即:状态COOKIE(STATE COOKIE)和未识别的参数。
INIT ACK数据块应包含以下参数:
-
必备参数:
- 启动标签;
- 通告的接收方窗口信用;
- 输入流数量;
- 输出流数量;
- 初始TSN。
-
可变长参数:
- STATECOOKIE 类型值=7 必备
- IPv4地址 类型值=5 任选
- IPv6地址 类型值=6 任选
- 未识别的参数 类型值=9 任选
- ECN能力预留 类型值=32768(0x8000) 任选
- 主机名地址 类型值=11 任选
字段 | 长度 | 描述 |
---|---|---|
启动标签(Initiate Tag) | 32比特无符号整数 | INIT ACK的接收方记录启动标签参数的值,并把该值放到INITACK接收方需要在相应的偶联上发送的每个SCTP分组中的验证标签中。启动标签不允许为0。如果收到的INIT ACK数据块中的启动标签为0,则接收方当作错误来处理并通过发送ABORT来关闭偶联。 |
通告的接收方窗口信用值Advertised Receiver Window Credit (a_rwnd) | 32比特无符号整数 | 这个值表示指定的缓冲区的容量,用字节数表示,是INIT ACK发送方为偶联预留的窗口,在偶联存活期间,这个缓冲区的容量不应减少(即不应把该偶联的专用缓冲区取走)。 |
输出流数量Number of Outbound Streams (OS) | 16比特无符号整数 | 定义发送INIT ACK数据块的一方希望在该偶联中创建的输出流的数量。该值不允许为0,接收方收到该参数为0的INIT ACK数据块后应中止该偶联并舍弃TCB。 |
输入流数量Number of Inbound Streams (MIS) | 16比特无符号整数 | 定义发送INIT ACK数据块的一方允许对端点在该偶联中所创建的流的最大数量。该值不允许为0,接收方收到该参数为0的INIT ACK数据块后应中止该偶联并舍弃该TCB。 |
Initial TSN(I-TSN) | 32比特无符号整数 | 定义发送方将使用的初始的TSN,该值可以设置为启动标签字段的值。 |
Optional/Variable-length Parameters | 变长 |
|
报文示例
SCTP SACK数据块格式
选择证实(SACK)数据块的格式
这个数据块通过使用DATA数据块中的TSN用来向对等的端点确认接收到的DATA数据块,并通知对等的端点在收到的DATA数据块中的间隔。所谓间隔就是指收到的DATA数据块的TSN不连续的情况。
SACK必须包含累积的TSN证实和通告的接收方窗口信用(a_rwnd)参数。
累积的TSN证实参数的值是指收到的TSN顺序断开前的最后一个TSN号码,下一个TSN则是在发送SACK的端点尚未收到的TSN值。所以这个参数确认已经收到了小于或等于该值的所有TSN。
SACK中可以包含0个或多个间隔证实块,每个间隔证实块确认了在一个不连续TSN后所收到的TSN序列,所有通过间隔证实块确认的TSN值都应比累积TSN证实的值大。
字段 | 长度 | 描述 |
---|---|---|
数据块标志位Chunk Flags | 8比特 | 设为全0并由接收方忽略。 |
Cumulative TSN Ack | 32比特无符号整数 | 该参数包含了在收到TSN序列的间隔前的最后一个TSN值。 |
Advertised Receiver Window Credit (a_rwnd) | 32比特无符号整数 | 该字段指示修改了SACK的发送方的接收缓冲容量的字节数。 |
Number of Gap Ack Blocks | 16比特无符号整数 | 用来指示SACK数据块中包含的间隔证实块的数目。 |
Number of Duplicate TSNs | 16比特 | 该字段包含了该端点收到的重复的TSN的数目。每个重复的TSN都列在间隔证实块列表后。 |
Gap Ack Block | 变长 | 这个字段中包含了间隔证实块,根据间隔证实块数量字段给出的值,间隔证实块重复若干次。所有TSN大于或等于累积TSN证实+间隔证实块开始的DATA数据块,或者是小于或等于每个间隔证实块的累积TSN证实+间隔证实块结束的DATA数据块都被看作是被正确地接收了。 |
Gap Ack Block Start | 16比特无符号整数 | 该字段用来指示这个间隔整数块的起始TSN偏移,为了计算实际的TSN号码必须要用累积TSN证实加上偏移号码。计算出的TSN标识用来识别第一个在这个间隔证实块中被收到的TSN。 |
Gap Ack Block End | 16比特无符号整数 | 用来指示这个间隔证实块的结束TSN偏移,为了计算实际的TSN需要把累积TSN证实加上这个偏移号码。这个计算出的TSN用来识别在这个间隔证实块中最后收到的DATA数据块。 |
Duplicate TSN | 32比特无符号整数 | 用来指示一个在上一个SACK发送后收到的TSN重复的个数。每次一个接收者收到一个重复的TSN(在发送SACK前),则把这个TSN加到重复的TSN列表中。每发送一次SACK后则把统计重复TSN的计数器重新清0。 |
报文示例
SCTP SHUTDOWN消息格式
报文格式
- Chunk Flags: 块标识,8比特。
- Length: 16 比特(无符号整数),标识参数的长度,值为8。
- Cumulative TSN Ack: 32 比特(无符号整数),包含在任何间隔之前接收的最后一个TNS。
报文示例
SCTP SHUTDOWN ACK数据块格式
关闭证实(SHUTDOWN ACK)数据块的格式
在完成了关闭程序后必须使用该数据块来确认收到的SHUTDOWN数据块。
数据块标志位(8bit):在发送方设置为全0,并在接收方忽略。SHUTDOWN ACK中不再包含其他参数。
报文示例
SCTP SHUTDOWN COMPLETE数据块格式
关闭完成(SHUTDOWN COMPLETE)数据块的格式
该数据块在完成关闭程序后用来确认收到SHUTOOWN ACK数据块。SHUTDOWN COMPLETE数据块中不包含其他参数。
-
Reserved:保留位。7比特,在发送方设为全0,在接收方忽略。
-
T:1比特。当发送方有一个TCB被破坏时则该T比特设置为0;如果发送方没有TCB,则把该比特设置为1。
报文示例
以上是关于TCP/IP:SCTP报文格式的主要内容,如果未能解决你的问题,请参考以下文章
TCP/IP 数据包报文格式(IP包TCP报头UDP报头)(转)
Linux 网络协议栈开发基础篇(十三)——TCP/IP协议各报文头格式