HTTPパイプライニング

From Wikipedia, the free encyclopedia

HTTPパイプライニング: HTTP pipelining)は、HTTP/1.1において、持続的接続上で先行するレスポンスの受信完了を待たずに複数のHTTPリクエストを連続して送信する方式である。サーバは、受信したリクエストに対応するレスポンスを、受信順と同じ順序で送信しなければならない。[1][2]

HTTPパイプライニングは、各リクエストごとにレスポンスを待ってから次のリクエストを送る方式に比べて待ち時間を減らせる可能性がある一方、先行するレスポンスが後続のレスポンスを妨げるヘッド・オブ・ライン・ブロッキングの問題や、中継装置との相互運用上の問題を抱えていた。このため広範な環境での実装は難しく、HTTP/2ではより堅牢な多重化方式が採用された。[3][4][5]

HTTP/1.1では持続的接続が既定であり、その上でクライアントは複数のリクエストをパイプライン化できる。RFC 9112では、持続的接続をサポートするクライアントは、各レスポンスを待たずに複数のリクエストを送信してよいとされている。サーバは、それらのリクエストを並列に処理してもよいが、対応するレスポンスは受信順どおりに返送しなければならない。[1]

HTTP/1.1の初期仕様であるRFC 2616では、持続的接続とパイプライニングは通信効率を高める仕組みとして位置づけられていた。持続的接続によってTCP接続の確立回数を減らし、パイプライニングによって複数の資源取得時の待ち時間の削減を図る設計であった。[6]

歴史

HTTP/1.1の初期仕様であるRFC 2068および後継のRFC 2616では、持続的接続とともにパイプライニングが定義された。RFC 2068でも、持続的接続をサポートするクライアントはリクエストをパイプライン化してよいとされている。[7][2]

その後、HTTP/1.1のメッセージ構文と接続管理を定めるRFC 9112でも、パイプライニングは引き続き規定されている。一方、HTTP/2を定めるRFC 9113は、単一接続上で複数の交換を同時に扱える仕組みを導入しており、HTTP/1.1のパイプライニングとは異なる方式で遅延低減と資源利用の改善を図っている。[1][4]

動作

HTTPパイプライニングは、持続的接続上で複数のリクエストを連続送信することにより動作する。たとえば、クライアントは最初のレスポンスを待たずに2件目、3件目のリクエストを送信できる。ただし、サーバが返すレスポンスの順序はリクエストの受信順に一致していなければならない。[1]

RFC 9112は、クライアントが接続障害後に失敗した要求を再試行できるよう考慮すべきであるとしている。そのため、クライアントは冪等でないメソッドの直後にパイプライニングを行うべきではなく、非冪等なリクエストの結果を再現なく失う危険がある場合は、最終レスポンスを待つ必要がある。HTTPの意味論を定めるRFC 9110では、冪等なメソッドとしてPUT、DELETE、および安全なリクエストメソッドが挙げられている。[8][1]

また、RFC 9112では、接続が失敗した直後に再度同じ接続方針でただちにパイプライニングすることは認めていない。これは、失敗の原因がパイプライニング自体にある可能性を考慮したものである。[1]

利点

HTTPパイプライニングの利点は、各リクエストについてレスポンス待ちの時間を減らせる可能性があることである。特に、同一のサーバから多数の画像、スタイルシート、スクリプトなどを取得する状況では、同じ持続的接続上で連続して要求を送ることに意味があった。[6][9]

また、HTTP/1.1全体の設計意図としては、持続的接続と組み合わせることでTCP接続の確立回数を減らし、ネットワーク負荷と遅延の軽減を狙っていた。[6]

問題点

HTTPパイプライニングでは、サーバがレスポンスを受信順どおりに返す必要があるため、先行するリクエストの処理や転送が遅いと、後続のレスポンスが待たされる。この性質は、HTTP/1.1接続上でのヘッド・オブ・ライン・ブロッキングの要因となる。RFC 9112でも、時間のかかるリクエストや大きな内容の転送が後続要求を妨げる場合があるとしている。[1][3]

さらに、現実のネットワーク環境では、古いソフトウェアや中継装置との共存により実装が難しかった。MDN Web Docsでも、HTTPパイプライニングは既存のネットワークにおいて実装が難しいことが実証されたと説明されている。[5]

HTTP/1.0時代の持続的接続との互換性も問題となった。RFC 2616は、HTTP/1.0の持続的接続との互換性に関する節を設け、古いプロキシとの相互運用上の問題を説明している。[10]

HTTP/2以降との関係

HTTP/2は、単一接続上で複数の交換を同時に扱える仕組みを導入した。RFC 9113の概要では、HTTP/2はフィールド圧縮を導入し、同一接続上で複数同時交換を可能にすることで、ネットワーク資源のより効率的な利用と遅延の削減を実現するとしている。[4]

MDN Web Docsも、HTTPパイプライニングはHTTP/2のより堅牢な多重化に置き換えられたと説明している。このため、HTTPパイプライニングはHTTP/1.1における歴史的・技術的機能として扱われることが多い。[5]

関連項目

脚注

参考文献

Related Articles

Wikiwand AI