[1] [DFN@en[[ABBR[RVSA] [Remote Variant Selection Algorithm]]]]
([DFN[[[遠隔異体選択アルゴリズム]]]]) は、[[透過内容折衝]]において[[利用者エージェント]]に代わって[[鯖]]が[[最善の異体]]を選択する標準化された[[アルゴリズム]]です [SRC[>>7, >>8]]。

* 仕様書

[REFS[
- [16] [CITE@en[RFC 2295 - Transparent Content Negotiation in HTTP]] ([TIME[2014-08-31 19:36:42 +09:00]] 版) <http://tools.ietf.org/html/rfc2295#section-5.7>
- [7] [CITE@en[RFC 2295 - Transparent Content Negotiation in HTTP]] ([TIME[2014-08-31 19:36:42 +09:00]] 版) <http://tools.ietf.org/html/rfc2295#page-7>
- [8] '''[CITE@en[RFC 2295 - Transparent Content Negotiation in HTTP]] ([TIME[2014-08-31 19:36:42 +09:00]] 版) <http://tools.ietf.org/html/rfc2295#section-7>'''
-- [11] [CITE@en[RFC 2295 - Transparent Content Negotiation in HTTP]] ([TIME[2014-08-31 19:36:42 +09:00]] 版) <http://tools.ietf.org/html/rfc2295#section-7.1>
- [19] [CITE@en[RFC 2295 - Transparent Content Negotiation in HTTP]] ([TIME[2014-08-31 19:36:42 +09:00]] 版) <http://tools.ietf.org/html/rfc2295#section-8.4>
- [2] [CITE@en[RFC 2296 - HTTP Remote Variant Selection Algorithm -- RVSA/1.0]] ([TIME[2014-09-15 15:43:00 +09:00]] 版) <http://tools.ietf.org/html/rfc2296>
]REFS]

* 版番号

[12] [[RVSA]] のアルゴリズムは[[版番号]]によって区別されることとなっています。

[38] 
[[版番号]]は、
1桁から4桁の[[ASCII数字]]列2つを [CODE(HTTP)[[[.]]]] で区切ったものとされています。

[FIG(railroad)[
= 1-4 [[ASCII数字]]
= [CODE(HTTP)[[[.]]]]
= 1-4 [[ASCII数字]]
]FIG]

[13] 数字列の解釈方法は明記されていません。[[先導0]]や末尾の[[0]]の有無が等価性に影響を与えるのかどうか不明です。

[18] 最初の番号が同じ場合、最後の番号が 0 より大きいなら、 0 の場合の[[アルゴリズム]]と[[下方互換]]でなければ[['''なりません''']]。ここで[[下方互換]]とは、同じ入力に対して同じ、またはより良い結果を返すことを言います。 [SRC[>>8]]

[14] 版番号は次の場面で使われます。
[FIG(short list)[
- [CODE(HTTP)@en[[[proxy-rvsa]]]]
- [CODE(HTTP)@en[[[Negotiate:]]]]
]FIG]

[20] [CODE(HTTP)@en[[[Negotiate:]]]] [[ヘッダー]]の[[指令]]として指定された場合、
[[起源鯖]]や[[串]]が[[遠隔異体選択アルゴリズム]]を実行することを認めることを表します。
この場合、指定された版か、指定されたのと1つ目の番号が同じで、
2つ目の番号がより大きな版が認められたこととなります。 [SRC[>>19]]

[21] [[起源鯖]]や[[串]]は、 [CODE(HTTP)@en[[[Negotiate:]]]]
[[ヘッダー]]に版番号が指定され、[[最善の異体]]である[[隣接異体]]を選ぶのに十分な情報があれば、
これを[[選択応答]]として返すことができます。 [SRC[>>19]]

[22] [CODE(HTTP)@en[[[Negotiate:]]]] [[ヘッダー]]に版番号が指定された場合、
[CODE(HTTP)@en[[[trans]]]] を暗示します [SRC[>>19]]。

;; [23] なお[[串]]による実行は [CODE(HTTP)@en[[[proxy-rvsa]]]]
により制限されることがあります。

* RVSA/1.0

[9] [DFN[[[RVSA/1.0]]]] は [[RFC 2296]] で規定されています [SRC[>>2]]。

[10] 版番号は [DFN[[[1.0]]]] とされています [SRC[>>2]]。

[25] [[RVSA/1.0]] は特定の[[透過的折衝可能資源]]への[[要求]]に対して実行され、
次の入力を持ちます [SRC[>>2]]。
[FIG(list)[
- [26] [[応答]]の [CODE(HTTP)@en[[[Alternates:]]]] [[ヘッダー]]で指定される[[異体リスト]]
- [27] [[要求]]の [[Accept-ヘッダー群]]で指定された[[利用者エージェント]]の[[特徴]] (の一部)
]FIG]

[28] ここで、 [CODE(HTTP)@en[[[Alternates:]]]] [[ヘッダー]]にフォールバックがあれば、
[[品質値]]が 0.000001 で[[異体属性]]なしの[[異体説明]]とみなします [SRC[>>2]]。

[29] [[RVSA/1.0]] は[[最善の異体]]を決定するか、[[リスト応答]]を返すかを出力します。
[[最善の異体]]が決まる場合には[[選択応答]]を返すことができますが、
[[透過内容折衝]]では常に[[リスト応答]]を返すことが認められているので、
[[RVSA/1.0]] を部分的に実装して[[リスト応答]]を返すこともできます。 [SRC[>>2]]

