/
339.txt
154 lines (107 loc) · 8.78 KB
/
339.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
* 仕様書
[REFS[
- [1] [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]
* データ構造
[11] [RUBYB[[[符号化器]]]@en[encoder]]が[[符号化]]を行い、
[RUBYB[[[復号器]]]@en[decoder]]が[[復号]]を行います。
* ヘッダーブロック
[5] [DFN[[RUBYB[ヘッダーリスト]@en[header list]]]]は、
[[ヘッダー欄表現]]を連結したものです。 [SRC[>>1]]
[28] 重複する[[ヘッダー欄]]を含むことができます。
[[HTTP/2]] [[header block]] に含まれる[[ヘッダー欄]]の完全なリストは、
[[ヘッダーリスト]]です。 [SRC[>>1]]
[7] [DFN[[RUBYB[ヘッダーブロック]@en[header block]]]]は、
[[ヘッダー欄表現]]の順序付きリストで、[[復号]]すると完全な[[ヘッダーリスト]]が得られるものです。
[SRC[>>1]]
[8] [[符号化器]]は、[[ヘッダーブロック]]中の[[ヘッダー欄]]の順序を元の[[ヘッダーリスト]]中の[[ヘッダー欄]]の順序のままとしなければ[['''なりません''']]。 [SRC[>>1]]
[9] [[復号器]]は、[[復号]]した[[ヘッダーリスト]]中の[[ヘッダー欄]]の順序を[[ヘッダーブロック]]中の順序のままとしなければ[['''なりません''']]。 [SRC[>>1]]
[27] [[復号器]]は、[[ヘッダーブロック]]内の[[ヘッダー欄表現]]を順に処理し、
元の[[ヘッダーリスト]]を再構築します。 [SRC[>>1]]
* ヘッダー欄
[2] [DFN[[RUBYB[ヘッダー欄]@en[header field]]]]は、名前と値の組です。
いずれも不透明な[[オクテット列]]として扱います。 [SRC[>>1]]
[6] [DFN[[RUBYB[ヘッダー欄表現]@en[header field representation]]]]は、
[[ヘッダー欄]]を[[リテラル]]として、または[[索引]]として[[符号化]]したものです。 [SRC[>>1]]
[19] [RUBYB[[[索引]]表現]@en[indexed representation]]は、[[静的表]]または[[動的表]]上の項目を参照する形で[[ヘッダー欄]]を表しています。 [SRC[>>1]]
[20] [RUBYB[[[リテラル]]]@en[literal]]表現は、名前と値を指定する形で[[ヘッダー欄]]を表しています。
名前は、[[リテラル]]により、または[[静的表]]または[[動的表]]上の項目を参照する形で表します。
値は、[[リテラル]]により表します。 [SRC[>>1]]
[21] [RUBYB[[[リテラル]]表現]@en[literal representation]]には、次の3通りがあります [SRC[>>1]]。
[FIG(list)[
- [22] [[動的表]]の最初に新しい項目として[[ヘッダー欄]]を追加するもの
- [23] [[動的表]]に[[ヘッダー欄]]を追加しないもの
- [24] [[動的表]]に[[ヘッダー欄]]を追加しないもので、しかも常にリテラル表現とするもの
]FIG]
;; [25] 3つ目は、[[中間器]]で再符号化するとしてもリテラル表現とすることを求めています。
これは[[圧縮]]することで危険になる[[ヘッダー欄]]を保護するためのものです。 [SRC[>>1]]
[26] [[ヘッダー欄]]の名前や値のリテラル表現は、
[[オクテット列]]を直接符号化することもできますし、 [[静的Huffman符号]]によることもできます。
[SRC[>>1]]
[29] [[復号器]]は、[[ヘッダー欄表現]]を次のようにしなければ[['''なりません''']]
[SRC[>>1]]。
[FIG(steps)[
= [30] [[索引]]表現なら、
== [[索引]]で参照されている項目の[[ヘッダー欄]]を、[[ヘッダーリスト]]の末尾に追加します。
= [31] リテラル表現なら、
== [32] [[ヘッダー欄]]を、[[ヘッダーリスト]]の末尾に追加します。
== [33] [[動的表]]に追加するものなら、
=== [[ヘッダー欄]]を[[動的表]]の先頭に追加します。
(これに伴い [[eviction]] が発生することがあります。)
]FIG]
* 表
[10] [[復号器]]は、[DFN[[RUBYB[復号文脈]@en[decoding context]]]]として[[動的表]]を維持する必要があります。
動的な状態として必要なのは[[動的表]]のみです。 [SRC[>>1]]
[12] [[エンドポイント]]は、双方向通信のため、
[[符号化]]用と[[復号]]用で別の[[動的表]]を維持する必要があります。 [SRC[>>1]]
[4] [DFN[[RUBYB[静的表]@en[static table]]]]は、頻出[[ヘッダー欄]]を索引値に関連付ける表です。
本表は順序があり、読み取り専用で、常にアクセス可能で、
すべての[[符号化]]や[[復号]]の文脈で共有できます。
本表は予め定義された共通の[[ヘッダー欄]]を含んでいます。 [SRC[>>1]]
[3] [DFN[[RUBYB[動的表]@en[dynamic table]]]]は、
蓄積された[[ヘッダー欄]]を[RUBYB[索引値]@en[index value]]に関連付ける表です。
本表は動的であり、[[符号化]]や[[復号]]の文脈に固有のものです。
[[FIFO]] で、最初の最新の[RUBYB[項目]@en[entry]]が最小の索引を持ち、
最古の項目が最高の索引を持ちます。
[[符号化器]]は、[[符号化]]対象の[[ヘッダーリスト]]で繰り返し登場する[[ヘッダー欄]]を[RUBYB[索引付け]@en[index]]するために使うことができます。 [SRC[>>1]]
[14] [[動的表]]の初期状態は、空です。 [SRC[>>1]]
[15] [[動的表]]は、重複する (同名同値の) 項目を含むことがあります。
[[復号器]]はこれをエラーとしては[['''なりません''']]。 [SRC[>>1]]
[16] [[符号化器]]は、[[動的表]]をどう使うか決めることができ、
従ってどれだけ[[メモリー]]を消費するかを決めることができます。
[[復号器]]のメモリー要件の制限のために[[動的表]]のサイズは厳密に上界が設けられています。
[SRC[>>1]]
** 索引
[17] 表上の項目は、[DFN[[RUBYB[索引]@en[index]]]]により参照されます。
[13] [[動的表]]と[[静的表]]は、どちらも共通の[RUBYB[索引番地空間]@en[index address space]]上にあります。
[CODE[[[1]]]] [[以上]]、[[静的表]]の大きさ[[以下]]の[[索引]]は、
[[静的表]]上の項目を表しています。それよりも大きな[[索引]]は、
[[動的表]]上の項目を表しています。 [SRC[>>1]]
[18] 両[[表]]の長さの[[和]]よりも大きな[[索引]]は、
復号エラーとしなければ[['''なりません''']] [SRC[>>1]]。
** サイズ制限
[34] [[動的表]]の[DFN[[RUBYB[サイズ]@en[size]]]]は、各項目のサイズの[[和]]です。 [SRC[>>1]]
[35] 項目の[DFN[[RUBYB[サイズ]@en[size]]]]は、名前のオクテット長と値のオクテット長と
32 の[[和]]です。 [SRC[>>1]]
;; [36] [[Huffman符号化]]は適用しない状態の長さです。 [SRC[>>1]]
[37] [[HPACK]] を使うプロトコルが最大の[[動的表]]サイズを決定します。 [SRC[>>1]]
[38] [[HTTP/2]] では、[[設定]] [CODE[[[SETTINGS_HEADER_TABLE_SIZE]]]]
により決まります。 [SRC[>>1]]
[39] [[符号化器]]は、[[動的表]]サイズを最大サイズ[[以下]]としなければ[['''なりません''']]。
[SRC[>>1]]
[40] [[動的表]]の最大サイズの変更は、[DFN[[RUBYB[動的表サイズ更新]@en[dynamic table size update]]]]により通知されます。
[[動的表サイズ更新]]は、変更の後の最初の[[ヘッダーブロック]]の最初で発生しなければ[['''なりません''']]。 [SRC[>>1]]
[41] [[HTTP/2]] では、[[設定]]の [[acknowledgment]] の後に当たります。 [SRC[>>1]]
[42] 2つの[[ヘッダーブロック]]の転送の間に最大サイズの変更が複数回行われた時は、
最小サイズを[[動的表サイズ更新]]で通知しなければ[['''なりません''']]。
最後のサイズも通知しなければなりません。 [SRC[>>1]]
;; [43] 0 を設定し、元に戻すことで、[[動的表]]の内容を消去できます。 [SRC[>>1]]
[44] 最大サイズが減少した時は、[[動的表]]のサイズが最大サイズ[[以下]]となるまで、
末尾から順に削除 ([[eviction]]) します。 [SRC[>>1]]
[45] 新しい項目を追加する前には、[[動的表]]に新しい項目のサイズを足しても最大サイズ[[以下]]となるか、
[[表]]が空となるまで、末尾から順に削除 ([[eviction]]) します。 [SRC[>>1]]
[46] 新しい項目が最大サイズ[[以下]]なら、[[動的表]]に追加します。 [SRC[>>1]]
;; [47] 最大サイズを超えるなら、[[動的表]]が空になります。これはエラーではありません。
[SRC[>>1]]
[48] なお、新しい項目は、それによって[[動的表]]から削除される項目の名前を参照していることがありますから、
注意が必要です。 [SRC[>>1]]