
HTTP パイプラインはHTTP/1.1の機能で、複数のHTTPリクエストを単一のTCP接続で送信し、対応する応答を待たずに済むようにします。[1] HTTP/1.1 では、サーバーが HTTP パイプラインをサポートしていない場合でも、パイプライン化されていない有効な応答でパイプライン化されたリクエストに正しく応答する必要があります。この要件にもかかわらず、多くの従来の HTTP/1.1 サーバーはパイプライン化を正しくサポートしていないため、ほとんどの HTTP クライアントは HTTP パイプラインを使用できません。
この技術はHTTP/2 [2]による多重化に取って代わられ、ほとんどの最新ブラウザでサポートされています。[3]
HTTP/3では、 TCPに代わるQUICを介して多重化が行われます。これにより、一部のパケットが失われても ヘッドオブラインブロッキングが発生しないため、読み込み時間がさらに短縮されます。
動機と限界
リクエストのパイプライン化により、HTMLページの読み込み時間が劇的に改善されます[4] 。特に衛星インターネット接続などの高遅延接続では顕著です。ブロードバンド接続ではHTTP 1.1の制限が依然として適用されるため、高速化はそれほど顕著ではありません。サーバーはリクエストを受信したのと同じ順序で応答を送信する必要があるため、接続全体が先入れ先出しのままになり[1]、HOLブロッキングが発生する可能性があります。
HTTP/2とSPDYの非同期操作は、この問題を解決するものです。[5] 2017年までに、ほとんどのブラウザは、代わりに多重化を使用するHTTP/2をデフォルトでサポートしました。[2]
のような非べき等性POSTリクエストはパイプライン化すべきではありません。[6]GETやのような読み取りリクエストは常にパイプライン化できます。 やのHEADような他のべき等性リクエストのシーケンスは、シーケンス内のリクエストが他のリクエストの効果に依存するかどうかに応じて、パイプライン化できるかどうかが決まります。[1]PUTDELETE
HTTPパイプラインはクライアントとサーバーの両方でサポートされる必要があります。HTTP /1.1準拠のサーバーはパイプライン化されたリクエストに対して有効なレスポンスを生成する必要がありますが、実際にはリクエストを同時に処理することはできません。[7]
パイプラインの問題のほとんどは、HTTP中間ノード(ホップバイホップ)、つまりプロキシサーバー、特に透過プロキシサーバーで発生します(HTTPチェーン上の1つがパイプライン化されたリクエストを適切に処理しない場合、何も機能しません)。[8]
HTTPプロキシサーバーでパイプラインを使用することは、HOLブロッキング問題によりプロキシサーバーの応答が遅くなる可能性があるため、通常は推奨されません(サーバーの応答は受信した要求と同じ順序でなければならないため)。[1] [9]
例: クライアントが単一の接続を介して 4 つのパイプライン GET 要求をプロキシに送信し、最初の要求がキャッシュにない場合、プロキシはその要求を宛先 Web サーバーに転送する必要があります。次の 3 つの要求がキャッシュに見つかった場合、プロキシは Web サーバーの応答を待機し、それをクライアントに送信する必要があります。その後で初めて、キャッシュされた3 つの応答も送信できます。
代わりに、クライアントがプロキシに4つの接続を開き、接続ごとに1つのGETリクエストを送信すると(パイプラインを使用せずに)、プロキシはサーバーからの応答を受信する前に3つのキャッシュされた応答をクライアントに並列に送信できるため、全体的な完了時間が短縮されます(要求はヘッドオブラインブロッキングの問題なしに並列に処理されるため)。[10] HTTP/2多重化ストリームにも同じ利点があります。
実施状況
パイプラインはHTTP/1.1で導入され、HTTP/1.0には存在しませんでした。[11]
ブラウザやプロキシサーバーなどがパイプライン化されたリクエスト/レスポンスを使用するとうまく動作しないという苦情は常に存在しており、長年にわたり(少なくとも2011年までは)、ソフトウェア開発者、エンジニア、ウェブ専門家などが、気づいたさまざまな問題をまとめ、問題を解決し、オープンウェブでのパイプライン化に対処する方法についてアドバイスを提供しようとしてきました。[8]
ウェブブラウザでの実装
主要なブラウザの中で、Operaだけがデフォルトで有効化された完全に機能する実装を持っていました。他のブラウザではHTTPパイプラインは無効化されているか実装されていませんでした。[5]
- Internet Explorer 8は、バグのあるプロキシとヘッドオブラインブロッキングに関する懸念のため、パイプラインリクエストをサポートしていません。[9]
- Internet Explorer 11はパイプラインをサポートしていません。[12]
- Mozilla ブラウザ ( Mozilla Firefox、SeaMonkey、Caminoなど) はパイプラインをサポートしていましたが、Firefox 54 で削除されました。 [13]サポートされていたときは、サーバーの誤動作による問題を回避するために、パイプラインはデフォルトで無効になっていました。[14]ユーザーがパイプラインを有効にした場合、Mozilla ブラウザはいくつかのヒューリスティックを使用して、主に古いMicrosoft IISサーバーのパイプラインをオフにしました。 [15]この削除は最終的に SeaMonkey にバックポートされました。
- Konqueror 2.0はパイプラインをサポートしていますが、デフォルトでは無効になっています。[16]
- Google Chromeは以前はパイプラインをサポートしていましたが、バグやサーバーの動作不良による問題のため無効になっています。[17]
- Pale Moon(ウェブブラウザ)はパイプラインをサポートしており、デフォルトで有効になっています。[18]
ウェブプロキシサーバーへの実装
ほとんどのHTTPプロキシは送信リクエストをパイプライン化しません。[19]
透過型HTTPプロキシを含む一部のHTTPプロキシは、パイプライン化されたリクエストを非常に不適切に管理する場合があります(たとえば、パイプライン化された応答の順序が混同されるなど)。[20]
Squid Webプロキシの一部のバージョンでは、最大2つの送信リクエストをパイプライン処理します。この機能はデフォルトでは無効になっており、「帯域幅管理とアクセスログの理由」により手動で有効にする必要があります。[21] Squidはクライアントからの複数のリクエストをサポートしています。
Polipoプロキシは送信リクエストをパイプライン化します。[22]
オープンソースのアプリケーション配信コントローラであるTempesta FW [23]もバックエンドサーバーへのリクエストをパイプライン化します。[24]
その他の実装
World Wide Web Consortium (W3C)が作成したlibwwwライブラリは、 1997年2月18日にリリースされたバージョン5.1以降、パイプラインをサポートしています 。[25]
HTTP パイプラインをサポートするその他のアプリケーション開発ライブラリには次のものがあります。
- HTTPパイプラインのクライアントサポートを提供するPerlモジュールは、HTTP::AsyncとLWPng(libwww-perl New Generation)ライブラリです。[26]
- Microsoft .NET Framework 3.5はモジュール内でHTTPパイプラインをサポートしています
System.Net.HttpWebRequest。[27] - Qtクラスは
QNetworkRequest4.4で導入されました。[28]
現在パイプラインを活用している他のアプリケーションは次のとおりです。
- BUILD389 以降の IceBreak アプリケーション サーバー
- FreeBSDのphttpget (最小限のパイプラインHTTPクライアント)[29]
- libcurlは以前はCURLMOPT_PIPELININGオプションを使用したパイプラインの限定的なサポートを行っていましたが[30] 、このサポートはバージョン7.65.0で削除されました[31]。
- portsnap ( FreeBSD ポートツリー配布システム)
- Advanced Packaging Tool (APT) はパイプラインをサポートしています。[引用が必要]
- Subversion(SVN)は、serf WebDAVアクセスモジュールによるHTTPパイプラインのオプションサポートを備えています(デフォルトモジュールのneonにはパイプラインサポートがありません)。[32] [33]
- Windows Server 2003上のMicrosoft Message Queuingは、デフォルトでHTTPのパイプラインを利用し、HTTPSで使用するように構成することもできます。[34]
- IBM CICS 3.1はクライアント内でHTTPパイプラインをサポートしています。[35]
HTTP パイプラインをサポートするテスト ツールには次のものがあります。
参照
参考文献
- ^ abcd Fielding, R.; Reschke, J. (2014). Fielding, R.; Reschke, J. (編). 「ハイパーテキスト転送プロトコル (HTTP/1.1): メッセージ構文とルーティング: パイプライン化」. ietf.org. doi : 10.17487/RFC7230 . 2014-07-24に取得。
{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)が必要です - ^ ab "リビジョン 1330814 | HTTP/1.x での接続管理 | MDN". MDN Web Docs . 2018-03-19 のオリジナルからアーカイブ。 2018-03-19に取得。
- ^ 「HTTP2 ブラウザ サポート」 。2017年3 月 9 日閲覧。
- ^ Nielsen, Henrik Frystyk ; Gettys, Jim ; Baird-Smith, Anselm ; Prud'hommeaux, Eric ; Lie, Håkon Wium ; Lilley, Chris (1997 年 6 月 24 日)。「HTTP/1.1、CSS1、および PNG のネットワーク パフォーマンス効果」。World Wide Web Consortium。2010年1 月 14 日閲覧。
- ^ ab Willis, Nathan (2009 年 11 月 18 日)。「SPDY による HTTP レイテンシの削減」LWN.net。
- ^ 「接続」. w3.org .
- ^ 「HTTP/1.1 パイプライン FAQ」。
- ^ ab Mark Nottingham (2011年3月14日). 「HTTPパイプラインをオープンウェブで使用可能にする」. 2021年10月16日閲覧。
- ^ ab 「『Windows Internet Explorer 8 Expert Zone Chat (2008 年 8 月 14 日)』の Wayback リンク」。Microsoft 。2008年 8 月 14 日。2010 年 12 月 4 日時点のオリジナルよりアーカイブ。2012 年5 月 10 日閲覧。
- ^ Fielding, R.; Reschke, J. (2014). Fielding, R.; Reschke, J. (編). 「ハイパーテキスト転送プロトコル (HTTP/1.1): メッセージ構文とルーティング: 同時実行」. ietf.org. doi : 10.17487/RFC7230 . 2014-07-24に取得。
{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)が必要です - ^ 「HTTP/1.0 と HTTP/1.1 の主な違い」。2016 年 4 月 24 日時点のオリジナルよりアーカイブ。2016 年 4 月 16 日閲覧。
- ^ 「Internet Explorer と接続制限」。IEBlog。2016年 11 月 14 日閲覧。
- ^ Firefox 54 リリースノート
- ^ 「バグ 264354: HTTP パイプラインをデフォルトで有効にする」。Mozilla。2011年9月 16 日閲覧。
- ^ 「ソースコード – nsHttpConnection.cpp」。Firefoxソースコード。Mozilla。2010 年 5 月 7 日。2010年12 月 5 日閲覧。
- ^ Emir Arian. インターネット通信:プロトコルと関連事項。 2021年10月16日閲覧。
- ^ HTTP パイプライン - Chromium プロジェクト
- ^ 「Firefox 54 で HTTP/1 パイプラインのサポートが削除されました - Pale Moon フォーラム」forum.palemoon.org 。2018 年 6 月 7 日閲覧。
- ^ Mark Nottingham (2007 年 6 月 20 日)。「プロキシ キャッシュの現状」 。2009年5 月 16 日閲覧。
- ^ マーク・ノッティンガム(2011年7月11日)。「プロキシがしなければならないこと」。2021年10月16日閲覧。
- ^ 「 squid : pipeline_prefetch 設定ディレクティブ」。Squid。2009年 11 月 9 日。2009年12 月 1 日閲覧。
- ^ 「Polipo — キャッシュ Web プロキシ」 Juliusz Chroboczek。2009 年 9 月 18 日。2009年11 月 12 日閲覧。
- ^ 「Tempesta FW — Linux アプリケーション配信コントローラー」。GitHub。2018年3 月 29 日閲覧。
- ^ “サーバー: テンペスタ側 - tempesta-tech/tempesta Wiki”. Tempesta Technologies INC. 2017 年 8 月 1 日。2018 年3 月 29 日に取得。
- ^ Kahan, José (2002 年 6 月 7 日). 「libwww の変更履歴」. World Wide Web Consortium . 2010 年8 月 3 日閲覧。
- ^ 「並列 HTTP リクエストに HTTP::Async を使用する (Colin Bradford)」(PDF)。2012 年 3 月 10 日のオリジナル(PDF)からアーカイブ。2010年 8 月 3 日に取得。
- ^ System.Net.HttpWebRequest とパイプライン
- ^ QNetworkRequest クラスリファレンス Archived 2009-12-22 at the Wayback Machine、Nokia QT ドキュメント
- ^ パイプライン HTTP GET ユーティリティ
- ^ Curl パイプラインの説明 Archived 2012-06-27 at the Wayback Machine、Curl 開発者ドキュメント
- ^ Curl パイプライン削除のお知らせ2021-02-05 にWayback Machineでアーカイブ
- ^ C. Michael Pilato、Ben Collins-Sussman、Brian W. Fitzpatrick (2008)。Subversionによるバージョン管理。O'Reilly Media。p . 238。ISBN 978-0-596-51033-6。
- ^ Justin R. Erenkrantz (2007). 「Subversion: Powerful New Toys」(PDF)。
- ^ 「HTTP/HTTPS メッセージ」。Microsoft TechNet。2005年 1 月 21 日。
- ^ CICS Web サポートがパイプラインを処理する方法
- ^ 「HTTP ウェブサイト」。2012 年 6 月 8 日時点のオリジナルよりアーカイブ。2010 年 10 月 1 日閲覧。
- ^ 「Library http」 . 2024年11月12日閲覧。
外部リンク
- RFC 7230 Fielding, R.; Reschke, J. (2014). Fielding, R; Reschke, J (編). 「ハイパーテキスト転送プロトコル (HTTP/1.1): メッセージ構文とルーティング」. ietf.org. doi : 10.17487/RFC7230 . 2014-07-24に取得。
{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)が必要です - mozilla.org の HTTP/1.1 パイプラインに関する FAQ
- w3.org の「HTTP/1.1、CSS1、PNG のネットワーク パフォーマンスへの影響」
- 「ページ読み込み時間の最適化」の記事
- phttpget
- serf C ライブラリ
