[1] [DFN[[CODE(ABNF)@en[[[protocol]]]]]] は、[[プロトコル]]の名前と[RUBY[版][バージョン]]を表す構文です。

* 仕様書

[REFS[
- [2] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-6.7>
- [9] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-2.6>
- [11] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-5.7.1>
- [20] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-8.6>
- [17] [CITE[Hypertext Transfer Protocol (HTTP) Upgrade Token Registry]] ([TIME[2014-06-11 03:43:45 +09:00]] 版) <http://www.iana.org/assignments/http-upgrade-tokens/http-upgrade-tokens.xhtml>
- [23] [CITE@en[RFC 3507 - Internet Content Adaptation Protocol (ICAP)]] ([TIME[2014-06-08 07:17:07 +09:00]] 版) <http://tools.ietf.org/html/rfc3507#section-4.3.2>
- [30] [CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-3.2>
]REFS]

* 文脈

[3] [CODE(ABNF)@en[[[protocol]]]] やそれに類する構文は、
次の場面で利用されます。

[FIG(list)[
- [[プロトコルの版]] ([[開始行]])
- [CODE(HTTP)@en[[[Upgrade:]]]] [[ヘッダー]] [SRC[>>2]]
- [CODE(HTTP)@en[[[Via:]]]] [[ヘッダー]]の[[プロトコル]] [SRC[>>2]]
- [CODE(CGI)@en[[[SERVER_PROTOCOL]]]] [[メタ変数]]
]FIG]

[4] [CODE(ABNF)@en[[[product]]]] ([CODE(HTTP)@en[[[User-Agent:]]]], [CODE(HTTP)@en[[[Server:]]]],
[CODE(HTTP)@en[[[Via:]]]] の[[注釈]]) も類似した構文を採用していますが、
[[プロトコル]]ではなく[[製品]]を表すものとなっています。

* 構文

[5] [CODE(ABNF)@en[[[protocol]]]] は、[[プロトコル名]]のみか、または[[プロトコル名]]と[[プロトコル版]]を[CODE(char)[[[/]]]] で区切ったものです
[SRC[>>2]]。

[6] [[プロトコル名]]と[[プロトコル版]]は、いずれも[[字句]]です [SRC[>>2]]。

[FIG(railroad)[
= [[字句]]
= ?
== [CODE(char)[[[/]]]]
== [[字句]]
]FIG]

[7] 大文字と小文字の区別の有無は明記されておらず、区別するものとみられます。
[[HTTPの版]]では区別すると明記されています [SRC[>>9]]。

;; [8] 歴史的には、区別しないという解釈もありました。[[HTTPの版]]や
[CODE(ABNF)@en[[[SERVER_PROTOCOL]]]] の項を参照してください。
また [[Web Sockets]] は、区別しない [CODE(HTTP)@en[[[Upgrade:]]]]
の処理を定義しています。

[13] [CODE(CGI)@en[[[SERVER_PROTOCOL]]]] では、値に更に制限があります。

[12] [[HTTPの版]]では、[[プロトコル版]]の値に更に制限があります。

[10] [CODE(HTTP)@en[[[Via:]]]] では、[[プロトコル名]]が [CODE[[[HTTP]]]]
の場合、[[プロトコル名]]と [CODE(char)[[[/]]]] を省略できることになっています。
[[プロトコル版]]は省略できません。

[FIG(railroad)[
=?
== [[字句]]
== [CODE(char)[[[/]]]]
= [[字句]]
]FIG]

* プロトコルの一覧

[14] [[プロトコル]]としては、次の値が利用されています。

[FIG(list)[
,*[[プロトコル]],*[CODE(HTTP)@en[[[Upgrade:]]]],*[CODE(HTTP)@en[[[Via:]]]],*[[HTTPの版]],*[CODE(CGI)@en[[[SERVER_PROTOCOL]]]]
,[CODE(HTTP)[CATP/1.0]],,,○,
,[CODE(HTTP)[CATP/1.1]],,,○,
,[CODE(HTTP)@en[fix]],○
,[CODE(HTTP)@en[[[GridHTTP/1.0]]]],○,,,
,[CODE(HTTP)@en[[[h2]]]],○,,,
,[CODE(HTTP)@en[[[h2c]]]],○,,,
,[CODE(HTTP)@en[[[HTTP/0.9]]]],×,×,△,○
,[CODE(HTTP)@en[[[HTTP/1.0]]]],×,○,○,○
,[CODE(HTTP)@en[[[HTTP/1.1]]]],? ,○,○,○
,[CODE(HTTP)@en[[[HTTP/2.0]]]],  ,  ,○,○
,[CODE(HTTP)@en[HTTP/2]]      ,  ,  ,  ,○
,[CODE(HTTP)@en[[[ICAP/1.0]]]],  ,○,○,
,[CODE(HTTP)@en[ICE]],,,○
,[CODE(HTTP)@en[ICY]],,,○
,[CODE(HTTP)@en[[[INCLUDED]]]],  ,  ,  ,○
,[CODE(HTTP)@en[[[MRCP/2.0]]]],  ,  ,○,
,[CODE(HTTP)@en[[[PTTH/0.9]]]],○,  ,  ,
,[CODE(HTTP)@en[[[PTTH/1.0]]]],○,  ,  ,
,[CODE(HTTP)@en[[[Q4S/1.0]]]] ,  ,  ,○,
,[CODE(HTTP)@en[[[RTSP/1.0]]]],  ,  ,○,
,[CODE(HTTP)@en[[[Secure-HTTP/1.4]]]],,,○,
,[CODE(HTTP)@en[[[SIP/2.0]]]] ,  ,○,○,○
,[CODE(HTTP)@en[tcp][Upgrade: tcp]],○
,[CODE(HTTP)@en[[[TLS/1.0]]]] ,○,  ,  ,
,[CODE(HTTP)@en[[[TLS/1.1]]]] ,○,  ,  ,
,[CODE(HTTP)@en[[[TLS/1.2]]]] ,○,  ,  ,
,[CODE(HTTP)@en[[[WebSocket]]]],○, ,  ,
,[CODE(HTTP)@en[WebSocket/13]],  ,  ,  ,○
]FIG]

[15] この他に、 [[HTTP]] の [[RFC]] には例示として
[CODE(HTTP)@en[[[HTTP/2.0]]]], [CODE(HTTP)[[[IRC]]/6.9]],
[CODE(HTTP)@en[[[SHTTP]]/1.3]], [CODE(HTTP)[[[RTA]]/[[x11]]]]
という架空の [CODE(HTTP)@en[[[Upgrade:]]]] [[ヘッダー]]の値が登場します。

[24] この一覧は >>25 に [[JSON]] 形式で収録されています。

[REFS[
- [25] [CITE@en[data-web-defs/headers.txt at master · manakai/data-web-defs]] ([TIME[2014-09-02 04:52:50 +09:00]] 版) <https://github.com/manakai/data-web-defs/blob/master/doc/headers.txt>
]REFS]

* IANA 登録簿

[16] [CODE(HTTP)@en[[[Upgrade:]]]] の値については、 [[IANA登録簿]] [SRC[>>17]] が用意されています
[SRC[>>20]]。

[18] [[IANA登録簿]]は [[RFC 2817]] により設けられました [SRC[>>26, >>27]]。

[REFS[
- [26] [CITE@en[RFC 2817 - Upgrading to TLS Within HTTP/1.1]] ([TIME[2015-02-22 14:29:05 +09:00]] 版) <http://tools.ietf.org/html/rfc2817#section-7.2>
- [27] [CITE[RFC Errata Report]] ([TIME[2015-03-04 19:05:39 +09:00]] 版) <http://www.rfc-editor.org/errata_search.php?rfc=2817>
]REFS]

[19] 2003年12月の時点で、登録簿には一つも登録されていません。
HTTP 仕様書で定義されている [CODE(HTTP)[HTTP/[VAR[*]]]] や
登録手続きを規定している RFC 2817 が定義している [CODE(HTTP)[TLS/1.0]]
すら載っていないのはなんとも間抜けな話です [WEAK[(が、 IANAREG では良くある話です)]]。

[22] その後いつからか、 [CODE[[[TLS/1.0]]]] も登録されました。
また、 [CODE[[[WebSocket]]]] も登録されています。

[21] [[RFC 7230]] は新しい登録手続きを定義しています。
手続きは [[First Come First Served]] となっています [SRC[>>20]]。
更に [CODE[[[HTTP]]]] も登録しています [SRC[>>20]]。

[28] 気づいたら [CODE[[[TLS/1.0]]]] は [CODE[[[TLS]]]] に変わっています。
[[RFC 2817]] は [CODE[[[TLS/1.0]]]] を規定していましたが、 [[RFC正誤表]]が
[CODE[[[TLS]]]] を規定し、 [[TLS]] の版を指定できる形に改めています [SRC[>>27]]。

[29] 現在の [[IANA登録簿]]は、 [[RFC 2818]] (のみ) を出典に、
版は「ANY DIGIT.DIGIT (e.g.. "1.2")」と説明しています [SRC[>>17]]。 [TIME[2015-03-04T10:11:34.700Z]]

;; しかも「[[IANA登録簿]]は既に修正されている」[SRC[>>27]] ともされています。
そんな勝手な変更をしないで素直に [[RFC]] を改訂してくれればいいのですが...

[31] [[HTTP/2]] において [CODE(HTTP)@en[[[Upgrade:]] [[h2][HTTP/2]]]] は無視しなければ[['''ならない''']]
[SRC[>>30]] と規定されていますが、なぜかこの [CODE[[[h2]]]] という値は登録されていません。
予約状態で登録されていても良さそうなものですが。 [TIME[2015-05-18T12:24:50.700Z]]

[32] [CITE@en[869725 – support shoutcast streams]]
([TIME[2017-01-22 13:24:42 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=869725>