ストリーミング寺子屋

音声・動画のストリーミング機能を
開発するエンジニアのための
実践的なナレッジベース

【Network技術-4】TCPの通信ソケットが残り続けています。確認するポイントを教えて下さい。

通信ソケット残存の要因は主に2つ

通信ソケットが残り続けている場合、主に以下の2つの要因の可能性があります。

1.ソケットクローズの処理忘れ

プログラムの終了ケースを全て確認してください(正常終了の他、エラー終了やシグナルによる強制終了も含む) 。その中でソケットクローズをし忘れている箇所はないかを確認する必要があります。

2.TCPの終了処理が正常に完了していない

TCPにおけるソケットは、切断する際 FIN,ACKパケットを用いた以下の切断処理を行っています。

  1. 切断したい側( close()がコールされた側 )がFIN+ACKパケットを送信する。
  2. 切断される側がFIN+ACKパケットを受信すると、ACKパケットを返信する。
  3. 切断される側が続けてFIN+ACKパケットを送信する。
  4. 切断したい側がFIN+ACKを受信すると、ACKパケットを返信する。
  5. 切断したい側はACKパケット送信後、一定時間待ってコネクションを切断する。
  6. 切断される側がACKパケット受信すると、コネクションを切断する。

この際、各パケットの送受信が正常に終了していないと受信を待ち続ける状態になってしまい、そこで使用されていたTCPの通信ソケットは残ったままになってしまいます。多数と接続断する サーバー側では特にこの現象に注意する必要があります。

対処法

FIN,ACKパケットによる通常のTCP終了処理ではなく、「RSTパケットを使用した切断を行う」方法があります。RSTパケットを使用した場合、以下のように切断処理が進みます。

  1. 切断したい側がRSTを送信し、その後 返答を待たずにコネクションを切断する。
  2. 切断される側はRSTを受信すると、現在のソケットの状態にかかわらずコネクションを切断する。

この方法では、相手の返答を待たずにコネクションを切断するため、ソケットもすぐに破棄されます。従って、送受信の失敗でソケットが残り続けるようなことはありません。
尚、切断される側がRSTの受信に失敗してしまった場合でも、そのソケットで通信しようとするたびにRSTパケットが返信されるため、そこでコネクションが切断できるようになっています。

Q&A

製品情報