【入門編】HTTP/1.1におけるHOL(Head-of-Line)ブロッキング問題 – HTTPプロトコル・通信規格実践ガイド

HTTP/1.1の「行列」問題:なぜWebサイトはたまに「詰まる」のか?

こんにちは!ネットワークの世界へようこそ。今日は、Webブラウザでページを開くときに背後で起きている「ちょっとした渋滞」のお話です。

Webサイトを表示する際、ブラウザは裏側でサーバーに対して「この画像ちょうだい!」「次はCSSファイルちょうだい!」と何度もリクエストを送っています。このやり取りのルールである「HTTP/1.1」には、実は「Head-of-Line (HOL) ブロッキング」という、ちょっと困ったクセがあるんです。

「なんだか難しそうな名前だな…」と感じましたか?大丈夫、郵便配達に例えて、一緒に紐解いていきましょう!

—

郵便ポストに例えるHTTP/1.1の「パイプライン」

HTTP/1.1というルールは、一つの大きなパイプ(コネクション)を使って、複数の注文を順番に送る「パイプライン化」という仕組みを持っています。

これを「郵便配達」でイメージしてみてください。

1. あなたが郵便局(サーバー)に、手紙(リクエスト)を3通まとめて出しました。
2. 郵便局員は、届いた順番に処理を始めます。
3. しかし、一番前の手紙の処理がすごく時間がかかるものだったら?

一番前の手紙が、複雑な調査が必要でなかなか終わらないとします。すると、後ろの2通は、前の手紙が終わるまでずっと窓口のカウンターで待機させられてしまいますよね。これが「HOLブロッキング」の正体です。

前の処理が終わるまで、後ろの処理がどれだけ早く終わる内容であっても、物理的に動くことができない。これがHTTP/1.1でWebサイトの読み込みが重くなる原因の一つなんです。

—

なぜ「順番待ち」が起きてしまうのか?

HTTP/1.1の設計思想は「シンプルに、順番通りに」です。そのため、サーバーは「受け取った順番通りに結果を返さなければならない」というルールがあります。

もし、3番目のリクエストが先に終わったからといって、勝手にそれを返してしまうと、ブラウザ側が「あれ?順番が違うぞ?」と混乱してしまいます。だからこそ、一番前の行列が動かない限り、後ろは立ち往生するしかないのです。

—

現場で起きる現象を観察してみよう

実際にWebブラウザの開発者ツール(F12キーを押して「ネットワーク」タブを開いてみてください)を見ると、この現象が垣間見えます。

もし皆さんがサーバーのログや、簡単なPythonコードでこの挙動をシミュレートするとしたら、以下のようなイメージになります。

HTTPの処理を模した擬似的なコードです
requests = [“画像1”, “重い計算処理”, “画像2”]

for req in requests:
if req == “重い計算処理”:
print(“【時間待ち】前の処理が終わるまで、後ろの画像2は待機します…”)
# ここで処理がブロックされる(HOLブロッキング!)
else:
print(f”{req} を処理しました”)

このように、コード上でも「前の処理が終わるまで次に行けない」という制約が、そのままWebの表示速度に直結してしまうのです。

—

どうやって解決したの?

この「行列問題」を解決するために、エンジニアたちは様々な工夫をしてきました。

  • ブラウザの工夫: 一つのパイプだけで待つのは効率が悪いので、同じサーバーに対して複数のパイプ(コネクション)を同時に開いて、「6つくらいの行列を同時に作る」という力技を使っていました。
  • HTTP/2の登場: これが現在の主流です。HTTP/2では「多重化」という魔法のような技術が使われました。郵便配達に例えるなら、「手紙をバラバラに分解して、封筒に関係なく空いている隙間にどんどん詰め込んで届ける」というスタイルです。これなら、前の手紙が遅れていても、後ろの手紙が先に届くことができるので、行列は詰まりません。

—

最後に:インフラエンジニアの視点

HTTP/1.1はインターネットを支えてきた偉大な規格ですが、今回お話しした「HOLブロッキング」のような限界もありました。

ネットワークを学ぶ際、「なぜこの技術が使われているのか?」「このルールは何を制限してしまっているのか?」と疑問を持つことは、一流のエンジニアへの第一歩です。

まずは、皆さんが普段見ているWebサイトが、どのプロトコルで通信しているのか、開発者ツールの「プロトコル」列をぜひチェックしてみてください。「h2(HTTP/2)」になっているか、「http/1.1」になっているかを見るだけで、世界が少し違って見えてくるはずですよ!

次回は、この「行列問題」を根本から解決したHTTP/2の仕組みについて、もっと深く掘り下げていきましょう。それでは、また!

コメント

タイトルとURLをコピーしました