今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

TCP/IPのデバッグ

アプリケーションが「通信エラー」を表示していると報告があった。このプログラムはもともとサンプル的に作ったものなので、あまりエラーについて深く考えていなかった。
発生する環境をヒアリングして試してみると確かに再現する。HTTP 通信している部分で発生した冷害を Java コンソールに出力して確認してみると、コネクションしようとしているところで Address in use が発生している。401 とか 404 などのありがちなエラーは想定していて、それなりのエラーメッセージを出していたけど、それ以外の例外はすべて「通信エラー」とだけ表示するようにしていた。
クライアント側なのに Address in use が出るなんて変だと思いつつ、netstat してみる。すると、TIME_WAIT なソケットが大量に発生していた。
で、TIME_WAITでぐぐってみて、「TCP/IPのデバッグ」というページを発見するが、

問題: netstat が TIME_WAIT 状態にあるソケット を山ほど表示しています。何が悪いのでしょうか?
答え: 何も悪くありません。TIME_WAIT は全く正常な ものです。(以下略)

と、簡単に片付けられた。
ループで繰り返し HTTP リクエストを送信するプログラムなんだけど、サーバに対して複数のURLで連続的にリクエストするような設定を、複数のサーバに対してやっていた。それで TIME_WAIT なソケットが大量に発生していたらしい。
でもー、TIME_WAIT が長期間残るときとすぐに消えるときがあるんだけど、何が原因でその違いが出てるんだろう?
TIME_WAIT による Address in use は時間が経てば自然と解消するので、適当に Thread.sleep() を追加し、エラーメッセージを表示しないようにして、エラーの発生をなかったことにするよう変更。(^^;