HTTPパイプライン

HTTPパイプラインとは



HTTPパイプラインとは、HTTP/1.1において、一つのTCPコネクション上で複数のHTTPリクエストを、前のリクエストに対するレスポンスを待たずに連続して送信する技術のことです。これにより、特に遠隔地にあるサーバとの通信や、衛星インターネットのようにレイテンシ(遅延)が大きい環境において、ウェブページの読み込み速度を大幅に向上させることが期待できます。

パイプライン化の仕組みと課題



HTTPパイプラインの基本的な仕組みは、クライアントが複数のリクエストを連続して送信し、サーバがそれらのリクエストに対して順次レスポンスを返すというものです。これにより、リクエストごとに新たなコネクションを確立する必要がなくなり、通信のオーバーヘッドを削減できます。しかし、HTTP/1.1の仕様上、クライアントからのリクエスト順序とサーバからのレスポンス順序は同期している必要があります。このため、もし一つのレスポンスが遅延すると、後続のレスポンスも全て遅れてしまう「HOL(Head-of-Line)ブロッキング」が発生する可能性があります。

この問題を解決するために、HTTP/2|HTTP_2ではリクエストとレスポンスの順序を非同期にすることが可能になりました。HTTP/2|HTTP_2では、SPDYというプロトコルが基盤となっています。

パイプライン化可能なメソッドと制約



HTTPパイプラインを利用するにあたっては、メソッドの種類によって制限があります。POSTメソッドのように、同じリクエストを繰り返すと結果が変わってしまう(冪等でない)メソッドは、パイプライン化してはなりません。パイプライン化が可能なのは、GETメソッドやHEADメソッドなど、冪等性を持つメソッドに限られます。また、PUTやDELETEなどのメソッドをパイプライン化する場合は、リクエストの順序が結果に影響しないことを確認する必要があります。

HTTPパイプラインの対応状況



HTTPパイプラインは、HTTP/1.1でのみサポートされており、HTTP/1.0では利用できません。また、クライアント(ブラウザ)とサーバの両方が対応している必要があります。サーバ側の対応は比較的容易ですが、クライアント側の対応は複雑であり、すべてのブラウザで完全に実装されているわけではありません。

サーバ側の対応



サーバ側は、リクエスト間でネットワークバッファを破棄しないように注意すれば、比較的容易にパイプライン化に対応できます。多くのサーバは特に問題なくパイプライン化をサポートしています。

ブラウザ側の対応



ブラウザ側の対応は複雑で、実装状況は様々です。

Opera: Prestoエンジン搭載時代には、パイプライン化を完全に実装し、デフォルトで有効にしていました。
Internet Explorer: バージョン8では、パイプライン化に対応していません。これは、パイプライン化に関するバグを持つプロキシが存在することや、HOLブロッキングを回避するためです。
Mozilla (Firefox, SeaMonkey, Camino): パイプライン化に対応しているものの、デフォルトでは無効化されています。これは、パイプライン化で誤った挙動をするサーバが存在するためです。古いIISサーバに対しては、自動的にパイプライン化を無効にするなどのヒューリスティクスが用いられています。
Google Chrome: バージョン18以降でパイプライン化に対応していますが、非標準のオプション機能扱いであり、HTTPSではパイプライン化に対応していません。バージョン26からは、オプション機能を有効化するフラグが削除されました。

プロキシの対応



多くのプロキシは、パイプライン化に対応していません。Squidの一部バージョンではパイプライン化に対応していますが、帯域管理やログ記録の都合でデフォルトでは無効化されています。Polipoはパイプライン化に対応しています。

HTTPパイプラインの関連技術



HTTPパイプラインは、HTTPの持続的接続と密接に関連しています。持続的接続は、複数のリクエストとレスポンスを同一のTCPコネクションでやり取りする技術であり、HTTPパイプラインは、その上で複数のリクエストを連続送信する技術です。

HTTP/2|HTTP_2では、HTTPパイプラインの課題を解決し、より効率的な通信を実現するために、SPDYプロトコルが基盤となっています。また、WebSocketは、双方向通信を可能にする別の技術であり、HTTPパイプラインとは異なる目的で使用されます。

まとめ



HTTPパイプラインは、ウェブページの読み込みを高速化する可能性を秘めた技術ですが、実装上の複雑さやHOLブロッキングなどの課題があり、普及が進んでいません。現在では、より高度な技術であるHTTP/2|HTTP_2にその役割が移行しつつあります。

参考文献



RFC 7230: Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing
HTTP/1.1 Pipelining FAQ at mozilla.org
"Network Performance Effects of HTTP/1.1, CSS1, and PNG" at w3.org
"Optimizing Page Load Times" article
phttpget
serf C library

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。