このページの本文へ

前へ 1 2 次へ

TCP/IPまるわかり 第6回

コネクションの確立と解放の仕組みを知ろう

TCPのコネクションとはなんですか?

2009年07月27日 09時00分更新

文● 伊藤玄蕃

  • この記事をはてなブックマークに追加
  • 本文印刷

コネクションの解放

 アプリケーションのデータ転送が終わってコネクションが不要になると、通信中に利用していたポートやコネクション状態テーブルなどの資源はすべて解放(破棄)される。これを「コネクションの解放」という(図2)。データの転送中に一方的にコネクションが解放されて通信に不整合が生じることのないよう、TCPでは両方のホストの合意に基づいて解放手続きが進められる。

図2 ゆるやかなコネクション開放

 ホストAでコネクション解放が上位アプリケーションから指示されると、まずTCPは送信終了の通知(FIN)を相手のホストBに送る。これ以降、ホストAはデータの送信を行なうことが禁止される。ホストBのTCPはホストAから送信終了の通知があったことを上位アプリケーションに通知するが、自分の上位アプリケーションから終了指示があるまで、ホストAに対してデータを送信し続けることができる。これに対し、ホストAもACK(確認応答)を返すことができる。

 ホストBのTCPは、上位アプリケーションからコネクション終了の指示があれば、送信終了の通知(FIN)を相手のホストAに送る。これに対してホストAはACKを返す。ホストBはこのACKを受け取った時点でコネクションを解放する。ホストAは、一定時間待って、ホストBからのFINが再送されないことを確認して(ホストBに最後のACKが届いたものと推定して)コネクションを解放する。このように、お互いの合意を基にコネクションを解放する形態を「ゆるやかな解放(graceful close)」と呼ぶ

コネクションのリセット

 では、一方のホストが通信中にダウンしてしまった場合はどうだろう。仮にホストが復旧できたとしても、通信を途中からやり直すことはできない。この場合、正常に動き続けていたホストが、相手の異常に気が付かずセグメント送信を待ち続けてしまうだろう。またTCPは再送によるエラー訂正を行なうため、相手の反応がなくてもコネクションをいきなり切ることをしない。このため、一方のホストだけがコネクションを開設している状態が生じることがある。これを「ハーフクローズ」や「半開設コネクション」などと呼ぶ。

 この状態を解消するには、リセットと呼ばれる手続きでコネクションを強制的に切断する。復旧したばかりで開放状態のTCPがセグメントを受け取ると、相手に対してリセット(RST)を送信し、通信が継続できないことを通知する。RSTを受信した場合、コネクションは強制解放される。またTCPには、無通信状態が長時間(通常2時間)続いた場合に、空のセグメントを送るオプション機能がある。相手が開放状態ならRSTが戻ってくるので、相手の返事を永久に待ち続けることを防ぐことができる。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事