Mar 16, 2007

FreeBSD FIN-WAIT-2 のデバッグ

FreeBSD 5.4-RELEASE-p22 でサーバを開発しているのだが,クライアントからの コネクションリクエストを受け付けないという問題があった.

tcpdump をすると,クライアントは TCP SYN パケットを送ってきている. サーバプロセスはちゃんと上がっている.TCP コネクションを張って, サーバプロセスまでデータを届けるのはカーネルの役目だ. tcpdump でネットワークのパケットレベルデータを見ると, クライアントから SYN パケットが送られてきているが, サーバ側カーネルがうんすんの状態だ.

ipfw 等ファイアウォールの設定でフィルタされていないことは確かめた. netstat すると,FIN-WAIT-2 というコネクションステータスが残っている. FIN-WAIT-2 は次のような状態に発生するステータスだ. サーバ側が close() し,クライアントへ FIN が送られる. そして,クライアントが FIN に対する ACK をサーバに送ると,サーバが FIN-WAIT-2 になる.正しくは,続けてクライアントがサーバに FIN パケットを送るのだが,なぜかそうはならなかったようだ. (注:クライアントは組み込み型のデバイスで,TCP の実装などが しっかりしているかわからない).

その後,サーバプロセスを上げなおしても,FIN-WAIT-2 ステータスのコネクションが 残り,新しいコネクション要求などを処理できない状態になるようだ. いろいろ見てみたが,コマンドなどでこのコネクションステータスを 削除する方法はわからなかった.

結局,nemesis Link というパケット作成アプリケーションを使って, コマンドラインで TCP FIN パケットを自分自身に送ってみた. そうすると,FIN-WAIT-2 コネクションが削除され, 新しいコネクションが正常に処理される.

とても重要なTIPSなので,とりあえずメモっておく.

同じ件の別のメモ: Link

Posted at 01:53 in howto | WriteBacks (0) | Edit
WriteBacks
TrackBack ping me at
http://www.sfc.wide.ad.jp/~yasu/nblog/howto/freebsd-fin-wait-2.trackback
Post a comment

writeback message: Ready to post a comment.