[关闭]
@ju1900 2017-07-04T10:05:45.000000Z 字数 7252 阅读 2354

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 端口。

image_1bk3igu5sj4c1s2q1shm1v4pstem.png-10.4kB


3. 偶联和流

偶联(Association)
偶联就是两个 SCTP 端点通过 SCTP 协议规定的 4 步握手机制 建立起来的进行数据传递的逻辑联系或者通道。 SCTP 协议规定在任何时刻两个端点之间能且仅能建立一个偶联由于偶联由两个端点的传送地址来定义,所以通过数据配置本地 IP 地址、本地 SCTP 端口号、对端 IP 地址、对端 SCTP 端口号等四个参数,可以唯一标识一个SCTP 偶联。正因为如此,在 GTSOFTX3000 中,偶联可以被看成是一条 M2UA 链路或 M3UA 链路。
流(Stream)
流是 SCTP 协议的一个特色术语。SCTP 偶联中的流用来指示需要 按顺序递交 到高层协议的用户消息的序列,在同一个流中的消息需要按照其顺序进行递交。严格地说,“流”就是一个SCTP 偶联中,从一个端点到另一个端点的 单向逻辑通道一个偶联是由多个单向的流组成的。各个流之间相对独立,使用 流 ID 进行标识,每个流可以单独发送数据而不受其他流的影响。

4. 通路和首选通路

通路(Path)
通路是一个端点将 SCTP 分组发送到对端端点特定目的传送地址的 路由。如果分组发送到对端端点不同的目的传送地址时,不需要配置单独的通路??
首选通路(Primary Path)
首选通路是在默认情况下,目的地址、源地址在 SCTP 分组中发到对端端点的通路。
多归属
如果可以使用多个目的地地址作为到一个端点的目的地址,则这个 SCTP 端点为多归属。如果发出 SCTP 分组的端点属于多归属节点时,如果定义了目的地址、源地址,能够更好控制响应数据块返回的通路和数据包被发送的接口。一个 SCTP 偶联的两个 SCTP 端点都可以配置多个 IP 地址,这样一个偶联的两个端点之间具有多条通路,这就是 SCTP 偶联的多地址性。SCTP 偶联的多地址性是 SCTP 与 TCP 最大的不同。

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

image_1bk3jppe2pqo1i3t5m767g14sd13.png-53.2kB

此两个端点决定了一个偶联,该偶联包括 4 条通路(Path0、Path1、Path2 和Path3)。根据数据配置可以确定此4 条通路的选择方式,如下图所示。图中定义了4 条通 路,而且首选通路为Path0:

通路选取原则
端点发送的 SCTP 工作原理为:本端点传送地址 A 发送的 SCTP 包通过首选通路发送到对端端点。当首选通路出现故障后,SCTP 可以自动切换到其他备用通路上,优先切换对端端点的传送地址,再次切换本端端点的传送地址。
心跳消息(Heart Beat)
当某条通路空闲时,本端 SCTP 用户要求 SCTP 生成相应的心跳消息并通过该通路发送到对端端点,而对端端点必须立即发 回对应的心跳确认消息。这种机制被用来精确测量回路时延RTT(Round Trip Time),而且可以随时监视偶联的可用情况和保持 SCTP 偶联的激活状态。

image_1bk3jua0ur2sm8c48l1m6t1r281g.png-77.8kB


5. TSN 和SSN

传输顺序号 TSN(Transmission Sequence Number)
SCTP 使用 TSN 机制实现数据的确认传输。一个偶联的一端为本端发送的每个数据块顺序分配一个基于初始 TSN 的 32 位顺序号(4步握手决定),以便对端收到时进行确认。 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 还可以发送一个数据报,以便 通过证实消息(SACK)消息得知对方缓冲区的变化,直到达到CWND 的限制。


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

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


SCTP功能

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

image_1bk3l4lg1cc913d0133ranu1tjf2d.png-63.5kB


1、偶联的建立和关闭

