SCTP为什么不需要TIME_WAIT状态?

3
我正在阅读《UNIX网络编程:套接字API》,其中提到SCTP不像TCP那样需要TIME_WAIT状态,这是由于它使用验证标签的原因。为什么会这样呢?我理解验证标签可以解决重复包的问题,因为接收方可以确定一个包是否属于当前SCTP关联,但是SCTP的最终SHUTDOWN-COMPLETE数据包也可能会丢失,就像TCP的最终ACK一样可能会丢失。所以执行主动关闭的对等方仍然需要维护某种状态来处理这个事件,就像TCP一样。

TIME_WAIT防御未来的数据包,而不是ACK丢失。 - user207421
1
TIME_WAIT会同时执行两个操作;如果客户端主动关闭连接,但由于某种原因其最终的TCP ACK未能到达服务器,则服务器将重新发送其FIN(因为TCP是可靠协议),因此客户端需要维护状态信息以允许其重新发送最终的ACK。 - dippynark
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”后没有保留任何状态信息。如果在此之后到达任何属于该关联的数据包,则它们将被视为“突发事件”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接