メインコンテンツまでスキップ

7.1. "alpn" と "no-default-alpn"

"alpn" と "no-default-alpn" SvcParamKeys は、このサービスエンドポイントがサポートするアプリケーション層プロトコルネゴシエーション(ALPN)プロトコル識別子のセットと関連するトランスポートプロトコル("SVCB ALPN セット")を示します。

Alt-Svc と同様に、各 ALPN プロトコル識別子は、エンドポイントがサポートするアプリケーションプロトコルと関連プロトコルスイート("プロトコルスイート")を識別するために使用されます。SVCB ALPN セット内に ALPN プロトコル識別子が存在することは、TargetName とその他のパラメータ(例:"port")によって記述されるこのサービスエンドポイントが、この ALPN 識別子に関連付けられたプロトコルスイートでサービスを提供することを示します。

クライアントは、サポートするプロトコルスイートに一致するように ALPN 識別子のセットをフィルタリングし、これが使用される基礎となるトランスポートプロトコル(UDP 上の QUIC や TCP 上の TLS など)を通知します。プロトコルスイートを一意に識別しない ALPN プロトコル識別子(例:TLS と DTLS の両方で使用できる識別シーケンス)は、この SvcParamKey と互換性がなく、SVCB ALPN セットに含めてはなりません。

7.1.1. 表現

ALPN は、登録された"識別シーケンス"(alpn-id)によって識別され、これは 1〜255 オクテットのシーケンスです。

alpn-id = 1*255OCTET

"alpn" の場合、表現値は 1 つ以上の alpn-id のカンマ区切りリストでなければなりません。ゾーンファイルの実装は、値リストのエスケープ手順を実装する代わりに、ALPN ID 内の","と"\"文字を禁止してもよく、これらの文字が必要な場合は不透明なキー形式(例:key1=\002h2)に依存します。

"alpn" のワイヤ形式値は、単一のオクテットで長さが前置された少なくとも 1 つの alpn-id で構成され、これらの長さ-値ペアが連結されて SvcParamValue を形成します。これらのペアは SvcParamValue を正確に埋める必要があります。そうでない場合、SvcParamValue は不正な形式です。

"no-default-alpn" の場合、表現値とワイヤ形式値は空でなければなりません。RR 内で"no-default-alpn"が指定されている場合、RR が"自己整合的"(セクション 2.4.3)であるためには、"alpn"も指定する必要があります。

この SvcParamKey を使用する各スキームは、ほぼすべてのクライアントとサーバーがサポートする ALPN ID の"デフォルトセット"を定義します。このセットは空である場合があります。SVCB ALPN セットを決定するために、クライアントは"alpn" SvcParamKey からの alpn-id リストから始め、"no-default-alpn" SvcParamKey が存在しない限り、デフォルトセットを追加します。

7.1.2. 使用

エンドポイントへの接続を確立するために、クライアントは以下を行う必要があります:

  1. SVCB-ALPN-Intersection を、SVCB ALPN セット内でクライアントがサポートするプロトコルのセットとします。

  2. Intersection-Transports を、SVCB-ALPN-Intersection 内のプロトコルが暗示するトランスポートのセット(例:TLS、DTLS、QUIC)とします。

  3. Intersection-Transports 内の各トランスポートについて、SVCB ALPN セットに関係なく、そのトランスポートに対してクライアントがサポートするすべての ALPN プロトコルの識別シーケンスを含む ProtocolNameList を構築します。

例えば、SVCB ALPN セットが ["http/1.1", "h3"] で、クライアントが HTTP/1.1、HTTP/2、HTTP/3 をサポートしている場合、クライアントは ["http/1.1", "h2"] の ProtocolNameList を持つ TCP 上の TLS を使用して接続を試み、また ["h3"] の ProtocolNameList を持つ QUIC を使用した接続も試みることができます。

クライアントが ClientHello を構築すると、そのハンドシェイク内のプロトコルネゴシエーションは、SVCB ALPN セットに関係なく、[ALPN] で指定されているとおりに進行します。

クライアントは、より優先されるトランスポートが接続に失敗した場合に、優先度の低いトランスポートを使用するフォールバック手順を実装してもかまいません。このフォールバック動作は、より優先されるトランスポートをブロックするネットワーク攻撃者による操作に対して脆弱ですが、既存のネットワークとの互換性のために必要な場合があります。

この手順が実施されると、DNS とネットワークトラフィックを変更できる攻撃者は、成功したトランスポート接続を防ぐことができますが、それ以外の方法で ALPN プロトコル選択に干渉することはできません。この手順はまた、各 ProtocolNameList が SVCB ALPN セットから少なくとも 1 つのプロトコルを含むことを保証します。

クライアントは、SVCB ALPN セットにサポートされているプロトコルが含まれていないサービスエンドポイントへの接続を試みるべきではありません。

動作の一貫性を確保するために、互換性のあるすべての RR が"no-default-alpn"を示している場合、非デフォルト ALPN プロトコルを使用して接続が成功した可能性があっても、クライアントは SVCB RRset 全体を拒否し、基本的な接続確立にフォールバックしてもかまいません。

ゾーン運営者は、各 RRset 内の少なくとも 1 つの RR がデフォルトトランスポートをサポートすることを確認すべきです。これにより、最大数のクライアントとの互換性が可能になります。