asciidoctor-rfc 0.2.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.adoc +116 -6
- data/asciidoctor-rfc.gemspec +15 -1
- data/lib/asciidoctor/rfc/common/base.rb +74 -7
- data/lib/asciidoctor/rfc/common/front.rb +1 -1
- data/lib/asciidoctor/rfc/v2/base.rb +87 -38
- data/lib/asciidoctor/rfc/v2/blocks.rb +29 -2
- data/lib/asciidoctor/rfc/v2/converter.rb +0 -1
- data/lib/asciidoctor/rfc/v2/inline_anchor.rb +2 -8
- data/lib/asciidoctor/rfc/v2/lists.rb +7 -4
- data/lib/asciidoctor/rfc/v2/table.rb +1 -1
- data/lib/asciidoctor/rfc/v3/base.rb +41 -43
- data/lib/asciidoctor/rfc/v3/blocks.rb +29 -2
- data/lib/asciidoctor/rfc/v3/converter.rb +0 -2
- data/lib/asciidoctor/rfc/v3/inline_anchor.rb +2 -6
- data/lib/asciidoctor/rfc/version.rb +1 -1
- data/spec/asciidoctor/rfc/v2/comments_spec.rb +7 -3
- data/spec/asciidoctor/rfc/v2/date_spec.rb +23 -0
- data/spec/asciidoctor/rfc/v2/dlist_spec.rb +107 -9
- data/spec/asciidoctor/rfc/v2/image_spec.rb +17 -0
- data/spec/asciidoctor/rfc/v2/inline_formatting_spec.rb +12 -0
- data/spec/asciidoctor/rfc/v2/listing_spec.rb +22 -0
- data/spec/asciidoctor/rfc/v2/literal_spec.rb +22 -2
- data/spec/asciidoctor/rfc/v2/preamble_spec.rb +72 -0
- data/spec/asciidoctor/rfc/v2/references_spec.rb +3 -1
- data/spec/asciidoctor/rfc/v2/table_spec.rb +104 -4
- data/spec/asciidoctor/rfc/v2/text_spec.rb +89 -0
- data/spec/asciidoctor/rfc/v2/ulist_spec.rb +40 -0
- data/spec/asciidoctor/rfc/v3/dlist_spec.rb +103 -1
- data/spec/asciidoctor/rfc/v3/image_spec.rb +18 -0
- data/spec/asciidoctor/rfc/v3/listing_spec.rb +26 -0
- data/spec/asciidoctor/rfc/v3/literal_spec.rb +20 -1
- data/spec/asciidoctor/rfc/v3/preamble_spec.rb +150 -0
- data/spec/asciidoctor/rfc/v3/references_spec.rb +35 -34
- data/spec/asciidoctor/rfc/v3/series_info_spec.rb +39 -0
- data/spec/examples/README.adoc +162 -0
- data/spec/examples/davies-template-bare-06.adoc +3 -0
- data/spec/examples/draft-ietf-core-block-xx.mkd +935 -0
- data/spec/examples/draft-ietf-core-block-xx.mkd.adoc +1013 -0
- data/spec/examples/draft-ietf-core-block-xx.xml.orig +1251 -0
- data/spec/examples/example-v2.adoc +6 -2
- data/spec/examples/example-v3.adoc +5 -1
- data/spec/examples/hoffmanv2.xml.adoc +247 -0
- data/spec/examples/hoffmanv2.xml.orig +339 -0
- data/spec/examples/hoffmanv3.xml.orig +346 -0
- data/spec/examples/mib-doc-template-xml-06.adoc +5 -1
- data/spec/examples/rfc2100.md.adoc +2 -3
- data/spec/examples/rfc3514.md.adoc +3 -2
- data/spec/examples/rfc5841.md.adoc +1 -1
- data/spec/examples/rfc748.md.adoc +7 -6
- data/spec/examples/rfc7511.md.adoc +15 -15
- data/spec/examples/skel.mkd +32 -0
- data/spec/examples/skel.mkd.adoc +50 -0
- data/spec/examples/skel.xml.orig +105 -0
- data/spec/examples/stupid-s.mkd +569 -0
- data/spec/examples/stupid-s.mkd.adoc +771 -0
- data/spec/examples/stupid-s.xml.orig +880 -0
- data/spec/spec_helper.rb +1 -1
- metadata +32 -4
@@ -0,0 +1,1251 @@
|
|
1
|
+
<?xml version="1.0" encoding="us-ascii"?>
|
2
|
+
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
|
3
|
+
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.7 -->
|
4
|
+
|
5
|
+
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
|
6
|
+
<!ENTITY RFC2119 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
|
7
|
+
<!ENTITY RFC2616 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2616.xml">
|
8
|
+
<!ENTITY I-D.ietf-core-coap SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-core-coap.xml">
|
9
|
+
<!ENTITY SELF "[RFCXXXX]">
|
10
|
+
]>
|
11
|
+
|
12
|
+
<?rfc toc="yes"?>
|
13
|
+
<?rfc sortrefs="yes"?>
|
14
|
+
<?rfc symrefs="yes"?>
|
15
|
+
|
16
|
+
<rfc ipr="trust200902" docName="draft-ietf-core-block-05" category="std">
|
17
|
+
|
18
|
+
<front>
|
19
|
+
<title>Blockwise transfers in CoAP</title>
|
20
|
+
|
21
|
+
<author initials="C." surname="Bormann" fullname="Carsten Bormann">
|
22
|
+
<organization>Universitaet Bremen TZI</organization>
|
23
|
+
<address>
|
24
|
+
<postal>
|
25
|
+
<street>Postfach 330440</street>
|
26
|
+
<city>Bremen</city>
|
27
|
+
<code>D-28359</code>
|
28
|
+
<country>Germany</country>
|
29
|
+
</postal>
|
30
|
+
<phone>+49-421-218-63921</phone>
|
31
|
+
<facsimile>+49-421-218-7000</facsimile>
|
32
|
+
<email>cabo@tzi.org</email>
|
33
|
+
</address>
|
34
|
+
</author>
|
35
|
+
<author initials="Z." surname="Shelby" fullname="Zach Shelby" role="editor">
|
36
|
+
<organization>Sensinode</organization>
|
37
|
+
<address>
|
38
|
+
<postal>
|
39
|
+
<street>Kidekuja 2</street>
|
40
|
+
<city>Vuokatti</city>
|
41
|
+
<code>88600</code>
|
42
|
+
<country>Finland</country>
|
43
|
+
</postal>
|
44
|
+
<phone>+358407796297</phone>
|
45
|
+
<email>zach@sensinode.com</email>
|
46
|
+
</address>
|
47
|
+
</author>
|
48
|
+
|
49
|
+
<date year="2012" month="January" day="13"/>
|
50
|
+
|
51
|
+
<area>Applications</area>
|
52
|
+
<workgroup>CoRE Working Group</workgroup>
|
53
|
+
<keyword>Internet-Draft</keyword>
|
54
|
+
|
55
|
+
<abstract>
|
56
|
+
|
57
|
+
|
58
|
+
<t>CoAP is a RESTful transfer protocol for constrained nodes and networks.
|
59
|
+
Basic CoAP messages work well for the small payloads we expect
|
60
|
+
from temperature sensors, light switches, and similar
|
61
|
+
building-automation devices.
|
62
|
+
Occasionally, however, applications will need to transfer
|
63
|
+
larger payloads — for instance, for firmware updates. With
|
64
|
+
HTTP, TCP does the grunt work of slicing large payloads up
|
65
|
+
into multiple packets and ensuring that they all arrive and
|
66
|
+
are handled in the right order.</t>
|
67
|
+
|
68
|
+
<t>CoAP is based on datagram transports such as UDP or DTLS,
|
69
|
+
which limits the maximum size of resource representations that
|
70
|
+
can be transferred without too much fragmentation.
|
71
|
+
Although UDP supports larger payloads through IP
|
72
|
+
fragmentation, it is limited to 64 KiB and, more importantly,
|
73
|
+
doesn't really work well for constrained applications and
|
74
|
+
networks.</t>
|
75
|
+
|
76
|
+
<t>Instead of relying on IP fragmentation, this specification
|
77
|
+
extends basic CoAP with a pair of "Block" options, for
|
78
|
+
transferring multiple blocks of information from a resource
|
79
|
+
representation in multiple request-response pairs. In many
|
80
|
+
important cases, the Block options enable a server to be truly
|
81
|
+
stateless: the server can handle each block transfer
|
82
|
+
separately, with no need for a connection setup or other
|
83
|
+
server-side memory of previous block transfers.</t>
|
84
|
+
|
85
|
+
<t>In summary, the Block options provide a minimal way to
|
86
|
+
transfer larger representations in a block-wise fashion.</t>
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
</abstract>
|
91
|
+
|
92
|
+
|
93
|
+
</front>
|
94
|
+
|
95
|
+
<middle>
|
96
|
+
|
97
|
+
|
98
|
+
<section anchor="problems" title="Introduction">
|
99
|
+
|
100
|
+
<t>The CoRE WG is tasked with standardizing an
|
101
|
+
Application Protocol for Constrained Networks/Nodes, CoAP.
|
102
|
+
This protocol is intended to provide RESTful <xref target="REST"/> services not
|
103
|
+
unlike HTTP <xref target="RFC2616"/>,
|
104
|
+
while reducing the complexity of implementation as well as the size of
|
105
|
+
packets exchanged in order to make these services useful in a highly
|
106
|
+
constrained network of themselves highly constrained nodes.</t>
|
107
|
+
|
108
|
+
<t>This objective requires restraint in a number of sometimes conflicting ways:</t>
|
109
|
+
|
110
|
+
<t><list style="symbols">
|
111
|
+
<t>reducing implementation complexity in order to minimize code size,</t>
|
112
|
+
<t>reducing message sizes in order to minimize the number of fragments
|
113
|
+
needed for each message (in turn to maximize the probability of
|
114
|
+
delivery of the message), the amount of transmission power needed
|
115
|
+
and the loading of the limited-bandwidth channel,</t>
|
116
|
+
<t>reducing requirements on the environment such as stable storage,
|
117
|
+
good sources of randomness or user interaction capabilities.</t>
|
118
|
+
</list></t>
|
119
|
+
|
120
|
+
<t>CoAP is based on datagram transports such as UDP, which limit the
|
121
|
+
maximum size of resource representations that can be transferred
|
122
|
+
without creating unreasonable levels of IP fragmentation. In
|
123
|
+
addition, not all resource representations will fit into a single link
|
124
|
+
layer packet of a constrained network, which may cause adaptation
|
125
|
+
layer fragmentation even if IP layer fragmentation is not required.
|
126
|
+
Using fragmentation (either at the adaptation layer or at the IP
|
127
|
+
layer) to enable the transport of larger representations is possible
|
128
|
+
up to the maximum size of the underlying datagram protocol (such as
|
129
|
+
UDP), but the fragmentation/reassembly process loads the lower layers
|
130
|
+
with conversation state that is better managed in the application
|
131
|
+
layer.</t>
|
132
|
+
|
133
|
+
<t>This specification defines a pair of CoAP options to enable <spanx style="emph">block-wise</spanx> access to
|
134
|
+
resource representations.
|
135
|
+
The Block options provide a minimal way to transfer larger
|
136
|
+
resource representations in a block-wise fashion.
|
137
|
+
The overriding objective is to avoid
|
138
|
+
creating conversation state at the server for block-wise GET requests.
|
139
|
+
(It is impossible to fully avoid creating conversation state for
|
140
|
+
POST/PUT, if the creation/replacement of resources is to be atomic;
|
141
|
+
where that property is not needed, there is no need to create server
|
142
|
+
conversation state in this case, either.)</t>
|
143
|
+
|
144
|
+
<t>In summary, this specification adds a pair of Block options to CoAP that
|
145
|
+
can be used for block-wise transfers. Benefits of using these options
|
146
|
+
include:</t>
|
147
|
+
|
148
|
+
<t><list style="symbols">
|
149
|
+
<t>Transfers larger than can be accommodated in constrained-network
|
150
|
+
link-layer packets can be performed in smaller blocks.</t>
|
151
|
+
<t>No hard-to-manage conversation state is created at the adaptation
|
152
|
+
layer or IP layer for fragmentation.</t>
|
153
|
+
<t>The transfer of each block is acknowledged, enabling retransmission
|
154
|
+
if required.</t>
|
155
|
+
<t>Both sides have a say in the block size that actually will be used.</t>
|
156
|
+
<t>The resulting exchanges are easy to understand using packet
|
157
|
+
analyzer tools and thus quite accessible to debugging.</t>
|
158
|
+
<t>If needed, the Block options can also be used as is to provide random
|
159
|
+
access to power-of-two sized blocks within a resource representation.</t>
|
160
|
+
</list></t>
|
161
|
+
|
162
|
+
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
|
163
|
+
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
|
164
|
+
document are to be interpreted as described in RFC 2119, BCP 14
|
165
|
+
<xref target="RFC2119"/> and indicate requirement levels for compliant CoAP
|
166
|
+
implementations.</t>
|
167
|
+
|
168
|
+
<t>In this document, the term "byte" is used in its now customary sense
|
169
|
+
as a synonym for "octet".</t>
|
170
|
+
|
171
|
+
<t>Where bit arithmetic is explained, this document uses the notation
|
172
|
+
familiar from the programming language C, except that the operator "**"
|
173
|
+
stands for exponentiation.</t>
|
174
|
+
|
175
|
+
</section>
|
176
|
+
<section anchor="block-wise-transfers" title="Block-wise transfers">
|
177
|
+
|
178
|
+
<t>As discussed in the introduction, there are good reasons to limit the
|
179
|
+
size datagrams in constrained networks:</t>
|
180
|
+
|
181
|
+
<t><list style="symbols">
|
182
|
+
<t>by the maximum datagram size (~ 64 KiB for UDP)</t>
|
183
|
+
<t>by the desire to avoid IP fragmentation (MTU of 1280 for IPv6)</t>
|
184
|
+
<t>by the desire to avoid adaptation layer fragmentation (60–80 bytes
|
185
|
+
for 6LoWPAN)</t>
|
186
|
+
</list></t>
|
187
|
+
|
188
|
+
<t>When a resource representation is larger than can be comfortably
|
189
|
+
transferred in the payload of a single CoAP datagram, a Block option
|
190
|
+
can be used to indicate a block-wise transfer. As payloads can be
|
191
|
+
sent both with requests and with responses, this specification
|
192
|
+
provides two separate options for each direction of payload transfer.</t>
|
193
|
+
|
194
|
+
<t>In the following, the term "payload" will be used for the actual
|
195
|
+
content of a single CoAP message, i.e. a single block being
|
196
|
+
transferred, while the term "body" will be used for the entire
|
197
|
+
resource representation that is being transferred in a block-wise
|
198
|
+
fashion.</t>
|
199
|
+
|
200
|
+
<t>In most cases, all blocks being transferred for a body will be of the
|
201
|
+
same size. The block size is not fixed by the protocol. To keep the
|
202
|
+
implementation as simple as possible, the Block options support only a
|
203
|
+
small range of power-of-two block sizes, from 2**4 (16) to 2**10
|
204
|
+
(1024) bytes. As bodies often will not evenly divide into the
|
205
|
+
power-of-two block size chosen, the size need not be reached in the
|
206
|
+
final block; still this size will be given as the block size even for
|
207
|
+
the final block.</t>
|
208
|
+
|
209
|
+
<section anchor="block-option" title="The Block Options">
|
210
|
+
|
211
|
+
<texttable title="Block Option Numbers" anchor="block-option-numbers">
|
212
|
+
<ttcol align='right'>Type</ttcol>
|
213
|
+
<ttcol align='left'>C/E</ttcol>
|
214
|
+
<ttcol align='left'>Name</ttcol>
|
215
|
+
<ttcol align='left'>Format</ttcol>
|
216
|
+
<ttcol align='left'>Length</ttcol>
|
217
|
+
<ttcol align='left'>Default</ttcol>
|
218
|
+
<c>19</c>
|
219
|
+
<c>Critical</c>
|
220
|
+
<c>Block1</c>
|
221
|
+
<c>uint</c>
|
222
|
+
<c>1-3 B</c>
|
223
|
+
<c>0 (see below)</c>
|
224
|
+
<c>17</c>
|
225
|
+
<c>Critical</c>
|
226
|
+
<c>Block2</c>
|
227
|
+
<c>uint</c>
|
228
|
+
<c>1-3 B</c>
|
229
|
+
<c>0 (see below)</c>
|
230
|
+
</texttable>
|
231
|
+
|
232
|
+
<t>Both Block1 and Block2 options can be present both in request and
|
233
|
+
response messages. In either case, the Block1 Option pertains to the
|
234
|
+
request payload, and the Block2 Option pertains to the response payload.</t>
|
235
|
+
|
236
|
+
<t>Hence, for the methods defined in <xref target="I-D.ietf-core-coap"/>, Block1 is
|
237
|
+
useful with the payload-bearing POST and PUT requests and their
|
238
|
+
responses. Block2 is useful with GET, POST, and PUT requests and
|
239
|
+
their payload-bearing responses (2.01, 2.02, 2.04, 2.05 — see
|
240
|
+
section "Payload" of <xref target="I-D.ietf-core-coap"/>).</t>
|
241
|
+
|
242
|
+
<t>(As a memory aid: Block_1_ pertains to the payload of the <spanx style="emph">1st</spanx> part
|
243
|
+
of the request-response exchange, i.e. the request, and Block_2_
|
244
|
+
pertains to the payload of the <spanx style="emph">2nd</spanx> part of the request-response
|
245
|
+
exchange, i.e. the response.)</t>
|
246
|
+
|
247
|
+
<t>Where Block1 is present in a request or Block2 in a response (i.e., in
|
248
|
+
that message to the payload of which it pertains) it indicates a
|
249
|
+
block-wise transfer and describes how this block-wise payload forms
|
250
|
+
part of the entire body being transferred ("descriptive usage").
|
251
|
+
Where it is present in the opposite direction, it provides additional
|
252
|
+
control on how that payload will be formed or was processed ("control usage").</t>
|
253
|
+
|
254
|
+
<t>Implementation of either Block option is intended to be optional.
|
255
|
+
However, when it is present in a CoAP message, it MUST be processed
|
256
|
+
(or the message rejected);
|
257
|
+
therefore it is identified as a critical option.</t>
|
258
|
+
|
259
|
+
<t>Three items of information may need to be transferred in a Block
|
260
|
+
option:</t>
|
261
|
+
|
262
|
+
<t><list style="symbols">
|
263
|
+
<t>The size of the block (SZX);</t>
|
264
|
+
<t>whether more blocks are following (M);</t>
|
265
|
+
<t>the relative number of the block (NUM) within a sequence of blocks
|
266
|
+
with the given size.</t>
|
267
|
+
</list></t>
|
268
|
+
|
269
|
+
<t>The value of the option is a 1-, 2- or 3-byte integer which encodes
|
270
|
+
these three fields, see <xref target="block"/>.</t>
|
271
|
+
|
272
|
+
<figure title="Block option value" anchor="block"><artwork><![CDATA[
|
273
|
+
0
|
274
|
+
0 1 2 3 4 5 6 7
|
275
|
+
+-+-+-+-+-+-+-+-+
|
276
|
+
| NUM |M| SZX |
|
277
|
+
+-+-+-+-+-+-+-+-+
|
278
|
+
|
279
|
+
0 1
|
280
|
+
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
|
281
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
282
|
+
| NUM |M| SZX |
|
283
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
284
|
+
|
285
|
+
0 1 2
|
286
|
+
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
|
287
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
288
|
+
| NUM |M| SZX |
|
289
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
290
|
+
]]></artwork></figure>
|
291
|
+
|
292
|
+
<t>The block size is encoded as a three-bit unsigned integer (0 for 2**4 to 6
|
293
|
+
for 2**10 bytes), which we call the <spanx style="verb">SZX</spanx> (size exponent); the
|
294
|
+
actual block size is then <spanx style="verb">2**(SZX + 4)</spanx>. SZX is transferred in the
|
295
|
+
three least significant bits of the option value (i.e., <spanx style="verb">val & 7</spanx>
|
296
|
+
where <spanx style="verb">val</spanx> is the value of the option).</t>
|
297
|
+
|
298
|
+
<t>The fourth least significant bit, the M or "more" bit (<spanx style="verb">val & 8</spanx>),
|
299
|
+
indicates whether more blocks are following or the current block-wise
|
300
|
+
transfer is the last block being transferred.</t>
|
301
|
+
|
302
|
+
<t>The option value divided by sixteen (the NUM field) is the sequence
|
303
|
+
number of the block currently being transferred, starting from
|
304
|
+
zero. The current transfer is therefore about the <spanx style="verb">size</spanx> bytes
|
305
|
+
starting at byte <spanx style="verb">NUM << (SZX + 4)</spanx>. (Note that, as an implementation
|
306
|
+
convenience, <spanx style="verb">(val & ~0xF) << (val & 7)</spanx>, i.e. the option value with
|
307
|
+
the last 4 bits masked out, shifted to the left by the value of SZX,
|
308
|
+
gives the byte position of the block.)</t>
|
309
|
+
|
310
|
+
<t>The default value of both the Block1 and the Block2 Option is zero,
|
311
|
+
indicating that the current block is the first and only block of the
|
312
|
+
transfer (block number 0, M bit not set); however, there is no
|
313
|
+
explicit size implied by this default value.</t>
|
314
|
+
|
315
|
+
<t>More specifically, within the option value of a Block1 or Block2
|
316
|
+
Option, the meaning of the option fields is defined as follows:</t>
|
317
|
+
|
318
|
+
<t><list style="hanging">
|
319
|
+
<t hangText='NUM:'>
|
320
|
+
Block Number. The block number is a variable-size (4, 12, or 20 bit)
|
321
|
+
unsigned integer (uint, see Appendix A of <xref target="I-D.ietf-core-coap"/>)
|
322
|
+
indicating the block number being requested or provided. Block
|
323
|
+
number 0 indicates the first block of a body.</t>
|
324
|
+
<t hangText='M:'>
|
325
|
+
More Flag (not last block). For descriptive usage, this flag, if
|
326
|
+
unset, indicates that the payload in this message is the last block
|
327
|
+
in the body; when set it indicates that there are one or more
|
328
|
+
additional blocks available. When a Block2 Option is used in a
|
329
|
+
request to retrieve a specific block number ("control usage"), the M
|
330
|
+
bit MUST be sent as zero and ignored on reception. (In a Block1
|
331
|
+
Option in a response, the M flag is used to indicate atomicity, see
|
332
|
+
below.)</t>
|
333
|
+
<t hangText='SZX:'>
|
334
|
+
Block Size. The block size is a three-bit unsigned integer indicating the size of a block to
|
335
|
+
the power of two. Thus block size = 2**(SZX + 4). The allowed
|
336
|
+
values of SZX are 0 to 6, i.e., the minimum block size is 2**(0+4) = 16
|
337
|
+
and the maximum is 2**(6+4) = 1024.
|
338
|
+
The value 7 for SZX (which would indicate a block size of 2048) is
|
339
|
+
reserved, i.e. MUST NOT be sent and MUST lead to a 4.00 Bad Request
|
340
|
+
response code upon reception in a request.</t>
|
341
|
+
</list></t>
|
342
|
+
|
343
|
+
<t>The Block options are used in one of three roles:</t>
|
344
|
+
|
345
|
+
<t><list style="symbols">
|
346
|
+
<t>In descriptive usage, i.e. a Block2 Option in a response (e.g., a
|
347
|
+
2.05 response for GET), or a Block1 Option in a request (e.g., PUT
|
348
|
+
or POST):
|
349
|
+
<list style="symbols">
|
350
|
+
<t>The NUM field in the option value describes what block number is
|
351
|
+
contained in the payload of this message.</t>
|
352
|
+
<t>The M bit indicates whether further
|
353
|
+
blocks are required to complete the transfer of that body.</t>
|
354
|
+
<t>The block size given by SZX MUST match the size of the payload in
|
355
|
+
bytes, if the M bit is set. (The block size given is irrelevant if
|
356
|
+
M is unset). For Block2, if the request suggested a larger value
|
357
|
+
of SZX, the next request MUST move SZX down to the size given
|
358
|
+
here. (The effect is that, if the server uses the smaller of its
|
359
|
+
preferred block size and the one requested, all blocks for a body
|
360
|
+
use the same block size.)</t>
|
361
|
+
</list></t>
|
362
|
+
<t>A Block2 Option in control usage in a request (e.g., GET):
|
363
|
+
<list style="symbols">
|
364
|
+
<t>The NUM field in the Block2 Option gives the block number of the
|
365
|
+
payload that is being requested to be returned in the response.</t>
|
366
|
+
<t>In this case, the M bit has no function and MUST be set to zero.</t>
|
367
|
+
<t>The block size given (SZX) suggests a block size (in the case of
|
368
|
+
block number 0) or repeats the block size of previous blocks
|
369
|
+
received (in the case of block numbers other than 0).</t>
|
370
|
+
</list></t>
|
371
|
+
<t>A Block1 Option in control usage in a response (e.g., a 2.xx
|
372
|
+
response for a PUT or POST request):
|
373
|
+
<list style="symbols">
|
374
|
+
<t>The NUM field of the Block1 Option indicates what block number is
|
375
|
+
being acknowledged.</t>
|
376
|
+
<t>If the M bit was set in the request, the server can choose whether
|
377
|
+
to act on each block separately, with no memory, or whether to
|
378
|
+
handle the request for the entire body atomically, or any mix of
|
379
|
+
the two. If the M bit is also set in the response, it indicates
|
380
|
+
that this response does not carry the final response code to the
|
381
|
+
request, i.e. the server collects further blocks and plans to
|
382
|
+
implement the request atomically (e.g., acts only upon reception
|
383
|
+
of the last block of payload). Conversely, if the M bit is unset
|
384
|
+
even though it was set in the request, it indicates the block-wise
|
385
|
+
request was enacted now specifically for this block, and the
|
386
|
+
response carries the final response to this request (and to any
|
387
|
+
previous ones with the M bit set in the response's Block1 Option
|
388
|
+
in this sequence of block-wise transfers); the client is still
|
389
|
+
expected to continue sending further blocks, the request method
|
390
|
+
for which may or may not also be enacted per-block.</t>
|
391
|
+
<t>Finally, the SZX block size given in a control Block1 Option
|
392
|
+
indicates the largest block size preferred by the server for
|
393
|
+
transfers toward the resource that is the same or smaller than the
|
394
|
+
one used in the initial exchange; the client SHOULD use this block
|
395
|
+
size or a smaller one in all further requests in the transfer
|
396
|
+
sequence, even if that means changing the block size (and possibly
|
397
|
+
scaling the block number accordingly) from now on.</t>
|
398
|
+
</list></t>
|
399
|
+
</list></t>
|
400
|
+
|
401
|
+
</section>
|
402
|
+
<section anchor="block-usage" title="Using the Block Options">
|
403
|
+
|
404
|
+
<t>Using one or both Block options, a single REST operation can be split
|
405
|
+
into multiple CoAP message exchanges. As specified in
|
406
|
+
<xref target="I-D.ietf-core-coap"/>, each of these message exchanges uses their own
|
407
|
+
CoAP Message ID.</t>
|
408
|
+
|
409
|
+
<t>When a request is answered with a response carrying a Block2 Option with
|
410
|
+
the M bit set, the requester may retrieve additional blocks of the
|
411
|
+
resource representation by sending further
|
412
|
+
requests with the same options and a Block2 Option giving the block
|
413
|
+
number and block size desired. In a request, the client MUST set the M bit of a Block2 Option
|
414
|
+
to zero and the server MUST ignore it on reception.</t>
|
415
|
+
|
416
|
+
<t>To influence the block size used in a response, the
|
417
|
+
requester also uses the Block2 Option, giving the desired size, a block
|
418
|
+
number of zero and an M bit of zero. A server MUST use the block
|
419
|
+
size indicated or a smaller size. Any further block-wise requests for
|
420
|
+
blocks beyond the first one MUST indicate the same block size that was
|
421
|
+
used by the server in the
|
422
|
+
response for the first request that gave a desired size using a Block2
|
423
|
+
Option.</t>
|
424
|
+
|
425
|
+
<t>Once the Block2 Option is used by the requester, all requests in a
|
426
|
+
single block-wise transfer
|
427
|
+
MUST ultimately use the same size, except that there may not be enough
|
428
|
+
content to fill the last block (the one returned with the M bit not
|
429
|
+
set).
|
430
|
+
(Note that the client may start using the Block2 Option in a second
|
431
|
+
request after a first request without a Block2 Option resulted in a
|
432
|
+
Block option in the response.)
|
433
|
+
The server SHOULD use the block
|
434
|
+
size indicated in the request option or a smaller size, but the
|
435
|
+
requester MUST take note of the actual block size used in the response
|
436
|
+
it receives
|
437
|
+
to its initial request and proceed to use it in subsequent requests. The
|
438
|
+
server behavior MUST ensure that this client behavior results in the
|
439
|
+
same block size for all responses in a sequence (except for the last
|
440
|
+
one with the M bit not set, and possibly the first one if the initial
|
441
|
+
request did not contain a Block2 Option).</t>
|
442
|
+
|
443
|
+
<t>Block-wise transfers can be used to GET resources the representations
|
444
|
+
of which are entirely static (not changing over time at all, such as
|
445
|
+
in a schema describing a device), or for dynamically changing
|
446
|
+
resources. In the latter case, the Block2 Option SHOULD be used in
|
447
|
+
conjunction with the ETag Option, to ensure that the blocks being
|
448
|
+
reassembled are from the same version of the representation: The
|
449
|
+
server SHOULD include an ETag option in each response. If an ETag
|
450
|
+
option is available, the client's reassembler, when reassembling the
|
451
|
+
representation from the blocks being exchanged, MUST compare ETag
|
452
|
+
Options. If the ETag Options do not match in a GET transfer, the
|
453
|
+
requester has the option of attempting to retrieve fresh values for
|
454
|
+
the blocks it retrieved first. To minimize the resulting
|
455
|
+
inefficiency, the server MAY cache the current value of a
|
456
|
+
representation for an ongoing sequence of requests. The client MAY
|
457
|
+
facilitate identifying the sequence by using the Token Option with a
|
458
|
+
non-default value. Note well that this specification makes no
|
459
|
+
requirement for the server to establish any state; however, servers
|
460
|
+
that offer quickly changing resources may thereby make it impossible
|
461
|
+
for a client to ever retrieve a consistent set of blocks.</t>
|
462
|
+
|
463
|
+
<t>In a request with a request payload (e.g., PUT or POST), the Block1
|
464
|
+
Option refers to the payload in the request (descriptive usage).</t>
|
465
|
+
|
466
|
+
<t>In response to a request with a payload (e.g., a PUT or POST
|
467
|
+
transfer), the block size given in the Block1 Option indicates the
|
468
|
+
block size preference of the server for this resource (control usage).
|
469
|
+
Obviously, at this point the first block has already been transferred
|
470
|
+
by the client without benefit of this knowledge. Still, the client
|
471
|
+
SHOULD heed the preference and, for all further blocks, use the block
|
472
|
+
size preferred by the server or a smaller one. Note that any
|
473
|
+
reduction in the block size may mean that the second request starts
|
474
|
+
with a block number larger than one, as the first request already
|
475
|
+
transferred multiple blocks as counted in the smaller size.</t>
|
476
|
+
|
477
|
+
<t>To counter the effects of adaptation layer fragmentation on packet
|
478
|
+
delivery probability, a client may want to give up retransmitting a
|
479
|
+
request with a relatively large payload even before MAX_RETRANSMIT has
|
480
|
+
been reached, and try restating the request as a block-wise transfer
|
481
|
+
with a smaller payload. Note that this new attempt is then a new
|
482
|
+
message-layer transaction and requires a new Message ID.
|
483
|
+
(Because of the uncertainty whether the request or the acknowledgement
|
484
|
+
was lost, this strategy is useful mostly for idempotent requests.)</t>
|
485
|
+
|
486
|
+
<t>In a blockwise transfer of a request payload (e.g., a PUT or POST) that is intended to be implemented in an
|
487
|
+
atomic fashion at the server, the actual creation/replacement takes
|
488
|
+
place at the time the final block, i.e. a block with the M bit unset
|
489
|
+
in the Block1 Option, is received. If not
|
490
|
+
all previous blocks are available at the server at this time, the
|
491
|
+
transfer fails and error code 4.08 (Request Entity Incomplete) MUST be returned. The error
|
492
|
+
code 4.13 (Request Entity Too Large) can be returned at any time by a server that does not
|
493
|
+
currently have the resources to store blocks for a block-wise request payload transfer that it would intend to implement in an atomic fashion.</t>
|
494
|
+
|
495
|
+
<t>If multiple concurrently proceeding block-wise request payload
|
496
|
+
transfer (e.g., PUT or POST) operations
|
497
|
+
are possible, the requester SHOULD use the Token Option to clearly separate the different sequences.
|
498
|
+
In this case, when reassembling the representation from the blocks
|
499
|
+
being exchanged to enable atomic processing, the reassembler MUST
|
500
|
+
compare any Token Options present (and, as usual, taking an absent Token Option
|
501
|
+
to default to the empty Token).
|
502
|
+
If atomic processing is not desired, there is no need to process the
|
503
|
+
Token Option (but it is still returned in the response as usual).</t>
|
504
|
+
|
505
|
+
</section>
|
506
|
+
</section>
|
507
|
+
<section anchor="examples" title="Examples">
|
508
|
+
|
509
|
+
<t>This section gives a number of short examples with message flows for a
|
510
|
+
block-wise GET, and for a PUT or POST.
|
511
|
+
These examples demonstrate the basic operation, the operation in the
|
512
|
+
presence of retransmissions, and examples for the operation of the
|
513
|
+
block size negotiation.</t>
|
514
|
+
|
515
|
+
<t>In all these examples, a Block option is shown in a decomposed way
|
516
|
+
separating the kind of Block option (1 or 2), block number (NUM), more bit (M), and block size exponent
|
517
|
+
(2**(SZX+4)) by slashes. E.g., a Block2 Option value of 33 would be shown as
|
518
|
+
2/2/0/32), or a Block1 Option value of 59 would be shown as 1/3/1/128.</t>
|
519
|
+
|
520
|
+
<t>The first example (<xref target="simple-get"/>) shows a GET request that is split
|
521
|
+
into three blocks.
|
522
|
+
The server proposes a block size of 128, and the client agrees.
|
523
|
+
The first two ACKs contain 128 bytes of payload each, and third ACK
|
524
|
+
contains between 1 and 128 bytes.</t>
|
525
|
+
|
526
|
+
<figure title="Simple blockwise GET" anchor="simple-get"><artwork><![CDATA[
|
527
|
+
CLIENT SERVER
|
528
|
+
| |
|
529
|
+
| CON [MID=1234], GET, /status ------> |
|
530
|
+
| |
|
531
|
+
| <------ ACK [MID=1234], 2.05 Content, 2/0/1/128 |
|
532
|
+
| |
|
533
|
+
| CON [MID=1235], GET, /status, 2/1/0/128 ------> |
|
534
|
+
| |
|
535
|
+
| <------ ACK [MID=1235], 2.05 Content, 2/1/1/128 |
|
536
|
+
| |
|
537
|
+
| CON [MID=1236], GET, /status, 2/2/0/128 ------> |
|
538
|
+
| |
|
539
|
+
| <------ ACK [MID=1236], 2.05 Content, 2/2/0/128 |
|
540
|
+
]]></artwork></figure>
|
541
|
+
|
542
|
+
<t>In the second example (<xref target="early-get"/>), the client anticipates the blockwise transfer
|
543
|
+
(e.g., because of a size indication in the link-format description)
|
544
|
+
and sends a size proposal. All ACK messages except for the last carry
|
545
|
+
64 bytes of payload; the last one carries between 1 and 64 bytes.</t>
|
546
|
+
|
547
|
+
<figure title="Blockwise GET with early negotiation" anchor="early-get"><artwork><![CDATA[
|
548
|
+
CLIENT SERVER
|
549
|
+
| |
|
550
|
+
| CON [MID=1234], GET, /status, 2/0/0/64 ------> |
|
551
|
+
| |
|
552
|
+
| <------ ACK [MID=1234], 2.05 Content, 2/0/1/64 |
|
553
|
+
| |
|
554
|
+
| CON [MID=1235], GET, /status, 2/1/0/64 ------> |
|
555
|
+
| |
|
556
|
+
| <------ ACK [MID=1235], 2.05 Content, 2/1/1/64 |
|
557
|
+
: :
|
558
|
+
: ... :
|
559
|
+
: :
|
560
|
+
| CON [MID=1238], GET, /status, 2/4/0/64 ------> |
|
561
|
+
| |
|
562
|
+
| <------ ACK [MID=1238], 2.05 Content, 2/4/1/64 |
|
563
|
+
| |
|
564
|
+
| CON [MID=1239], GET, /status, 2/5/0/64 ------> |
|
565
|
+
| |
|
566
|
+
| <------ ACK [MID=1239], 2.05 Content, 2/5/0/64 |
|
567
|
+
]]></artwork></figure>
|
568
|
+
|
569
|
+
<t>In the third example (<xref target="late-get"/>), the client is surprised by the
|
570
|
+
need for a blockwise transfer, and unhappy with the size chosen
|
571
|
+
unilaterally by the server. As it did not send a size proposal
|
572
|
+
initially, the negotiation only influences the size from the second
|
573
|
+
message exchange onward. Since the client already obtained both the first and
|
574
|
+
second 64-byte block in the first 128-byte exchange, it goes on
|
575
|
+
requesting the third 64-byte block ("2/0/64"). None of this is (or
|
576
|
+
needs to be) understood by the server, which simply responds to the
|
577
|
+
requests as it best can.</t>
|
578
|
+
|
579
|
+
<figure title="Blockwise GET with late negotiation" anchor="late-get"><artwork><![CDATA[
|
580
|
+
CLIENT SERVER
|
581
|
+
| |
|
582
|
+
| CON [MID=1234], GET, /status ------> |
|
583
|
+
| |
|
584
|
+
| <------ ACK [MID=1234], 2.05 Content, 2/0/1/128 |
|
585
|
+
| |
|
586
|
+
| CON [MID=1235], GET, /status, 2/2/0/64 ------> |
|
587
|
+
| |
|
588
|
+
| <------ ACK [MID=1235], 2.05 Content, 2/2/1/64 |
|
589
|
+
| |
|
590
|
+
| CON [MID=1236], GET, /status, 2/3/0/64 ------> |
|
591
|
+
| |
|
592
|
+
| <------ ACK [MID=1236], 2.05 Content, 2/3/1/64 |
|
593
|
+
| |
|
594
|
+
| CON [MID=1237], GET, /status, 2/4/0/64 ------> |
|
595
|
+
| |
|
596
|
+
| <------ ACK [MID=1237], 2.05 Content, 2/4/1/64 |
|
597
|
+
| |
|
598
|
+
| CON [MID=1238], GET, /status, 2/5/0/64 ------> |
|
599
|
+
| |
|
600
|
+
| <------ ACK [MID=1238], 2.05 Content, 2/5/0/64 |
|
601
|
+
]]></artwork></figure>
|
602
|
+
|
603
|
+
<t>In all these (and the following) cases, retransmissions are handled by
|
604
|
+
the CoAP message exchange layer, so they don't influence the block
|
605
|
+
operations (<xref target="late-get-lost-con"/>, <xref target="late-get-lost-ack"/>).</t>
|
606
|
+
|
607
|
+
<figure title="Blockwise GET with late negotiation and
|
608
|
+
lost CON" anchor="late-get-lost-con"><artwork><![CDATA[
|
609
|
+
CLIENT SERVER
|
610
|
+
| |
|
611
|
+
| CON [MID=1234], GET, /status ------> |
|
612
|
+
| |
|
613
|
+
| <------ ACK [MID=1234], 2.05 Content, 2/0/1/128 |
|
614
|
+
| |
|
615
|
+
| CON [MID=1235], GE///////////////////////// |
|
616
|
+
| |
|
617
|
+
| (timeout) |
|
618
|
+
| |
|
619
|
+
| CON [MID=1235], GET, /status, 2/2/0/64 ------> |
|
620
|
+
| |
|
621
|
+
| <------ ACK [MID=1235], 2.05 Content, 2/2/1/64 |
|
622
|
+
: :
|
623
|
+
: ... :
|
624
|
+
: :
|
625
|
+
| CON [MID=1238], GET, /status, 2/5/0/64 ------> |
|
626
|
+
| |
|
627
|
+
| <------ ACK [MID=1238], 2.05 Content, 2/5/0/64 |
|
628
|
+
]]></artwork></figure>
|
629
|
+
|
630
|
+
<figure title="Blockwise GET with late negotiation and
|
631
|
+
lost ACK" anchor="late-get-lost-ack"><artwork><![CDATA[
|
632
|
+
CLIENT SERVER
|
633
|
+
| |
|
634
|
+
| CON [MID=1234], GET, /status ------> |
|
635
|
+
| |
|
636
|
+
| <------ ACK [MID=1234], 2.05 Content, 2/0/1/128 |
|
637
|
+
| |
|
638
|
+
| CON [MID=1235], GET, /status, 2/2/0/64 ------> |
|
639
|
+
| |
|
640
|
+
| //////////////////////////////////tent, 2/2/1/64 |
|
641
|
+
| |
|
642
|
+
| (timeout) |
|
643
|
+
| |
|
644
|
+
| CON [MID=1235], GET, /status, 2/2/0/64 ------> |
|
645
|
+
| |
|
646
|
+
| <------ ACK [MID=1235], 2.05 Content, 2/2/1/64 |
|
647
|
+
: :
|
648
|
+
: ... :
|
649
|
+
: :
|
650
|
+
| CON [MID=1238], GET, /status, 2/5/0/64 ------> |
|
651
|
+
| |
|
652
|
+
| <------ ACK [MID=1238], 2.05 Content, 2/5/0/64 |
|
653
|
+
]]></artwork></figure>
|
654
|
+
|
655
|
+
<t>The following examples demonstrate a PUT exchange; a POST exchange
|
656
|
+
looks the same, with different requirements on atomicity/idempotence.
|
657
|
+
To ensure that the blocks relate to the same version of the resource
|
658
|
+
representation carried in the request, the client in
|
659
|
+
<xref target="simple-put-atomic"/> sets the Token to
|
660
|
+
"v17" in all requests. Note that, as with the GET, the responses to
|
661
|
+
the requests that have a more bit in the request Block2 Option are
|
662
|
+
provisional; only the final response tells the client that the PUT
|
663
|
+
succeeded.</t>
|
664
|
+
|
665
|
+
<figure title="Simple atomic blockwise PUT" anchor="simple-put-atomic"><artwork><![CDATA[
|
666
|
+
CLIENT SERVER
|
667
|
+
| |
|
668
|
+
| CON [MID=1234], PUT, /options, v17, 1/0/1/128 ------> |
|
669
|
+
| |
|
670
|
+
| <------ ACK [MID=1234], 2.04 Changed, 1/0/1/128 |
|
671
|
+
| |
|
672
|
+
| CON [MID=1235], PUT, /options, v17, 1/1/1/128 ------> |
|
673
|
+
| |
|
674
|
+
| <------ ACK [MID=1235], 2.04 Changed, 1/1/1/128 |
|
675
|
+
| |
|
676
|
+
| CON [MID=1236], PUT, /options, v17, 1/2/0/128 ------> |
|
677
|
+
| |
|
678
|
+
| <------ ACK [MID=1236], 2.04 Changed, 1/2/0/128 |
|
679
|
+
]]></artwork></figure>
|
680
|
+
|
681
|
+
<t>A stateless server that simply builds/updates the resource in place
|
682
|
+
(statelessly) may indicate this by not setting the more bit in the
|
683
|
+
response (<xref target="simple-put-stateless"/>); in this case, the response codes are valid separately for
|
684
|
+
each block being updated. This is of course only an acceptable
|
685
|
+
behavior of the server if the potential inconsistency present during
|
686
|
+
the run of the message exchange sequence does not lead to problems,
|
687
|
+
e.g. because the resource being created or changed is not yet or not currently in
|
688
|
+
use.</t>
|
689
|
+
|
690
|
+
<figure title="Simple stateless blockwise PUT" anchor="simple-put-stateless"><artwork><![CDATA[
|
691
|
+
CLIENT SERVER
|
692
|
+
| |
|
693
|
+
| CON [MID=1234], PUT, /options, v17, 1/0/1/128 ------> |
|
694
|
+
| |
|
695
|
+
| <------ ACK [MID=1234], 2.04 Changed, 1/0/0/128 |
|
696
|
+
| |
|
697
|
+
| CON [MID=1235], PUT, /options, v17, 1/1/1/128 ------> |
|
698
|
+
| |
|
699
|
+
| <------ ACK [MID=1235], 2.04 Changed, 1/1/0/128 |
|
700
|
+
| |
|
701
|
+
| CON [MID=1236], PUT, /options, v17, 1/2/0/128 ------> |
|
702
|
+
| |
|
703
|
+
| <------ ACK [MID=1236], 2.04 Changed, 1/2/0/128 |
|
704
|
+
]]></artwork></figure>
|
705
|
+
|
706
|
+
<t>Finally, a server receiving a blockwise PUT or POST may want to indicate a
|
707
|
+
smaller block size preference (<xref target="simple-put-atomic-nego"/>).
|
708
|
+
In this case, the client SHOULD continue with a smaller block size; if
|
709
|
+
it does, it MUST adjust the block number to properly count in that smaller size.</t>
|
710
|
+
|
711
|
+
<figure title="Simple atomic blockwise PUT with
|
712
|
+
negotiation" anchor="simple-put-atomic-nego"><artwork><![CDATA[
|
713
|
+
CLIENT SERVER
|
714
|
+
| |
|
715
|
+
| CON [MID=1234], PUT, /options, v17, 1/0/1/128 ------> |
|
716
|
+
| |
|
717
|
+
| <------ ACK [MID=1234], 2.04 Changed, 1/0/1/32 |
|
718
|
+
| |
|
719
|
+
| CON [MID=1235], PUT, /options, v17, 1/4/1/32 ------> |
|
720
|
+
| |
|
721
|
+
| <------ ACK [MID=1235], 2.04 Changed, 1/4/1/32 |
|
722
|
+
| |
|
723
|
+
| CON [MID=1236], PUT, /options, v17, 1/5/1/32 ------> |
|
724
|
+
| |
|
725
|
+
| <------ ACK [MID=1235], 2.04 Changed, 1/5/1/32 |
|
726
|
+
| |
|
727
|
+
| CON [MID=1237], PUT, /options, v17, 1/6/0/32 ------> |
|
728
|
+
| |
|
729
|
+
| <------ ACK [MID=1236], 2.04 Changed, 1/6/0/32 |
|
730
|
+
]]></artwork></figure>
|
731
|
+
|
732
|
+
</section>
|
733
|
+
<section anchor="http-mapping" title="HTTP Mapping Considerations">
|
734
|
+
|
735
|
+
<t>In this subsection, we give some brief examples for the influence the
|
736
|
+
Block options might have on intermediaries that map between CoAP and
|
737
|
+
HTTP.</t>
|
738
|
+
|
739
|
+
<t>For mapping CoAP requests to HTTP, the intermediary may want to map
|
740
|
+
the sequence of block-wise transfers into a single HTTP transfer.
|
741
|
+
E.g., for a GET request, the intermediary could perform the HTTP
|
742
|
+
request once the first block has been requested and could then fulfill
|
743
|
+
all further block requests out of its cache.
|
744
|
+
A constrained implementation may not be able to cache the entire
|
745
|
+
object and may use a combination of TCP flow control and (in
|
746
|
+
particular if timeouts occur) HTTP range requests to obtain the
|
747
|
+
information necessary for the next block transfer at the right time.</t>
|
748
|
+
|
749
|
+
<t>For PUT or POST requests, there is more variation in how HTTP servers
|
750
|
+
might implement ranges. Some WebDAV servers do, but in general the
|
751
|
+
CoAP-to-HTTP intermediary will have to try sending the payload of all
|
752
|
+
the blocks of a block-wise transfer within one HTTP request. If
|
753
|
+
enough buffering is available, this request can be started when the
|
754
|
+
last CoAP block is received. A constrained implementation may want to
|
755
|
+
relieve its buffering by already starting to send the HTTP request at
|
756
|
+
the time the first CoAP block is received; any HTTP 408 status code
|
757
|
+
that indicates that the HTTP server became impatient with the
|
758
|
+
resulting transfer can then be mapped into a CoAP 4.08 response code
|
759
|
+
(similarly, 413 maps to 4.13).</t>
|
760
|
+
|
761
|
+
<t>For mapping HTTP to CoAP, the intermediary may want to map a single
|
762
|
+
HTTP transfer into a sequence of block-wise transfers.
|
763
|
+
If the HTTP client is too slow delivering a request body on a PUT or
|
764
|
+
POST, the CoAP server might time out and return a 4.08
|
765
|
+
response code, which in turn maps well to an HTTP 408 status code
|
766
|
+
(again, 4.13 maps to 413).
|
767
|
+
HTTP range requests received on the HTTP side may be served out of a
|
768
|
+
cache and/or mapped to GET
|
769
|
+
requests that request a sequence of blocks overlapping the range.</t>
|
770
|
+
|
771
|
+
<t>(Note that, while the semantics of CoAP 4.08 and HTTP 408 differ, this
|
772
|
+
difference is largely due to the different way the two protocols are
|
773
|
+
mapped to transport. HTTP has an underlying TCP connection, which
|
774
|
+
supplies connection state, so a HTTP 408 status code can immediately
|
775
|
+
be used to indicate that a timeout occurred during transmitting a
|
776
|
+
request through that active TCP connection.
|
777
|
+
The CoAP 4.08 response code indicates one or more missing blocks,
|
778
|
+
which may be due to timeouts or resource constraints; as there is no
|
779
|
+
connection state, there is no way to deliver such a response
|
780
|
+
immediately; instead, it is delivered on the next block transfer.
|
781
|
+
Still, HTTP 408 is probably the best mapping back to HTTP, as the
|
782
|
+
timeout is the most likely cause for a CoAP 4.08.
|
783
|
+
Note that there is no way to distinguish a timeout from a missing
|
784
|
+
block for a server without creating additional state, the need for
|
785
|
+
which we want to avoid.)</t>
|
786
|
+
|
787
|
+
</section>
|
788
|
+
<section anchor="iana-considerations" title="IANA Considerations">
|
789
|
+
|
790
|
+
<t>This draft adds the following option numbers to the CoAP Option
|
791
|
+
Numbers registry of
|
792
|
+
<xref target="I-D.ietf-core-coap"/>:</t>
|
793
|
+
|
794
|
+
<texttable title="CoAP Option Numbers" anchor="tab-option-registry">
|
795
|
+
<ttcol align='right'>Number</ttcol>
|
796
|
+
<ttcol align='left'>Name</ttcol>
|
797
|
+
<ttcol align='left'>Reference</ttcol>
|
798
|
+
<c>17</c>
|
799
|
+
<c>Block2</c>
|
800
|
+
<c>&SELF;</c>
|
801
|
+
<c>19</c>
|
802
|
+
<c>Block1</c>
|
803
|
+
<c>&SELF;</c>
|
804
|
+
</texttable>
|
805
|
+
|
806
|
+
<t>This draft adds the following response code to the CoAP Response Codes registry of
|
807
|
+
<xref target="I-D.ietf-core-coap"/>:</t>
|
808
|
+
|
809
|
+
<texttable title="CoAP Response Codes" anchor="tab-response-code-registry">
|
810
|
+
<ttcol align='right'>Code</ttcol>
|
811
|
+
<ttcol align='left'>Description</ttcol>
|
812
|
+
<ttcol align='left'>Reference</ttcol>
|
813
|
+
<c>136</c>
|
814
|
+
<c>4.08 Request Entity Incomplete</c>
|
815
|
+
<c>&SELF;</c>
|
816
|
+
</texttable>
|
817
|
+
|
818
|
+
</section>
|
819
|
+
<section anchor="security-considerations" title="Security Considerations">
|
820
|
+
|
821
|
+
<t>Providing access to blocks within a resource may lead to
|
822
|
+
surprising vulnerabilities.
|
823
|
+
Where requests are not implemented atomically, an attacker may be able
|
824
|
+
to exploit a race condition or confuse a server by inducing it to use
|
825
|
+
a partially updated resource representation.
|
826
|
+
Partial transfers may also make certain problematic data invisible to
|
827
|
+
intrusion detection systems; it is RECOMMENDED that an intrusion
|
828
|
+
detection system (IDS) that analyzes resource representations transferred by
|
829
|
+
CoAP implement the Block options to gain access to entire resource representations.
|
830
|
+
Still, approaches such as transferring even-numbered blocks on one path and odd-numbered
|
831
|
+
blocks on another path, or even transferring blocks multiple times
|
832
|
+
with different content and
|
833
|
+
obtaining a different interpretation of temporal order at the IDS than
|
834
|
+
at the server, may prevent an IDS from seeing the whole picture.
|
835
|
+
These kinds of attacks are well understood from IP fragmentation and
|
836
|
+
TCP segmentation; CoAP does not add fundamentally new considerations.</t>
|
837
|
+
|
838
|
+
<t>Where access to a resource is only granted to clients making use of a specific security
|
839
|
+
association, all blocks of that resource MUST be subject to the same
|
840
|
+
security checks; it MUST NOT be possible for unprotected exchanges to
|
841
|
+
influence blocks of an otherwise protected resource.
|
842
|
+
As a related consideration, where object security is employed,
|
843
|
+
PUT/POST should be implemented in the atomic fashion, unless the
|
844
|
+
object security operation is performed on each access and the
|
845
|
+
creation of unusable resources can be tolerated.</t>
|
846
|
+
|
847
|
+
<section anchor="mitigating-exhaustion-attacks" title="Mitigating Resource Exhaustion Attacks">
|
848
|
+
|
849
|
+
<t>Certain blockwise requests may induce the server to create state, e.g. to
|
850
|
+
create a snapshot for the blockwise GET of a fast-changing resource
|
851
|
+
to enable consistent access to the same
|
852
|
+
version of a resource for all blocks, or to create temporary
|
853
|
+
resource representations that are collected until pressed into
|
854
|
+
service by a final PUT or POST with the more bit unset.
|
855
|
+
All mechanisms that induce a server to create state that cannot simply
|
856
|
+
be cleaned up create opportunities for denial-of-service attacks.
|
857
|
+
Servers SHOULD avoid being subject to resource exhaustion based on state
|
858
|
+
created by untrusted sources.
|
859
|
+
But even if this is done, the mitigation may cause a denial-of-service
|
860
|
+
to a legitimate request when it is drowned out by other state-creating
|
861
|
+
requests.
|
862
|
+
Wherever possible, servers should therefore minimize the opportunities
|
863
|
+
to create state for untrusted sources, e.g. by using stateless approaches.</t>
|
864
|
+
|
865
|
+
<t>Performing segmentation at the application layer is almost always
|
866
|
+
better in this respect than at the transport layer or lower (IP fragmentation,
|
867
|
+
adaptation layer fragmentation), e.g. because there is application
|
868
|
+
layer semantics that can be used for mitigation or because lower
|
869
|
+
layers provide security associations that can prevent attacks.
|
870
|
+
However, it is less common to apply timeouts and keepalive mechanisms
|
871
|
+
at the application layer than at lower layers. Servers MAY want to
|
872
|
+
clean up accumulated state by timing it out (cf. response code 4.08), and
|
873
|
+
clients SHOULD be prepared to run blockwise transfers in an expedient
|
874
|
+
way to minimize the likelihood of running into such a timeout.</t>
|
875
|
+
|
876
|
+
</section>
|
877
|
+
<section anchor="mitigating-amplification-attacks" title="Mitigating Amplification Attacks">
|
878
|
+
|
879
|
+
<t><xref target="I-D.ietf-core-coap"/> discusses the susceptibility of
|
880
|
+
CoAP end-points for use in amplification attacks.</t>
|
881
|
+
|
882
|
+
<t>A CoAP server can reduce the amount of amplification it provides to an
|
883
|
+
attacker by offering large resource representations only in relatively
|
884
|
+
small blocks. With this, e.g., for a 1000 byte resource, a 10-byte request might
|
885
|
+
result in an 80-byte response (with a 64-byte block) instead of a
|
886
|
+
1016-byte response, considerably reducing the amplification provided.</t>
|
887
|
+
|
888
|
+
</section>
|
889
|
+
</section>
|
890
|
+
<section anchor="acknowledgements" title="Acknowledgements">
|
891
|
+
|
892
|
+
<t>Much of the content of this draft is the result of
|
893
|
+
discussions with the <xref target="I-D.ietf-core-coap"/> authors, and via many CoRE
|
894
|
+
WG discussions. Tokens were suggested by Gilman Tolle and refined by
|
895
|
+
Klaus Hartke.</t>
|
896
|
+
|
897
|
+
<t>Charles Palmer provided extensive editorial comments to a previous
|
898
|
+
version of this draft, some of which the authors hope to have covered
|
899
|
+
in this version.</t>
|
900
|
+
|
901
|
+
</section>
|
902
|
+
|
903
|
+
|
904
|
+
</middle>
|
905
|
+
|
906
|
+
<back>
|
907
|
+
|
908
|
+
<references title='Normative References'>
|
909
|
+
|
910
|
+
&RFC2119;
|
911
|
+
&RFC2616;
|
912
|
+
&I-D.ietf-core-coap;
|
913
|
+
|
914
|
+
|
915
|
+
</references>
|
916
|
+
|
917
|
+
<references title='Informative References'>
|
918
|
+
|
919
|
+
<reference anchor="REST" >
|
920
|
+
<front>
|
921
|
+
<title>Architectural Styles and the Design of Network-based Software Architectures</title>
|
922
|
+
<author initials="R." surname="Fielding" fullname="Roy Fielding">
|
923
|
+
<organization>University of California, Irvine</organization>
|
924
|
+
</author>
|
925
|
+
<date year="2000"/>
|
926
|
+
</front>
|
927
|
+
</reference>
|
928
|
+
|
929
|
+
|
930
|
+
</references>
|
931
|
+
|
932
|
+
|
933
|
+
<section anchor="compat" title="Historical Note">
|
934
|
+
|
935
|
+
<t>(This appendix to be deleted by the RFC editor.)</t>
|
936
|
+
|
937
|
+
<t>An earlier version of this draft used a single option:</t>
|
938
|
+
|
939
|
+
<texttable>
|
940
|
+
<ttcol align='right'>Type</ttcol>
|
941
|
+
<ttcol align='left'>C/E</ttcol>
|
942
|
+
<ttcol align='left'>Name</ttcol>
|
943
|
+
<ttcol align='left'>Format</ttcol>
|
944
|
+
<ttcol align='left'>Length</ttcol>
|
945
|
+
<ttcol align='left'>Default</ttcol>
|
946
|
+
<c>13</c>
|
947
|
+
<c>Critical</c>
|
948
|
+
<c>Block</c>
|
949
|
+
<c>uint</c>
|
950
|
+
<c>1-3 B</c>
|
951
|
+
<c>0 (see below)</c>
|
952
|
+
</texttable>
|
953
|
+
|
954
|
+
<t>Note that this option number has since been reallocated in
|
955
|
+
<xref target="I-D.ietf-core-coap"/>; no backwards compatibility is provided after
|
956
|
+
July 1st, 2011.</t>
|
957
|
+
|
958
|
+
</section>
|
959
|
+
|
960
|
+
|
961
|
+
</back>
|
962
|
+
|
963
|
+
<!-- ##markdown-source:
|
964
|
+
H4sIAMEV/FkAA+19aXcbx5Xo9/oV9ehzJoANQARJbVQyZyiKsvmihSNRcZKZ
|
965
|
+
OVYBKBAdNbrxuhukYEn57XO32hoNSY5jO8kzc2KRQHctt+6+1XA4VE3W5PZY
|
966
|
+
P8zL6ZubrLa6qUxRz21V66zQp+XJhfpCm8mkstfH9OeQHlWzclqYJbw5q8y8
|
967
|
+
GWa2mQ+nZWWHE/x6uH9bzUwDXx/sjw+G++Ph+BDGST5K/lbwV92YYvadycsC
|
968
|
+
PmyqtVUqW1X0a90c7O/f3z9QprLmWJ+sVnk2NU1WFrW6ucKFvTjT35bVm6y4
|
969
|
+
0l9X5Xql3twc6/OisVVhm+EjXKSCN45hlplS03IGTx7rdT009TTL1Co71vDz
|
970
|
+
hZ6aAj612lSV2eheNtcmz/XG1n1dVnph6oVe2MrCcvVQN+WUf6nLqqnsvJa/
|
971
|
+
Nkv6Q+MDx/gy/OoeOaZpZnZu1nlTwxPue36JH1dm3SzK6lhp+hnKvxrOBJ44
|
972
|
+
HemHZbU0ReE/57M4NVXd2GLr27KCvb4qsms41qwxttEPK7uEBy//fO4fCsec
|
973
|
+
flrDsm1zHH0y1Bdl3czNdKEPD/ePjvaT7x5mkzwrm4V9A2+O9Nh/KQPtfHma
|
974
|
+
NZtjWVn4sJzBxh4ND+4d3r4ffboumgqe/triTjf+i9WCsOero/vDo4Px8GB8
|
975
|
+
b3jn8P5BWARMXGfLLG89dHd/PyzELk2WHwMqTMr/aL7PRgC+7oP480i/XNh8
|
976
|
+
smmdw59xd61v6Axe2qLOCtiS/7gqcSl2ljVltQWp32cz+2b9F6MPWkD6w7p8
|
977
|
+
Y5oma4Hp3r070TY8kB5nRQ6k1QbS3leHt+8d7d+9e//Owf27e+3tfw+b+I/a
|
978
|
+
LXg0LZdKFYhYDeDRMWK6wERX8+nBeHy//dGd8Z34o/Pho1FgE9PSrGDGF49P
|
979
|
+
8dVj+RVewV+3Hz0GXlDMw+zw+NnLS0ZKYWEn1XSRNXbarCuT65fNJre1hm1r
|
980
|
+
QEX9yNbZVaHLuX5mmxtgFMOJqe1MvyznzQ0wlfhtIketHQl+0Xn0L0YAVpsj
|
981
|
+
G2kd/otys/1VSoEbXMipyTPYUZGZgT6vrrOCkcLxRDhIZYsGj9uP8vLsyWM4
|
982
|
+
t/8CUP0Rfv5nD9nmcDjURdnY787PXn793TP4TX0BH09y4/6vFD5jJoBWZtoo
|
983
|
+
pZCP6wygQ1Ccr3PP9fWqKoFplbmGpQEGFfgOLG2mEQkYngVDsB6ph6bOpiQV
|
984
|
+
9NLWtbmCJ/ArfWNzHgFhXy+Rha7MJi/NDB6w2r5dAaTVvCqXurHLla0Mwl0j
|
985
|
+
tpVVPdB5drVodH2TNdOFhb9xWiJbU6nJOiPYDuGAyiUJAWCn19nUwoqeT6ew
|
986
|
+
prKAGTcDvShvLEAc3o8Ehr7JYDmFhT0B83UbVzD0Fe7fLRNBhjuA0wa5NLUD
|
987
|
+
+mueVUvCl/UKD6oe6W+zZqG+uby8GOjL0ws9KwEGuOurCqiPoQGHXcP0KJto
|
988
|
+
ljAJyKmsgFUsQRZkqxy/mb6xDcMZgLGu8KVmYRocc0OyCCQToBE+gdIQRFIx
|
989
|
+
y2EvIK1x2oogV1YzW43CQTOyI6BMY64qs+R9r0Am1bpeA7cytX716AJl3KPL
|
990
|
+
Jy8H6maRwac5wLzh/SzN22y5XsIxfG9xR0Am5bqawox2Bb8Dqgp4cbUKxegk
|
991
|
+
KBMVzA6HuSjXsJES9wuDzytztXTvjdRJjt9fLWgd9XrFi2sfS7Oo6KHzC5W8
|
992
|
+
P9BZgzulFfPR3jkCBvoQATXQS2AkOlvimKZoADcUHlTxmwaWj7jSQtsY8RPc
|
993
|
+
QagH/Ffn8Jg1M4ZHvsHDAiCfX+jW2poFLK0GpM/mMpSyb0FSz+hoHA0hhIAm
|
994
|
+
VyarcMQ90rT2dLmiuQkBlYcozuXRhpSuGl/yXBLWQfRl/Emp9KQQY/wAlf1/
|
995
|
+
a1s3Q/h+BXNZWgRg9zk8g/LVgw6kYo0UiShB63PLA3Q1ExjJABVXQHR4AoQB
|
996
|
+
63yjgIQaC/wYGCdxBH4CkYTRV1uUmLSLQJG1XZkK3wNKJtAUJZMtnpDBMyqA
|
997
|
+
i+BOatusV4i7qHbgizj8sAbpCXwJjp74Lez9OivXdWsaPkZAuOXSVJuujQFL
|
998
|
+
vMahjF5mRQbMTN+AatiU/iwckrYpAQBseLYhqdZz0B4J1ZkhL7MZbB1nb6py
|
999
|
+
tuatyM+7L2BWAOey/qB+F/0odQnrY3X3a8T3xtRvhLhYgTbVLPsekcMUKtKT
|
1000
|
+
9UXM2E8j/BaBWN96hhx+QKg4gmmyOgiDDDeD+MqU5SDipMe7d/jbhw90sMiI
|
1001
|
+
USCpdZFnb6xG3ohPsHj/8IF4C6Ec7JnZm4XDXAIavhXRmOEfnnyQNxFlGuZE
|
1002
|
+
woGU45X27RSw6Ip5IHE+XOPSwNzweG3DqkCxx+XSuSyAUQJmJiKOIYErgBeX
|
1003
|
+
tc2v4SV+cFsWjhQDqZz8BdHwmokoAwxAiqNHG56qWC8nlki6Lpe2yUBW4nBz
|
1004
|
+
OJsGAQDoVIOCMwwgaQEggk6yRURHBAZqfwSWQTyIiGT6ou5+EcEZVueYFuo/
|
1005
|
+
SGhCakSbbrAeypl1VTCI34ZhEF/NJMv5CGGEmc1R3dkION0IfSYxs0TtlL5D
|
1006
|
+
KlpmNYptvQKJXcnkMIZT35D3E3PloYTJgw5XzG6yGaA+YkBh82T/chy0I2TL
|
1007
|
+
+KYtrrOqLPAzL/eAbJBx1aCBw/oGMO1VWYK+QUyTmCqscFYuC9gAMhnAoorI
|
1008
|
+
AbUpOh6z4p1nhBU/VOgCdwvCFlepfpCs1duyVjlZOwXpRii2LuC3umQWnYNS
|
1009
|
+
lNPG2pJqBLp3ocwMzBGSW0DGpHPsXADpUnMUvajGAO+HyXCGrHgDGtWGJDdS
|
1010
|
+
KU5mdAexuc0vgaVODVneM7Pi4WWEZIUa1g6ii5be9XVGvMed/WykXuGSWg/1
|
1011
|
+
bIaCQrNaFc0oQ5b+K1Az6KM+4rtIOPzcnyRubBf7BwZaAlrDOwrEEyqbHXoU
|
1012
|
+
frYGxlqx+uBxxfPenqCKAlQB4pmseWXJjm7h6dZ2OQFGBS9OEVOdvoTUc0NC
|
1013
|
+
CvZRE2rgQaAlwnsm4cyohFhrG8BslPrmKqiVkRLEAHHcL1Fq0K0Bh1tHSgwR
|
1014
|
+
g5OkAYZfBrH4pTZTWjBI1F14NiKx93liWbfE8s5Bd8tnnKy8RiWLuY7n8Bnt
|
1015
|
+
wVyX2Ux52uoApmCP6DnIRKNpvj67dPoWbKx3TmBHBYtxBWcAKQUnSfPoj82D
|
1016
|
+
GuHF85eXty5eXQ6QKkiW0guEFKvcTIkBxlyklm1McJ3lMps+AIlsK0EBACvY
|
1017
|
+
YyhpmJKYFxPTrix/6I0nmsltU3Wsj7AH3kGlcaCZ6kZ91da4tvAIOFCMROnB
|
1018
|
+
w8SEVbGhsa5FWEVwDhqe1g9tAajZENNb16J1wDMyJlhh03w9syCFv9SX3gMq
|
1019
|
+
hA0TFY7LAq6Wy2WJxh8RR8TShsLSQIAg/xvG/K927wNsUUHnl8kytrJowIUv
|
1020
|
+
9bMSNOJqNmzKIVNg16kjQAnys20OhpM7HhZYZFm1rS3Y5iKACMESqeDoGpi+
|
1021
|
+
KcobMCyv8PCJalmmxuIaJsvmEa/9Uj8sUQ/N0FWwMNdkDZiNYyI8eM0aA6wc
|
1022
|
+
xOeajS+UInKKbmmArWicwJxOv4NFVWgp1ETlxDNJ45UDZUCT0mDyzfek6ZS5
|
1023
|
+
cwGB3g+rbKwwG0doMztZX13B6zjt+TzG9hbW4fmZvC49thlHR44RsZaAC3D8
|
1024
|
+
jNWZYTkfAmLQxmfOVEM2TPxnB3casab/xpJpCtSw9/TVy8u9Af+rnz2n31+c
|
1025
|
+
/eer8xdnj/D3l9+cPHnif+EnFPzx/NUT+R5/C2+ePn/69OzZI3756cmf9tjN
|
1026
|
+
svf84vL8+bOTJ3uOetHXvyYmgvBnxkHqD6y3YUDAeU+rbMJYDZq+RqfeQD88
|
1027
|
+
vdDjI8XKP3wCFgJOkRUzJHQba2hOKWHrG9TdDI1Nij+kyrDYa8Q03ML4vGBF
|
1028
|
+
S7032TR2D0+GDgmWg1QPqKyn6xr9RaCQopvJKoMcpt4UZbFZ0rR75bSxzR6M
|
1029
|
+
/y3xukmGO4ZzQp19ikPat8BQkdQH6fw4F4ta4JhMhnOzBI3QVGyEi4KMgn3J
|
1030
|
+
bqDiao3UfTpA9Larxjt5dEnuMFzPf3/531/uKcJxBgzMXxboFHQo8rCD2yX2
|
1031
|
+
YrAbT2C5WQ1AqINUzyLL03F4PGPSf1lhJDQOmikRr9NR6hYD9J5BYqOTTaLv
|
1032
|
+
eMWGhuj91blncF+o2YQ3AJkyRjQWgG0lVfeeXr5CjjU+uLdP759fXN/5yABb
|
1033
|
+
+l1ruDv7wyGMhJiDpg+OeOdJ+e3FybM+4cJHyJRcTttSAjB4jv4S0MdU7AMT
|
1034
|
+
uIs3i5ViUZlJpDkgASkm7CcRc7AvT0GmS+CBvIPT9i4zflfhmvUE+TOpgE4D
|
1035
|
+
IYqUT9j3U3f6q4TLAT4gKxPXjOeO3k6cAeTZKkKXi+zTL0xIFxWXHLRS2HlM
|
1036
|
+
uvL4XiIPvBuZpQVqGY0oNCnsxL4ENWhkR+E7FjoTi9746CjI7nDKPDOOcrbZ
|
1037
|
+
MTWSXGV3KZKR6kyKRXre8Qmp4AFCx1pZe3caGlkiGbZHYX8Xrs8vjw0HVZsl
|
1038
|
+
2/dw5JephBX1bZ69RaGzcSyIbAp8ugTZYlc0yra7paaP8DenlXaJRHHSgomL
|
1039
|
+
yqpiP3+FopoOP5Z9YWHox0SWeIDc7Uj3xnfItqI/x/uqN94/OOozLTIew74z
|
1040
|
+
MsMxssm+e9gXmoEw6ywj0UvWJ25lx6R6uijhvAbBf0QqLA40weMEzPXUqcCE
|
1041
|
+
MXIaD0DjwhmZHvA9dwBXGdqh4pGKJiLzlBy1iOVhJJHnDMDnAkD97gtGDobo
|
1042
|
+
B3QLJj9KvdeXm5XV7/XprTN2Db7Xz/DU8ZfH5OqFX57Y4goo+L1+xHFl8SK+
|
1043
|
+
V+95nOOvwphffcYv8gPvwyjj+zg9CEJgBTn8SnsYwy9r9HDhOsbDQ/0Qf9kH
|
1044
|
+
a9UCPCwQd1/L63c7Xj/4rNffHesEQEP2VdUc8vvdXgxN/Yy/2/sAYhG5nCwT
|
1045
|
+
2ZtMGatyqIozDTNPhLMXjkg+fu8Hd3Et8oyIBSPmjCeIsVsCGk4gCWux9ZUb
|
1046
|
+
URjbwPuzZEHdr+nICU/vAe58Y30Iin1pzaKc1WJvE+a+e7cdNf3wYeBWCGqc
|
1047
|
+
eD+J10dSaDixhqIJaEjSCsGYTMUDPJ1VHiZkT/EGMu9TpVHBsh3QMIPOcRSN
|
1048
|
+
szWvH1f3Dkb744GG/x7Qf4/ov7cpFgeIASKMRcvehZMUwGe6N94HoPVOUMWT
|
1049
|
+
CIDJZpLm8t34uy2QRxIZ//xuXDfwkKkaJZ9sBUicVSLyJnpmEHDuu4Pv1Kem
|
1050
|
+
OihmPJXeMZXqnIq/G/WdturP2eO1mBeMgoA47sxEneFt9HBIGLhQJMWcm3d7
|
1051
|
+
reymAzXQ7adPETdRRADQqkMTIUg446DGeCyz0uhRNwVaxbWK4cBSl+XetlDs
|
1052
|
+
7fG4K3LMrHHVe3DoDAyOBUaAYMUahBmagF5HoaChV2yc21OUjKrM0XnLazae
|
1053
|
+
iL0EEDMeAHtjaud1o4W5t/2i1HkqYdHaZk4SC9R2lGXi1CuTj9Q3LpR9g/ro
|
1054
|
+
1v5MWwdqNNmJxOZkZarnuQcfcmXRr2Vn/QeKdP956UEHAAHozzM274yeOv7N
|
1055
|
+
KyJpVll82i634o7oy3UuolYQmJbKGWQ8EntcQlQnkqe9l3/+IyztS9wyAYuC
|
1056
|
+
uKIloZnilUiwCOhBpoycckSiuEY05LNXT/vB9q6ROICx4kM8Lqj/nj+yiCft
|
1057
|
+
ioX3tcnXfo3hzAwIMGBUQ0SFwyFqLnSMaBMw0cAUGDBS7HJqCHBzzBABXQjl
|
1058
|
+
3bt3NPmHDzCPjn7207/0WB/oQ32kb+s7+m783VfD1v/iL0EGw67h36fvNUAU
|
1059
|
+
xOpH32zNuf0z/tiq9D19P/7so3N9YtXuh1bvP/+sXfwNu+r47OCH7LT92Q9a
|
1060
|
+
32dCohskPwoyWzN7nStVsgTdiQRQxVLb5gajuTAMwvIhulDWBaZeEe0zUfTY
|
1061
|
+
aBcDABM1lP97LGZ438WFbkB3N6SBW/0atvcaVETSs8UV0n9AmhYbh60FNcgq
|
1062
|
+
Xx98+SVyEv2VPuq/BtUFf8cvt8xyxZSZWwPyEtdMxi8qiOI4jsieWYEIz9fw
|
1063
|
+
l/43ffe1+NHx79eygC6m0Rd+MgdrEnhN54SsXj5FnrKHfG+P3FE9mere6/5A
|
1064
|
+
Bdn7aQYpnH+6hv3iBMEk9aJa1pvjYiKjOQaUrDuBAVtgZGLW2dvGAsh7OA6i
|
1065
|
+
KDG5vhvZcVvVxZllZXmHqB+g27tqOIxXLtX3tipHJDPcdlp7EElmJqXEyl4j
|
1066
|
+
RrwWB48fDGQ6MevXuNTf/lYnWNLDRDoS/ANC6KIVk+doR5GxXv66x+fy1/23
|
1067
|
+
j/s0lqBE/3WktCVwQzGjPMCPGMmWnM0B64ZNL7K5ZDLRY3beODve4xSseKBQ
|
1068
|
+
TokditshJUe0DA9f1BMvyTXG9qEfgYyfyJLptlAArgh1j3NxVlqKVO6w51nF
|
1069
|
+
phR7B/g78Vr44+rxx4IP+wPAd8RyNMtri6TtE/ii6JNCL2w2zRqhc/QVOxdH
|
1070
|
+
Vqc7BIR9iqjgXVm5SybyOmF0JORSEjh4fVkxCAaiOZkiykOQt1mW6yzYY6YW
|
1071
|
+
2kNXKKDXsRLbQ6zUUeStkd2TInENFhHGR4fsJAX7ZwyWEDLHfYRMH1j7NjtF
|
1072
|
+
O5oViZPVCrTH7K0++YhhhEGb+BRb62DyE7OB9VvRkGcj0dy0P7FI/w+H7s+a
|
1073
|
+
fVZ4Brh/OojHuQFtDQ848Jn+CB0ZekudFzfkHF7B2Cbv3TaDZFLBQaecu4Cj
|
1074
|
+
U3G3mBrtnncNa3vA6jSMmhozblzxh4OkQTgge8XwjrcTPK+9NlmO5waMQ/zF
|
1075
|
+
W/TjwhEGRnBGGZA2BtQyy5EyQdL0PLbMCZEMMMwk0vLJEDBMphxkuSrKivNP
|
1076
|
+
wNqxK0nv6J371aEi59YX24RO9CDg/coTpzNFjbNmQ1iHC0GHDbIY4Ed41ILr
|
1077
|
+
L8kxua0ofFQ7aOGmMwuMS9srsawCT5ySGpAQb0ga+MQ+euN3rE54li7+UYM0
|
1078
|
+
SZlFRPG18FA65H1SRZhdC7VjXsF62Vo9D7z/1VEfZhnfibKUXKjDP3RHHto/
|
1079
|
+
OBopXgFzmrukAeHMPVFzynU+23Lr+90f7B/dQzlKuEPh9pnIFRcNDDgAi6EP
|
1080
|
+
c0xMpaSco9H+vn4If71gvONR2P6n1LH1KsaSxHGQ+C2dA40SoAWfiTbmYtVg
|
1081
|
+
NQOnsp0XXQQtrvkWcaQOCTu6AvgjmZDvx3+BEPv67LJP/NC0PG+Jr0OGuHh1
|
1082
|
+
qTDznjxSfcyiH9IReM1EdwmB4K24QSbQ4tGkWyNBGud323LpBO4z8lOyXNtW
|
1083
|
+
2OaoAFou/Ij0NhdRpxwLyv1rorSjudOdcHnEYN00EdKw8QpCEZGM8AGM8+ki
|
1084
|
+
oamUcfIiUEXymSSy7BoZ5Ej3OqdAZwHI/9xeo+ZKbFrDi8g3kFsj5T32wtSP
|
1085
|
+
7I6qXl9dsZwxLo5Gx0CjiILDgVX7tvFv8X5KwCvc3ay8KZyWFBZGIyAHR6aH
|
1086
|
+
K7fzuZ02LBFQq5OVSI6Oj+C6nAz0aTR83itQKNlQiHbviB7x30vLJJATwjY0
|
1087
|
+
yrrmM6SYTRgI2eYQBPYWTSRsvxPBkRo+gtbpiJGWGKO0qGS0TRetS8JZQRNg
|
1088
|
+
bw4IrHUV4b73RNJCzpOEn4BDC0OJQ/N1wR5cz6WIbZEkJLV+NyqTN8jhS51y
|
1089
|
+
yJ6sBWfl5FOd7nKfqvcqu7Km2QrZbOWG86kjP4SZZ+3Rk5FrTjnn4O8+Gnb+
|
1090
|
+
LMefOssWwwN29/ZtzJoZf9CJLjzMnUXnoQs9t6cOHGcHM+NTjtN95CRjFoAe
|
1091
|
+
TlKSiph6BzEBYVBluihLWLhwNy7OKjFwi1pIlF/UldnPbnpi7o47kqzXrkQg
|
1092
|
+
ZhtpYJZdxKyVsIaPkCs2IMDfOnQg7omaQrox1EYwqSfZnFODYpYtg5BamNXh
|
1093
|
+
kKjeB/XZqamqjWjBqBqmElYCQoxXAjxvFzoIgsUAHKp2UsFLBKCVVW4ogkAj
|
1094
|
+
eEs0gUnYv0epKSU+wwepgHfMtWXuh4A9Mu1TzjujM2qLA+LsNAqFO6Vu5yN4
|
1095
|
+
0lKubeyAiGBC79vCoFOacnZiu00O3UUPfDBNBnDQxvIob44kB0FnQGcnXJQG
|
1096
|
+
QG1549g8M4ESU1i9G5h33YEgv6lTauOzEQa45VpuZemw30pPwXYtWMRioJlh
|
1097
|
+
StVxTvoDhhdr0u0oFzXFjUGCARwVpDHmZRUlVqPtgj55yubmFDYH5ZWthhKg
|
1098
|
+
Rqp/nEnpHI6LwnVb3hecyE38rGv/8TGTSPcIRqNEwnQTY/9c6l9D/XlT3phq
|
1099
|
+
5kDOmRdONnlBCltzEpt4sEMIFMvrJNUJbDbABhdLS8AvqXEsoR2C0TAsIJAP
|
1100
|
+
e72gYAaOee9yFj7GKXP5CiYaQRBh4DPXJdCGBE1rSc1wFmhE85x6wchZAw10
|
1101
|
+
2uuYkFohauSbPmdWIOFQiOaVS3Rtpx2ExAMSSNt5Bz79gIcQ+3fiw+qhJs3n
|
1102
|
+
2WAFkOSucU0ExdjrVZ41rRrHOFIVkjs52UMIns5N7QppkyRh/hUi9FGaqNPl
|
1103
|
+
MHn4puB6jKfy1PmjUZTTxXSDQqCowZx0hVQm5SeUmN+2Wrz/zvOHhBgtk1ww
|
1104
|
+
77ecBqJ57UoqmmzaNK88nnnexCTgrLJitrVKoNkEa5zvFZ+N8I0z5mac5GBS
|
1105
|
+
+S40QtoaqWp+z8Ff5uZTosd57ViIm15mjwTKgsQnAQYm+hbmOfPLFiV4t0nq
|
1106
|
+
nlABzMTRvPqeLGcQ71/2yHVSTn+MfNF+3YC5fn/sawaVLt6I0+R5BPYLCNub
|
1107
|
+
pcxCUrNOQBdJGDcLA3+eyPt89temFNixNw1pj8HnnAMdRgTzFJCeiuCVclaJ
|
1108
|
+
biR6ZRjf+6JwhCvO2Y5BJdnVJnWHwqk9d6fV7eqSNfhzGkghUWCVRsUpeql8
|
1109
|
+
VAxo4BhL0hNT64mPsJU4W1kv5Ei+oU7iswWxpiKTMFKk8vSCBSdWTUvsYx0j
|
1110
|
+
WbEqBARiqsAZKaAQqgq6vBu1hYXMfD6QmRPitk7AFW21aZgz4Z33MM0YaNlg
|
1111
|
+
fXLWyLknUm0HtqaKmht2C4d92VFEd3RCDVZZYvcBp09uB+JiKexTWrLG2Vc1
|
1112
|
+
8oyMMIIldJSGxbkLrAnhNkiNBBtwwkLVg64mL6PU/cLpLwwocrJCqqL3B4em
|
1113
|
+
KZ+cf4rB64S3alMWWWF5UCNrd6Ki3/UEDR1VIXYpRKltTGIhEYv2Fp2Lni2Q
|
1114
|
+
8OgyyzhVUfxObQTp70gE162kYa47cjVAfBxJQZTyaT5UaEG2VU74jfnv5LX3
|
1115
|
+
CktJJd7ZkmqdAD4DV9GoGDzThV0a50xjBsJNGth/h9CabQrjLBY3rheHknDH
|
1116
|
+
EKWKtFbSnScPQfOJxzQk+r84R4M/hbNLc+XFAhWixXjhw6acKOzL6dAxhYFU
|
1117
|
+
l8RP2EFNPEKALYXicYyKsjapLkLJQssI1EuqjCdfMk7lIRUlmLjwQiyQf1Pr
|
1118
|
+
sEqXF+Q/EV7ULvn3+4h3GwqoB0wy6HLEXdMyRGkMhnMESKyAIMxk3yKdPGKZ
|
1119
|
+
Q8G2qF5IvqxjM7DZBvt/sLc/CobMYdEL56N32bSyZmId/NyMaYfTmZOiZl89
|
1120
|
+
BOho52BBYqB2kzgsnp78CXBquuAXXBAzRAK3YEdOBaDTqxKXGxt4gQ1xWFo0
|
1121
|
+
ppM/qbmZYmEwVW1xStXGRzbcAJNNJDwuyzdwjpGOCQspymKYhjW1JmlEVfGB
|
1122
|
+
s6U1dFgAT/HSuMrG92TxPRoslT9nAG70mFCBWRR35edqTg4s5+h6hsGmbyKS
|
1123
|
+
jXgKSkOSxLAlqr9Hhu0LG5X0bWDo4NTXZDz5ABiWkmQ1yeuaS4b5yDld3iSC
|
1124
|
+
MvrT+S2D2987/eMkXeXFqViX9F0SOAyCsLcVvOjzKmJvwtaKWitJnHc+6i2L
|
1125
|
+
6jKsP+bAQ0raMqMdAqZ2tHdRsWHRS7yPsI/nE/JzoJnvUGdVZuJOimO4SK8m
|
1126
|
+
B6ZCGZjo6YlqzEXBk+N0ysuECy19KMS7FTHzBl0cMQ9Twh8XJOMXya6obYsT
|
1127
|
+
vm2vR4dOs8uv0DbeHe1wBWKxUdQvINamIigjQqOlHsQEa3IhfoG6nxRVm9Qw
|
1128
|
+
j8uCYN6BKxZIlT4Bb1Il1G7rYmru5RX0qMS+IAOKHxCvKEU6yML8ROkTJp9z
|
1129
|
+
2aTv1hD1cRgEakVA3Bgm2yuiiVWoBW04nUZt0SdnYgKvSNoesSNkwkk6T0/+
|
1130
|
+
+N2Ls8sXJ89ePj2/RIxThGlSkyFevgotadJDhE168PlIQMt+kDU4QLlM+vjw
|
1131
|
+
CT8Le+OEkE8ZM/ipEr+ClPHSwCYEL3yvD3o4cS/0HlruZOCr+6ecMt1sgms7
|
1132
|
+
VrpdfZOnFTwghb7QvGQrnPyD6DG/2kQ591hAJH5REC7AZ5tEJ+4L2yTwpGnZ
|
1133
|
+
ZLnv4J8J1+p7j1srM9n7oMUuKRT7n10RfVoCP4htg876dDQkakV/u1dJuwx+
|
1134
|
+
XPH6SgiZSa2lY7NfuouRDjRxRI7osC6Dph01JktjP6TveY2rVcnvsAaXxsqN
|
1135
|
+
B+kc3pC+XVVFRayg8B2N9u/pnoTd9Rm1cwO11sV0+z4G5uxP0SBoCCVDjA+3
|
1136
|
+
hrgsS/0EaarvlHxvwDJXY+ABJwztmPAcXbRChXQ7KtOOfawkGrEZiuc/Esjc
|
1137
|
+
clxs1fcJsjQ+nQFRhlJHfMSCcEWnuIKSdR64HjDYsDyxAJHudy8gyijb1gGC
|
1138
|
+
U7KmhmlpRVtQTlvmcqKIoSc+t6ZCa8iVPpJPKZuTvGq8NgfKShoD7dTL286+
|
1139
|
+
ll6uWnp51DhDICdJ/b6AMjIFCKeU0+ERF+KthKqBHklYg9wEqHKAFMhto7BT
|
1140
|
+
ID4Qv6aoVp5VUNGckGXK2KBToOHSXpqrQRR3UncPCdeuBIkpgXkPXQ5ZiI3s
|
1141
|
+
jDz7PaCKdvbWIK6FKmjXp0RKhzgMnvRkWmANo5X3mKU4n/IcU/gY/+PyFqpz
|
1142
|
+
QlLfCtFS7xCqDpLhgC9zgbRgDLd78yg5EHvIuc3FCcFn5IyLuOWCNEP04zuF
|
1143
|
+
PgwhfuVIiynsVRlqxs85eNEk62wXHBPUF5hYQUbdzCI+lWhf35iN68zmkBnw
|
1144
|
+
ZtZu06F7lEN5gB1rknQ2rMCQfnyU0Yx/tbzRLrdb9XwS11dH/T65xHNgGeQc
|
1145
|
+
OBNhlToDvPl2eChMCIMQtBHQLA5uHdzav3V40J1D5N+9fX/7XT2+dXhrfGt8
|
1146
|
+
cM8lb5MaJ/DTvXfvuGZ2eGWbDx/69F4t5nDiYiU7zQdFOG3KmTmR8w7bsJS1
|
1147
|
+
bSU6cNF7qCMU7cxcwSjyPq8Ly19PTn9fe58RvMbJPXFdNupYbrCsmuEbSl6g
|
1148
|
+
RkA3qIlxTrB/H7b/1/CjTp+cnz277ChR+PTPy7MXfzh7oborHD775z0NcPr8
|
1149
|
+
mf6vp+ePfjc+ODz6nwFT6C3UGNf1jhc5xPXvMsCPXsFveTz4G6CYrIXS2E7Z
|
1150
|
+
EQ1/AQYSHrUH+NEriGFwuwUDnHeMM8fz/kwwuN0Bg/HPAIM7HTA4+IVgcKcD
|
1151
|
+
BltreZ9QFhbiBJ7iqnFecmV+0Olhh1SPI85SsU8jvkRqi7ClJKIH5lw2zVZp
|
1152
|
+
TkZqRYk6NQkGjdFxBCGymqnlEdcAhszPsugr6t1LrU6Nc10gazPYheAEBBGC
|
1153
|
+
yXcP7nCmcwhW3Tna4l8PwjPoPXepHynjcu9h181/IMb1abbFrGL/Fmwg/Pyd
|
1154
|
+
kPVvYVnROv4us38Ou/q5976LVbX2fvy3z3788ddHo9GPef1zZk8hf68D8ke/
|
1155
|
+
AOTvdUD+6CfGuvsde7/9C+z9fsfeW+vYFg2erSd1mr7BIJkxbLFG6v+e/uAl
|
1156
|
+
Bat8kaDIQRJ0yQnUWNfVqspCWF9FfZi3xQarlOtiYVarTZSsEhqxqHWR4XQV
|
1157
|
+
Bf8Shy3nAWUh6omyoy06lIRIXaZatEVOePT5JFHL4BDE42h8O3EI3sSEM3RU
|
1158
|
+
Zy63wYlKcYKXE0n892Vzvs5NieS9c8Ql4FINV0RPgbDn76KGDo2+Qp8MWNhi
|
1159
|
+
JTijio8nHa23d0BosdcnR6arvMio9qxXVnQs0tux7zrkYS+vBMKutJaUi42Y
|
1160
|
+
0bN20xJyO2fo0CcRXPzTyc/O135B+Rmpej+L/Dz4B5GfBz8xF+9S8w9/gb13
|
1161
|
+
qfiHP/He7/6DSO+7v4D07tJcfgnp3aW5fFJ6O1n7EeGNj3TJ7uC86zk3kK/z
|
1162
|
+
77t+ci2noY5vCplsKJ2iMw2Xo4QDXZMs2OhZiXdkdGRnquBVj3WHIUashiAI
|
1163
|
+
MU+3/bHBHif9XwXJ1uz/aILk1q6frtd/5Ow9jFSV66b/t73+I2f/Jxai/+JG
|
1164
|
+
6D8dK/es7wfwdM3XsuGbCBBi8b8yx3T2fzTm+HMyiJ2M2P/8lFr2r6z5V9b8
|
1165
|
+
L8SaTaun2eezZlgIsebLWNfujvFzNkCoMjRcue0+UHlZvgnli1L+HNJI2ncW
|
1166
|
+
+VYrt3yG19SOMOFvR/46Jd35/p3d6erd18Fx+KSdCZt6ArEmT2JSqzVAlFZH
|
1167
|
+
935JWT1ncDSl2rse391zhZJRfnTaVsv7BgnF4qQOKnaO1iE9eeRSCZ8+0Erb
|
1168
|
+
TZMBwOjhtuV8I+QDdg2GjLKQy2vzvI436qGKPUTq9XRK10L8U1gudBPMLV+f
|
1169
|
+
Cccw0ONYNP58wvlIn7q6gvHPIpy79z7+Wfd+u2Pv459473d27j2KMf98LrBk
|
1170
|
+
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
|
1246
|
+
8xDsfF9eQhcJSuAZ/dD00v8CANnxsiCqAAA=
|
1247
|
+
|
1248
|
+
-->
|
1249
|
+
|
1250
|
+
</rfc>
|
1251
|
+
|