偶联的建立是由 SCTP 用户(如 M2UA、M3UA 等)发起请求来启动的。而且建立过程相对于 TCP 连接而言比较复杂,是个 四次握手 过程,并用到了 COOKIE 的机制。

COOKIE
是一个含有端点初始信息和加密信息的数据块,通信的双方在关联建立时需要处理并交换,从而增加协议的安全性,防止拒绝服务和伪装等潜在的 攻击

SCTP 提供了对激活偶联的 正常的关闭程序,它必须根据 SCTP 用户的请求来执行, 当然 SCTP 也提供一种非正常(即中止)程序,中止程序 的执行既可以根据 SCTP 用户的请求来启动,也可以由 SCTP 协议检查出差错来中止。 SCTP 不支持半打开状态(即一端可以在另一端结束后继续发送数据)。无论是哪个端点执行了关闭程序,偶联的两端都应停止接受从 SCTP 用户发来请求原语。


2、流内消息顺序递交

SCTP 提供数据报的顺序传递,顺序传递的数据报必须放在一个“流”中传递。流是顺序传递的基石。 通过流,SCTP 将数据的确认传输和有序递交分成两种不同机制。SCTP 使用 TSN(传输顺序号) 机制实现了数据的确认传输,使用流号(ID)和SSN(流顺序号)则实现数据的有序递交。

当 SCTP 收到数据的 SSN 连续的时候,SCTP 就可以将数据向 SCTP 用户递交, 而不用等到数据的 TSN 号连续以后才向 SCTP 用户递交

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


3、用户数据分段

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


4、 证实(SACK)和避免拥塞

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


5、 消息块绑定

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


6 、分组的有效性

分组的有效性是 SCTP 提供无差错传输的基石。SCTP 分组的公共分组头包含一个 验证标签(Verification Tag)和一个可选的 32 位校验码(Checksum)


7、 通路管理


SCTP 基本信令流程

image_1bk3pdv63v1m1akm96gjl1lfe6v.png-166.4kB

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

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

image_1bk3mt6avtgdi1h192i1k591jm72q.png-50.8kB

image_1bk5jb8eliljp1t10gr1jgg3fd9.png-78.5kB

(1) 端点 A 创建一个数据结构 TCB(传输控制块)来描述即将发起的这个偶联(包含偶联的基本信息),然后向端点 B 发送 INIT 数据块, 启动 INIT 计时器, 进入 COOKIE-WAIT 状态

image_1bk5jle5mtfq130u4u5nqe1arb1g.png-82.8kB

(2) 端点B 收到 INIT 消息后,立即用 INIT ACK 数据块响应

image_1bk5jpvtg1gkro1k6ba1dmt1r571t.png-93.5kB

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

image_1bk5k1db91q0e2b15j716o7nt42a.png-69.2kB

(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 通知。端点 A 接收到 COOKIE ACK, 也会进入 ESTABLISHED 状态

image_1bk5kb3hm10ehlk31tbo1fna6hf2n.png-61.8kB

(5) 端点 A 向端点B 发送一个 DATA 数据块,启动 T3-RTS 定时器

image_1bk5keebb17o91apbfb5cofv9q34.png-79.3kB

(6) 端点 B 收到 DATA 数据块后,返回 SACK 数据块

image_1bk5kk1phdn47dp1is015b8l303h.png-75.9kB

(7) 端点 B 向端点 A 发送第一个 DATA 数据块

image_1bk5ko0qc1hd914u71n6m6eila14e.png-85.9kB

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

image_1bk5krgc01an0msr1ocfqca14fg4r.png-83.3kB


2. 偶联关闭流程

一个端点退出服务时,需要停止它的偶联。偶联的停止使用两种流程:偶联的中止流程(非正常关闭)和偶联的正常关闭流程。

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

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

image_1bk3nbdm54ql7et4f3krfmtm3n.png-27.3kB

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

image_1bk3sc4og1vh913lgoq462t1qqt9q.png-81.1kB

  (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 状态。
  

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注