-
Notifications
You must be signed in to change notification settings - Fork 4
/
344.txt
89 lines (67 loc) · 4.58 KB
/
344.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
[2] [DFN[[RUBYB[[[フレーム]]]@en[frame]]]]は、[[HTTP/2接続]]中の通信の最小単位です。[[フレーム]]は[[ヘッダー]]と可変長の[[オクテット列]]で構成されます。 [SRC[>>1]]
* 仕様書
[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-2.2>
- [3] '''[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>'''
]REFS]
* 構文
[4] [[フレーム]]は、9[[バイト]]の[[ヘッダー]]と、
可変長の[[payload]] で構成されます [SRC[>>3]]。
[5] [[フレーム]]の[[ヘッダー]]は、次の欄で構成されます [SRC[>>3]]。
[FIG(list members)[
:[RUBYB[長さ]@en[Length]]:
[[payload]] の長さを[[符号無し]]24ビット[[整数]] ([[ネットワークバイト順]])
で表現したものです。 [SRC[>>3]]
:[RUBYB[型]@en[Type]]:[[フレーム]]の種類を表す8ビットの値です。
[[フレーム]]の形式と意味が指定されます。 [SRC[>>3]]
:[RUBYB[フラグ群]@en[Flags]]:[[フレーム型]]依存の [[boolean]] [[フラグ]]用の
8ビットの欄です。 [SRC[>>3]]
:R:予約された1ビットの欄です。意味は定義されていません。 [SRC[>>3]]
:[RUBYB[[[ストリーム識別子]]]@en[Stream Identifier]]:[[ストリーム識別子]]を[[符号無し]]31ビット[[整数]]
([[ネットワークバイト順]]) として表したものです。 [SRC[>>3]]
:Frame Payload:[[フレーム型]]に依存したデータです [SRC[>>3]]。
長さは「長さ」欄で指定され、0のこともあります。
]FIG]
[FIG(packet)[
:width:32:
= 24 [[Length]]
= 8 [[Type]]
= 8 [[Flags]]
= 1 R
= 31 [[ストリーム識別子]]
= 24... [[Frame Payload]]
]FIG]
[8] [[送信者]]は、[[フレーム型]]により[[フラグ]]群の意味が定義されていない場合、
0 を設定しなければ[['''なりません''']] [SRC[>>3]]。
[10] [[送信]]は、 R 欄に 0 を設定しなければ[['''なりません''']] [SRC[>>3]]。
[7] [[受信者]]は、未知の[[型]]の[[フレーム]]を無視し、捨てなければ[['''なりません''']] [SRC[>>3]]。
[9] [[受信者]]は、[[フレーム型]]により[[フラグ]]群の意味が定義されていない場合、
0 を設定しなければ[['''なりません''']] [SRC[>>3]]。
[11] [[受信者]]は、 R 欄を無視しなければ[['''なりません''']] [SRC[>>3]]。
[12] [[ストリーム識別子]] [CODE[0]] は、個別の[[ストリーム]]ではなく[[接続]]全体を表すものとして予約されています [SRC[>>3]]。
* payload の長さ
[13] [[フレーム]]の [[payload]] の長さは、[[受信者]]が
[DFN[[CODE[[[SETTINGS_MAX_FRAME_SIZE]]]]]] 設定により[[広告]]した最大長により、
制限されます [SRC[>>3]]。
[15] この設定の値は、 2[SUP[14]] [[以上]]、 2[SUP[24]]-1 [[以下]]です [SRC[>>3]]。
[6] [[受信者]]がより大きな値を [CODE[[[SETTINGS_MAX_FRAME_SIZE]]]] に設定している場合を除き、
長さを 2[SUP[14]] より大きな値としては[['''なりません''']] [SRC[>>3]]。
[16] すべての実装は、 2[SUP[14]] [[バイト]][[以下]]の [[payload]]
を扱うことができなければ[['''なりません''']] [SRC[>>3]]。
;; [17] [[payload]] の長さには、[[フレーム]]の[[ヘッダー]]の長さ 9 は含まれていません。
;; [18] [CODE[[[PING]]]] のように、[[フレーム型]]依存の [[payload]]
の長さの制約が別にあるかもしれません。
[19] [[エンドポイント]]は、次の場合に [DFN[[CODE[[[FRAME_SIZE_ERROR]]]]]]
[[エラー符号]]を送信しなければ[['''なりません''']] [SRC[>>3]]。
[FIG(list)[
- [20] [[フレーム]]の長さが [CODE[[[SETTINGS_MAX_FRAME_SIZE]]]] を超える場合
- [21] [[フレーム]]の長さが[[フレーム型]]依存の制限を超える場合
- [22] [[フレーム]]の長さが必須のフレームデータの長さより短い場合
]FIG]
[23] [[接続]]全体の状態を変えてしまい得る[[フレーム]]の長さのエラーは、
[[接続エラー]]となければ[['''なりません''']]。これには次のものが含まれます。 [SRC[>>3]]
[FIG(list)[
- [25] [[header block]] を含む[[フレーム]] ([CODE[[[HEADERS]]]], [CODE[[[PUSH_PROMISE]]]], [CODE[[[CONTINUATION]]]])
- [26] [CODE[[[SETTINGS]]]]
- [[ストリーム識別子]]が [CODE[[[0]]]] の[[フレーム]]
]FIG]