流控制传输协议是什么

小白 QA 2020-07-07 14:03:02 阅读(...)

流控制传输协议(SCTP)是一种在网络连接两端之间同时传输多个数据流的协议。SCTP提供的服务于UDP和TCP类似。SCTP 能给在所连接的端点之间提供多个流,每个流各自可靠地按序递送消息

流控制传输协议SCTP,Stream Control Transmission Protocol)是一种在网络连接两端之间同时传输多个数据流的协议。SCTP 提供的服务于 UDPTCP 类似。

流控制传输协议是什么

介绍

SCTP 提供的服务于 UDP 和 TCP 类似。SCTP 在 RFC2960 中详细说明,并有 RFC3309 加以更新。RFC 3286 给出了 SCTP 的简要介绍。SCTP 在客户和服务器之间提供关联(association),并像 TCP 那样给应用提供可靠性、排序、流量控制以及全双工的数据传输。SCTP 中使用“关联”一词替代“连接”是为了避免这样的内涵:一个连接只涉及两个 IP 地址间的通信。一个关联指代两个系统之间的一次通信,它可能因为 SCTP 支持多宿而涉及不止两个地址。

与 TCP 不同的是,SCTP 是面向消息的(message-oriented)。它提供各个记录的按序递送服务。与 UDP 一样,由发送端写入的每一条记录的长度随数据一道传递给接收端应用。

SCTP 能给在所连接的端点之间提供多个流,每个流各自可靠地按序递送消息。一个流上某个消息的丢失不会阻塞同一关联其他流上消息的投递。这种做法与 TCP 正好相反,就 TCP 而言,在单一字节流中任何位置的字节丢失都将在阻塞该连接上其后所有数据的递送,直到该丢失被修复为止。

SCTP 还提供多宿特性,使得单个 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,以备校验。包含 INIT 数据块的分组中验证标签必须为 0。在包含 SHUTDOWN-COMPLETE 数据块且设置了 T 比特的分组中,验证标签必须要从包含 SHUTDOWN-ACK 数据块的分组中复制。

在包含 ABORT 数据块的分组中,验证标签必须要从触发这个 ABORT 发送的分组中复制。

Checksum:32 比特的无符号整数,SCTP 通过对用户数据使用 ADLER-32 算法,计算出一个 32 位的校验码,带在数据报中,在接收端进行同样的运算,通过检查校验码是否相等来验证用户数据是否遭到破坏。

Chunk Type:8 比特的无符号整数,块类型定义在块值(Chunk Value)中消息所属的类型。包括:INIT、INIT ACK、SACK、ABORT、ERROR、SHUTDOWN、COOKIE ACK 等 13 种数据块类型。该参数的取值范围为 0~254,255 留作今后的扩展。数据块类型字段的编码分配如下:

0:净荷数据(DATA)

1:启动(INIT)

2:启动证实 (INIT ACK)

3:选择证实 (SACK)

4:Heartbeat 请求(HEARTBEAT)

5:Heartbeat 证实(HEARTBEAT ACK)

6:中止 (ABORT)

7:关闭(SHUTDOWN)

8:关闭证实(SHUTDOWN ACK)

9:操作差错(ERROR)

10:状态 Cookie(COOKIE ECHO)

11:Cookie 证实(COOKIE ACK)

12:为明确拥塞通知响应(ECNE)预留

13:为降低拥塞窗口(CWR)预留

14:关闭完成(SHUTDOWN COMPLETE)

15~62:IETF 预留

63:IETF 定义的数据块扩展

64~126:IETF 预留

127:IETF 定义的数据块扩展

128~190:IETF 预留

191:IETF 定义的数据块扩展

192~254:IETF 预留

255:IETF 定义的数据块扩展

Chunk type 的高两位 bit 指示了收端不认识对应的 chunk type 的处理原则:

00:停止处理数据报并丢弃,不再处理报中的其他 Chunk。

01:与 00 相同处理外,还要在 ERROR 或 INIT ACK 中上报,原因为不认识的参数类型。

10:忽略该 Chunk ,继续处理数据报中的其他 Chunk。

11:同 10 相同处理外,还要在 ERROR 中上报,原因为不认识的 Chunk 类型。

Chunk Flags:8 比特的无符号整数,块标志位用法由块类型决定。除非被置为其他值,块标记在传送过程中会被置 0 而且接收端点会忽视块标记。

Chunk Length:16 比特的无符号整数,块长度用来表示包括块类型、块标记、块长度和块值在内的字节数,长度使用二进制表示。

Chunk Value:变长,块值字段是在该数据块中真正传送的信息,内容由数据块类型决定。块值的长度为不定长。

特点

和 TCP 类似,SCTP 是面向连接、端到端、全双工、带有流量和拥塞控制的可靠传输协议。SCTP 的连接称为关联。SCTP 的关联通过 4 次握手建立。相对于 TCP 的 3 次握手建立连接,SCTP 的关联能够抵御拒绝服务(DoS)攻击,从而提高了安全性。数据只有在关联建立之后与关联关闭之前才可发送。SCTP 的关联通过 3 次握手关闭,不支持类似 TCP 的半关闭连接。也就是在任何一方关闭关联后,对方即不再发送数据。

