我正在阅读" UNIX网络编程:套接字API"并且它提到SCTP不像TCP那样需要TIME_WAIT状态,因为它使用了验证标签。为什么会这样?我理解为什么验证标签可以解决重复数据包的问题,因为接收方可以确定数据包是否是当前SCTP关联的一部分,但是最终SCTP SHUTDOWN-COMPLETE数据包肯定会丢失,就像TCP中的最终ACK一样丢失,所以执行主动关闭的对等体仍然必须保持某种状态来处理此事件,就像使用TCP一样。
答案 0 :(得分:1)
在这种情况下无需维护状态信息。 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 chapter 8.4描述了如何处理蓝色数据包,bullet#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后不会保留任何状态信息。如果属于此协会的任何数据包在此之后到达,它们将被视为“突然出现”。