- ベストアンサー
TIME_WAIT 時の振る舞い
- TCP/IP Vol.1の第18章で説明されているTIME_WAIT状態についての振る舞いが気になる。
- MSL値を実装する場合、コネクションは2回繰り返される時間だけTIME_WAITに留まる必要があり、再転送されたFINも破棄されるが、再転送されたFINに対するACKは送られない可能性がある。
- 詳解TCP/IP Vol.1以外ではこの部分についての詳しい説明は見つからない。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
> 再転送された FIN も破棄されるのですか? 「破棄」という言葉が曖昧ですが、再転送されてきた FIN は無視はされず、ACK を返します。TIME_WAIT 状態はそのための状態です。 > 破棄されるのに,それに対する ACK を送ることは可能なのですか? 「破棄」とは、単にTCP/IPスタックがパケットを無視するという意味ではありません。そして、ここでいう「セグメント」とは「アプリケーションデータ」と言い換えたほうがいいかもしれません。 ("segment" という単語は、アプリケーションが送ろうとしたデータがパケットへ分割された後の「破片」を暗に意味しています) この部分の言葉を補うとするなら、こんな感じです: 「コネクションが 2MSL待ちにあるときに遅れて到着したデータは、 いかなるものでもアプリケーションに渡されず、破棄される」 このような動作とすべき理由は明らかです。 コネクションが 2MSL待ち (TIME_WAIT状態) になったということは、相手方がこちらに送信したいデータについて、すべて受け取ったということを意味します[1]。この状態で、相手から何らかのTCPセグメント(アプリケーションデータ) を受け取るということは、それはネットワーク側で複製されてしまったパケットか、何らかの理由で相手が無駄に再送してきたパケットのいずれかのはずです。そのようなパケットに乗っているデータをアプリケーションに渡すと TCP の役目を果たせません [2] ので、破棄することになります。 > 再転送された FIN に対する ACK は送られないということでしょうか? いいえ、TIME_WAIT 状態で再度 FIN を受信したら、必ず ACK しなければなりません(そして再度 2MSL待たなければなりません)。 そうしないと、通信する双方において、送信したいデータがすべて相手方に受信されたことが保証することができなくなってしまいます。 [1] RFC 793, 3.1. Header Format "FIN" はもう送るデータは無いよ、ということを意味する。 [2] 相手のアプリケーションが送ろうとしたデータが、勝手に増殖した ことになるため。
お礼
>"segment" という単語は、アプリケーションが送ろうとしたデータがパケットへ分割された後の「破片」を暗に意味しています なるほど!自分の中で,セグメントというものを勘違いしていたために,おかしくなってしまっていたのですね。 >「コネクションが 2MSL待ちにあるときに遅れて到着したデータは、 いかなるものでもアプリケーションに渡されず、破棄される」 >コネクションが 2MSL待ち (TIME_WAIT状態) になったということは、相手方がこちらに送信したいデータについて、すべて受け取ったということを意味します[1]。この状態で、相手から何らかのTCP セグメント(アプリケーションデータ) を受け取るということは、それはネットワーク側で複製されてしまったパケットか、何らかの理由で相手が無駄に再送してきたパケットのいずれかのはずです。そのようなパケットに乗っているデータをアプリケーションに渡すと TCP の役目を果たせません [2] ので、破棄することになります。 なるほど!FINを単に終了するためのもの程度にしか考えていませんでした.やはり気になるところはRFCを読み定義を確認しないといけませんね. 丁寧に回答していただき,ありがとうございます.