「送ったもん勝ち」はなぜ破綻したのか? HTTP/1.1のパイプライン処理と「HOLブロッキング」の正体
こんにちは!ネットワークの深淵を愛するエンジニアの皆さん。今日は、Web通信の歴史の中でも少し「不器用で愛おしい」存在、HTTP/1.1のパイプライン処理についてお話ししましょう。
「リクエストを待たずに送っちゃえば速いんじゃない?」という、一見天才的なアイデアが、なぜ現場ではあまり使われず、最終的にHTTP/2という革命を引き起こすことになったのか。そのドラマを紐解いていきます。
—
郵便局の窓口に例えてみよう
HTTP/1.1のパイプライン処理を理解するために、ある郵便局の窓口を想像してみてください。
通常、私たちは窓口で「切手をください」と頼み、切手を受け取ってから「次は封筒をください」と頼みますよね。これが標準的なHTTPのやり取りです。
パイプライン処理=「まとめて注文」
パイプライン処理とは、窓口の人に「切手と、封筒と、ハガキをまとめてお願い!」と一度に要求を投げつける行為です。窓口の人は、それらを順番に処理して、結果をまとめて返してくれます。
一見、往復回数が減って効率的に見えますよね? しかし、ここには致命的な「待ちぼうけ」の罠があったのです。
—
「HOLブロッキング」という名の渋滞
この郵便局には、実は一つだけ厳しいルールがありました。それは「注文を受けた順番通りにしか商品を渡せない」というルールです。
もし、あなたが「切手」「封筒」「ハガキ」の順に頼んだとして、たまたまその時「切手」の在庫を探すのに時間がかかってしまったらどうなるでしょう?
- 後ろの「封筒」と「ハガキ」は、すぐ準備ができるのに、前の「切手」が届くまで窓口のカウンターから動けません。
- あなたの後ろに並んでいる他の人たちも、あなたの注文が終わるまでずっと待たされることになります。
これが、ネットワークの世界で言うHOLブロッキング(Head-of-Line Blocking:先頭ブロック問題)です。
前のリクエストが詰まると、後ろに並んでいるすべてのリクエストが、たとえ軽いデータであっても「人質」のように拘束されてしまう。これがHTTP/1.1のパイプライン処理が抱えていた、非常に深刻なボトルネックでした。
—
なぜ現場では普及しなかったのか?
実は、HTTP/1.1の仕様書には「パイプライン機能を使ってもいいよ」と書かれています。しかし、ブラウザやWebサーバーの現場では、長らくこの機能は「オフ」にされてきました。
理由は明確です。
「サーバー側で前のリクエストの処理が終わるまで、次のリクエストの結果を返せない」という仕組みは、サーバーの負荷を予測不能にするからです。
サーバー側の処理イメージ(擬似コード)
もしWebサーバーがパイプラインを受け取った時の挙動を、非常にシンプルに書くとこんな感じです。
// 擬似的なリクエスト処理のイメージ
function handleRequests(requests) {
for (let req of requests) {
// もしこの処理に時間がかかると…
const response = process(req);
// 次のreqは、前のprocess()が終わるまで「待ち」状態になる
sendToClient(response);
}
}
このコードを見るとわかる通り、途中で重い画像ファイルやデータベース検索が混ざると、その後の「軽いCSS」や「小さなアイコン」の配信まで全て止まってしまいます。これを避けるために、ブラウザは「安全のためにパイプラインはやめて、並列で接続を張る(コネクションを複数作る)」という戦略をとったのです。
—
次の世代へ:私たちが学べること
HTTP/1.1のパイプライン処理は、「効率化を求めて先走った結果、逆に全体の流れをせき止めてしまった」という、インフラ設計における典型的な失敗例かもしれません。
この教訓があったからこそ、HTTP/2では「ストリーム」という概念が導入され、順番を気にせずバラバラにデータをやり取りできる仕組み(多重化)が誕生しました。
まとめ:今日から意識したいこと
- HTTP/1.1は「順番待ち」に弱い: 大量の小さなリクエストを送る際は、相変わらずコネクションの貼りすぎに注意が必要です。
- モダンなプロトコルへの理解: なぜHTTP/2やHTTP/3が「速い」と言われるのか。それは「HOLブロッキングをどう解決したか」という歴史の積み重ねの上にあるからです。
ネットワークの世界は、こうした「先人たちの失敗と改善の繰り返し」でできています。もしトラブルシューティングでパケットキャプチャを見る機会があれば、「今、前のデータが詰まって後ろが待たされていないか?」という視点を持ってみてください。きっと、プロのインフラエンジニアへの第一歩になるはずですよ!
それでは、また次回の深掘りでお会いしましょう。ハッピー・パケット・ライフを!
コメント