続・Tomcat5.5のTCPセッション保持時間って?
はじめに
タイトルからしてそもそもおかしいのですが、チラ裏なんで恥をそのまま晒しておきますw
Tomcatはサーブレットコンテナ兼HTTPサーバなので、TCPからみたらユーザ(ネットワーク層で言うところの上位層)にあたります。
TCPのセッション保持は結局OSのネットワークプロトコルスタックの実装に依るものでいて、Tomcatは関係ありませんね。
Windowsの場合、レジストリをいじることで変更できます。
調べてみた
http://bwind.blog19.fc2.com/blog-entry-41.html の件、必死こいてTomcatを色々調べても出てこなかったでござる。 前の記事に書いた予想が大体当たってたんだけど、 OSのプロトコルスタックの設定でした。試してた環境はWindowsXP。
- クライアントが1回目の通信開始
- 通信が終わる
- サーバはTCPセッションをTIME_WAIT状態で「一定時間」保持(これはTCPの仕様)
- この間クライアントが同じソースポートで2回目(別)の通信開始
- サーバはTIME_WAIT状態のセッションに新たなパケットが来たと思うんだけど、シーケンス番号が違うので破棄 *1
- クライアントは2回目の通信のSYN ACKを受け取れない、接続タイムアウトしたと思う
ということでした。
「一定時間」はRFC793では「最大セグメント生存時間の2倍」で、RFC推奨値は240秒 (最大セグメント生存時間は大体のTCPパケットで120秒だから) Windows2000はきっちり240秒設定だったらしいんだけど、TIME_WAITのセッションがある間は 新しいセッションを当然張れないので、パフォーマンス的にどうよ?ってことになったらしく、 XP以降は120秒になってるらしい。
で、ここは最小値30まで設定可能なので30に変更しておいた。ホントは10秒くらいにしたかったんだけどね。 設定方法はレジストリに値追加して再起動するだけ。参考URLからTcpTimedWaitDelay検索でどうぞ。
参考 http://support.microsoft.com/kb/314053/ja
わざわざこんな対応しなくても、通常は「短い時間に同じsrcポートで別の通信しようとしてくるクライアントがタコです」って言えば済む話だと思いますです。
*1:本来は、通信終了後-CLOSEまでに、ネットワーク上を彷徨ってるパケットをこの間に受け取ることができるようにしておくステート