/
286.txt
260 lines (198 loc) · 12.4 KB
/
286.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
[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]]
* URL
[16] [[HTTP/2]] では、 [CODE(URI)@en[[[http:]]]]/[CODE(URI)@en[[[https:]]]]
[[URL scheme]] を使います [SRC[>>17]]。 [[URL]] だけから [[HTTP/2]]
と [[HTTP/1.1]] [[以下]]を区別することはできません。
* 歴史
[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>