/
286.txt
197 lines (151 loc) · 9.9 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
[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]
* 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]] では、[[クライアント]]が[[要求]]を送信し[[サーバー]]が[[応答]]を送信する従来の形のやり取りに加えて、
[[サーバー]]が[[要求]]と[[応答]]を[[クライアント]]に送信する[[サーバープッシュ]]が導入されています。
* 識別子
[19] [[ALPN]] の識別子 [DFN[[CODE[[[h2]]]]]] ([CODE[0x68, 0x32]]) は、
[[HTTP/2]] over [[TLS]] を表します [SRC[>>17, >>34]]。
;; [21] [[HTTP/2]] の [[Internet Draft]] は、 [CODE[[[h2-11]]]] のような値を使っていました。
[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]]]] を参照。
[18] [[HTTP/1.1]] [[以下]]とは違って、[[要求行]]や[[状態行]]の[[プロトコルの版]]に相当するものはありません。
[23] ただし[[クライアント接続序文]]は、 [[HTTP/1.1]] の[[メッセージ]]として解釈すると、
[[プロトコルの版]] [DFN[[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]] [[以下]]を区別することはできません。
* 歴史
[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>