TL; DR:Chromeはこの応答ヘッダーを解釈しkeep-alive
、Firefoxが各接続を閉じる間、永続的な接続を維持します。
私は自分のウェブサイトのページ読み込み時間を最適化しようとしたときに、この質問に出くわしました。
Connection
参照されているRFCでは、ヘッダー内の複数のエントリを適切に処理する方法については何も見つかりませんでした。実装は2つの可能性から選択できるように私には思えました:
- 複数のエントリがある場合は、ニーズに最適なものを選択できます
- 内部にある場合は、
close
送信後に接続を閉じることができます
だから、私は見つける必要がありました。さらに詳しく調べてみましょう。
Connection: keep-alive
Chromeは常にHTTP/1.1リクエストを送信しており、Apacheのデフォルト設定は常にConnection: close
ヘッダーで応答していることに気付きました。そこで、私は調査を開始し、Wiresharkを使用してTCPセグメントを調べました。
Chromeは、ウェブサイトを表示するために14個の要素をフェッチする必要があります。そのほとんどは、画像やcssファイルなどの静的な要素です。そして、それは完全な14のTCP接続を取り、それは多くの時間(約1.2秒)を要しました。画像を要求するたびに(たとえば)、FIN
フラグが1に設定されたTCPセグメントが発生しました。
では、ChromeとFirefoxはどうですか?Chromeには、1台のサーバーへの同時接続の最大数が6であるようです。Firefoxはよりきめ細かい構成であり、永続的(about:configで見られる最大6)と非永続的(最大数はソースによって大きく異なります)を区別します。 )。しかし待ってください...ChromeとFirefoxはどちらもHTTP/1.1リクエストヘッダーを送信してConnection: keep-alive
いるので、両方とも6に制限する必要があります(これは永続的な接続を開くためのリクエストであるため)。
私は簡単なトリックを試してみることに.htaccess
し、Webルートフォルダの自分に次の行を追加しました。
<ifModule mod_headers.c>
Header set Connection keep-alive
</ifModule>
サーバーは次のように応答します。
Connection: keep-alive, close
ここで、TCPセグメントをもう一度確認しました。Chromeからサーバーへの接続は9つだけで、FIN
フラグが1に設定されているのは3つだけでした。したがって、このトリックは機能しているように見えました。しかし、なぜデータ送信後に接続を閉じた3つの接続があったのでしょうか。HTTPヘッダーでX-Powered-By: PHP/5.4.11
確認されたように、これらはPHPリクエストでした。
そしてFirefoxはどうですか?まだ14件のリクエストがありました!
それを修正し、fcgiプロセスをkeep-aliveでも動作させるにはどうすればよいですか?
httpd.conf構成のvirtualhostセクションに次の行を追加しました。
KeepAlive On
KeepAliveTimeout 5
MaxKeepAliveRequests 100
に追加されたものを削除しました.htaccess
。これで、サーバーは混乱を招くような送信を送信していませんConnection: keep-alive, close
がConnection: keep-alive
、すべてが正常に機能します。
結論:
接続フィールドがに設定されたヘッダー
HTTP/1.1 200 OK
Connection: keep-alive, close
keep-alive
Firefoxが各接続を閉じているように見える間、Chromeによって解釈されます。実際の実装に依存しているようです。
したがって、を含む応答ヘッダーを処理するためのクライアントを実装する場合はConnection: keep-alive, close
、複数のリクエストが必要な場合は、keep-aliveを使用してみることをお勧めします。発生する可能性のある最悪の事態:サーバーが接続を閉じ、再度接続する必要があります(これは、他のオプションです!)