-
Notifications
You must be signed in to change notification settings - Fork 4
/
353.txt
138 lines (98 loc) · 6.84 KB
/
353.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
* 仕様書
[REFS[
- [1] [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>
- [4] '''[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>'''
- [28] [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-7>
- [29] [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>
- [31] [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.8>
- [33] [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.3>
]REFS]
* 意味
[5] [CODE[[[SETTINGS]]]] [[フレーム]] ([[フレーム型]] [CODE[[[0x4]]]])
は、通信に関わる引数の設定情報を伝達するものです [SRC[>>4]]。またその[RUBYB[返答]@en[acknowledge]]にも使います [SRC[>>4]]。
[6] [CODE[[[SETTINGS]]]] の[[引数]]を[DFN[[RUBYB[設定]@en[setting]]]]ともいいます [SRC[>>4]]。
[7] [[設定]]は、[[エンドポイント]]の性質を説明するものであり、[[折衝]]するものではありません。
両 [[peer]] は同じ[[引数]]の違う値を使うこともあります。 [SRC[>>4]]
[27] なお[[設定]]の値や[[設定]]に依存した機能の挙動は、[[fingerprinting vector]] です [SRC[>>31]]。
* 構文
[16] [[ストリーム識別子]]は、 [CODE[[[0x0]]]] でなければ[['''なりません''']] [SRC[>>4]]。
[[ストリーム]]にのみ[[設定]]を適用することはできません。
[12] 次の[[フラグ]]があります。
[13] [CODE[[[ACK]]]] フラグ ([CODE[[[0x1]]]] = 第0ビット) は、
設定されていれば、 [[peer]] の [CODE[[[SETTINGS]]]] [[フレーム]]を受信し適用したことを
[[acknowledge]] することを表します。 [SRC[>>4]]
[FIG(packet)[
:width:8
= 1 [[ACK]]
= 1 0
= 1 0
= 1 0
= 1 0
= 1 0
= 1 0
= 1 0
]FIG]
[20] [[payload]] は、0個以上の[[引数]]の列です。各[[引数]]は、
[[符号無し]]16ビットの[RUBYB[識別子]@en[identifier]]欄と、
[[符号無し]]32ビットの[RUBYB[値]@en[value]]欄で構成されます。 [SRC[>>4]]
[FIG(railroad)[
= *
== 識別子
== 値
]FIG]
[14] [CODE[[[ACK]]]] フラグが設定されている場合は、 [[payload]] は空でなければ[['''なりません''']] [SRC[>>4]]。
* 文脈
[8] [CODE[[[SETTINGS]]]] [[フレーム]]は、
接続の開始時に両[[エンドポイント]]が送信しなければ[['''なりません''']] [SRC[>>4]]。
;; [[HTTP/2接続]]、[[HTTPS]] も参照。
[9] [CODE[[[SETTINGS]]]] [[フレーム]]は、
[[接続]]中必要に応じて送ることができます [SRC[>>4]]。
* 設定 (引数)
[22] 次の[[設定]]があります。実装は、これらの[[設定]]すべてに対応しなければ[['''なりません''']]
[SRC[>>4]]。
[FIG(list)[
- [CODE[[[SETTINGS_HEADER_TABLE_SIZE]]]] ([CODE[[[0x1]]]])
- [CODE[[[SETTINGS_ENABLE_PUSH]]]] ([CODE[[[0x2]]]])
- [CODE[[[SETTINGS_MAX_CONCURRENT_STREAMS]]]] ([CODE[[[0x3]]]])
- [CODE[[[SETTINGS_INITIAL_WINDOW_SIZE]]]] ([CODE[[[0x4]]]])
- [CODE[[[SETTINGS_MAX_FRAME_SIZE]]]] ([CODE[[[0x5]]]])
- [CODE[[[SETTINGS_MAX_HEADER_LIST_SIZE]]]] ([CODE[[[0x6]]]])
]FIG]
[3] (新たな) [[設定]]を[[拡張]]の[[折衝]]に使う場合、既定値は当該拡張を無効としなければ[['''なりません''']] [SRC[>>1]]。
[34] [[IANA登録簿]]があります [SRC[>>33]]。
[35] [CODE[0xf000]]-[CODE[0xffff]] は[[実験用]]に予約されています [SRC[>>33]]。
* 処理
[15] [[受信者]]は、 [CODE[[[SETTINGS]]]] [[フレーム]]の [CODE[[[ACK]]]] フラグが設定されていて、
[[payload]] の長さ欄の値が 0 でなければ、[[接続エラー]] [CODE[[[FRAME_SIZE_ERROR]]]]
としなければ[['''なりません''']] [SRC[>>4]]。
[17] [[受信者]]は、[[ストリーム識別子]]が [CODE[[[0x0]]]] でなければ、
[[接続エラー]] [CODE[[[PROTOCOL_ERROR]]]]
としなければ[['''なりません''']] [SRC[>>4]]。
[18] [[受信者]]は、[CODE[[[SETTINGS]]]] [[フレーム]]の形式が誤っているか不完全なら、
[[接続エラー]] [CODE[[[PROTOCOL_ERROR]]]] としなければ[['''なりません''']] [SRC[>>4]]。
[19] [[受信者]]は、[CODE[[[SETTINGS]]]] [[フレーム]]の [[payload]]
が 6 の[[倍数]]でなければ、
[[接続エラー]] [CODE[[[FRAME_SIZE_ERROR]]]] としなければ[['''なりません''']] [SRC[>>4]]。
[10] [CODE[[[SETTINGS]]]] [[フレーム]]の受信者は、
[CODE[[[ACK]]]] フラグが設定されていなければ、
可能な限りすぐに指定された[[引数]]を適用しなければ[['''なりません''']] [SRC[>>4]]。
新しい値により、既存の値を置き換えます [SRC[>>4]]。
[2] 未知の[[設定]]は、無視しなければ[['''なりません''']] [SRC[>>1, >>4]]。
[21] [[設定]]によっては、指定できる値に制約があり、それを満たさなければエラーとなることがあります。
;; 各[[設定]]の項を参照。
[11] [[設定]]は出現順に処理します。 [SRC[>>4]]
[23] [[設定]]の更新中に他の[[フレーム]]を処理しては[['''なりません''']] [SRC[>>4]]。
[24] すべての[[設定]]の処理を終えたら、直ちに [CODE[[[ACK]]]] フラグを設定した
[CODE[[[SETTINGS]]]] [[フレーム]]を送信しなければ[['''なりません''']] [SRC[>>4]]。
[25] [CODE[[[ACK]]]] フラグが設定された [CODE[[[SETTINGS]]]] [[フレーム]]を受信したら、
設定が適用されたことに依存できるようになります [SRC[>>4]]。
[26] 十分な時間内に [[acknowledgement]] を受信しなければ、
[[接続エラー]] [DFN[[CODE[[[SETTINGS_TIMEOUT]]]]]] ([CODE[[[0x4]]]])
としても構いません [SRC[>>4, >>28]]。
[30] [CODE[[[SETTINGS]]]] [[フレーム]]は、
意味もなく[[引数]]を変更したり、未定義の[[引数」」を設定したり、
同じ[[引数]]を何度も変更したりして無駄な処理をさせるために濫用できます。
[[エンドポイント]]は利用状況を監視して制限する[['''べきです''']]。
[[接続エラー]] [CODE[[[ENHANCE_YOUR_CALM]]]] としても構いません。 [SRC[>>29]]
[32] [CODE[[[SETTINGS]]]] [[フレーム]]の返信によって [[peer]] までの[[遅延]]が測定されると、
[[プライバシー]]上問題となることもあるかしれません [SRC[>>31]]。