2017-03-12 24 views
3

私は "UNIX Network Programming:The Sockets API"を読んでおり、SCTPは検証タグを使用しているためTCPがTIME_WAIT状態を必要としないことを述べています。これはなぜですか?私は、パケットが現在のSCTPアソシエーションの一部であるかどうかをレシーバが判断できるので、検証タグがこの問題を重複パケットで解決する理由を理解していますが、TCPの最終ACKと同様に最終SCTP SHUTDOWN-COMPLETEパケットも失われますそのため、アクティブクローズを実行しているピアは、TCPと同様にこのイベントを処理するために何らかの状態を維持しなければなりません。なぜSCTPはTIME_WAIT状態を必要としないのですか?

+0

TIME_WAITは、ACK損失ではなく、将来のデータパケットに対して防御します。 – EJP

+1

TIME_WAITは両方を行います。クライアントがアクティブクローズを実行し、最終的なTCP ACKが何らかの理由でサーバに送信しない場合、サーバはFINを再送します(TCPは信頼できるプロトコルなので)。クライアントは許可する状態情報を維持する必要があります最終的なACKを再送する – dippynark

答えて

1

この場合、状態情報を維持する必要はありません。 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は状態情報を保持しません。このアソシエーションに属しているパケットがそれ以降に到着した場合、それらは「青の外」として扱われます。

関連する問題