SCTP

发布时间:2024-05-16 14:33:34 作者:汉语成语

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

相关术语

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地址,是一个典型的物理实体。

端点(SCTPEndpoint)

端点是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)和通路(PrimaryPath)

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

通路(PrimaryPath)通路是在默认情况下,目的地址、源地址在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)。

图1SCTP双归属

此两个端点决定了一个偶联,该偶联包括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定义了心跳消息(HeartBeat)。当某条通路空闲时,本端SCTP用户要求SCTP生成相应的心跳消息并通过该通路发送到对端端点,而对端端点必须立即发回对应的心跳确认消息。这种机制被用来精确测量回路时延RTT(RoundTripTime),而且可以随时监视偶联的可用情况和保持SCTP偶联的激活状态。

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

5.TSN和SSN

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

流顺序号SSN(StreamSequenceNumber)

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

6.拥塞窗口CWND(CongestionWindow)

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

7.接收窗口RWND(ReceiveWindow)

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

8.传输控制块TCB(TransmissionControlBlock)

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

功能

如图所示,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(PathMaximumTransmissiONUnit)的检测,实现在SCTP层将超大用户数据分片打包,避免在IP层的多次分片、重组,可以减少IP层的数据负担。

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

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

7、通路管理

发送端的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数据块中主要包括如下参数:

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

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

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

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

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

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

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

本端点传送地址。

入局流的数量。

出局流的数量。

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

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

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

TSN:DATA数据块的初始TSN。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

间隔块(GapAckBlock):此值为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用户发来的的新数据,并且检查数据块的累积TSNACK字段,验证所有未完成的DATA数据块已经被SHUTDOWN的发送方接收。当端点B所有未发送数据和发送未证实数据得到发送和证实后,发送SHUTDOWNACK数据块并启动本端T2-SHUTDOWN定时器,并且进入SHUTDOWN-ACK-SENT状态。如果定时器超时了,端点B则重新发送SHUTDOWNACK数据块。

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