web-dev-qa-db-ja.com

HTTP / 2で多重化する同時リクエストの数

長い間、ブラウザはホストごとに最大6つの同時HTTP 1.1接続を使用して、Webページからアセットを取得してきました。このゴールデンスタンダードを(はるかに)超えると、DOSとして認識され、サーバーへのアクセスが禁止されます。

現在、HTTP/2があり、1つの接続で多くのHTTPリクエストを多重化できます。サーバーの過負荷を防ぐために、接続で多重化する同時要求の数に同様の制限を引き続き使用する必要がありますか?または、単一の接続でさらに多くのリクエストを多重化しても害はありませんか?

ブラウザーがHTTP/2サーバーのホストごとおよび接続ごとに使用する制限を知っている人はいますか?

17
Jeroen

クライアントとサーバーが開始できるストリームの数は無制限ではなく、接続の開始時に各ピアが送信するSETTINGSフレームのSETTINGS_MAX_CONCURRENT_STREAMSパラメータによって義務付けられています。以下を参照してください RFC 7540のセクション6.5.2 デフォルトは無制限であり、RFCには次の推奨事項があります。

並列処理を不必要に制限しないように、この値は100以上にすることをお勧めします。

ただし、HTTP/2の並列処理を検討する際に考慮すべきパラメーターは、ストリームの数だけではありません。重みとストリームの依存関係も関係します。

各ストリームには重みが付けられており、RFCはサーバーがそれらの重みに基づいてリソースをストリームに割り当てることを推奨しています。クライアント側では、Firefoxは画像よりもCSSに高い重みを割り当てます。 各ブラウザがストリームに優先順位を付けて整理する方法の詳細については、この素晴らしいプレゼンテーションを参照してください 。 Chromeは依存関係を使用するため、依存関係チェーンで最も重要な要素(CSS、HTML)が他よりも高くなります。 このツールを参照 Chromeが生成する依存ツリーを示します。サーバー側、 H2O、新しい高速HTTPサーバー は、依存関係と重みに基づいてストリームをクライアントに送信するために、接続ごとにO(1)スケジューラーを実装します。つまり、デフォルトの依存関係を持つ500要素をリクエストすると、各ストリームはサーバーリソースの1/500を取得します。

(通常のWebブラウジングの場合)できるだけ多くの要素を要求することの欠点はありません。 HTTPArchive によると、ページの40%に100を超える要素が含まれているので、それらすべてを同時に確認するのが妥当だと思います(ストリームの数がSETTINGS_MAX_CONCURRENT_STREAMS。重要なのは、ブラウザが可能な限りレンダリングできるようにそれらを要求できるようにすることです。

20