Open4
TCP 切断
ソケット作成フェーズ
接続フェーズ
データ送受信フェーズ
切断フェーズ
切断フェーズでサーバー/クライアント間のコネクションを削除する。
データ送受信が終わった後、切断する。
HTTPプロトコルの場合は、サーバーから切断する。
切断フロー
サーバー : Socketライブラリのclose()実行
サーバー : プロトコルスタック : 切断用のTCPヘッダー作成(コントロールビットの
FINが1)し送信
サーバー : プロトコルスタック : ソケットを切断状態に移行
クライアント : FINが1のTCPヘッダーを受信
クライアント : ソケットを切断状態に移行
クライアント : FINパケットを受け取ったことを表すACKパケットを送信
クライアント : アプリケーションからのread命令が来たら送受信が終わったことを伝える
クライアント : アプリケーション : Socketライブラリのclose()を実行
クライアント : FINが1のTCPヘッダーを送信
サーバー : FINパケットを受け取ったことを表すACKパケットを送信
クライアント : ACKパケットを受信。
クライアント : しばらくしたらソケットを削除
ソケット削除
FINパケットが来て、ACKパケットを送った後、ソケットを削除するまでしばらく待つ。
ACKパケットがロストすると、相手からFINパケットが再送される。
もしすぐにソケットを削除していると、同じポート番号で新しくソケットが作成されている可能性がある。
新しいソケットに対してFINパケットが来たと誤認し、切断してしまう可能性があるため。