[FIG(steps)[
= [30] [[異体リスト]]の各[[異体]]について、[[品質値]]を計算します。
これは、[[異体説明]]の[[品質値]]と、
各 [[Accept-ヘッダー群]]から相当する[[異体属性]]の値に対する[[品質値]]を求めたものをすべて掛け合わせて、
得られた[[浮動小数点数]]を[[小数点]]以下5桁までに[[丸め]]たものです。
=- [[Accept-ヘッダー群]]で相当するものが[[要求]]になければ、[[品質値]]は1とします。
=- [[Accept-ヘッダー群]]で相当するものがあっても値で一致するものがなければ、[[品質値]]は0とします。
=- 相当する[[異体属性]]がなければ、[[品質値]]は1とします。
= [31] ここで [[Accept-ヘッダー群]]で欠落しているものがあったか、
[CODE(HTTP)[[[*]]]] と一致したことによって値が決定されたなら、
[[品質値]]は不確定的とし、そうでなければ確定的とします。
= [32] [[品質値]]が最高で最初の[[異体]]を[[最善の異体]]とします。
= [33] [[最善の異体]]の[[品質値]]が[[正]]で、確定的であり、
かつ[[隣接異体]]なら、この[[最善の異体]]の[[選択応答]]を返します。
= [34] それ以外なら、[[リスト応答]]を返します。
]FIG]

* Apache の RVSA

[4] [[Apache]]の[[RVSA]]の実装では、 [[RFC]] と次のような違いがあります [SRC[>>3]]。
[FIG(list)[
- [5] [CODE(HTTP)@en[[[Accept-Encoding]]]] ([CODE(HTTP)@en[[[Content-Encoding]]]]) も選択の対象に含まれています。
- [6] 選択する[[異体]]が決定するまで、[[丸め]]ません。
]FIG]

[REFS[
- [3] [CITE[コンテントネゴシエーション - Apache HTTP サーバ]] 
<http://httpd.apache.org/docs/2.0/ja/content-negotiation.html#extensions>
]REFS]

* 文脈

[15] [[遠隔異体選択アルゴリズム]]は[[透過内容折衝]]に対応した[[串]]や[[起源鯖]]で使われます。

[17] [[串]]は、未知の[[異体属性]]が[[異体リスト]]に含まれていれば、
[[遠隔異体選択アルゴリズム]]を実行しては[['''なりません''']] [SRC[>>16]]。

* 関連

[24] [[遠隔異体選択アルゴリズム]]が[[起源鯖]]や[[串]]で実行されるのに対し、
[[局所異体選択アルゴリズム]]は[[利用者エージェント]]で実行されます。

* 歴史

[FIG(quote)[ [35] [[RFC2295]] 2.2 抜粋

> 
:remote variant selection algorithm:
A standardized algorithm by which a server can sometimes choose a
best variant on behalf of a negotiating user agent.  The algorithm
typically computes whether the Accept- headers in the request
contain sufficient information to allow a choice, and if so, which
variant is the best variant.  The use of a remote algorithm can
speed up the negotiation process.

:遠隔変種選択算法:[[サーバー]]が折衝している[[利用者エージェント]]に代わって最善の[[変種]]を選ぶことが時々できる標準化された算法。
この算法は典型的には要求中の [[Accept-頭群]]が選択を行うのに十分な情報を含んでいるか、そうであればどれが最善の変種であるかを計算します。
遠隔算法の使用によって折衝過程が高速化できます。

]FIG]

[FIG(quote)[ [36] [[RFC 2295]] (HTTP 透過折衝) 7  Remote variant selection algorithms

[37] 

> A remote variant selection algorithm is a standardized algorithm by
which a server can choose a best variant on behalf of a negotiating
user agent.  The use of a remote algorithm can speed up the
negotiation process by eliminating a request-response round trip.

> A remote algorithm typically computes whether the Accept- headers in
the request contain sufficient information to allow a choice, and if
so, which variant is the best variant.  This specification does not
define any remote algorithms, but does define a mechanism to
negotiate on the use of such algorithms.

* 7.1 Version numbers

> A version numbering scheme is used to distinguish between different
remote variant selection algorithms.

版番号付け方式は異なる遠隔変種選択算法同士を区別するのに使います。

>
- rvsa-version = major "." minor
- major = 1*4DIGIT
- minor = 1*4DIGIT

> An algorithm with the version number X.Y, with Y>0, MUST be downwards
compatible with all algorithms from X.0 up to X.Y.  Downwards
compatibility means that, if supplied with the same information, the
newer algorithm MUST make the same choice, or a better choice, as the
old algorithm.  There are no compatibility requirements between
algorithms with different major version numbers.

版番号 [SAMP(conneg)[[VAR[X]].[VAR[y]]]] ([CODE(math)[[VAR[Y]] > 0]])
の算法は [SAMP(conneg)[[VAR[X]].0]] から [SAMP(conneg)[[VAR[X]].[VAR[Y]]]]
までのすべての算法と互換でなければ'''なりません'''。
下方互換性とは、同じ情報が供給された場合、新しい方の算法は古い算法と同じ選択かより良い選択を行わなければ'''ならない'''ことを意味します。
異なる大版番号の算法間での互換性はありません。

]FIG]




* メモ