質問: ### 実行環境 ・CentOS6 64bit ・Apache 2.2 ### やってみたこと ApacheのKeepAliveの設定および、挙動について質問です。 ApacheのKeep-Alive関連の設定を下記のように設定しました。 ``` KeepAlive On MaxKeepAliveRequest 100 KeepAliveTimeout 10 ``` この設定についての私の解釈は、下記のようになります。 * KeepAlive設定が有効(TCPコネクションの使い回し) * 一つのTCPコネクションにつき、100回までリクエストを処理する。 (100回リクエストを処理して、続けて同一クライアントからリクエストがきた場合、新たにTCPコネクションを確立) * 10秒間、リクエストが来なかったTCPコネクションは切断する。(10秒間はESTABLISHED状態を維持) この設定で、Webブラウザから、下記のような検証曜Webページにアクセスします。 ``` TEST PAGE this is test page ``` アクセス時のネットワーク状況を、 watch -n 1 "netstat -ant" コマンドで監視したところ、下記のようなイメージで、 2つのESTABLISHEDなTCPコネクションが確立されていました。 ``` tcp 0 0 [Server IP Addr]:80 [Client IP Addr]:62385 ESTABLISHED tcp 0 0 [Server IP Addr]:80 [Client IP Addr]:62383 ESTABLISHED ``` また、Webブラウザ(Firefox)で、「F12」から開発者ツールを起動し、 ヘッダの状態を確認したところ、 Connection:Keep-Alive Keep-Alive:timeoout=10 max=100 となっているリクエストが2つ存在したため、 たしかに、TCPコネクションが2つ確立され、 それぞれにKeepAliveの設定値が反映されていることがわかります。 ※ 他のリクエストは、timeout=10 max=99(or 98)でした ### 疑問点:思っていた動作と違う 今回、検証したWebページは、 htmlファイル ✕ 1 cssファイル ✕ 1 imgファイル ✕ 2 なので、クライアントからサーバーへ送られるリクエスト数は4つになるはずです。 であれば、MaxKeepAliveRequestsの設定値が10なので、 一つのTCPコネクションで、全てのリクエストを捌けるはずだと考えていました。 (つまり、ESTABLISHEDのコネクションが一つになるはず) しかし、実際は何故か、2つのTCPコネクションが確立され、 それぞれにKeepAliveの設定値が振られているように見えます。 ### 質問したいこと 質問したいことですが、 今回の検証では、私が思っていた動作にはなりませんでした。 つまり私の解釈の何かが間違っていると思っているのですが・・・ KeepAliveの設定や挙動に関して、 私の解釈が間違っている点、ならびに正しい解釈等、 わかる方がいらっしゃいましたらご助言いただきたいです。 とてもわかりにくい説明となっており、 大変恐縮ですが、よろしくお願い致します。
回答: ``` 一つのTCPコネクションで、全てのリクエストを捌けるはずだと考えていました。 (つまり、ESTABLISHEDのコネクションが一つになるはず) しかし、実際は何故か、2つのTCPコネクションが確立され、 それぞれにKeepAliveの設定値が振られているように見えます。 ``` はい。ひとつのコネクションで複数のリクエストとするかどうかはブラウザの実装依存です。 webサーバーでのkeepAliveの設定はあくまでもwebサーバー側の設定でクライアントのブラウザの挙動を制御するものではありません。 ブラウザが一つのコネクションで順次リクエストを投げるとリクエスト⇒レスポンスを10回処理する時間がかかります。ブラウザは2つのコネクションで5つずつのリクエストを非同期に処理すると半分の時間で処理可能です。5つのコネクションで2つずつのリクエストを非同期に処理すると5分の1の時間で処理可能です。 TCPコネクションをいくつ作成するかはブラウザの実装(表示速度最適化の実装)により異なります。