ALPN(Application-Layer Protocol Negotiation)をネスペ午後問を解きながら9秒で理解!

ALPN アイキャッチ
哲学者トニーくん
哲学者トニーくん

【9秒チャレンジ】
ALPNは、TCP接続後のTLSハンドシェイク中(ClientHello,ServerHello)に行われ、クライアントとサーバが使うアプリケーションプロトコル自動選択する仕組みです。これにより、プロトコルの不一致無駄な通信を防ぎます。特にHTTPは1つのポートで複数プロトコル(例: HTTP/1.1, HTTP/2)を扱うため、ALPNがあると最初から最適なプロトコルで通信でき、効率的です。逆に、アプリケーションプロトコルの中でも、SMTPやFTPなどはポートごとに役割が決まっているので、ALPNは基本不要です。

もし、この説明でモヤモヤしても、大丈夫!
以下の問題でアウトプットしていくことで無理なく理解に落とし込むことができます!

では、練習問題を通して実感していきましょう!

問題

企業Aでは、Webサービスの通信効率を向上させるため、HTTPS通信においてHTTP/2の利用を検討している。エンジニアBは、クライアントとサーバが適切なプロトコルを選択する仕組みについて調査を行い、ALPNがその役割を担うことを突き止めた。

エンジニアBは、以下のような通信の流れを確認した。

  1. クライアントはTLSハンドシェイク時に「ClientHello」メッセージを送信し、ALPN拡張フィールドに対応可能なプロトコルのリスト(例: http/1.1, h2)を含めた。
  2. サーバは「ServerHello」メッセージで、対応可能なプロトコルの中から選択したプロトコルを返した。
  3. その後、選択されたプロトコルに基づいてアプリケーションレイヤの通信が開始された。

このとき、エンジニアBは次の点について疑問を抱いた。

設問1

ALPNが使用されるプロトコルの組み合わせとして 最も適切なもの を以下から選択せよ。

  1. FTP over TLS
  2. SMTP over TLS
  3. HTTPS over TLS
  4. DNS over TLS

設問2

ALPNが導入されていない場合、クライアントとサーバがアプリケーションプロトコルを協調する際に起こりうる具体的な問題を 2つ 挙げよ。

設問3

以下のTLSハンドシェイクメッセージの内容を読み取り、どのプロトコルが選択されたか答えよ。

HTTP
ClientHello:
    ALPN: h2, http/1.1

ServerHello:
    ALPN: h2

(1) 選択されたプロトコル名を答えよ。
(2) この選択によって得られる通信上のメリットを 2つ 挙げよ。

哲学者トニーくん
哲学者トニーくん

では、解答を見ていこう!

設問1の解答:ALPNが使用されるプロトコルの組み合わせとして 最も適切なもの を以下から選択せよ。

3. HTTPS over TLS

解説

ALPNは、TLSハンドシェイク中にクライアントとサーバがアプリケーションレイヤのプロトコル協議する仕組みです。これは特に、同じポートで複数のプロトコル(例えばHTTP/1.1やHTTP/2)が動作する可能性がある場合に重要です。ALPNは主に HTTPS (HTTP over TLS) で使われ、HTTP/1.1 や HTTP/2、最近では HTTP/3 などのプロトコルをネゴシエーションします。

FTPやSMTPもTLSで暗号化できますが、これらのプロトコルではALPNは一般的に使われません。

哲学者トニーくん
哲学者トニーくん

要するに、HTTPは1つのポート(80番)で複数(HTTP/1,HTTP/2など)のプロトコルを扱う。で、それをクライアントとサーバ間で決めるのは少々手間がかかる。そこで、ALPNを使えば、スムーズに使うプロトコルを決定できるというわけです。

FTPやSMTPもアプリケーション層のプロトコルではありますが、通常、1つのポートでは単一のプロトコルしか動作しないので、ALPNを使う必要がありません。


設問2の解答:ALPNが導入されていない場合、クライアントとサーバがアプリケーションプロトコルを協調する際に起こりうる具体的な問題を 2つ 挙げよ。

