2017-03-12 54 views
3

我在閱讀「UNIX網絡編程:套接字API」,它提到SCTP不需要TIME_WAIT狀態,因爲TCP使用驗證標籤。爲什麼會這樣?我明白爲什麼驗證標記可以解決重複數據包的問題,​​因爲接收方可以確定數據包是否是當前SCTP關聯的一部分,但是肯定最終的SCTP SHUTDOWN-COMPLETE數據包可能會丟失,就像TCP中的最終ACK可以丟失一樣被丟失,所以執行主動關閉的對端仍然必須保持某種狀態來處理這個事件,就像TCP一樣。爲什麼SCTP不需要TIME_WAIT狀態?

+0

TIME_WAIT防禦未來的數據包,而不是ACK丟失。 – EJP

+1

TIME_WAIT既有;如果客戶端執行主動關閉,並且其最終的TCP ACK不會因爲任何原因而到達服務器,那麼服務器將重新發送其FIN(因爲TCP是可靠的協議),所以客戶端需要維護狀態信息以允許它重新發送它的最終ACK – dippynark

回答

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描述瞭如何處理藍色數據包,子彈#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後不會保留任何狀態信息。如果任何數據包屬於此關聯後到達,它們將被視爲「突然出現」。