/
467.txt
251 lines (184 loc) · 13.9 KB
/
467.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
[10] [DFN[[CODE(HTTP)@en[[[Meter:]]]]]] [[ヘッダー]]は、
[[起源鯖]]から[[串]]に対して[[応答]]回数の計測に関する指示を行ったり、
[[串]]から[[起源鯖]]に対して計測結果を報告したりするものです。
* 仕様書
[REFS[
- [2] [CITE@en[RFC 2227 - Simple Hit-Metering and Usage-Limiting for HTTP]]
( ([TIME[2011-12-18 04:36:26 +09:00]] 版))
<http://tools.ietf.org/html/rfc2227>
]REFS]
* 意味
[3] [CODE(HTTP)@en[[[Meter:]]]] は、[[キャッシュ]]によって[[利用者エージェント]]からのアクセスの情報が[[鯖]]に伝わらないことを防ぐため[[キャッシュ]]を無効化する [[cache-busting]]
がしばしば行われている [SRC[>>2]] として、その必要性を低めるための代替となる仕組みとして提案されました。
;; ただしすべての [[cache-busting]] を置き換えることを目的とするものではない [SRC[>>2]]
とされています。
[6] [CODE(HTTP)@en[[[Meter:]]]] [[ヘッダー]]は、
[[起源鯖]]が[[串]]を通じて配信された回数を十分正確に取得する「hit-metering」や、
[[串]]が[[再検証]]なしに[[再利用]]できる回数を指定する「usage-limiting」
を実現します [SRC[>>2]]。
* 構文
[18] [CODE(HTTP)@en[[[Meter:]]]] [[ヘッダー]]の値は、0個以上の[[指令]]の[[リスト]]
([CODE(HTTP)[#]]) です [SRC[>>2]]。
[FIG(railroad)[
= ?
== [[指令]]
== *
=== [[OWS]]
=== [CODE(HTTP)[[[,]]]]
=== [[OWS]]
=== [[指令]]
]FIG]
* 空のヘッダー
[21] [[要求]]において値が指定されない場合、 [CODE(HTTP)@en[[[will-report-and-limit]]]]
が指定されたのと等価です [SRC[>>2]]。
[34] [[応答]]において値が指定されない場合、 [CODE(HTTP)@en[[[do-report]]]]
が指定されたのと等価です [SRC[>>2]]。
;; [36] [[空文字列]]の[[ヘッダー]]と非[[空文字列]]の[[ヘッダー]]が同時に別々に指定された時にも >>21 や >>34 が適用されるのかは明記されていませんが、
字面通り解釈すると適用されることになります。複数の同名の[[ヘッダー]]は
[CODE(HTTP)[[[,]]]] 区切りで連結しても同じ意味を表すことになっていますから、
[[空文字列]]の[[ヘッダー]]と[[空文字列]]でない[[ヘッダー]]が連結されることもあります。
とすると[[ヘッダー]]の値である[[リスト]]に[[空文字列]]の要素が含まれている時も
>>21 や >>34 のように解釈するべきなのでしょうか?
[22] 更に、 [CODE(HTTP)@en[[[Connection:]] [[Meter]]]] によって
[CODE(HTTP)@en[[[Meter:]]]] ([[空文字列]])
が暗示され、 [CODE(HTTP)@en[[[Meter:]]]] [[ヘッダー]]は省略できます [SRC[>>2]]。
[35] [CODE(HTTP)@en[[[dont-report]]]] を含まない [CODE(HTTP)@en[[[Meter:]]]]
[[ヘッダー]]は、 [CODE(HTTP)@en[[[do-report]]]] が指定されたとみなします [SRC[>>2]]。
;; [46] ここで [CODE(HTTP)@en[[[wont-ask]]]] も [CODE(HTTP)@en[[[dont-report]]]]
と同じとみなされると推測されます。
* 文脈
[20] [[串]]は計測や制限に対応していることを示すために [CODE(HTTP)@en[[[Meter:]]]]
[[ヘッダー]]を送信できます。どちらにも対応しない[[串]]は、
[CODE(HTTP)@en[[[Meter:]]]] [[ヘッダー]]を送信しては[['''なりません''']] [SRC[>>2]]。
[37] [[鯖]]は[[要求]]に [CODE(HTTP)@en[[[Meter]]]] が含まれており、
計測や制限を[[下流]]に委ねたい場合に、 [CODE(HTTP)@en[[[Meter:]]]]
[[ヘッダー]]を送信できます。
[11] [CODE(HTTP)@en[[[Meter:]]]] [[ヘッダー]]を含む[[メッセージ]]は、
[CODE(HTTP)@en[[[Connection:]] [[meter]]]] を含まなければ[['''なりません''']] [SRC[>>2]]。
[CODE(HTTP)@en[[[Meter:]]]] の値が[[空文字列]]になるときは、
[CODE(HTTP)@en[[[Connection:]] [[meter]]]] のみ指定して
[CODE(HTTP)@en[[[Meter:]]]] [[ヘッダー]]自体は省略できます。
[12] [CODE(HTTP)@en[[[Meter:]]]] [[ヘッダー]]は、
[[プロトコルの版]]が [[HTTP/1.1]] [[未満]]の[[メッセージ]]に含めては[['''なりません''']]
[SRC[>>2]]。
[19] この[[ヘッダー]]は複数指定できます [SRC[>>2]]。
* 計測部分木
[8] [[起源鯖]]を[[根]]とし、[[起源鯖]]からの[[応答]]の[[転送]]経路上にあって
[CODE(HTTP)@en[[[Meter:]]]] [[ヘッダー]]による計測に対応した[[串]]によって構成される[[木]]のことを[DFN[[RUBYB[計測部分木]@en[metering subtree]]]]
[SRC[>>2]] といいます。
[9] [[起源鯖]]と[[利用者エージェント]]の間には、 [CODE(HTTP)@en[[[Meter:]]]]
[[ヘッダー]]に対応しない[[串]]や、対応しているものの[[上流]]に対応しない[[串]]が存在しているため対応できない[[串]]があるかもしれません。
[[計測部分木]]は、そのような[[串]]も含めた配送経路全体で構成される[[木]]の[[部分木]]となります。
* 指令
[48] [[指令]]には、[[要求]]で[[串]]が使うものと[[応答]]で[[鯖]]が使うものがあります。
** 串の機能を示す指令
[25] [[串]]は[[鯖]]に[[要求]]を送信する際に、次の[[指令]]を送信することができます [SRC[>>2]]。
[26] [DFN[[CODE(HTTP)@en[[[will-report-and-limit]]]]]] は、
利用報告を送信する意思があり、利用制限にも従うつもりであることを表します [SRC[>>2]]。
[27] [DFN[[CODE(HTTP)@en[[[wont-report]]]]]] は、
利用制限に従う意志はあるが利用報告は送信しないことを表します [SRC[>>2]]。
[28] [DFN[[CODE(HTTP)@en[[[wont-limit]]]]]] は、
利用制限には従わないが利用報告は返すつもりであることを表します [SRC[>>2]]。
** 計測の指示と利用の制限
[29] [[鯖]]は[[串]]に[[応答]]を送信する際に、次の[[指令]]を送信することができます [SRC[>>2]]。
[30] [DFN[[CODE(HTTP)@en[[[do-report]]]]]] が指定された場合、[[串]]は[[鯖]]に利用報告を送信しなければ[['''なりません''']] [SRC[>>2]]。
[31] [DFN[[CODE(HTTP)@en[[[dont-report]]]]]] が指定された場合、
[[串]]は[[鯖]]に利用報告を送信する[['''べきではありません''']] [SRC[>>2]]。
[32] [CODE(HTTP)@en[[DFN[[[timeout]]]]=[VAR[[[delta-seconds]]]]]]
が指定された場合、[[応答]]が作成されてから指定された[[時間]]が経過した時までに計測結果が
0 でなければ、[[串]]は[[鯖]]に利用報告を送信しなければ[['''なりません''']] [SRC[>>2]]。
[CODE(HTTP)@en[[[timeout]]]] は [CODE(HTTP)@en[[[do-report]]]]
を暗示しています [SRC[>>2]]。
[38] [CODE(HTTP)@en[[DFN[[[max-uses]]]]=...]] は、
[[応答]]を「利用」する回数の[[上限]]を指定します。この数には当該[[応答]]の直後の[[転送]]は含めません。
[SRC[>>2]]
;; [41] [[キャッシュ]]が「先読み」のために[[要求]]して [CODE(HTTP)@en[[[max-uses]]]]
が返された場合でも、次の最初の実際の[[クライアント]]からの[[要求]]にその[[キャッシュ項目]]を使って返した時は回数に含まれません [SRC[>>1]]。
[39] [CODE(HTTP)@en[[DFN[[[max-reuses]]]]=...]] は、
[[応答]]を「再利用」する回数の[[上限]]を指定します。
[SRC[>>2]]
[47] [DFN[[CODE(HTTP)@en[[[wont-ask]]]]]] は、[[串]]が[[鯖]]に対して [CODE(HTTP)@en[[[Meter]]]]
を送信する[['''べきではない''']]ことを示します。
[[串]]はこれを最大24時間覚えておく[['''べきです''']]。
[CODE(HTTP)@en[[[wont-ask]]]] は [CODE(HTTP)@en[[[dont-report]]]]
を暗示します。 [SRC[>>2]]
** 利用報告の指令
[49] [[串]]は[[鯖]]に [CODE(HTTP)@en[[DFN[[[count]]]]=[VAR[...]]/[VAR[...]]]]
[[指令]]によって利用報告を送信できます。ここで1つ目の数は[[利用]]、
2つ目の数は[[再利用]]の回数を表します。 [SRC[>>2]]
[50] [[要求]]に [CODE(HTTP)@en[[[count]]]] 以外の[[指令]]が含まれない時は、
[CODE(HTTP)@en[[[will-report-and-limit]]]] を暗示します [SRC[>>2]]。
[51] [CODE(HTTP)@en[[[count]]=0/0]] は情報がありませんから、
送信する[['''べきではありません''']] [SRC[>>2]]。
* 処理モデル
[4] [CODE(HTTP)@en[[[Meter:]]]] は[[串]]または[[起源鯖]]に対するものです [SRC[>>2]]。
[[利用者エージェント]]には適用されません。
[13] [[プロトコルの版]]が [[HTTP/1.1]] [[未満]]の[[クライアント]]から送信された
[CODE(HTTP)@en[[[Meter:]]]] [[ヘッダー]]を受け入れては[['''なりません''']] [SRC[>>2]]。
;; [14] これは、[CODE(HTTP)@en[[[Connection:]]]] を正しく処理できない [[HTTP/1.0]]
[[串]]があるためです [SRC[>>2]]。
** 起源鯖の処理
[23] [[起源鯖]]は、[[要求]]に [CODE(HTTP)@en[[[Meter]]]] が指定されている時、
[[下流]]に計測や制限を委ねるかどうか決定できます。委ねない場合
(や [CODE(HTTP)@en[[[Meter]]]] を実装しない場合) はただ単に
[CODE(HTTP)@en[[[Meter]]]] を無視して構いません [SRC[>>2]]。
[33] 委ねる場合には、計測や制限を指示する[[指令]]を指定した
[CODE(HTTP)@en[[[Meter:]]]] [[ヘッダー]]を[[応答]]に含めます [SRC[>>2]]。
[[鯖]]は[[串]]が表明した機能以外を要求しては[['''なりません''']] [SRC[>>2]]。
** 串の処理
[5] [[串]]は [CODE(HTTP)@en[[[Meter:]]]] を実装しても構いませんが、
実装しなくても構いません [SRC[>>2]]。
[CODE(HTTP)@en[[[Meter:]]]] [[ヘッダー]]を[[転送]]する[[串]]は、
[[RFC 2227]] に従わなければ[['''なりません''']] [SRC[>>2]]。
;; [7] [[起源鯖]]は [CODE(HTTP)@en[[[Connection:]] [[Meter]]]]
と指定しなければなりませんから、未対応の[[串]]は [CODE(HTTP)@en[[[Connection:]]]]
[[ヘッダー]]の規定に従い [CODE(HTTP)@en[[[Meter:]]]]
[[ヘッダー]]を[[転送]]時に削除します。
[24] [[串]]は計測や制限を行える時は、[[要求]]にその旨を含めます (>>20)。
[42] [[串]]は[[鯖]]に対して表明 (>>20) した機能以外を[[鯖]]からの[[応答]]の
[CODE(HTTP)@en[[[Meter]]]] で求められても、これを無視する[['''べきです''']] [SRC[>>20]]。
[40] [[串]]は[[上流]]からの[[応答]]で指定された「利用」や「再利用」
を使い果たした時には[[キャッシュ項目]]を[[応答]]に含めて返す前に[[再検証]]しなければ[['''なりません''']]。
なお利用報告を送ることを求められている場合には、この[[再検証]]を使って送る[['''べきです''']]。
[SRC[>>2]]
[15] [[串]]は、計測や制限を行う[[応答]]を[[転送]]する際、
[[クライアント]] ([[串]]であれ[[利用者エージェント]]であれ) が[[計測部分木]]に含まれないなら、
[CODE(HTTP)@en[[[Meter:]]]] [[ヘッダー]]を削除し、
[CODE(HTTP)@en[[[Cache-Control:]] [[s-maxage]]=0]]
を含めなければ[['''なりません''']] [SRC[>>2]]。
;; [16] これにより[[計測部分木]]外の[[共有キャッシュ]]は常に[[計測部分木]]内の[[鯖]]に[[再検証]]しなくてはならなくなりますから、
[[計測部分木]]内の[[串]]が常に計測できることとなります。
[43] [[下流]]からの[[要求]]で [CODE(HTTP)@en[[[Meter]]]] を受信した[[串]]は、
自身の[[上流]]に対する義務と整合する範囲でのみこれを無視して構いません。
[CODE(HTTP)@en[[[Meter]]]] がそのような義務に反する場合や、
[[下流]]からの[[要求]]に [CODE(HTTP)@en[[[Meter]]]] が含まれず[[上流]]からの[[応答]]には
[CODE(HTTP)@en[[[Meter]]]] が含まれている場合、
[[転送]]する[[応答]]に [CODE(HTTP)@en[[[Cache-Control:]] [[s-maxage]]=0]]
を追加しなければ[['''なりません''']]。 [CODE(HTTP)@en[[[Expires:]]]]
や [CODE(HTTP)@en[[[Cache-Control:]] [[max-age]]]] は追加したり変更したりする[['''べきではありません''']]。
[SRC[>>2]]
[EG[
[44] [[下流]]の[[串]]が [CODE(HTTP)@en[[[Meter]]]] を送信してきた時、
自身の[[キャッシュ項目]]に [CODE(HTTP)@en[[[Meter]]]] が含まれていなければ、
[CODE(HTTP)@en[[[Meter]]]] を無視します [SRC[>>2]]。
]EG]
[EG[
[45] [[下流]]の[[串]]が [CODE(HTTP)@en[[[Meter:]] [[wont-report]]]] を送信してきた時、
自身の[[キャッシュ項目]]に [CODE(HTTP)@en[[[Meter:]] [[do-report]]]]
が含まれていた場合、[[下流]]からの[[要求]]は自身の義務に則したものではありません。
ですから[[転送]]時には [CODE(HTTP)@en[[[Meter]]]] を削除してかわりに
[CODE(HTTP)@en[[[Cache-Control:]] [[s-maxage]]=0]] を追加しなければなりません。 [SRC[>>2]]
]EG]
[52] 計測する[[串]]は適宜利用報告を [CODE(HTTP)@en[[[Meter:]] [[count]]]]
によって[[上流]]に送信します。これには (計測対象を明確にするため)
[[条件付き要求]]を使わなければ[['''なりません''']] [SRC[>>2]]。
[CODE(HTTP)@en[[[If-Match:]]]] や [CODE(HTTP)@en[[[If-None-Match:]]]]
を使う場合は、[[実体タグ]]を複数指定しては[['''なりません''']] [SRC[>>2]]。
[[計測部分木]]内の[[串]]は利用報告の[[転送]]時に条件を表す[[ヘッダー]]を書き換えては[['''なりません''']] [SRC[>>2]]。
[17] [[串]]の[[下流]]に複数の[[計測部分木]]内の[[串]]がある場合、
利用可能回数を分配することができます。また計測結果は合算して[[上流]]に報告することとなります。
[SRC[>>2]]
* 歴史
[1] [CITE@en[draft-ietf-http-hit-metering-00 - Simple Hit-Metering and Usage-Limiting for HTTP]]
( ([TIME[2012-01-20 20:05:43 +09:00]] 版))
<http://tools.ietf.org/html/draft-ietf-http-hit-metering-00>