与 TCP 一样,SCTP 也是面向连接的,因而也有关联的建立和终止的握手过程。
建立一个 SCTP 连接时发生的情形如下:
1、服务器必须准备好接受外来的连接。这通常通过调用 socket、bind 和 listen 这 3 个函数来完成,称为被动打开。
2、客户通过调用 connect 或者发送一个隐式打开该连接的消息进行主动打开。这使得客户 SCTP 发送一个 INIT 消息,用以告诉服务器客户的 IP 地址清单、初始序列号、用于标识本关联中所有分组的起始标记、客户请求的外出流的数目以及能够支持的外来流的数目。
3、服务器以一个 INIT ACK 消息确认客户的 INIT 消息,其中含有服务器的 IP 地址清单、初始序列号、起始标记、服务器请求的外出流的数目、服务器能够支持的外来流的数目以及一个数字签名过的状态 cookie。,其中包含了服务器用于确信本关联有效所需的所有状态,这样服务器的 SCTP 栈就不必保存所关联客户的有关信息。
4、客户以一个 COOKIE ECHO 消息回射服务器的状态 cookie。该消息也可能在同一个分组中捆绑了用户数据。
5、服务器以一个 COOKIE ACK 消息确认客户回射的 cookie 是正确的,连接建立成功。同样,该消息也可能捆绑了用户数据。
本过程至少需要 4 个分组,故称为 SCTP 的四路握手(four-way handshake)。下图展示了这个过程:
[img]http://dl2.iteye.com/upload/attachment/0126/2272/e7582579-ffd7-3ba1-879e-b3965476f2a7.png[/img]
SCTP 的四路握手与 TCP 的三路握手的差别主要在于作为 SCTP 整体一部分的 cookie 的生成。INIT 承载一个验证标记 Ta 和一个初始序列号 J。在之后关联的有效期内,另一方发送的每个分组中必须出现该 Ta 标记。同样,对端发送的 INIT ACK 中承载的 Tz 标记之后也必须出现在本端发送的每个分组中。
四路握手过程结束时,两端各自选择一个主目的地址,作为无网络故障发生时数据要发送到的默认目的地。
在SCTP 中使用四路握手是为了避免某种形式的拒绝服务攻击。SCTP 使用 cookie 的四路握手定形了一种防护这种攻击的方法。TCP 的许多实现也使用类似的方法,但 TCP 中 cookie 状态必须编码到只有 32 位长的初始序列号中,而 SCTP 为此提供了一个任意长度的字段,并且要求实施基于加密的安全性以防护攻击。
对于 SCTP 连接的终止,SCTP 不像 TCP 那样允许“半关闭”的关联。当一端关闭某个连接时,另一端必须停止发送新的数据。连接关闭请求的接收端发送完已经排队的数据(如果有的话)后,完成关联的关闭。下图展示了这一交换过程:
[img]http://dl2.iteye.com/upload/attachment/0126/2280/a1046188-0c86-310a-9df7-49fe59a56512.png[/img]
SCTP 没有类似于 TCP 的 TIME_WAIT 状态,因为 SCTP 使用了验证标记。所有后续块都在捆绑它们的 SCTP 分组的公共首部标记了初始的 INIT 块和 INIT ACK 块中作为起始标记交换的验证标记。由来自旧连接的块通过所在的 SCTP 分组的公共首部间接携带的验证标记对于新连接来说是不正确的。因此,SCTP 通过放置验证标记值就避免了 TCP 在 TIME_WAIT 状态保持整个连接的做法。
同 TCP 一样,SCTP 的连接和终止过程也可用状态转换图来说明。
[img]http://dl2.iteye.com/upload/attachment/0126/2715/495f40ff-a2ca-3985-89d5-7bb353b4a8a8.png[/img]
从一个状态转换到另一个状态是由 SCTP 规则基于当前状态及在该状态下所接收的块来规定的。举例来说,当某个应用进程在 CLOSED 状态下执行主动打开时,SCTP 将发送一个 INIT,且新的状态是 COOKIE-WAIT。如果该 SCTP 接着接收到一个 INIT ACK,它将发送一个 COOKIE ECHO,且新的状态是 COOKIE-ECHOED。若其随后又接收到一个 COOKIE ACK,它将转换成 ESTABLISHED 状态。该最终状态是绝大多数数据传送发生点的状态,尽管 DATA 块也可以由 COOKIE ECHO 块或 COOKIE ACK 块所在消息捆绑捎带。从 ESTABLISHED 状态引出的两个箭头处理连接的终止。如果某个应用进程在接收到一个 SHUTDOWN 之前调用 close(主动关闭),那就转换到 SHUTDOWN-PENDING 状态;否则,如果接收到一个 SHUTDOWN(被动关闭)
,那就切换到 SHUTDOWN-RECEIVED 状态。
下图展示了 SCTP 连接建立、数据传输和连接终止 3 个阶段所发生的实际分组交换情况,以及每个端点所历经的 SCTP 状态。
[img]http://dl2.iteye.com/upload/attachment/0126/2399/1bf49c7f-0c9b-3d6e-a667-bb25903d7ae0.png[/img]
图中,客户在 COOKIE ECHO 块所在分组中捎带了它的第一个 DATA 块,服务器则在作为应答的 COOKIE ACK 块分组中捎带了数据。一般而言,当网络应用采用一到多接口式样时,COOKIE ECHO 通常都会捎带一个或多个 DATA 块。
SCTP 分组中消息的单位称为块(chunk)。块是自描述的,包含一个块类型、若干个块标记和一个块长度。这样做方便了多个块的绑缚,只需要把它们简单地组合到一个 SCTP 外出消息即可。
建立一个 SCTP 连接时发生的情形如下:
1、服务器必须准备好接受外来的连接。这通常通过调用 socket、bind 和 listen 这 3 个函数来完成,称为被动打开。
2、客户通过调用 connect 或者发送一个隐式打开该连接的消息进行主动打开。这使得客户 SCTP 发送一个 INIT 消息,用以告诉服务器客户的 IP 地址清单、初始序列号、用于标识本关联中所有分组的起始标记、客户请求的外出流的数目以及能够支持的外来流的数目。
3、服务器以一个 INIT ACK 消息确认客户的 INIT 消息,其中含有服务器的 IP 地址清单、初始序列号、起始标记、服务器请求的外出流的数目、服务器能够支持的外来流的数目以及一个数字签名过的状态 cookie。,其中包含了服务器用于确信本关联有效所需的所有状态,这样服务器的 SCTP 栈就不必保存所关联客户的有关信息。
4、客户以一个 COOKIE ECHO 消息回射服务器的状态 cookie。该消息也可能在同一个分组中捆绑了用户数据。
5、服务器以一个 COOKIE ACK 消息确认客户回射的 cookie 是正确的,连接建立成功。同样,该消息也可能捆绑了用户数据。
本过程至少需要 4 个分组,故称为 SCTP 的四路握手(four-way handshake)。下图展示了这个过程:
[img]http://dl2.iteye.com/upload/attachment/0126/2272/e7582579-ffd7-3ba1-879e-b3965476f2a7.png[/img]
SCTP 的四路握手与 TCP 的三路握手的差别主要在于作为 SCTP 整体一部分的 cookie 的生成。INIT 承载一个验证标记 Ta 和一个初始序列号 J。在之后关联的有效期内,另一方发送的每个分组中必须出现该 Ta 标记。同样,对端发送的 INIT ACK 中承载的 Tz 标记之后也必须出现在本端发送的每个分组中。
四路握手过程结束时,两端各自选择一个主目的地址,作为无网络故障发生时数据要发送到的默认目的地。
在SCTP 中使用四路握手是为了避免某种形式的拒绝服务攻击。SCTP 使用 cookie 的四路握手定形了一种防护这种攻击的方法。TCP 的许多实现也使用类似的方法,但 TCP 中 cookie 状态必须编码到只有 32 位长的初始序列号中,而 SCTP 为此提供了一个任意长度的字段,并且要求实施基于加密的安全性以防护攻击。
对于 SCTP 连接的终止,SCTP 不像 TCP 那样允许“半关闭”的关联。当一端关闭某个连接时,另一端必须停止发送新的数据。连接关闭请求的接收端发送完已经排队的数据(如果有的话)后,完成关联的关闭。下图展示了这一交换过程:
[img]http://dl2.iteye.com/upload/attachment/0126/2280/a1046188-0c86-310a-9df7-49fe59a56512.png[/img]
SCTP 没有类似于 TCP 的 TIME_WAIT 状态,因为 SCTP 使用了验证标记。所有后续块都在捆绑它们的 SCTP 分组的公共首部标记了初始的 INIT 块和 INIT ACK 块中作为起始标记交换的验证标记。由来自旧连接的块通过所在的 SCTP 分组的公共首部间接携带的验证标记对于新连接来说是不正确的。因此,SCTP 通过放置验证标记值就避免了 TCP 在 TIME_WAIT 状态保持整个连接的做法。
同 TCP 一样,SCTP 的连接和终止过程也可用状态转换图来说明。
[img]http://dl2.iteye.com/upload/attachment/0126/2715/495f40ff-a2ca-3985-89d5-7bb353b4a8a8.png[/img]
从一个状态转换到另一个状态是由 SCTP 规则基于当前状态及在该状态下所接收的块来规定的。举例来说,当某个应用进程在 CLOSED 状态下执行主动打开时,SCTP 将发送一个 INIT,且新的状态是 COOKIE-WAIT。如果该 SCTP 接着接收到一个 INIT ACK,它将发送一个 COOKIE ECHO,且新的状态是 COOKIE-ECHOED。若其随后又接收到一个 COOKIE ACK,它将转换成 ESTABLISHED 状态。该最终状态是绝大多数数据传送发生点的状态,尽管 DATA 块也可以由 COOKIE ECHO 块或 COOKIE ACK 块所在消息捆绑捎带。从 ESTABLISHED 状态引出的两个箭头处理连接的终止。如果某个应用进程在接收到一个 SHUTDOWN 之前调用 close(主动关闭),那就转换到 SHUTDOWN-PENDING 状态;否则,如果接收到一个 SHUTDOWN(被动关闭)
,那就切换到 SHUTDOWN-RECEIVED 状态。
下图展示了 SCTP 连接建立、数据传输和连接终止 3 个阶段所发生的实际分组交换情况,以及每个端点所历经的 SCTP 状态。
[img]http://dl2.iteye.com/upload/attachment/0126/2399/1bf49c7f-0c9b-3d6e-a667-bb25903d7ae0.png[/img]
图中,客户在 COOKIE ECHO 块所在分组中捎带了它的第一个 DATA 块,服务器则在作为应答的 COOKIE ACK 块分组中捎带了数据。一般而言,当网络应用采用一到多接口式样时,COOKIE ECHO 通常都会捎带一个或多个 DATA 块。
SCTP 分组中消息的单位称为块(chunk)。块是自描述的,包含一个块类型、若干个块标记和一个块长度。这样做方便了多个块的绑缚,只需要把它们简单地组合到一个 SCTP 外出消息即可。