ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:dame1975 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が省略されてしまうのか原因が知りたいです。また、自分の認識が間違っている場合のご指摘等頂ければと思います。

つたない文章で申し訳ありませんがご存知の方がいらっしゃいましたら教えて下さい。
質問投稿日時:06/05/18 16:25
質問番号:2159134

回答

 

回答者:Toshi0230 矢印が全部一緒の方向なので意図がつかみにくいのですが、質問内容はこういう事ですかね?
(以下、矢印はパケットの流れる方向を示す)

通常の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をとってました。
種類:回答
どんな人:経験者
自信:参考意見
回答日時:06/05/19 01:27
回答番号:No.1
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼回答ありがとうございました。(2')のように1つにまとめても不具合はないのですね。

ただ、etherealでパケットをキャプチャした際、自作のプログラム以外のプログラムの通信は全て(1)〜(4)の切断方法だったので、なぜ自分のプログラムだけ中途半端なのか?と思っています。