[8] [DFN[[[HTTP/2]]]] は、旧来の [[HTTP]] にかわるものとして新たに開発された[[転送プロトコル]]です。
[[Google]] によって開発された [[SPDY]] が元となっています。

* 仕様書

[REFS[
- [14] '''[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>'''
-- [17] [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>
-- [25] [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-8>
-- [34] [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-11.1>
-- [35] [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-11.8>
- [15] [CITE@en[RFC 7541 - HPACK: Header Compression for HTTP/2]] ([TIME[2015-05-15 10:13:02 +09:00]] 版) <https://tools.ietf.org/html/rfc7541>
]REFS]

* プロトコル

[26] [[HTTP]] の通信は、 [[HTTPサーバー]]と [[HTTPクライアント]]との間に
[[HTTP接続]]を確立し、その上で[[メッセージ]]をやり取りすることで行われます。

[27] [[HTTP接続]]内には複数の[[ストリーム]]を開くことができます。
[[ストリーム]]上を[[サーバー]]から[[クライアント]]に、あるいは[[クライアント]]から[[サーバー]]にと[[フレーム]]を送信することで、
両者間で制御情報やデータのやり取りを行います。

;; [38] [[HTTP/2]] では、複数の [[TCP接続]]を開かず、同じ [[TCP接続]]内で[[ストリーム]]によって[[多重化]]を実現しています。

[28] [[フレーム]]の列により、[[要求]]や[[応答]]の[[メッセージ]]が表されています。
上位の[[アプリケーション]]の処理は、[[要求]]と[[応答]]によって行われます。
[[フレーム]]には[[メッセージ]]を表すものの他、制御情報を表すものもあります。

[29] [[メッセージ]]の意味 [SRC[>>25]] や個々の構成要素の構文は、 [[HTTP/1.1]] が参照されています。

;; [31] その詳細は [[HTTP/1.1]] などの項を参照。この意味で [[HTTP/2]]
は [[HTTP/1.1]] の完全の代替ではなく、新たなプロトコル階層を挿入するものです。
従って [[HTTP/1.1]] は[[廃止]]されていません。

[30] [[ストリーム]]や[[フレーム]]の概念や、[[メッセージ]]を[[フレーム]]の列で表現する方法は、
[[HTTP/2]] で新たに規定されました。

[FIG(short list)[
- [[HTTPエンドポイント]]
-- [[HTTPクライアント]]
-- [[HTTPサーバー]]
- [[HTTP接続]]
- [[接続序文]]
- [[HTTPストリーム]]
- [[HTTPフレーム]]
- [[誤り符号]]
- [[接続エラー]]
- [[ストリームエラー]]
- [[フロー制御]]
- [[ストリーム優先度]]
- [[設定 (HTTP)]]
- [[サーバープッシュ]]
- [[HPACK]]
- [[疑似ヘッダー]]
- [[奇形]]
]FIG]

[50] [[HTTP/1]] との切り替えについては、 [[HTTP接続]]を参照。

* HTTP/1.1 との違い

[33] [[HTTP/1.1]] はテキストベース、 [[HTTP/2]] はバイナリーベースで、
[[プロトコル]]としての構造はまったく違っています。
そうした表現上の違いや制御情報のやり取りに関する異なりを除くと、
次のような差があります。

[32] [[HTTP/2]] では、 [[HTTP/1.1]] の次の機能は使えません。

[FIG(short list)[
- [CODE(HTTP)@en[[[chunked]]]]
- [CODE(HTTP)@en[[[101]]]]
- [[connection-specific header]]
-- [CODE(HTTP)@en[[[Connection:]]]]
-- [CODE(HTTP)@en[[[Upgrade:]]]]
-- [CODE(HTTP)@en[[[Transfer-Encoding:]]]]
- [CODE(HTTP)@en[[[TE:]]]] ([CODE(HTTP)@en[[[TE:]] [[trailer]]]] 以外)
- [[開始行]]の[[プロトコルの版]]
- [[理由句]]
]FIG]

[36] [[HTTP/2]] では、 [CODE(HTTP)@en[[[Cookie:]]]] [[ヘッダー]]を複数指定できます。

[40] [[HTTP/2]] では、ほとんどの場合 [CODE(HTTP)@en[[[:scheme]]]]
[[疑似ヘッダー]]が必須です。

[37] [[HTTP/2]] では、原則として [CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]のかわりに
[CODE(HTTP)@en[[[:authority]]]] [[疑似ヘッダー]]を使います。

[39] [[HTTP/2]] では、[[クライアント]]が[[要求]]を送信し[[サーバー]]が[[応答]]を送信する従来の形のやり取りに加えて、
[[サーバー]]が[[要求]]と[[応答]]を[[クライアント]]に送信する[[サーバープッシュ]]が導入されています。

[49] [CODE(HTTP)@en[Upgrade:]] が使えないため、 [[WebSocket]] も使えません。

* 識別子

[19] [[ALPN]] の識別子 [DFN[[CODE[h2][HTTP/2]]]] ([CODE[0x68, 0x32][HTTP/2]]) は、
[[HTTP/2]] over [[TLS]] を表します [SRC[>>17, >>34]]。

;; [21] [[HTTP/2]] の [[Internet Draft]] は、 [CODE[[[h2-11]]]] のような値を使っていました。

[52] [[代替サービス]]でも利用できます。

-*-*-

[20] [CODE(HTTP)@en[[[Upgrade:]]]] [[ヘッダー]]の値 [DFN[[CODE(HTTP)@en[[[h2c]]]]]]
は、[[HTTP/2]] over [[TCP]] を表します [SRC[>>17, >>34, >>35]]。 [[ALPNプロトコル名]]
[CODE[[[h2c]]]] は予約されており、使いません [SRC[>>17]]。

;; [22] 指定と処理の方法は、 [CODE(HTTP)@en[[[Upgrade: h2c]]]] を参照。

;; [48] [[HTTP/2]] の [[RFC 7540]] 出版時点で [[ALPNプロトコル名]]の用途は [[TLS]]
だけで、 [[RFC]] には [CODE[h2c]] がまったく使ってはいけないように書かれていますが、
これがその後拡大された [[ALPNプロトコル名]]の用法 ([CODE(HTTP)@en[ALPN:]]
や [CODE(HTTP)@en[Alt-Svc:]]) にも適用されるのかどうかは不明です。
[CODE(HTTP)@en[ALPN:]] では、 (理論上は) 使っても良さそうです。
[CODE(HTTP)@en[Alt-Svc:]] でも、 (理論上は) 使うことができそうですし、
[[RFC 7838]] にも使った場合についての言及があります。
(実際には[[平文]]の [[HTTP/2]] など使うこともないでしょうから、問題にはならなそうです。)

-*-*-

[18] [[HTTP/1.1]] [[以下]]とは違って、[[要求行]]や[[状態行]]の[[プロトコルの版]]に相当するものはありません。

[23] ただし[[クライアント接続序文]]は、 [[HTTP/1.1]] の[[メッセージ]]として解釈すると、
[[プロトコルの版]] [DFN[[CODE[[[HTTP/2.0]]]]]] を指定したことになります。

[53] [[メタ変数]] [CODE[SERVER_PROTOCOL]] でも [CODE[HTTP/2.0]] という値が使われることがあります
([CODE[HTTP/2]] を使う実装もあります)。

[54] [[curl]] の [CODE[--dump-header]] オプションで[[応答ヘッダー]]を出力すると、
[[プロトコルの版]]は [CODE[HTTP/2]] となります。
[TIME[2017-10-09T05:44:43.100Z]]

[58] 
[[nginx]] のログファイルで [CODE[HTTP/2.0]] という値が使われます。

* URL

[16] [[HTTP/2]] では、 [CODE(URI)@en[[[http:]]]]/[CODE(URI)@en[[[https:]]]]
[[URL scheme]] を使います [SRC[>>17]]。 [[URL]] だけから [[HTTP/2]]
と [[HTTP/1.1]] [[以下]]を区別することはできません。

* 歴史

[57] 
[[HTTP/0.9]] が [[HTTP]] と呼ばれていた頃、
[[HTTP/1.0]] に結実する新仕様案が [[HTTP2]]
と呼ばれていました。
[SEE[ [[HTTP2]] ]]
後の [[HTTP/2]] とは異なります。

-*-*-

[9] これまで [[HTTP/1.1]] に大きな変更を加える提案としては、
[[HTTP/1.2]]、[[PEP]]、[[RFC 2774]] といった機能拡張のための機能を追加するもの、
[[WAP]] のようにバイナリー化するもの、
[[GridHTTP]] や [[Reverse HTTP]] のように特定の用法のために拡張するものなど色々ありましたが、
いずれも主流となることはできず、やがて消えてゆきました。

[10] [[HTTP]] には大きな変更が加えられることなく10年が過ぎようとしており、
[[RFC]] の改訂 ([[RFC 723x]]) はともかく、プロトコルへの変更は最早不可能との観測もありました。

[11] しかし [[Google]] が [[Web]] の高速化施策の1つとして [[SPDY]]
を提案し [[Google Chrome]] や各 [[Google]] サービスのサーバーに実装したことで、
この流れは大きく変わります。

;; [12] [[SPDY]] の歴史は、 [[SPDY]] の項を参照。

[1] [CITE@en[Rechartering HTTPbis]]
([[Mark Nottingham]] 著, [TIME[2012-01-24 12:55:46 +09:00]] 版)
<http://lists.w3.org/Archives/Public/ietf-http-wg/2012JanMar/0098.html>

[2] 
[PRE(HTTP code)[
$ telnet mail.kamu.ct.tr 80
Trying 212.175.153.6...
Connected to mail.kamu.ct.tr.
Escape character is '^]'.
GET / HTTP/1.0

HTTP/2.0 302 Found
Server: SmarterTools/2.0.2692.18364
Date: Wed, 05 Mar 2014 09:02:07 GMT
X-AspNet-Version: 2.0.50727
Location: /Login.aspx
Set-Cookie: ASP.NET_SessionId=1dmqmiv3plhasn45ayqi2155; path=/; HttpOnly
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 130
Connection: Close

<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="%2fLogin.aspx">here</a>.</h2>
</body></html>
]PRE]

[3] [CITE@en[draft-montenegro-httpbis-http2-negotiation-01 - HTTP 2.0 Negotiation]]
( ([TIME[2014-10-17 12:33:08 +09:00]] 版))
<http://tools.ietf.org/html/draft-montenegro-httpbis-http2-negotiation-01>

[4] [CITE[IRC logs: freenode / #whatwg / 20141210]]
( ([TIME[2014-12-11 10:00:45 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20141210#l-637>

[5] [CITE@en-US[HTTP/2 – Closing on the Final Design | MS OpenTech]]
( ([TIME[2014-02-03 10:59:53 +09:00]] 版))
<http://msopentech.com/blog/2014/01/31/http2-moving-quickly-endgame/>

[6] [CITE@en-US[HTTP/2 – “Nearing Completion” | MS Open Tech]]
( ([TIME[2014-11-04 02:54:46 +09:00]] 版))
<http://msopentech.com/blog/2014/03/19/http2-nearing-completion/>

[7] [CITE@en[Chromium Blog: Hello HTTP/2, Goodbye SPDY]]
( ([TIME[2015-02-10 03:03:41 +09:00]] 版))
<http://blog.chromium.org/2015/02/hello-http2-goodbye-spdy-http-is_9.html>

[13] [CITE@ja[HTTP2 時代のサーバサイドアーキテクチャ考察 - Block Rockin’ Codes]]
([TIME[2015-05-12 10:30:29 +09:00]] 版)
<http://jxck.hatenablog.com/entry/http2-server-side-architecture>

[24] [[RFC 7540]] は、2015年出版と新しい仕様書で、過去の [[HTTP]]
仕様に比べればかなり明確に細かな挙動が規定されています。エラー処理もほとんどの場合が明文化されています。
その一方で、要件の一部しか [[RFC 2119]] [[助動詞]]で記述されておらず、
要件らしきものが[[事実の文]]でしかなかったり、[[助動詞]]によって記述された要件で内容が同じとみられるものが仕様書の複数の箇所に重出したりと、
前近代的な部分もなお残っています。近年の [[Web]] 関連仕様のような[[アルゴリズム]]による規定の記述を行っていないので、
正常処理やエラー処理の規定の適用順序が明確になっていないことも多いようです。

[41] [CITE@en[1047594 – Enable http/2 (and alpn) by default]]
([TIME[2015-09-26 22:11:14 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=1047594>

[42] [CITE[Bits Up!: HTTP/2 is Live in Firefox]]
([TIME[2015-09-26 08:55:00 +09:00]] 版)
<http://bitsup.blogspot.jp/2015/02/http2-is-live-in-firefox.html>

[43] [CITE[Issue 408944 - chromium - Chromium h2-14 and twitter.com interop PROTOCOL_ERROR - An open-source project to help move the web forward. - Google Project Hosting]]
([TIME[2015-09-27 00:11:47 +09:00]] 版)
<https://code.google.com/p/chromium/issues/detail?id=408944>

[44] [CITE[Issue 345769 - chromium - Full HTTP/2 support - An open-source project to help move the web forward. - Google Project Hosting]]
([TIME[2015-09-27 20:11:10 +09:00]] 版)
<https://code.google.com/p/chromium/issues/detail?id=345769>

* 実装

[45] [[サーバー]]ソフトウェアの実装:
[FIG(short list)[
- [[H2O]]
- [[nginx]]
- [[Caddy]]
]FIG]

[47] [[サーバー]]サービス:
[FIG(short list)[
- [[CloudFlare]]
- [[KeyCDN]]
]FIG]

[46] [[クライアント]]の実装:
[FIG(short list)[
- [[Chrome]]/[[Chromium]] ([[Blink]])
- [[Firefox]] ([[Gecko]])
- [[Safari]] ([[WebKit]])
- [[Edge]]
- [[Googlebot]]
]FIG]


[51] [CITE@en[mod_http2 - Apache HTTP Server Version 2.4]]
( ([TIME[2017-01-15 21:40:17 +09:00]]))
<https://httpd.apache.org/docs/2.4/mod/mod_http2.html>


[55] [CITE[HTTP/2 with curl]], [TIME[2020-09-21T09:01:13.000Z]], [TIME[2020-10-02T01:55:23.360Z]] <https://curl.haxx.se/docs/http2.html>

[56] [CITE@en-US[HTTP/2 Fully Supported in NGINX Plus | NGINX]]
([TIME[2021-04-24T09:29:44.000Z]])
<https://www.nginx.com/blog/http2-r7/>