私は "UNIX Network Programming:The Sockets API"を読んでおり、SCTPは検証タグを使用しているためTCPがTIME_WAIT状態を必要としないことを述べています。これはなぜですか?私は、パケットが現在のSCTPアソシエーションの一部であるかどうかをレシーバが判断できるので、検証タグがこの問題を重複パケットで解決する理由を理解していますが、TCPの最終ACKと同様に最終SCTP SHUTDOWN-COMPLETEパケットも失われますそのため、アクティブクローズを実行しているピアは、TCPと同様にこのイベントを処理するために何らかの状態を維持しなければなりません。なぜSCTPはTIME_WAIT状態を必要としないのですか?
答えて
この場合、状態情報を維持する必要はありません。 RFC 4960は、未知の(青色からの)パケットに対する一種のデフォルト処理を定義しています。
あなたのアソシエーションには、サイドAとサイドBの2つの側面があります。これらのサイドで使用される確認タグは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は状態情報を保持しません。このアソシエーションに属しているパケットがそれ以降に到着した場合、それらは「青の外」として扱われます。
- 1. TCP TIME_WAIT状態
- 2. なぜDataTableがカスタム状態をクリアしないのですか?
- 3. なぜアプレットはmain()を必要としないのですか?
- 4. Boost.asioクライアント/サーバーTIME_WAITなぜですか?
- 5. ReactjSとfirebaseデータの状態が一致しないのはなぜですか?
- 6. なぜ状態変化に反応しないのですか?
- 7. なぜこの状況でcomponentWillReceivePropsが必要なのですか?
- 8. なぜwatir-webdriverとfirefoxを使用してスリープ状態になるか待つ必要がありますか?
- 9. トランジションの状態が終了しても、トランジションの状態が維持されないのはなぜですか?
- 10. なぜPDFファイルにLOG4JとSLF4Jが必要ですか?なぜ.Docファイルには必要ないのですか?
- 11. 私の状態はなぜ機能していないのですか?
- 12. 状態変更でWPFバインディングが機能しないのはなぜですか?
- 13. コンポーネントのコンストラクタで状態を設定できないのはなぜですか?
- 14. アクティブな状態を作るのに助けが必要ですjQueryで状態ラベルをクリックするには
- 15. ブートストラップナビバーでアクティブ状態を変更できないのはなぜですか?
- 16. ルビーはなぜ「細かい」必要はないのですか?
- 17. UIButtonがallocとinitを必要としないのはなぜですか?
- 18. 私のEmbeddedIdが休止状態にならないのはなぜですか?
- 19. Quartz.NETトリガの状態 - 管理者の注意が必要な状態
- 20. なぜmutexはmutexを必要としないのですか?mutexにはmutexが必要です...
- 21. コードがストア状態を変更できないのはなぜですか?
- 22. 安全でない状態と安全な状態
- 23. ルートコンポーネントの状態が変わっていないのはなぜですか?
- 24. なぜSCTP上でDTLSを使用するのですか?
- 25. なぜJComboBoxはNULL値の状態を無視しますか?
- 26. Tracker.AutorunのReact状態にアクセスできないのはなぜですか?
- 27. モデルの状態は無効ですがなぜですか?
- 28. マッチで状態が更新されないのはなぜですか?
- 29. React.jsで状態が更新されないのはなぜですか?
- 30. ClojureファイルにJavaライブラリを必要としないのはなぜですか?
TIME_WAITは、ACK損失ではなく、将来のデータパケットに対して防御します。 – EJP
TIME_WAITは両方を行います。クライアントがアクティブクローズを実行し、最終的なTCP ACKが何らかの理由でサーバに送信しない場合、サーバはFINを再送します(TCPは信頼できるプロトコルなので)。クライアントは許可する状態情報を維持する必要があります最終的なACKを再送する – dippynark