SCTP协议详解 - 小花朵朵

时间:2024-01-31 13:00:40

SCTP协议详解

  •   SCTP 被视为一个传输层协议,它的上层为SCTP 用户应用,下层作为分组网络。在SIGTRAN 协议的应用中,SCTP 上层用户是SCN 信令的适配模块(如M2UA、M3UA),下层是IP 网。
SCTP

SCTP相关术语

  •   1. 传送地址

      传送地址由 IP 地址、传输层协议类型和传输层端口号定义。由于SCTP 在IP 上传 输,所以一个SCTP 传送地址由一个IP 地址加一个SCTP 端口号决定。SCTP 端口 号就是SCTP 用来识别同一地址上的用户,和TCP 端口号是一个概念。比如IP 地 址10.105.28.92 和SCTP 端口号1024 标识了一个传送地址,而10.105.28.93 和 1024 则标识了另外一个传送地址,同样,10.105.28.92 和端口号1023 也标识了一 个不同的传送地址。

      2. 主机和端点

      主机(HoST) 主机配有一个或多个 IP 地址,是一个典型的物理实体。

      端点(SCTP Endpoint)

      端点是SCTP 的基本逻辑概念,是数据报的逻辑发送者和接收者,是一个典型的逻 辑实体。

      一个传送地址(IP 地址+SCTP 端口号)唯一标识一个端点。一个端点可以由多个 传送地址进行定义,但对于同一个目的端点而言,这些传送地址中的IP 地址可以配 置成多个,但必须使用相同的SCTP 端口。

      3. 偶联和流

      偶联(AssociATION) 偶联就是两个 SCTP 端点通过SCTP 协议规定的4 步握手机制建立起来的进行数据 传递的逻辑联系或者通道。 SCTP 协议规定在任何时刻两个端点之间能且仅能建立一个偶联。由于偶联由两个 端点的传送地址来定义,所以通过数据配置本地IP 地址、本地SCTP 端口号、对端 IP 地址、对端SCTP 端口号等四个参数,可以唯一标识一个SCTP 偶联。正因为如 此,在GTSOFTX3000 中,偶联可以被看成是一条M2UA 链路或M3UA 链路。

      流(Stream) 流是 SCTP 协议的一个特色术语。SCTP 偶联中的流用来指示需要按顺序递交到高 层协议的用户消息的序列,在同一个流中的消息需要按照其顺序进行递交。严格地 说,“流”就是一个SCTP 偶联中,从一个端点到另一个端点的单向逻辑通道。一 个偶联是由多个单向的流组成的。各个流之间相对独立,使用流ID 进行标识,每个 流可以单独发送数据而不受其他流的影响。

      4. 通路(Path)和首选通路(Primary Path)

      通路(Path) 通路是一个端点将 SCTP 分组发送到对端端点特定目的传送地址的路由。如果分组 发送到对端端点不同的目的传送地址时,不需要配置单独的通路。

      首选通路(Primary Path) 首选通路是在默认情况下,目的地址、源地址在SCTP 分组中发到对端端点的通路。

      如果可以使用多个目的地地址作为到一个端点的目的地址,则这个SCTP 端点为多 归属。如果发出SCTP 分组的端点属于多归属节点时,如果定义了目的地址、源地 址,能够更好控制响应数据块返回的通路和数据包被发送的接口。 一个 SCTP 偶联的两个SCTP 端点都可以配置多个IP 地址,这样一个偶联的两个 端点之间具有多条通路,这就是SCTP 偶联的多地址性。SCTP 偶联的多地址性是 SCTP 与TCP 最大的不同。

      一个偶联可以包括多条通路,但只有一个首选通路。如图1所示,MGC(如 GTSOFTX3000)一个端点包括两个传送地址(10.11.23.14:2905 和10.11.23.15: 2905),而SG 一个端点也包括两个传送地址(10.11.23.16:2904 和10.11.23.17: 2904)。

     SCTP 双归属

     

      图1 SCTP 双归属

      此两个端点决定了一个偶联,该偶联包括4 条通路(Path0、Path1、Path2 和Path3)。 根据数据配置可以确定此4 条通路的选择方式,如图2所示。图中定义了4 条通 路,而且首选通路为Path0: Path0:本端传送地址1(10.11.23.14:2905)发送SCTP 分组到对端传送地 址1(10.11.23.16:2904)。

      Path1:本端传送地址1(10.11.23.14:2905)发送SCTP 分组到对端传送地 址2(10.11.23.17:2904)。

      Path2:本端传送地址2(10.11.23.15:2905)发送SCTP 分组到对端传送地 址1(10.11.23.16:2904)。

      Path3:本端传送地址2(10.11.23.15:2905)发送SCTP 分组到对端传送地 址2(10.11.23.17:2904)。

      端点发送的 SCTP 工作原理为:本端点传送地址A 发送的SCTP 包通过首选通路发 送到对端端点。当首选通路出现故障后,SCTP 可以自动切换到其他备用通路上, 优先切换对端端点的传送地址,再次切换本端端点的传送地址。

      SCTP 定义了心跳消息(Heart Beat)。当某条通路空闲时,本端SCTP 用户要求 SCTP 生成相应的心跳消息并通过该通路发送到对端端点,而对端端点必须立即发 回对应的心跳确认消息。这种机制被用来精确测量回路时延RTT(Round Trip TIme),而且可以随时监视偶联的可用情况和保持SCTP 偶联的激活状态。

    确定通路选择方式的数据配置

     

      图2 确定通路选择方式的数据配置

      5. TSN 和SSN

      传输顺序号 TSN(Transmission Sequence Number) SCTP 使用TSN 机制实现数据的确认传输。一个偶联的一端为本端发送的每个数据 块顺序分配一个基于初始TSN 的32 位顺序号,以便对端收到时进行确认。 TSN 是基于偶联进行维护的。

      流顺序号 SSN(Stream Sequence Number)

      SCTP 为本端在这个流中发送的每个数据块顺序分配一个16 位SSN,以便保证流 内的顺序传递。 在偶联建立时,所有流中的SSN 都是从0 开始。当SSN 到达65535 后,则接下来 的SSN 为0。 TSN 和SSN 的分配是相互独立的。

      6. 拥塞窗口CWND(Congestion Window)

      SCTP 也是一个滑动窗口协议,拥塞窗口是针对每个目的地址维护的,它会根据网 络状况调节。当目的地址的发送未证实消息长度超过其CWND 时,端点将停止向这 个地址发送数据。

      7. 接收窗口RWND(Receive Window)

      RWND 用来描述一个偶联对端的接收缓冲区大小。偶联建立过程中,双方会交换彼 此的初始RWND。RWND 会根据数据发送、证实的情况即时地变化。RWND 的大 小限制了SCTP 可以发送的数据的大小。当RWND 等于0 时,SCTP 还可以发送一 个数据报,以便通过证实消息得知对方缓冲区的变化,直到达到CWND 的限制。

      8. 传输控制块TCB(Transmission Control Block)

      TCB 是一种内部数据结构,是一个SCTP 端点为它与其他端点之间已经启动的每一 个偶联生成的。TCB 包括端点的所有状态、操作信息,便于维护和管理相应的偶联。