ALPNがない場合に起こる問題は以下のようなものがあります:

  1. プロトコルミスマッチによる接続失敗
    クライアントがHTTP/2を使いたいと思っても、サーバがHTTP/1.1しか対応していない場合、プロトコルの不一致で通信が成立しないことがあります。
  2. 余計なラウンドトリップが発生する
    ALPNがない場合、クライアントはまずHTTP/1.1で通信を開始し、サーバがアップグレードヘッダを返してHTTP/2に移行するという余計な往復通信が必要になることがあります。これにより、TLS接続の確立にかかる時間が増加します。

設問3の解答:(1) 選択されたプロトコル名を答えよ。(2) この選択によって得られる通信上のメリットを 2つ 挙げよ。

HTTP
ClientHello:
    ALPN: h2, http/1.1

ServerHello:
    ALPN: h2

(1) h2(HTTP/2)

(2) 通信上のメリット

  1. 多重化による高速化
    HTTP/2では1つのTCP接続内で複数のストリームを並行して送信できるため、リクエスト/レスポンスの順序を気にせず効率的にデータ転送できます。
  2. ヘッダ圧縮によるデータ削減
    HTTP/2ではHPACKという圧縮方式を使い、リクエストヘッダを圧縮します。これにより、特に繰り返し送信されるCookieや認証情報などが効率的に送られ、トラフィック量が削減されます。

まとめ

ALPNは、TLSハンドシェイク中にアプリケーションプロトコルを効率的に決定する重要な仕組みです。特にHTTP/2やHTTP/3のような最新プロトコルを利用する際に、余計な通信のやり取りを削減しつつ、クライアントとサーバのプロトコルミスマッチを防ぐことができます。

🌐 ALPN(Application-Layer Protocol Negotiation)とは?

ALPNは、TLS通信の最初のやりとり(TLSハンドシェイク)のときに、クライアントとサーバがどのアプリケーションプロトコルを使うか相談する仕組みです。

例えば、WebブラウザがWebサーバと通信するとき、HTTP/1.1 なのか HTTP/2 なのかを事前に決める必要があります。その決め方に ALPN が使われます。


🚚 ALPNの流れ(簡単なイメージ)

  1. クライアントの希望を伝える
    ブラウザ(クライアント)は、「HTTP/2を使いたいけど、HTTP/1.1でもOKだよ!」という候補リストをサーバに送ります。これは ClientHello というメッセージの中に含まれます。

🔸 例:クライアント → サーバ
「私は HTTP/2HTTP/1.1 を話せます。どっち使う?」

  1. サーバがプロトコルを選ぶ
    サーバは自分が対応できるプロトコルをチェックし、クライアントが提案したリストの中から選びます。そして ServerHello メッセージで選択結果を返します。

🔸 例:サーバ → クライアント
「じゃあ HTTP/2 を使おう!」

  1. 選んだプロトコルで通信開始
    TLSハンドシェイクが終わると、選ばれたプロトコルで本格的な通信が始まります。

🧩 ALPNがあると何がうれしいの?

  • 高速なプロトコル選択 → プロトコルを後から変えるときの余計なやり取りがいらない
  • 複数プロトコルの同時対応 → サーバ側でHTTP/1.1とHTTP/2を同じポートで待機できる
  • セキュリティの強化 → TLSの一部として動くので安全な通信が保たれる

📘 具体例:ブラウザとWebサーバ

例えば、ブラウザがGoogleにアクセスするとき、ALPNで以下のようなやりとりが行われます。

  1. ブラウザ:「h2 (HTTP/2)http/1.1 どっちでもOK!」
  2. サーバ:「じゃあ h2 (HTTP/2) にしよう!」
  3. 通信スタート!(HTTP/2で効率的にデータやり取り)

🎯 簡単なまとめ

ALPNは、TLS接続の最初の段階で、どのアプリケーションプロトコルを使うか自動的に決めてくれる仕組みです。これにより、クライアントとサーバが無駄なやり取りをせず、スムーズに最適なプロトコルで通信できるようになります。

ゴーゴー魚釣り / 工藤祐次郎 covered by Fujiぼっち弾き語り
タイトルとURLをコピーしました