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
writeback message: Ready to post a comment.