SCTP功能

  •   如图所示,SCTP 的功能主要包括:偶联的建立和关闭、流内消息顺序递交、用户数据分段、证实和避免拥塞、消息块绑定、分组的有效性和通路管理。

    SCTP 功能示意图

      图 SCTP 功能示意图

      1、偶联的建立和关闭

      偶联的建立是由 SCTP 用户(如M2UA、M3UA 等)发起请求来启动的。而且建立 过程相对于TCP 连接而言比较复杂,是个“四次握手”过程,并用到了“COOKIE” 的机制。COOKIE 是一个含有端点初始信息和加密信息的数据块,通信的双方在关 联建立时需要处理并交换,从而增加协议的安全性,防止拒绝服务和伪装等潜在的 攻击。 SCTP 提供了对激活偶联的正常的关闭程序,它必须根据SCTP 用户的请求来执行, 当然SCTP 也提供一种非正常(即中止)程序,中止程序的执行既可以根据SCTP 用户的请求来启动,也可以由SCTP 协议检查出差错来中止。 SCTP 不支持半打开状态(即一端可以在另一端结束后继续发送数据)。无论是哪 个端点执行了关闭程序,偶联的两端都应停止接受从SCTP 用户发来请求原语。

      2、流内消息顺序递交

      SCTP 提供数据报的顺序传递,顺序传递的数据报必须放在一个“流”中传递。流 是顺序传递的基石。 通过流,SCTP 将数据的确认和传输的有序递交分成两种不同机制。SCTP 使用TSN 机制实现了数据的确认传输,使用流号和SSN(流顺序号)则实现数据的有序递交。 当SCTP 收到数据的SSN 连续的时候,SCTP 就可以将数据向SCTP 用户递交, 而不用等到数据的TSN 号连续以后才向SCTP 用户递交。

      当一个流被闭塞时,期望的下一个连续的SCTP 用户消息可以从另外的流上进行递 交。 SCTP 也提供非顺序递交的业务,接收到的用户消息可以使用这种方式立即递交到 SCTP 用户,而不需要保证其接收顺序。

      3、用户数据分段

      SCTP 通过对传送通路上最大PMTU(Path Maximum TransmissiON Unit)的检测, 实现在SCTP 层将超大用户数据分片打包,避免在IP 层的多次分片、重组,可以减 少IP 层的数据负担。

      在发送端,SCTP 可以对大的用户数据报进行分片以确保SCTP 数据报传递到 低层时适合通路MTU(Maximum Transmission Unit)。

      在接收端,SCTP 将分片重组为完整的用户数据报,然后传递给SCTP 用户。

      4、 证实和避免拥塞

      证实和重传是协议保证传输可靠性的策略,SCTP 也一样。证实机制是SCTP 保证 传输可靠性的基石。避免拥塞沿袭了TCP 的窗口机制,进行合适的流量控制。 ??

      SCTP 在将数据(数据分片或未分片的用户数据报)发送给底层之前顺序地为 之分配一个发送顺序号(TSN)。

      TSN 和SSN(流顺序号)是相互独立的,TSN 用于保证传输的可靠性,SSN 用于保证流内消息的顺序传递。

      TSN 和SSN 在功能上使可靠传递和顺序传递分开。接收端证实所有收到的 TSNs,即使其中有些尚未收到。

      包重发功能负责 TSN 的证实,还负责拥塞消除。

      5、 消息块绑定

      如果长度很短的用户数据被带上很大一个 SCTP 消息头,其传递效率会很低,因此, SCTP 将几个用户数据绑定在一个SCTP 报文里面传输,以提高带宽的利用率。

      SCTP 分组由公共分组头和一个/多个信息块组成,信息块可以是用户数据,也 可以是SCTP 控制信息。

      SCTP 用户能够可选地使用捆绑功能,决定是否将多个用户数据报捆绑在一个 SCTP 分组中。

      为提高效率,拥塞/重发时,捆绑功能可能仍被执行,即使用户已经禁止捆绑。

      6 、分组的有效性

      分组的有效性是 SCTP 提供无差错传输的基石。SCTP 分组的公共分组头包含一个 验证标签(VerificATIon Tag)和一个可选的32 位校验码(Checksum)。 验证标签的值由偶联两端在偶联启动时选择。如果收到的分组中如果没有期望的验 证标签值,接收端将丢弃这个分组,以阻止攻击和失效的SCTP 分组。 校验码由 SCTP 分组的发送方设置,以提供附加的保护,用来避免由网络造成的数 据差错。接收端将丢弃包含无效校验码的SCTP 分组。

      7、 通路管理

      发送端的 SCTP 用户能够使用一组传送地址作为SCTP 分组的目的地。SCTP 管理 功能可以根据SCTP 用户的指令和当前合格的目的地集合的可达性状态,为每个发 送的SCTP 分组选择一个目的地传送地址。当其他分组业务量不能完全表明可达性 时,通路管理功能可以通过心跳消息来监视到某个目的地地址的可达性,并当任何 对端传送地址的可达性发生变化时,向SCTP 用户提供指示。通路功能也用来在偶 联建立时,向对端报告合格的本端传送地址集合,并把从对端返回的传送地址报告 给本地的SCTP 用户。 在偶联建立时,为每个 SCTP 端点定义一个首选通路,用来正常情况下发送SCTP 分组。

      在接收端,通路管理功能在处理SCTP 分组前,用来验证入局的SCTP 分组属于的 偶联是否存在。

