流控制传输协议SCTP
SCTP
提供的服务与UDP
和TCP
提供的类似。
SCTP
在客户和服务器之间提供关联,并像TCP
那样给应用提供可靠性,排序,流量控制以及全双工的数据传送。SCTP
使用关联一词取代连接是为了避免这样的内涵:一个连接只涉及两个IP
地址之间的通信,一个关联指代两个系统之间的一次通信,它可能因为SCTP
支持多宿而涉及不止两个地址。
与TCP
不同的是,SCTP
是面向消息的,它提供各个记录的按序递送服务。与UDP
一样,由发送端写入的每条记录的长度随数据一起传送给接收端应用。
SCTP
能够在所连接的端点之间提供多个流,每个流各自可靠地按序传递消息。一个流上某个消息的丢失不会阻塞同一关联其他流上消息的投递。这种做法与TCP
正好相反,就TCP而言,在单一字节流中任何位置的字节丢失都将阻塞该连接上其后所有数据的递送,直到该丢失被修复为止。
SCTP
还提供多宿特性,使得单个SCTP
端点能够支持多个IP
地址。该特性可以增强应对网络故障的健壮性。一个端点可能有多个冗余的网络连接,每个网络又可能有各自接入因特网基础设施的连接。当该端点与另一个端点建立一个关联后,如果它的某个网络或某个跨越因特网的通路发生故障,SCTP
就可以通过切换到使用已与该关联相关的另一个地址来规避所发生的故障。
SCTP关联的建立和终止
与TCP
一样,SCTP
也是面向连接的。因此也有关联的建立与终止的握手过程。不过SCTP
的握手过程不同于TCP
。
四路握手
建立一个SCTP
关联的时候会发生如下情形。
- 服务器必须准备好接受外来的关联。这通常通过调用
socket
,bind
,listen
这三个函数来完成,称为被动打开。 - 客户通过调用
connect
或者发送一个隐式打开该关联的消息进行主动打开,这使得客户SCTP
发送一个INIT
消息(初始化),该消息告诉服务器客户的IP
地址清单,初始序列号,用户表示本关联中所有分组的起始标记,客户请求的外出流的数目以及客户能够支持的外来流的数目。 - 服务器以一个
INIT ACK
消息确认客户的INIT
消息,其中含有服务器的IP
地址清单,初始序列号,起始标记,服务器请求的外出流的数目,服务器能够支持的外来流的数目以及一个状态cookie
。状态cookie
包含服务器用于确信本关联有效所需的所有状态,它是数字化签名过的,以确保其有效性。 - 客户以一个
COOKIE ECHO
消息回射服务器的状态cookie
。除COOKIE ECHO
外,该消息可能在同一个分组中还捆绑了用户数据。 - 服务器以一个
COOKIE ACK
消息确认客户回射的cookie
是正确的,本关联于是建立。该消息也可能在同一个分组中还捆绑了用户数据。
SCTP
的四路握手在很多方面类似于TCP
的三路握手,差别在于作为SCTP
整体一部分的cookie
的生成。INIT
承载一个验证标记
T
a
T_a
Ta和一个初始序列号
J
J
J。在关联的有效期内,验证标记
T
a
T_a
Ta必须在对端发送的每个分组中出现。初始序列号
J
J
J用作承载用户数据的DATA块的起始序列号。对端也在INIT ACK
中承载一个验证标记
T
Z
T_Z
TZ,在关联的有效期内,验证标记
T
Z
T_Z
TZ也必须在其发送的每个分组中出现。除了验证标记
T
Z
T_Z
TZ和初始序列号K外,INIT
的接收端还在作为相应的INIT ACK
中提供一个cookie C
。该cookie
包含设置本SCTP
关联所需的所有状态,这样服务器的SCTP
栈就不必保存所关联客户的有关信息。
四路握手过程结束时,两端各自选择一个主目的地址。当不存在网络故障时,主目的地址将用作数据要发送的默认目的地。
关联终止
SCTP不像TCP那样允许“半关闭”的关联。当一端关闭某个关联时,另一端必须停止发送新的数据。关联关闭请求的接收端发送完已经排队的数据(如果有的话)后,完成关联的关闭。
SCTP
没有类似于TCP
的TIME_WAIT
状态,因为SCTP
使用了验证标记。所有后续块都在捆绑他们的SCTP
分组的公共首部标记了初始的INIT
块和INIT ACK
块中作为起始标记交换的验证标记;由来自旧连接的块通过所在SCTP
分组的公共首部间接携带的验证标记对于新连接来说是不正确的。因此,SCTP
通过放置验证标记值就避免了TCP
在TIME_WAIT
状态保持整个连接的做法。
观察分组
本例中,客户在COOKIE ECHO块所在分组中捎带了它的第一个DATA块,服务器则在作为应答的COOKIE ACK块所在分组中捎带了数据。
SCTP分组中信息的单位称为块。块是自描述的,包含一个块类型,若干个块标记和一个块长度。这样做方便了多个块的绑缚,只要把他们简单的组合到一个SCTP外出消息中。