こんにちは!技術メディア編集長のネットワークスペシャリストです。
日頃からWebアプリの開発やインフラの保守に携わっていると、「HTTP/2ってなんだか速いらしい」「マルチプレクシング(多重化)のおかげで、1つのコネクションで同時にたくさんのファイルが取れるんだよね」といった話をよく耳にすると思います。
でも、ちょっと待ってください。
クライアント(ブラウザ)とサーバーが、その「速くて効率的な通信ルール」を始める前に、一体どうやってお互いの意思疎通をとっているか、気になったことはありませんか?
「うちのサーバーは、同時に最大でこれだけのファイルを流せるよ」
「了解!じゃあそのルールでいこう!」
今回は、この「通信を始める前の大切な握手(ネゴシエーション)」の主役である、`SETTINGSフレーム`について、一歩ずつ優しく紐解いていきましょう!難解なビット数や英語の仕様書は脇に置いて、身近な例えからスタートしますので、リラックスして読んでくださいね。
—
1. 郵便配達で例える「HTTP/2 SETTINGSフレーム」の世界
私たちが普段使っているインターネットの通信を、「郵便配達」に例えてみましょう。
従来のHTTP/1.1という世界は、言ってみれば「ハガキを1枚送るたびに、専用のバイクを1台発進させる」ようなものでした。これでは道路(ネットワーク)がすぐに渋滞してしまいますよね。
そこで登場したHTTP/2は、「1台の大きなトラック(TCPコネクション)の中に、たくさんの引き出し(ストリーム)を作って、手紙や荷物をまとめて同時に運んじゃおう!」という革命的な仕組みです。
しかし、ここで一つ問題が起きます。
もし、送り先の相手(サーバー)が、あまりにも小さなお家だったらどうでしょう? あなたが「大きな荷物を同時に100個受け取って!」とトラックごと送りつけても、サーバー側の置き場所がパンクしてしまいますよね。
だからこそ、トラックが出発した直後にお互いの「積載ルール」を確認し合う必要があるのです。
この確認作業の最前線でやり取りされるのが、今回フォーカスする`SETTINGS(セッティングス)フレーム`という名の「申し送り書」になります。
—
2. SETTINGSフレームの正体と、その「お作法」
HTTP/2の通信が始まると、クライアントとサーバーは、一番最初に「SETTINGSフレーム」という特別なパケットを相手に送りつけます。
これは、難しい言葉で言うと「接続パラメータのネゴシエーション(条件交渉)」ですが、要するに「お互いの自己紹介と、これからのルール決め」です。
SETTINGSフレームには何が書いてあるの?
この申し送り書の中には、いくつかの「お願いルール(パラメータ)」が詰め込まれています。代表的なものをいくつか覗いてみましょう。
1. お互いの部屋の広さ(最大フレームサイズ)
- 「一度に送る荷物は、最大でもこの大きさにしようね」というサイズ制限です。
2. 同時並行で運べる荷物の数(最大コンカレント・ストリーム数)
- 「同時に何個の引き出しを開けて通信していいか」の上限値です。サーバーのパワーに合わせて調整されます。
3. 窓口の混雑具合(初期ウィンドウサイズ)
- 「今からどれくらいの量のデータを一気に送り出していいか」の交通整理の基準です。
これらの数値は、ネットワークの混雑具合やサーバーのスペックを最大限に活かすために、とても重要な意味を持っています。
—
3. 「ちゃんと届いたよ!」を伝える ACK フラグの仕組み
さて、ここで一つの疑問が湧いてきますよね。
「クライアントが自分のルール(SETTINGS)をサーバーに送った後、サーバーがそれをちゃんと読んでくれたかどうか、どうやって確認するんだろう?」
ネットワークの世界は、手紙を出したらハイおしまい、ではありません。必ず「届いたよ!」という確約が必要です。
ここで登場するのが、`ACK(エーシーケー / 承認)フラグ`という小さな目印です。
郵便配達の「受領印」をイメージしよう
1. クライアントからの送信
「私の設定ルールはこれです!」と書いたSETTINGSフレームをサーバーに送ります。
2. サーバーの確認と適用
サーバーはそのフレームを受け取り、「なるほど、このルールで通信すればいいんだな」と自分の頭の中にメモ(設定の適用)をします。
3. ACKフラグ付きの返信
サーバーはすぐさま、「確認しました!」というACKフラグ(確認応答フラグ)が「ON」になったSETTINGSフレームを、クライアントに投げ返します。
この「ACKが返ってくる」というステップを踏むことで、初めてお互いに「よし、このルールで本格的なデータ通信をスタートしよう!」と確信を持てるわけです。この往復のキャッチボールが終わるまで、お行儀の良いHTTP/2クライアントは、重たいデータ(リクエスト)を本格的には流しません。
—
4. 実務で役立つ!パケットキャプチャや設定の視点
インフラエンジニアとして現場に立っていると、ブラウザからのアクセスがなぜか遅かったり、プロキシサーバー(NginxやEnvoyなど)との間で「なんだかHTTP/2のネゴシエーションがうまくいかないな…」というトラブルに直面することがあります。
そんな時、Wiresharkなどのパケット解析ツールを開いて、次のようなやり取りを目にすることがあります。
[フレームのタイムライン例]
1. Client -> Server : HEADERS (HTTP/2 Connection Preface)
2. Client -> Server : SETTINGS (私の設定はこれです。最大ストリーム数=100)
3. Server -> Server : SETTINGS (私の設定はこれです。最大ストリーム数=128)
4. Server -> Client : SETTINGS [ACK=1] (クライアントさんの設定、了解しました!)
5. Client -> Server : SETTINGS [ACK=1] (サーバーさんの設定、こちらも了解しました!)
— ここから本格的なマルチプレクシング通信がスタート! —
もし、この手順の中でサーバーからの `SETTINGS [ACK=1]` が一向に返ってこなかったとしたら?
それは、ファイアウォールや途中のルーターが特定のパケットサイズをドロップしているか、あるいはサーバー側のHTTP/2実装が何らかの理由でフリーズしているサインかもしれません。トラブルシューティングの強力な手がかりになりますよね。
また、NginxなどのWebサーバーの設定ファイル(`nginx.conf`など)では、このSETTINGSフレームでやり取りされる上限値を次のようにチューニングすることができます。
http {
# HTTP/2で一度に処理できるストリーム(引き出し)の最大数を指定
# サーバーのメモリやCPU負荷に合わせて調整します
http2_max_concurrent_streams 128;
# 受け取るフレームの最大サイズを指定(デフォルトは16KB)
http2_chunk_size 8k;
}
「あ、この設定ファイルで書いている数値が、あのSETTINGSフレームの数字になって相手に伝わっているんだな」とイメージできるようになると、インフラを触る面白さが何倍にも膨れ上がります!
—
5. おわりに:一歩ずつ、確かなネットワークの知識へ
今回は、HTTP/2の舞台裏を支える「SETTINGSフレームによる接続パラメータのネゴシエーション」について、郵便配達の例えを交えながら優しく解説しました。
一見すると難解なプロトコル仕様も、「お互いが安全に、効率よく荷物をやり取りするための人間味あふれるマナーのやり取りなんだな」と捉えると、グッと身近に感じられたのではないでしょうか。
ネットワークやインフラストラクチャの世界は、こうした「目に見えない小さな約束事(フレームのキャッチボール)」の積み重ねで成り立っています。これからも一つひとつの仕組みを丁寧に紐解きながら、自信を持って現場で活躍できるエンジニアを目指して一緒に進んでいきましょう!
それでは、また次回の技術解説でお会いしましょう!
コメント