ALPN【Application-Layer Protocol Negotiation】
概要

TLS(Transport Layer Security)はトランスポート層レベルでデータを暗号化するプロトコルで、様々なアプリケーション層のプロトコルと組み合わせて使用される。従来のTLS通信では、暗号化セッションを確立した後に、実際に使用するアプリケーションプロトコルを別途通知(ネゴシエーション)する必要があった。例えば、TLS上でHTTP通信を行うHTTPSでは、TLS接続が完了してから初めてHTTPのバージョンなどを調整していた。通信開始時に余分な通信の往復(ラウンドトリップ)が発生し、接続確立までの時間が長くなるという課題があった。
ALPNでは、TLSによる接続を確立する手続きの最中に、アプリケーションプロトコルの通知を済ませてしまう。具体的には、クライアントがTLSハンドシェイクの「ClientHello」メッセージの中に、対応しているプロトコルの一覧を添付して送信する。サーバはその一覧を参照し、自身が対応しているプロトコルの中から最適なものを選択して「ServerHello」メッセージで返答する。これにより、TLSセッションの確立と同時にプロトコルの合意が完了し、余分なラウンドトリップを省くことができる。
ALPNが特に重要な役割を果たしているのが、HTTP/2およびHTTP/3の選択である。古い仕様であるHTTP 1.1と、近年更新されたHTTP/2およびHTTP/3では通信方式が大きく変わっており、通信開始時にWebブラウザとWebサーバがどのバージョンのHTTPで通信するか交渉しなければならない。ALPNでは、HTTP/1.1が「http/1.1」、HTTP/2が「h2」、HTTP/3が「h3」というプロトコル識別子で識別され、同一のポート番号(標準では443番)でも双方の対応状況に応じて適切なバージョンを速やかに自動選択できる。