3. Alt-Svc HTTP ヘッダーフィールド
HTTP(S) オリジンサーバーは、レスポンスに Alt-Svc ヘッダーフィールドを追加することで、クライアントに代替サービスの可用性を通知できます。
Alt-Svc = clear / 1#alt-value
clear = %s"clear"; "clear", 大文字小文字を区別
alt-value = alternative *( OWS ";" OWS parameter )
alternative = protocol-id "=" alt-authority
protocol-id = token ; パーセントエンコードされた ALPN プロトコル名
alt-authority = quoted-string ; [ uri-host ] ":" port を含む
parameter = token "=" ( token / quoted-string )
フィールド値は、値のリスト(それぞれが1つの代替サービスを示す)またはキーワード "clear" のいずれかで構成されます。
特別な値 "clear" を含むフィールド値は、オリジンがそのオリジンのすべての代替を無効にすることを要求していることを示します("clear" と代替サービスの両方を含む無効な応答の場合、同じレスポンスで指定されたものも含みます)。
ALPN プロトコル名は、フォーマットに追加の制約がないオクテットシーケンスです。トークンで許可されていないオクテット([RFC7230]、セクション 3.2.6)は、[RFC3986] のセクション 2.1 に従ってパーセントエンコードされなければなりません(MUST)。その結果、パーセント文字 "%"(16進数 25)を表すオクテットもパーセントエンコードされなければなりません。
任意の ALPN プロトコル名を表現する方法を正確に1つにするために、以下の追加の制約が適用されます:
- ALPN プロトコル名のオクテットは、"%" を除く有効なトークン文字である場合、パーセントエンコードされてはなりません(MUST NOT)。
- パーセントエンコードを使用する場合は、大文字の16進数を使用しなければなりません(MUST)。
これらの制約により、受信者は単純な文字列比較を適用してプロトコル識別子を照合できます。
"alt-authority" コンポーネントは、オプションの uri-host([RFC3986] のセクション 3.2.2 の "host")、コロン (":")、およびポート番号で構成されます。
例えば:
Alt-Svc: h2=":8000"
これは、同じホスト上の指定されたポート 8000 での "h2" プロトコル([RFC7540])を示します。
ホストの変更を伴う例:
Alt-Svc: h2="new.example.org:80"
これは、ホスト "new.example.org" のポート 80 で実行されている "h2" プロトコルを示します。":" は "token" で許可されている文字ではないため、"quoted-string" 構文を使用する必要があることに注意してください。
プロトコル名のエスケープの例:
| ALPN プロトコル名 | protocol-id | 備考 |
|---|---|---|
| h2 | h2 | エスケープ不要 |
| w=x:y#z | w%3Dx%3Ay#z | "=" と ":" がエスケープされる |
| x%y | x%25y | "%" はエスケープが必要 |
Alt-Svc は、ステータスコードに関係なく、任意の HTTP レスポンスメッセージに出現してもよい(MAY)。Alt-Svc の受信者はヘッダーフィールドを無視できる(そして状況によっては無視する必要がある。セクション 2.1 および 6 を参照)ことに注意してください。
Alt-Svc フィールド値は複数の値を持つことができます:
Alt-Svc: h2="alt.example.com:8000", h2=":443"
複数の値が存在する場合、値の順序はサーバーの優先順位を反映します(最初の値が最も優先される代替です)。
Alt-Svc によって通知された値は、クライアントが代替サービスへの新しい接続を開くために使用できます。後続のリクエストは直ちにこの新しい接続の使用を開始するか、新しい接続が作成されている間、既存の接続を使用し続けることができます。
HTTP/2 ([RFC7540]) を使用する場合、サーバーは代わりに ALTSVC フレーム(セクション 4)を送信すべきです(SHOULD)。接続に対して単一の ALTSVC フレームを送信できます。リクエストごとに新しいフレームは必要ありません。この推奨事項にもかかわらず、Alt-Svc ヘッダーフィールドは HTTP/2 経由で配信されるレスポンスでも引き続き有効であることに注意してください。
各 "alt-value" の後には、オプションでセミコロン区切りの追加パラメータのリストが続きます。各 "parameter" は名前と値で構成されます。
本仕様では、セクション 3.1 で定義されている "ma" と "persist" の 2 つのパラメータを定義しています。不明なパラメータは無視されなければなりません(MUST)。つまり、それらが出現する値(alt-value)は、不明なパラメータが存在しないかのように処理されなければなりません。
新しいパラメータは、拡張仕様で定義できます(登録の詳細については、セクション 7.3 を参照)。
"quoted-string" 構文を許可するすべてのフィールド要素は、[RFC7230] のセクション 3.2.6 に従って処理されなければならないことに注意してください。
3.1. Alt-Svc ヘッダーフィールド値のキャッシュ
代替サービスが Alt-Svc を使用して通知されると、メッセージの生成から 24 時間新鮮であると見なされます。これは、"ma" (max-age) パラメータで変更できます。
構文:
ma = delta-seconds; see [RFC7234], Section 1.2.1
delta-seconds 値は、レスポンスが生成されてから代替サービスが新鮮であると見なされる秒数を示します。
Alt-Svc: h2=":443"; ma=3600
レスポンスの年齢の決定に関する詳細については、[RFC7234] のセクション 4.2.3 を参照してください。
例えば、以下のレスポンス:
HTTP/1.1 200 OK
Content-Type: text/html
Cache-Control: max-age=600
Age: 30
Alt-Svc: h2=":8000"; ma=60
これは、代替サービスが利用可能であり、次の 60 秒間使用可能であることを示します。ただし、レスポンスはすでに 30 秒間キャッシュされています(Age ヘッダーフィールド値による)。したがって、代替サービスは、このレスポンスが受信されてから 30 秒間(推定転送時間を引いたもの)のみ新鮮です。
HTTP キャッシュの新鮮度寿命(ここでは 600 秒)は Alt-Svc 値のキャッシュに影響しないことに注意してください。
Alt-Svc レスポンスヘッダーフィールドがオリジンから受信されると、その値はそのオリジンのすべてのキャッシュされた代替サービスを無効にし、置き換えます。
デフォルトでは、クライアントがネットワークの変更を検出すると、キャッシュされた代替サービスはクリアされます。より長く存続することを意図した代替サービス(クライアントアクセスネットワークに固有ではないものなど)は、ネットワーク構成の変更を超えてサービスが潜在的に有用であることを示唆するために、値 "1" の "persist" パラメータを持つことができます。
構文:
persist = "1"
例えば:
Alt-Svc: h2=":443"; ma=2592000; persist=1
本仕様では、"persist" の単一の値のみを定義しています。クライアントは、"1" 以外の値を持つ "persist" パラメータを無視しなければなりません(MUST)。
代替サービスのキャッシュに関する一般的な要件については、セクション 2.2 を参照してください。