3

我正在阅读“UNIX 网络编程:套接字 API”,它提到 SCTP 不需要像 TCP 那样的 TIME_WAIT 状态,因为它使用了验证标签。为什么会这样?我理解为什么验证标签解决了重复数据包的问题,​​因为接收者可以确定数据包是否是当前 SCTP 关联的一部分,但最终的 SCTP SHUTDOWN-COMPLETE 数据包肯定会丢失,就像 TCP 中的最终 ACK 一样丢失,因此执行主动关闭的对等方仍然必须保持某种状态来处理此事件,就像使用 TCP 一样。

4

1 回答 1

2

在这种情况下不需要维护状态信息。RFC 4960定义了一种对未知(出乎意料)数据包的默认处理。

假设您的关联中有两个边:A 边和 B 边。v1/v2 是这些边使用的验证标签。A 面启动关机。

`
A                      B
       Shutdown(v1)
  -------------------->
    Shutdown_ack(v2)
  <--------------------
  Shutdown_complete(v1)
  -------------------->
`

当 A 方发送 SHUTDOWN COMPLETE 时,它会释放此关联使用的所有资源。就 A 方而言,该协会已不复存在。

如果由于某些原因 SHUTDOWN COMPLETE 块丢失,则 B 端将在 t2 计时器(RFC 4960 术语)到期后重新发送 SHUTDOWN ACK 块。

当 A 方接收到这个重传的 SHUTDOWN ACK 块时,它将无法确定它属于哪个关联,因为该关联已经关闭。因此,A 方会将此数据包视为“出乎意料”。RFC 4960 第 8.4 章描述了如何处理突发数据包,项目符号 #5 描述了如何处理“突发事件”的 SHUTDOWN ACK。

在这种情况下,A 方将回复 SHUTDOWN COMPLETE。但是,携带 SHUTDOWN COMPLETE 块的数据包将与原始数据包略有不同。新数据包将 t 位设置为 1 并包含所谓的反射验证标签(它只是来自包含 SHUTDOWN ACK 的数据包的验证标签)。 A B Shutdown(v1) --------------------> Shutdown_ack(v2) <-------------------- Shutdown_complete(v1) -------LOST-------- Shutdown_ack(v2) <-------------------- Shutdown_complete(v2), t-bit=1 -------------------->

B 方知道如何处理 t 位设置为 1 的数据包并处理 SHUTDOWN COMPLETE。

如你所见,A方一旦发送了SHUTDOWN COMPLETE,就不会保留任何状态信息。如果任何属于该关联的数据包在此之后到达,它们将被视为“突发事件”。

于 2017-03-15T01:02:10.163 回答