[Interest] CBOR Questions

Thiago Macieira thiago.macieira at intel.com
Wed Mar 6 19:16:13 CET 2019

On Wednesday, 6 March 2019 08:44:31 PST Jason H wrote:
> > > So the protocol it expects to work with assumes a message-based upper
> > > bound, and of trivial size. This is not good.  In light of this, I
> > > would suggest a QCborDataStream class that implements efficient
> > > parsing.
> > 
> > No needed. You simply misunderstood the CoAP spec.
> In what way? The spec continues:

In the way that your argument is not supported at all by the part of the spec 
you quoted.

The spec says that each CoAP request or response must fit inside a single UDP 
datagram, without IPv4 fragmentation like the text below talks about. If you 
need to go higher, you need to use the BLOCK extension, which the text also 
talks about.

Whether you're using BLOCK or not, the size of the PDU is known well in 
advance. If you need to, you can wait for the entire content to be received 
and, in the case of blockwise transfers, reassembled, before you start 
parsing. You don't need to send a size count, if that size count is going to 
be the CoAP PDU's size minus the size's size. This is also why CoAP does not 
explicitly indicate sizes in non-blockwise datagrams: the PDU size can be 
inferred from the UDP datagram's size. In turn, the UDP datagram size can be 
inferred from the 802.x frame size.

But if you want to implement a streaming receiver, you also can. That's what 
QCborStreamReader is for (hence the name). It's suitable for parsing on 
streaming sockets (TCP), not just datagram ones.

>  Implementation Note:  CoAP's choice of message size parameters works
>       well with IPv6 and with most of today's IPv4 paths.  (However,
>       with IPv4, it is harder to absolutely ensure that there is no IP
>       fragmentation.  If IPv4 support on unusual networks is a
>       consideration, implementations may want to limit themselves to
>       more conservative IPv4 datagram sizes such as 576 bytes; per
>       [RFC0791], the absolute minimum value of the IP MTU for IPv4 is as
>       low as 68 bytes, which would leave only 40 bytes minus security
>       overhead for a UDP payload.  Implementations extremely focused on
>       this problem set might also set the IPv4 DF bit and perform some
>       form of path MTU discovery [RFC4821]; this should generally be
>       unnecessary in realistic use cases for CoAP, however.)  A more
>       important kind of fragmentation in many constrained networks is
>       that on the adaptation layer (e.g., 6LoWPAN L2 packets are limited
>       to 127 bytes including various overheads); this may motivate
>       implementations to be frugal in their packet sizes and to move to
>       block-wise transfers [BLOCK] when approaching three-digit message
>       sizes.

Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel System Software Products

More information about the Interest mailing list