レスポンスは5分以内に返しなさい

Webアプリケーションで、サーバの処理時間が長い(5分〜10分)場合に*1、IE6、IE7で、こんなエラーがでる。

ページを表示できません。サーバーが見つからないか、DNS エラーです。

結論から言うと、まだよくわからない。ちなみに、原因は次に解説されている。
http://www.atmarkit.co.jp/fwin2k/win2ktips/448timeout/timeout.html


どうもこのエラーが出る直前に、IEが、TCPコネクションに対してRSTパケットを送信しているようだ。
また、中継機器が、5分間通信がないTCPコネクションに対し、RSTパケットを送信しているようだ。これに対し、IEがHTTPリクエストを再送(つまりTCPコネクションを再作成)しているようだ。
これ以上、手持ちの材料がない。


MSのサポートページには、タイムアウトは60分とあった。

Internet Explorer では、仕様により、サーバーからデータが返されるまでのタイムアウト時間が設定されています。 タイムアウト時間は、バージョン 4.0 および 4.01 の場合は 5 分、バージョン 5.x、6、および 7 の場合は 60 分です。

http://support.microsoft.com/kb/181050/ja

しかし、次の2つの記事では、タイムアウトが5分と書かれている。

IEでアクセスしたWebページがタイムアウトで表示されないことがある。 ... 途中略 ... デフォルトでは、約5分後にタイムアウトになるように設定されているが、レジストリを変更することでこの時間を変えられる。

http://trendy.nikkeibp.co.jp/article/tec/winxp/20070403/121467/

Internet Explorer 5.x/6.xでは、アクセスしたWebページがなかなか表示されないと、タイムアウトエラーが表示されるようになっている。 ... 途中略 ... 初期設定では、このタイムアウトにかかる時間は約5分(300000ミリ秒)となっている。

http://www.itmedia.co.jp/help/tips/windows/w0682.html

IEタイムアウトって何?どこかでやってみるしかない*2
とにかく、5分以内でレスポンスを返せば、問題は発生しない。IEも中継機器も「5分」をトリガーに、何かをやっている。こういう面倒な目にあいたくなければ、レスポンスは5分以内に返しなさいということだ(そして、たいていのWebの利用者もそれを望んでいるはず)。

2010/04/20追記

ローカル環境では、5分でタイムアウトは起きない。1時間近く待ち状態になった。


Wiresharkを使って、パケットのやりとりを見てみた。RSTが送信されているのは、ブラウザを閉じたときのように見える。やはり自分で見ないとダメだ。
中継機器からのRSTパケットを受信すると、上記のエラー画面が表示される(に間違いないだろう)。ただし、複数TCPコネクションが維持されている場合に、1つのTCPコネクションに対してRSTパケットが送信された場合には、エラー画面が表示されるのではなく、再度HTTPリクエストを送信しているように見える*3。こういう仕様*4なのか?

*1:そもそも処理時間が長すぎるというのはわかっているが、今すぐにはどうにもならない。

*2:やってみたいけど、時間とれるかなぁ。。

*3:あ、これは業務時間中に仕入れた情報だ。まずいまずい。

*4:勝手に送信されると、二重送信になっちゃうぢゃんか!と。レスポンスは5分以内に返しましょう。