シリアル接続
HTTP/0.9 および初期の HTTP/1.0 プロトコルは、HTTP リクエストの処理をシリアル化します。ページに 3 つのスタイル ファイルが含まれており、すべてが同じプロトコル、ドメイン名、ポートに属しているとします。この場合、ブラウザは合計 4 つのリクエストを開始する必要があり、リクエストされたリソースがダウンロードされるたびに開くことができる TCP チャネルは 1 つだけです。接続はすぐに切断され、キュー内の次のリクエストを処理するために新しい接続が開かれます。 。ページ リソースのサイズと数が拡大し続けると、ユーザーは空白の画面に直面し、待ち時間が長すぎると忍耐力を失います。
並列接続
ネットワークのスループットを向上させるために、改良された HTTP プロトコルにより、クライアントは同時に複数の TCP 接続を開き、複数のリソースを並行して要求し、帯域幅を最大限に活用できるようになります。 。通常、各接続間には一定の遅延が発生しますが、リクエストの送信時間が重なるため、全体の遅延はシリアル接続よりも大幅に小さくなります。各接続がシステム リソースを消費し、サーバーが多数の同時ユーザー リクエストを処理する必要があることを考慮して、ブラウザーは同時リクエストの数に一定の制限を設定します。 RFC では特定の制限が指定されていませんが、各ブラウザーのメーカーには独自の基準があります:
IE 7: 2
IE 8/9: 6
IE 10: 8
IE 11: 13
Firefox: 6
Chrome : 6
Safari: 6
Opera: 6
iOS WebView: 6
Android WebView: 6
永続接続 (長時間接続)
初期の HTTP プロトコルはリクエストごとに独立した TCP 接続を占有しており、間違いなく増加していますTCP の接続確立オーバーヘッド、輻輳制御オーバーヘッド、および接続解放オーバーヘッドは、改良された HTTP/1.0 と HTTP/1.1 (デフォルト) の両方で永続的な接続をサポートします。リクエストが完了した場合、接続はすぐには切断されませんが、クライアントのハートビート検出が失敗するかサーバー接続がタイムアウトになるまで、今後の HTTP リクエストを迅速に処理し、同じ TCP チャネルを再利用するために接続は一定期間維持されます。 。この機能は、HTTP ヘッダー Connection: keep-alive を通じてアクティブにすることができ、クライアントは Connection: close を送信して接続をアクティブに閉じることもできます。したがって、並列接続と永続接続の 2 つの最適化が相互に補完し合うことがわかります。並列接続では、ページが最初に読み込まれるときに複数の TCP 接続を同時に開くことができますが、永続接続では後続のリクエストが確実に再利用されます。これは、最新の Web ページの一般的なメカニズムでもあります。
パイプライン接続
永続的な接続では、接続を再利用して複数のリクエストを完了できますが、FIFO キューの順序を満たす必要があり、前のリクエストがサーバーに正常に到達し、正常に処理され、サーバーが受信した場合、返された最初のバイトのみがキュー内の次のリクエストを開始できます。 HTTP パイプを使用すると、クライアントは応答を待たずに同じ TCP チャネル内で複数のリクエストを連続して開始できるため、往復の遅延の差がなくなります。ただし、実際には、HTTP/1.x プロトコルの制限により、データが 1 つのリンクにインターリーブされて到着することは許可されません (IO 多重化)。クライアントとサーバーが HTML と複数の CSS リクエストを同時に送信する状況を想像してください。サーバーはすべてのリクエストを並行して処理し、すべての CSS リクエストが処理されてバッファ キューに追加されると、HTML リクエストの処理が発生したことがわかります。問題が発生し、無期限にハングする場合があります。深刻な場合には、この状況は行頭ブロックと呼ばれることもあります。したがって、このソリューションは HTTP/1.x プロトコルでは採用されていません。
Head-of-line ブロッキングは HTTP 特有の概念ではなく、キャッシュされた通信ネットワーク交換で一般的な現象です
概要
1. 同じプロトコル、ドメイン名、およびポートに対して、ブラウザーはオープンを許可します。同時に TCP 接続を行う場合、通常の上限は 6 です。
2. 同じ TCP 接続で複数の HTTP リクエストを開始できますが、前のリクエストの最初のバイト応答がクライアントに到達するまで待つ必要があります。
3. キュー ヘッドのブロックの問題により、クライアントはキュー内のすべてのリクエストを同時に送信できません。この問題は HTTP/2.0 で解決されました。
以上がHTTP プロトコルの同時実行制限と行頭ブロックの問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。