面向消息的传输

SCTP 是一种面向消息的传输协议,从上层应用传递下来的数据以消息的形式传输。SCTP 提供消息的定界功能。在接收端,数据以消息的形式递交。为便于传输,SCTP 提供消息的拆分和组装,以及消息的捆绑传输功能。  SCTP 的数据传输基本单位是块。每个 SCTP 包包括一个 SCTP 公共头部、一个或多个块。块有两种基本类型:控制块和数据块。控制块用于 SCTP 的连接控制,包括连接的建立、关闭、传输路径的维护等;数据块传送应用层的用户数据。上层用户的每一个消息均被封装在一个数据块中,如果消息长度大于传输路径的最大传输单元(MTU),消息将被拆分成多个数据块传输,在接收端再组装起来向上层提交,这样每一个 SCTP 包封装一个数据块。如果消息长度较小,在 1 个 MTU 大小的限制下,在同一个 SCTP 包里可以捆绑多个消息,也即多个数据块共用一个公共头部,从而提高传输效率。数据块可以和控制块封装在同一个 SCTP 包里传输,这种捆绑受 MTU 大小的限制。  RFC2960 定义了 13 种块类型,包括 1 种数据块和 12 种控制块。为实现新功能扩展,可以定义新的块类型。块包括块参数,用于协助完成块功能。块和块参数都是采用类型-长度-值(TLV)的结构定义的。用这种结构定义新的块类型及块参数类型来实现 SCTP 新功能非常方便。SCTP 包括较完善的容错机制,如果通信双方的某一方不支持对端的某项扩展功能,可以通过容错和报错机制保证关联的健壮性。体现了 SCTP 的良好可扩展性。

多穴主机

SCTP 的一个主要特点是支持多穴主机。SCTP 关联的每个端点都可以拥有多个网络层地址。SCTP 可以支持不同的网络层协议,为描述方便,本文以 IP 作为网络层协议来说明,即每个 SCTP 端点可以拥有多个 IP 地址用于数据传输。  对多穴主机的支持是为了在网络级提高容错能力。如果接收端是多穴主机,那么对于发送端来说每一个接收端的 IP 地址代表着一条通往对端的路径,这样发送端可以选择任一条路径来发送数据。SCTP 规定任何时间都有一条路径作为首选路径来发送数据,其他路径作为备份路径。如果首选路径因接口故障或者网络拥塞等原因而失效,SCTP 可以自动切换到另外一条路径来发送,避免单点失效,从而提高整个关联的容错能力。多穴主机之间的 SCTP 关联如图所示。主机 A 到主机 B 有两条路径,A 是多穴主机,这里只考虑不同的 IP 地址对应不同的网络接口的情况,A 有两个网络接口,选择哪个接口来发送数据是 A 自身的路由策略问题(源地址选择问题)。

多流

SCTP 的另一主要特点是多流。SCTP 消息在不同的流内发送,这也是流传输控制协议名称的由来。从发送端到接收端可以有多个流,在同一流内发送的消息有序,而不同流之间的消息无序,因此不同流之间的消息传输是相对独立的。在某一个流内由于数据传输失败而引起的阻塞不会影响其他流的消息递交。多流特性可以帮助解决 TCP 中的队头阻塞(HOL)问题。因为 TCP 传输是按字节严格有序的,先行传送的字节如果丢失或损坏,即使后续的字节正确地被接收到也不能向上层递交,必须在接收端缓冲起来,直到先行字节由于重传而全部正确接收到后才可以提交,并且释放缓冲区。

图描述了一个用 3 个流发送消息的 SCTP 实例。发送端有 3 个出流,相应的接收端就有 3 个入流。图 2 中给出了发送从 1 到 9 的 9 个消息实例。其中消息 1、2、3 在同一个流,4、5、6 在同一个流,7、8、9 在同一个流,分别在各自流内有序。由于消息 1 没有正确接收,造成消息 2、3 不能向上层协议(ULP)提交。然而从 4 到 9 的消息由于在不同的流中,则可以提交给 ULP。这种流机制提供了无序递交功能,提高了传输效率。

此外,SCTP 还定义了无序消息。如果消息带有无序标志,则不论它在哪个流中(在具体实现中,数据块中的流号不被解析),只要被正确接收,都提交给 ULP,从而实现和流无关的无序递交。

流量、拥塞和错误的控制

