-
Notifications
You must be signed in to change notification settings - Fork 4
/
53.txt
158 lines (111 loc) · 9.06 KB
/
53.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
* 仕様書
[REFS[
- [6] [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-3>
- [73] '''[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-4.3>'''
- [82] [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-5.5>
- [84] [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-6.5.2>
- [92] [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.1.2>
- [104] [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-10.5>
- [4] [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#section-1.3>
- [3] [CITE@en-US[Fetch Standard]] ([TIME[2015-05-07 18:42:14 +09:00]] 版) <https://fetch.spec.whatwg.org/#concept-header-list>
]REFS]
* ヘッダー部
[7] [[HTTPメッセージ]]のうち0個以上の[[頭欄]]の部分のことを、
[DFN[[RUBYB[頭部]@en[header section]]]]や[DFN[[RUBYB[ヘッダー群]@en[headers]]]]といいます [SRC[>>6]]。
[8] >>7 の定義によると[[開始行]]は[[頭部]]には含まれていません。
[[トレーラー部]]も[[ヘッダー部]]の一部では無さそうです。
[9] [[頭部]]のそれぞれの項目のことを仕様上は[[頭欄]]、一般的には[[ヘッダー]]と呼んでいます。
[[頭部]]のことを[[ヘッダー群]]と言うのはこの[[ヘッダー]]という呼称に由来します。
[[HTTP]] に影響を与えた [[RFC 822]] の本来の用語では、
[[頭部]]全体のことを[RUBYB[[[ヘッダー]]]@en[header]]と呼んでいました。
* ヘッダーリスト
[5] [[Fetch]] [SRC[>>3]] と [[HTTP/2]] [SRC[>>73]] や [[HPACK]] [SRC[>>4]] は、
0個以上の[[ヘッダー]]の順序付きのリストを[DFN[[RUBYB[ヘッダーリスト]@en[header list]]]]と呼んでいます。
[10] [[HTTP/2]] や [[HPACK]] では、[[トレーラー部]]も (独立した) [[ヘッダーリスト]]です。
* HTTP/2 ヘッダー
[12] [[HTTP/2]] では、[[HTTPメッセージ]]の先頭となる1つ[[以上]]の[[フレーム]]により、
[[ヘッダーリスト]]が転送されます。
[13] 加えて、[[HTTPメッセージ]]の末尾となる1つ[[以上]]の[[フレーム]]により、
[[トレーラー部]]の[[ヘッダーリスト]]が転送されます。
[99] [[HTTP/2]] の[[ヘッダー]]には、 [[HTTP/1.1]] と共通の通常の [[HTTPヘッダー]]の他に、
[[HTTP/1.1]] の[[開始行]]に相当する[[疑似ヘッダー]]があります。
[14] [[疑似ヘッダー]]は、通常の[[ヘッダー]]より前になければなりません [SRC[>>92]]。
[15] [[疑似ヘッダー]]は[[trailer]]では使えません [SRC[>>92]]。
;; [16] [[ヘッダー名]]、[[ヘッダー値]]も参照。
** 構文
[77] [[ヘッダー]]を表す[[フレーム]]群は、 [CODE[[[HEADERS]]]] または
[CODE[[[PUSH_PROMISE]]]] で始まり、0個[[以上]]の [CODE[[[CONTINUATION]]]]
が続きます。最後の[[フレーム]]は [CODE[[[END_HEADERS]]]] [[フラグ]]が設定され、
それ以外の[[フレーム]]は設定されません。 [SRC[>>73]]
[FIG(railroad)[
= |
== [CODE[[[HEADERS]]]] ([CODE[[[END_HEADERS]]]])
== [CODE[[[PUSH_PROMISE]]]] ([CODE[[[END_HEADERS]]]])
== =
=== |
==== [CODE[[[HEADERS]]]] (¬[CODE[[[END_HEADERS]]]])
==== [CODE[[[PUSH_PROMISE]]]] (¬[CODE[[[END_HEADERS]]]])
=== *
==== [CODE[[[CONTINUATION]]]] (¬[CODE[[[END_HEADERS]]]])
=== [CODE[[[CONTINUATION]]]] ([CODE[[[END_HEADERS]]]])
]FIG]
[17] 通常の [[HTTPメッセージ]]の[[ヘッダー部]]や[[トレーラー部]]では、
[CODE(HTTP)@en[[[HEADERS]]]] [[フレーム]]を使います。
[[サーバープッシュ]]の[[要求]]の[[ヘッダー部]]では、
[CODE(HTTP)@en[[[PUSH_PROMISE]]]] [[フレーム]]を使います。
[19] [[ヘッダーリスト]]は、 [[HPACK]] によって[[圧縮]]します。
その[[符号化]]と[[復号]]に使う[[動的表]]は、[[接続]]単位で[[符号化]]用、
[[復号]]用に1つずつ存在します [SRC[>>73]]。
;; [[HPACK]] を参照。
;; [20] 同じ [[HTTP接続]]を使う[[HTTPメッセージ]]は、[[要求]]と[[応答]]の組以外は互いに意味的に無関係です。
しかしそれを表現する[[フレーム]]列は、[[動的表]]を介して依存関係にあります。
** 符号化
[75] [[ヘッダーリスト]]は、 [[HTTPヘッダー圧縮]]により[RUBYB[[[ヘッダーブロック]]]@en[header block]]として[[直列化]]されます [SRC[>>73]]。
[76] [[直列化]]された[[ヘッダーブロック]]は、1つ[[以上]]の[DFN[[RUBYB[[[ヘッダーブロック素片]]]@en[header block fragment]]]]に分割されて
[CODE[[[HEADERS]]]], [CODE[[[PUSH_PROMISE]]]], [CODE[[[CONTINUATION]]]]
の[[フレーム]]の [[payload]] で転送されます [SRC[>>73]]。
[11] どのように分割するかは、[[送信者]]に委ねられています。
[80] [[ヘッダーブロック]]は連続した[[フレーム]]として転送しなければ[['''なりません''']]。
他の[[フレーム]]を挟んではなりません。 [SRC[>>73]]
[83] 未知の[[フレーム型]]の[[フレーム]]も挟めません [SRC[>>82]]。
** 復号
[18] [CODE(HTTP)@en[[[CONTINUATION]]]] [[フレーム]]ではなく未知の[[フレーム型]]の[[フレーム]]が現れた場合、[[接続エラー]] [CODE[[[PROTOCOL_ERROR]]]] としなければ[['''なりません''']] [SRC[>>82]]。
[79] [[ヘッダーブロック]]の[[復号エラー]]は、[[接続エラー]]
[CODE[[[COMPRESSION_ERROR]]]] としなければ[['''なりません''']] [SRC[>>73]]。
[81] [[受信者]]は、[[フレーム]]群が捨てられる場合であっても、
その[[フレーム]]群から[[ヘッダーブロック]]を結合し展開する必要があります。
[[受信者]]が持つ[[圧縮文脈]]を変更する可能性があります。 [SRC[>>73]]
[[展開]]しない場合は、[[接続エラー]]
[CODE[[[COMPRESSION_ERROR]]]] としなければ[['''なりません''']] [SRC[>>73]]。
[21] [[ヘッダー名]]や[[ヘッダー値]]も、エラーを含む場合があります。
;; それぞれの項を参照。
** サイズ制限
[86] [[設定]] [DFN[[CODE[[[SETTINGS_MAX_HEADER_LIST_SIZE]]]]]] ([CODE[[[0x6]]]]) は、
[[送信者]]が受け付ける準備のできている [[header list]] の最大長を知らせる[[ヒント]]です。
この値は、圧縮前の状態で、[[header field]] ごとに名前と値の長さとオーバーヘッドとして 32
を足した合計値を[[バイト]]単位にしたものです。 [SRC[>>84]]
[89] 各[[要求]]で、この値よりも小さな制限を課しても構いません [SRC[>>84]]。
[88] 初期値は、無制限です [SRC[>>84]]。
[105] [[header block]] が大きいと、大量のデータを保持する必要が生じ、
不都合が生じるかもしれません。 [[header block]] の大きさに厳密な上限は設けていませんが、
[[設定]] [CODE[[[SETTINGS_MAX_HEADER_LIST_SIZE]]]]
によって [[header block]] の大きさの制限を [[peer]] に[[ヒント]]として伝えられます。
[[peer]] はそれより大きな [[header block]] を送っても構いませんが、
[[奇形]]とみなされるリスクが有ります。 [SRC[>>104]]
[106] [[設定]] [CODE[[[SETTINGS_MAX_HEADER_LIST_SIZE]]]]
は[[接続]]に対するもので、[[中間器]]を介した別の[[ホップ]]はより厳しい制限を持つかもしれません。
[[中間器]]は[[設定]]を[[転送]]することで問題を避けられますが、
そうする義務はありません。 [SRC[>>104]]
[107] [[サーバー]]は、 [[header block]] が大きすぎて処理したくないときは
[CODE(HTTP)[[[431]]]] [[応答]]を送ることができます。 [SRC[>>104]]
[108] [[クライアント]]は、 [[header block]] が大きすぎて処理したくないときは捨てることができます。
[SRC[>>104]]
[109] いずれにせよ、 [[header block]] は、接続の状態の一貫性を保つため、
[[接続]]を閉じる場合以外は処理しなければ[['''なりません''']] [SRC[>>104]] (>>81)。
* 歴史
[1] [CITE[Add sketch for headers · 50b8147 · whatwg/fetch]]
( ([TIME[2014-05-31 02:34:28 +09:00]] 版))
<https://github.com/whatwg/fetch/commit/50b8147869f3d8d9fc2e29e09445176ac07391a6>
[2] [CITE[Define Headers object · 37526e4 · whatwg/fetch]]
( ([TIME[2014-06-12 03:55:34 +09:00]] 版))
<https://github.com/whatwg/fetch/commit/37526e41d1da81e8b19a9d089ff16727eeda9dc8>