asciidoctor-rfc 0.2.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +116 -6
  3. data/asciidoctor-rfc.gemspec +15 -1
  4. data/lib/asciidoctor/rfc/common/base.rb +74 -7
  5. data/lib/asciidoctor/rfc/common/front.rb +1 -1
  6. data/lib/asciidoctor/rfc/v2/base.rb +87 -38
  7. data/lib/asciidoctor/rfc/v2/blocks.rb +29 -2
  8. data/lib/asciidoctor/rfc/v2/converter.rb +0 -1
  9. data/lib/asciidoctor/rfc/v2/inline_anchor.rb +2 -8
  10. data/lib/asciidoctor/rfc/v2/lists.rb +7 -4
  11. data/lib/asciidoctor/rfc/v2/table.rb +1 -1
  12. data/lib/asciidoctor/rfc/v3/base.rb +41 -43
  13. data/lib/asciidoctor/rfc/v3/blocks.rb +29 -2
  14. data/lib/asciidoctor/rfc/v3/converter.rb +0 -2
  15. data/lib/asciidoctor/rfc/v3/inline_anchor.rb +2 -6
  16. data/lib/asciidoctor/rfc/version.rb +1 -1
  17. data/spec/asciidoctor/rfc/v2/comments_spec.rb +7 -3
  18. data/spec/asciidoctor/rfc/v2/date_spec.rb +23 -0
  19. data/spec/asciidoctor/rfc/v2/dlist_spec.rb +107 -9
  20. data/spec/asciidoctor/rfc/v2/image_spec.rb +17 -0
  21. data/spec/asciidoctor/rfc/v2/inline_formatting_spec.rb +12 -0
  22. data/spec/asciidoctor/rfc/v2/listing_spec.rb +22 -0
  23. data/spec/asciidoctor/rfc/v2/literal_spec.rb +22 -2
  24. data/spec/asciidoctor/rfc/v2/preamble_spec.rb +72 -0
  25. data/spec/asciidoctor/rfc/v2/references_spec.rb +3 -1
  26. data/spec/asciidoctor/rfc/v2/table_spec.rb +104 -4
  27. data/spec/asciidoctor/rfc/v2/text_spec.rb +89 -0
  28. data/spec/asciidoctor/rfc/v2/ulist_spec.rb +40 -0
  29. data/spec/asciidoctor/rfc/v3/dlist_spec.rb +103 -1
  30. data/spec/asciidoctor/rfc/v3/image_spec.rb +18 -0
  31. data/spec/asciidoctor/rfc/v3/listing_spec.rb +26 -0
  32. data/spec/asciidoctor/rfc/v3/literal_spec.rb +20 -1
  33. data/spec/asciidoctor/rfc/v3/preamble_spec.rb +150 -0
  34. data/spec/asciidoctor/rfc/v3/references_spec.rb +35 -34
  35. data/spec/asciidoctor/rfc/v3/series_info_spec.rb +39 -0
  36. data/spec/examples/README.adoc +162 -0
  37. data/spec/examples/davies-template-bare-06.adoc +3 -0
  38. data/spec/examples/draft-ietf-core-block-xx.mkd +935 -0
  39. data/spec/examples/draft-ietf-core-block-xx.mkd.adoc +1013 -0
  40. data/spec/examples/draft-ietf-core-block-xx.xml.orig +1251 -0
  41. data/spec/examples/example-v2.adoc +6 -2
  42. data/spec/examples/example-v3.adoc +5 -1
  43. data/spec/examples/hoffmanv2.xml.adoc +247 -0
  44. data/spec/examples/hoffmanv2.xml.orig +339 -0
  45. data/spec/examples/hoffmanv3.xml.orig +346 -0
  46. data/spec/examples/mib-doc-template-xml-06.adoc +5 -1
  47. data/spec/examples/rfc2100.md.adoc +2 -3
  48. data/spec/examples/rfc3514.md.adoc +3 -2
  49. data/spec/examples/rfc5841.md.adoc +1 -1
  50. data/spec/examples/rfc748.md.adoc +7 -6
  51. data/spec/examples/rfc7511.md.adoc +15 -15
  52. data/spec/examples/skel.mkd +32 -0
  53. data/spec/examples/skel.mkd.adoc +50 -0
  54. data/spec/examples/skel.xml.orig +105 -0
  55. data/spec/examples/stupid-s.mkd +569 -0
  56. data/spec/examples/stupid-s.mkd.adoc +771 -0
  57. data/spec/examples/stupid-s.xml.orig +880 -0
  58. data/spec/spec_helper.rb +1 -1
  59. 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 &#8212; 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&#8211;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 &#8212; 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 &amp; 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 &amp; 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 &lt;&lt; (SZX + 4)</spanx>. (Note that, as an implementation
306
+ convenience, <spanx style="verb">(val &amp; ~0xF) &lt;&lt; (val &amp; 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
+ 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
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
+ 760o984Yd+AnrVC3fBjCDLBT4sYn2l8rmSQ5il+b7omtb8lFrQnrQ7ZBqaaq
1171
+ 54fA8ukl3VXjyyyxEnzjCre8Y77Fe0JdZS/hjX7gDx/6D1oXISXZa1O+WLei
1172
+ 3lDZLGqOQZUvUdsMzgrkDXGmKHv+gbFPYV8YoKdO/AXdQLOia+2Ur3NLywSk
1173
+ 1IxzhrHsLit8+cV045MEZ3QDLTPitRchW14jX8vi22G47lPuGsuBwlQCn0mQ
1174
+ nAbvy11phLmz7j5HHmtjKUma6s98YijIojV2nfmVJbdm/yEsef//Y5b80+79
1175
+ X4UlBxabcuXw+TZj9k1EfPI5Z95zGWjyvG9tFBeYhDZ4KrkhbavyqdehjQ5R
1176
+ hyc383YvqrTdh++t0qoVCXM9wH5mGafNh57qZvaXdR0p3S61lbndCm9y5HIc
1177
+ 5vookdJynV9ZVmv2H6ZFHh60Xv877n03yzoKM/9CLOvoJ977bpZ1+xff++2f
1178
+ eO93d+79DmWM/1x772LX0Qr49U9q0MQDP0ON5iY27Rijohu7n5rVChk2XhWe
1179
+ zXys790Xi6ZZDZf87YfOy+Z85YVnwdSyQa7cuOGCV7oLW0+qzM63qxmSgGPS
1180
+ 8qLWy+xqIY4Ayj7F27vsLDPS9gt7K5mVTwKlKCe6cnBTwHsfUy8stzX4LvgX
1181
+ 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
1246
+ 8xDsfF9eQhcJSuAZ/dD00v8CANnxsiCqAAA=
1247
+
1248
+ -->
1249
+
1250
+ </rfc>
1251
+