SCTP 仍然采用类似 TCP 的流量控制和拥塞控制机制,但又有所增强。整个传输分为慢启动阶段和拥塞避免阶段。与 TCP 不同的是,SCTP 的拥塞窗口初始值可以是 2 个 MTU,可以比 TCP 获得更快的窗口增长。SCTP 的拥塞控制采用了选择确认(SACK)快速重传和快速恢复机制,是 TCP 各种主流改进机制的集成。但是由于 SCTP 采用了块结构和控制块机制,可以比 TCP 更大地提升传输性能。例如 SCTP 在移动通信的切换中表现得比 TCP SACK 更优越。 由于 SCTP 有多个通往对端的路径,在发送端对每一个路径都有一套拥塞控制参数和控制用的数据结构。这类似于有多个通往对端的 TCP 连接,SCTP 为多条路径的流量控制和拥塞控制提供统一的管理机制。消息可以在不同的路径上传输,流管理和路径管理是正交的,即相对独立。  每个路径有一个错误计数器,当某一路径上的错误达到一个门限时,该路径将会被标记为不活动的(Inactive),SCTP 把传输转移到另一条路径上进行。同时 SCTP 对整个关联设置一个错误计数器,每个路径上的错误计数时,整个关联的错误计数也要增加,只要对端返回确认,则关联错误计数器清零(不管是对哪条路径返回的确认)。如果关联错误计数器达到一个门限值,则整个关联被非正常关闭。由此可见,多路径带来比 TCP 更好的网络级容错机制。

工作过程

建立连接

不同于 TCP,SCTP 通过四次握手来完成连接的建立:

连接发起者(一般为客户端)SCTP 发送一个 INIT 消息(初始化)。该消息包括了连接发起者的 IP 地址清单、初始序列号、用于标识本耦联中所有报文的起始标记、客户请求的外出流的数目以及客户能够支持的外来流的数目

对端(服务器)发送一个 INITACK 消息确认连接发起者的 INIT 消息,其中含有服务器的 IP 地址清单、初始序列号、起始标记、服务器请求的外出流的数目、服务器能够支持的外来流的数目以及一个状态 cookie,状态 cookie 包含服务器用于确信本耦联有效所需的所有状态,cookie 是经过数字签名的,因而可以确保其有效性

客户以一个 COOKIEECHO 消息返回服务器的状态 cookie,除 COOKIEECHO 外,该消息可能在同一个报文中捆绑一个用户数据

服务器以一个 COOKIEACK 消息确认客户返回的 cookie 是正确的,到此时该耦联就建立成功了。该消息也可能在同一个报文中捆绑一个用户数据。

在一次 SCTP 四次握手中,INIT 消息的接收端不必保存任何状态信息或者分配任何资源,这样就可防范 SYNFlooding 等 DoS 攻击。它在发送 INIT-ACK 消息时,采用了一种机制——“状态 Cookie”,该 Cookie 具有发送端要建立自己状态所需的全部信息。

用于建立连接的 INIT ACK 只能在 COOKIE WATI 状态收到,在其它状态收到该报文时都会直接丢弃,类似的,COOKIE ACK 只能在 COOKIE ECHOED 状态接收。

在常规的握手中,主动发起方的本地 tag 在发起握手时产生,主动发起方的对端 tag 在收到 INIT ACK 时产生。而连接的被动方的本地 tag 和对端 tag 都在收到 INIT 时产生,但是最终要到收到了 COOKIE ECO 后才确定并保存下来。

SCTP 产生一个状态 Cookie 的过程如下:

使用收到的 INIT 和发出的 INIT-ACK 块中的信息创建一个关联的 TCB(传输控制块)。

在 TCB 中,将当前日期设为创建日期,将协议参数“有效 Cookie 时间”设为生存期间。

根据 TCB,收集重建 TCB 所需的最小信息子集,将该子集和密钥产生一个 MAC(信息认证编码)。

结合上述最小信息子集和 MAC 产生状态 Cookie。

在发送完 INITACK(包含状态 Cookie 参数)后,发送方必须删除 TCB 以及任何与新关联有关的本地资源。

INIT 和 INIT-ACK 都必须包含建立初始状态所需的参数:一组 IP 地址,保证可靠传输的初始序列号,每个被接收的 SCTP 报文中必须含有的验证标签,每一端请求发出的流数目和每一端能支持接收的流数目。交换完这些消息之后,INIT 的发送端以 COOKIE-ECHO 消息的方式发送回状态 Cookie。接收端根据所接收到的 COOKIE-ECHO 中的状态 Cookie,完整地重建自己的状态,并回送 COOKIE-ACK 来确认关联已建立。

因此对于 SCTP,即使接收再多的 INIT 消息,接收端也没有任何资源的消耗:它既不分配任何系统资源,也不保存此次新关联的状态,它只是把相应重建状态所用的状态 Cookie 作为参数,包含在每一个回送的 INIT-ACK 消息中,最后该状态 Cookie 会被 COOKIE-ECHO 消息发送回来。

类似于 TCP,SCTP 也多由客户端执行主动打开,而服务器执行被动打开。

收藏 0个人收藏
走进科技生活方式

评论交流

泪雪默认头像 请「登录」后参与评论
  1. 加载中..