SCTP 基本信令流程

  •   1 偶联的建立和发送流程

      SCTP 端点A 启动建立偶联,并向端点B 发送一个用户消息,随后端点B 向A 发送 两个用户消息。(假定这些消息没有捆绑和分段)。信令流程如图1所示。

    偶联建立过程消息交互图

     

      图1 偶联建立过程消息交互图

      (1) 端点A 创建一个数据结构TCB(传输控制块)来描述即将发起的这个偶联(包 含偶联的基本信息),然后向端点B 发送INIT 数据块。INIT 数据块中主要包 括如下参数:

      启动标签(Initiate Tag):对端验证标签,如设为Tag_A。Tag_A 是从1 到 4294967295 中的一个随机数。

      输出流数量(OS):本端点期望的最大出局流的数量。

      输入流数量(MIS):本端点允许入局流的最大数量。

      (2) 端点B 收到INIT 消息后,立即用INIT ACK 数据块响应。INIT ACK 数据块中 必须带有如下参数:

      目的地 IP 地址:设置成INIT 数据块的起源IP 地址。

      启动标签(Initiate Tag):设置成Tag_B。

      状态 COOKIE(STATE COOKIE):根据偶联的基本信息生成一个TCB,不 过这个TCB 是一个临时TCB。这个TCB 生成以后,将其中的必要信息(包含 一个COOKIE 生成的时间戳、COOKIE 的生命期)和一个本端的密钥通过 RFC2401 描述的算法计算成一个32 位的摘要MAC(这种计算是不可逆的)。 必要信息和MAC 组合成STATE COOKIE 参数。

      本端点传送地址。

      最大入局流的数量。

      最大出局流的数量。

      (3) 端点A 收到INIT ACK 后,首先停止INIT 定时器定时器 的供应商离开COOKIE-WAIT 状态, 然后发送COOKIE ECHO 数据块,将收到INIT ACK 数据块中的STATE COOKIE 参数原封带回。最后端点A 启动COOKIE 定时器并进入 COOKIE-ECHOED 状态。

      (4) 端点B收到COOKIE ECHO数据块后,进行COOKIE验证。将STATE COOKIE 中的TCB 部分和本端密钥根据RFC2401 的MAC 算法进行计算,得出的MAC 和STATE COOKIE 中携带的MAC 进行比较。如果不同则丢弃这个消息;如 果相同,则取出TCB 部分的时间戳,和当前时间比较,看时间是否已经超过 了COOKIE 的生命期。如果是,同样丢弃。否则根据TCB 中的信息建立一个 和端A 的偶联。端点B 将状态迁入ESTABLISHED,并发出COOKIE ACK 数 据块。端点B 向SCTP 用户发送SCOMMUNCIATION UP 通知。

      (5) 端点A 向端点B 发送一个DATA 数据块,启动T3-RTS 定时器。DATA 数据 块中必须带有如下参数:

      TSN:DATA 数据块的初始TSN。

      流标识符(Stream Identifier):用户数据属于的流,假设流标识符为0。

      流顺序码(Stream Sequence Number):所在流中的用户数据的顺序号码。 该字段从0 到65535。

      用户数据(User Data):携带用户数据净荷。

      (6) 端点B 收到DATA 数据块后,返回SACK 数据块。SACK 数据块中必须带有 如下参数:

      累积证实 TSN 标签(Cumulative TSN Ack):端点A 的初始TSN。

      间隔块(Gap Ack Block):此值为0。 端点 A 收到SACK 数据块后,停止T3-RTX 定时器。

      (7) 端点B 向端点A 发送第一个DATA 数据块。DATA 数据块中必须带有如下参 数:

      TSN:端点B 发出DATA 数据块的初始TSN。

      流标识符(Stream Identifier):用户数据属于的流,假设流标识符为0。

      流顺序码(Stream Sequence Number):所在流中的用户数据的顺序号码。 假设流顺序码为0。

      用户数据(User Data):携带用户数据净荷。

      (8) 端点B 向端点A 发送第二个DATA 数据块。DATA 数据块中必须带有如下参 数:

      TSN:端点B 发出DATA 数据块的初始TSN+1。

      流标识符(Stream Identifier):用户数据属于的流,假设流标识符为0。

      流顺序码(Stream Sequence Number):所在流中的用户数据的顺序号码。 此时流顺序码为1。

      用户数据(User Data):携带用户数据净荷。

      (9) 端点A 收到DATA 数据块后,返回SACK 数据块。SACK 数据块中必须带有 如下参数:

      累积证实 TSN 标签(Cumulative TSN Ack):端点B 的初始TSN。

      间隔块(Gap Ack Block):此值为0。

      2 偶联关闭流程

      一个端点退出服务时,需要停止它的偶联。偶联的停止使用两种流程:偶联的中止 流程(非正常关闭)和偶联的正常关闭流程。 偶联的中止(非正常关闭)可以在任何未完成期间进行,偶联的两端都舍弃数据并 且不提交到对端。此种方法不考虑数据的安全。偶联的中止步骤比较简单:发起端 点向对端端点发送ABORT 数据块,发送的SCTP 分组中必须填上对端端点的验证 标签,而且不在ABORT 数据块中捆绑任何DATA 数据;接收端点收到ABORT 数 据块后,进行验证标签的检查。如果验证标签与本端验证标签相同,接收端点从记 录上清除该偶联,并向SCTP 用户报告偶联的停止。

      偶联的正常关闭:任何一个端点执行正常关闭程序时,偶联的两端将停止接受从其 SCTP 用户发来的新数据,并且在发送或接收到SHUTDOWN 数据块时,把分组中 的数据递交给SCTP 用户。偶联的关闭可以保证所有两端的未发送、发送未证实数 据得到发送和证实后再终止偶联。

    偶联正常关闭消息交互图

     

      图2 偶联正常关闭消息交互图

      偶联的正常关闭步骤如下:

      (1) 偶联关闭发起端点A 的SCTP 用户向SCTP 发送请求SHUTDOWN 原因。 SCTP 偶联从ESTABLISHED 状态迁入SHUTDOWN-PENDING 状态。在这 个状态,SCTP 不接受SCTP 用户在这个偶联上的任何数据发送请求。同时等待端点A 所有发送未证实的数据得到端点B 的证实。当所有端点A 发送未证 实数据得到证实,则向端点B 发送SHUTDOWN 数据块。端点A 启动 T2-shutdown 定时器进入SHUTDOWN-SENT 状态。启动T2-shutdown 定时 器的目的是等待端点B 发回的SHUTDOWN-ACK 数据块,如果定时器超时, 则端点A 必须重新发送SHUTDOWN 数据块。

      (2) 端点B 收到SHUTDOWN 消息后,进入SHOUTDOWN-RECEIVED 状态, 不再接收从SCTP 用户发来的的新数据,并且检查数据块的累积TSN ACK 字 段,验证所有未完成的DATA 数据块已经被SHUTDOWN 的发送方接收。当 端点B 所有未发送数据和发送未证实数据得到发送和证实后, 发送 SHUTDOWN ACK 数据块并启动本端T2-SHUTDOWN 定时器,并且进入 SHUTDOWN-ACK-SENT 状态。如果定时器超时了,端点B 则重新发送 SHUTDOWN ACK 数据块。

      (3) 端点A 收到SHUTDOWN ACK 消息后,停止T2-shutdown 定时器,并且向端 点B 发送SHUTDOWN COMPLETE 数据块,并清除偶联的所有记录。端点B 收到SHUTDOWN COMPLETE 数据块后, 验证是否处于 SHUTDOWN-ACK-SENT 状态。如果不是处于该状态,则丢弃该数据块;如 果端点处于SHUTDOWN-ACK-SENT 状态,端点B 则停止T2-shutdown 定时 器并清除偶联的所有记录,进入CLOSED 状态。