編集:私の答えは元の未編集の質問のみをカバーしています。これは、この種のことがロードバランサー/リバースプロキシで一般的かどうかでした。nginx / product Xがこれをサポートしているかどうかはわかりませんが、リバースプロキシエクスペリエンスの99.9%がHAproxyを使用しています。
正しい。HTTPキープアライブはクライアント側で実行されますが、サーバー側では実行されません。
どうして?
いくつかの詳細を分析すると、なぜこれが利点なのかがすぐにわかります。この例では、ページwww.example.comを読み込んでいるとします。このページには3つの画像img [1-3] .jpgが含まれています。
Keep-Aliveを使用しないブラウザーのページ読み込み
- クライアントはポート80でwww.example.comへのTCP接続を確立します
- クライアントは「/」のHTTP GET要求を行います
- サーバーは、URI「/」のHTMLコンテンツを送信します(これには3つの画像を参照するHTMLタグが含まれます)
- サーバーはTCP接続を閉じます
- クライアントはポート80でwww.example.comへのTCP接続を確立します
- クライアントは「/img1.jpg」に対してHTTP GET要求を実行します
- サーバーは画像を送信します
- サーバーはTCP接続を閉じます
- クライアントはポート80でwww.example.comへのTCP接続を確立します
- クライアントは「/img2.jpg」に対してHTTP GET要求を実行します
- サーバーは画像を送信します
- サーバーはTCP接続を閉じます
- クライアントはポート80でwww.example.comへのTCP接続を確立します
- クライアントが「/img3.jpg」に対してHTTP GET要求を実行します
- サーバーは画像を送信します
- サーバーはTCP接続を閉じます
4つの個別のTCPセッションが確立されてから閉じられることに注意してください。
Keep-Aliveを使用したブラウザーのページの読み込み
HTTPキープアライブでは、1つのTCP接続で複数のHTTP要求を次々に処理できます。
- クライアントはポート80でwww.example.comへのTCP接続を確立します
- クライアントは「/」のHTTP GET要求を実行し、これをHTTPキープアライブセッションにするようサーバーに要求します。
- サーバーは、URI「/」のHTMLコンテンツを送信します(これには3つの画像を参照するHTMLタグが含まれます)
- サーバーが TCP接続を閉じない
- クライアントは「/img1.jpg」のHTTP GETリクエストを行います
- サーバーは画像を送信します
- クライアントは「/img2.jpg」のHTTP GETリクエストを行います
- サーバーは画像を送信します
- クライアントは「/img3.jpg」のHTTP GETリクエストを行います
- サーバーは画像を送信します
- HTTPキープアライブタイムアウト期間内にHTTPリクエストが受信されない場合、サーバーはTCP接続を閉じます
キープアライブでは、1つのTCP接続のみが確立され、最終的に閉じられることに注意してください。
キープアライブの方が良いのはなぜですか?
これに答えるためには、クライアントとサーバー間のTCP接続を確立するために必要なことを理解する必要があります。これは、TCP 3ウェイハンドシェイクと呼ばれます。
- クライアントはSYN(chronise)パケットを送信します
- サーバーはSYN(chronise)ACK(nowledgement)、SYN-ACKを送り返します
- クライアントはACK(nowledgement)パケットを送信します
- TCP接続は、クライアントとサーバーの両方でアクティブと見なされるようになりました
ネットワークには遅延があるため、3ウェイハンドシェイクの各ステップには一定の時間がかかります。クライアントとサーバー間に30ミリ秒があるとしましょう。TCP接続を確立するために必要なIPパケットの往復送信は、TCP接続を確立するのに3 x 30ミリ秒= 90ミリ秒かかることを意味します。
これはあまり聞こえないかもしれませんが、元の例で4つのTCP接続を確立する必要があると考えると、これは360ミリ秒になります。クライアントとサーバー間の遅延が30ミリ秒ではなく100ミリ秒の場合はどうなりますか?その後、4つの接続が確立するのに1200msかかります。
さらに悪いことに、一般的なWebページでは、読み込むために3つ以上の画像が必要な場合があり、クライアントが要求する必要のある複数のCSS、JavaScript、画像、またはその他のファイルが存在する場合があります。ページに他の30個のファイルが読み込まれ、クライアントサーバーの待ち時間が100ミリ秒の場合、TCP接続の確立に費やす時間はどれくらいですか?
- 1つのTCP接続を確立するには、3倍の遅延が必要です。つまり、3 x 100ms = 300msです。
- これを31回、ページに対して1回、ページによって参照される他の各ファイルに対してさらに30回行う必要があります。31 x 300ms = 9.3秒。
9.3秒でTCP接続の確立に費やし、他の30個のファイルを参照するWebページをロードしました。また、HTTP要求の送信と応答の受信に費やされた時間もカウントされません。
HTTPキープアライブでは、1つのTCP接続を確立するだけで、300ミリ秒かかります。
HTTPキープアライブが非常に優れている場合、サーバー側でも使用してみませんか?
HTTPリバースプロキシ(HAproxyなど)は、通常、プロキシするバックエンドサーバーの非常に近くに展開されます。ほとんどの場合、リバースプロキシとそのバックエンドサーバー間の遅延は1ミリ秒未満であるため、TCP接続の確立はクライアント間よりもはるかに高速です。
しかし、それは理由の半分にすぎません。HTTPサーバーは、クライアント接続ごとに一定量のメモリを割り当てます。Keep-Aliveを使用すると、接続をキープアライブに維持し、拡張により、キープアライブタイムアウトに達するまでサーバー上で一定量のメモリを使用し続けます。 。
したがって、HTTPリバースプロキシのサーバー側でキープアライブを使用する効果を考慮すると、メモリの必要性が増加しますが、プロキシとサーバー間のレイテンシが非常に低いため、実際のメリットは得られませんTCPの3ウェイハンドシェイクにかかる時間を短縮するため、通常、このシナリオではプロキシとWebサーバー間のKeep-Aliveを無効にすることをお勧めします。
免責事項:はい、この説明では、ブラウザーが通常サーバーへの複数のHTTP接続を並行して確立するという事実を考慮していません。ただし、ブラウザが同じホストに対して行う並列接続の数には制限があり、通常、これはキープアライブを望ましいものにするのに十分なほど小さいものです。