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.
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
+