我在閱讀「UNIX網絡編程:套接字API」,它提到SCTP不需要TIME_WAIT狀態,因爲TCP使用驗證標籤。爲什麼會這樣?我明白爲什麼驗證標記可以解決重複數據包的問題,因爲接收方可以確定數據包是否是當前SCTP關聯的一部分,但是肯定最終的SCTP SHUTDOWN-COMPLETE數據包可能會丟失,就像TCP中的最終ACK可以丟失一樣被丟失,所以執行主動關閉的對端仍然必須保持某種狀態來處理這個事件,就像TCP一樣。爲什麼SCTP不需要TIME_WAIT狀態?
回答
在這種情況下不需要維護狀態信息。 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後不會保留任何狀態信息。如果任何數據包屬於此關聯後到達,它們將被視爲「突然出現」。
- 1. 爲什麼需要不可變狀態的redux
- 2. 我爲什麼要添加狀態?
- 3. 爲什麼要使用無狀態bean?
- 4. 爲什麼不需要document.getElementById?
- 5. 爲什麼我不需要
- 6. 爲什麼我需要返回http狀態
- 7. 爲什麼concrete5需要會話狀態?它可以被禁用?
- 8. WebAPI - 爲什麼在無狀態模式下需要設置Principal?
- 9. 爲什麼Facebook登錄需要的狀態變量
- 10. 爲什麼CustomFieldSerializer需要靜態方法?
- 11. 爲什麼這裏需要靜態
- 12. 爲什麼靜態需要在這裏
- 13. 爲什麼需要
- 14. 爲什麼需要「{} \」?
- 15. 由TIME_WAIT狀態佔用的套接字
- 16. 迭代加深爲什麼星星不需要測試重複狀態?
- 17. 沒有TIME_WAIT連接,爲什麼呢?
- 18. 爲什麼在SCTP上使用DTLS?
- 19. 爲什麼狀態欄顏色不變?
- 20. 爲什麼我的狀態不確定?
- 21. 爲什麼定義?狀態
- 22. VHDL爲什麼當狀態S0不應該是活動狀態?
- 23. 什麼時候TCP套接字需要保持活動狀態?
- 24. USB傳輸需要狀態階段是什麼?
- 25. CEP是什麼,我需要(系統狀態和事件回放)
- 26. 什麼是「需要全屏幕」和「隱藏狀態欄」
- 27. 檢查Windows服務的狀態 - 我需要什麼特權
- 28. WCF:Message Inspector中的相關狀態需要什麼?
- 29. 需要在還原狀態下儲存什麼?
- 30. 爲什麼UIButton不需要alloc和init?
TIME_WAIT防禦未來的數據包,而不是ACK丟失。 – EJP
TIME_WAIT既有;如果客戶端執行主動關閉,並且其最終的TCP ACK不會因爲任何原因而到達服務器,那麼服務器將重新發送其FIN(因爲TCP是可靠的協議),所以客戶端需要維護狀態信息以允許它重新發送它的最終ACK – dippynark