• 締切済み

FIN,ACKとACKについて

はじめまして。5月よりTCPソケット通信を勉強しているものです。 クライアントとサーバーのプログラムを作り試行錯誤しながら動かしているのですが一つ不思議な現象が起きたので質問させて頂きます。 処理が終わり、通信を切断する時なのですが、ソケット通信に関連する書籍やWebページを見ていると接続を切断するときにFIN,ACKを送信して相手側がACKを送信し、FIN,ACKを送信して最後にACKを送信するとなっています。図にすると以下のような感じでしょうか。 PCA       PCB FIN,ACK送信 → FIN,ACK受信 ACK受信   → ACK送信 FIN,ACK受信 → FIN,ACK送信 ACK送信   → ACK受信 この手順でPCA,PCBともに切断されるとあるのですが、自分が作ったプログラムを実行させて、etherealでパケットをモニタリングすると以下のような状態で終わってしまいます。 PCA       PCB FIN,ACK送信 → FIN,ACK受信 FIN,ACK受信 → FIN,ACK送信 ACK送信   → ACK受信 PCAからのFIN,ACK受信に対してのACKの送信が省略されて、いきなりFIN,ACKを送信してしまいます。その後PCAからはACKが返されて終了となります。 プログラム的には希望通り動作しているので問題は無いのですが、なぜ途中のACKが省略されてしまうのか原因が知りたいです。また、自分の認識が間違っている場合のご指摘等頂ければと思います。 つたない文章で申し訳ありませんがご存知の方がいらっしゃいましたら教えて下さい。

みんなの回答

  • Toshi0230
  • ベストアンサー率51% (836/1635)
回答No.1

矢印が全部一緒の方向なので意図がつかみにくいのですが、質問内容はこういう事ですかね? (以下、矢印はパケットの流れる方向を示す) 通常のTCPの停止は以下の手順のはずなのに対して、 PCA    PCB  - FIN →     (1)  ← ACK →     (2)  ← FIN(,ACK) -  (3)  - ACK →     (4) 実際には以下のようになっている PCA    PCB  - FIN →     (1')  ← FIN,ACK -   (2')  - ACK →     (3') その理由は?ということですね? 一言で言えば実装上そうなっているから、ということですが、もう少しかみ砕いて言えば、(2)のACKと(3)のACKは、両方とも(1)のFINに対するACKになります。 であれば、(2')の様に1つにまとめても不具合はない、ということになります。 納得いただけたでしょうか? TCPの確立時も以下のような形ですよね? PCA    PCB  - SYN →  ← SYN, ACK -  - ACK → ちなみに、手元のPC UNIX機で確認したところ、セッション切断時は(1)~(4)の4WAYをとってました。

dame1975
質問者

お礼

回答ありがとうございました。(2')のように1つにまとめても不具合はないのですね。 ただ、etherealでパケットをキャプチャした際、自作のプログラム以外のプログラムの通信は全て(1)~(4)の切断方法だったので、なぜ自分のプログラムだけ中途半端なのか?と思っています。