• Revised I-D Needed - Issue raised by WG
  • Awaiting Expert Review/Resolution of Issues Raised
  • Awaiting External Review/Resolution of Issues Raised
  • Awaiting Merge with Other Document
  • Author or Editor Needed
  • Waiting for Referenced Document
  • Waiting for Referencing Document
  • Revised I-D Needed - Issue raised by WGLC
  • Revised I-D Needed - Issue raised by AD
  • Revised I-D Needed - Issue raised by IESG
  • Doc Shepherd Follow-up Underway
  • Other - see Comment Log

IETF :: core

Current state: Submitted to IESG for Publication

Viewing the last 20 entries. Show full log.

Spencer Dawkins

[Ballot comment]
On 5/20/2013 3:35 PM, Carsten Bormann wrote:
> Spencer,
>
> thank you for this attentive review.
> I have done some of the changes as simple editorial fixes, these are
> marked like [1373] below and can be reviewed in
> http://trac.tools.ietf.org/wg/core/trac/changeset/1373
> (Overview in http://trac.tools.ietf.org/wg/core/trac/timeline).

Hi, Carsten,

Thank you for the quick and careful response.

We've discussed my DISCUSS, so I'm changing my ballot position to YES (but please make Martin happy on his transport-ish DISCUSS :-).

I have a couple of places where I've suggested text that seems clearer to me, but I moved these to COMMENTs on my ballot.

> Grüße, Carsten
>
> ----------------------------------------------------------------------
> DISCUSS:
> ----------------------------------------------------------------------
>
> Note that I plan to ballot Yes, after we resolve these questions.
>
> I have three points - the first one is the one I'm most curious about.
>
> In 4.8.1. Changing The Parameters
>
> It is recommended that an
> application environment use consistent values for these parameters.
>
> I'm thinking about this in an IOT/M2M context where it's somewhere
> between inconvenient and impossible to change parameters on all the
> deployed devices at once. I understand that configuring these parameters
> is out of scope for the doc, so assume changing the parameters is out of
> scope as well.
>
> Yes. The assumption is that implementations better don't start
> changing the parameters until there is a good way to do so.
>
> If you start deploying new devices into that environment with
> significantly different parameters, is it more likely that performance
> would suffer, or that something would break? (I don't care what the
> answer is, I'd just like for the reader to have one - do you HAVE to get
> the parameters right the first time, or do you WANT to get them right,
> but you can deploy new devices with different parameters and let the old
> devices be removed/replaced over time?)
>
> The answer is different for each parameter and for the direction in
> which you change it. I don't think we can provide all the definitive
> answers in this document.

For "changing the parameters" above ... I think what you're saying in your response to me is more helpful than the way I read the text in -16. If I'm understanding correctly, the situation is

- the specification doesn't include a way to change parameters without a "flag day", and

- if an application environment uses consistent parameters, everything will work, but

- if an application environment doesn't use consistent parameters, what happens next is out of scope for this specification (and, for extra credit, is unpredictable)

As a COMMENT, I'd be more comfortable if

It is recommended that an
application environment use consistent values for these parameters.

continued to say "Operation with inconsistent values in an application environment is outside the scope of this specification", or something like that.

As an aside, also as a COMMENT ... I am now noticing that the specification has "recommended" in lower case. If you were telling me it's "RECOMMENDED = SHOULD = do it this way unless you're sure what you're doing, and if you think you know what you're doing, but you break it, you own it", I'd be more comfortable. That's consistent with the way I read this text in 2119:

3. SHOULD This word, or the adjective "RECOMMENDED", mean that there
may exist valid reasons in particular circumstances to ignore a
particular item, but the full implications must be understood and
carefully weighed before choosing a different course.

> This one is on the edge of being a Comment:
>
> In 5.10.5. Max-Age
>
> The value is intended to be current at the time of transmission.
> Servers that provide resources with strict tolerances on the value of
> Max-Age SHOULD update the value before each retransmission.
>
> Will servers know that resources they serve have strict
> tolerances?
>
> Yes. It is typically in the nature of a resource to be replaced
> periodically (e.g., the ECB exchange rate -- this has a very specific
> Max-Age) or be on a more unpredictable basis. In the CoRE model,
> servers generally should be aware about the nature of the resources
> they are serving.
>
> The
> answer may be "yes", I'm just asking. If not, I'm wondering if this
> should be a MUST.
>
> Because both the condition on the SHOULD and the desired behavior are
> very much local matter, a MUST won't have a much different outcome
> here. Maybe the SHOULD should be turned into a non-RFC 2119
> implementation guidance recommendation.

Your explanation was very helpful to me. I'm fine with SHOULD as 2119 language here - that matches what I'm hearing you say.

> This one is on the edge of being a comment:
>
> In 7.2. Resource Discovery
>
> The discovery of resources offered by a CoAP endpoint is extremely
> important in machine-to-machine applications where there are no
> humans in the loop and static interfaces result in fragility. A CoAP
> endpoint SHOULD support the CoRE Link Format of discoverable
> resources as described in [RFC6690].
>
> Is it obvious that this is a SHOULD? Is CoRE Link Format necessary for
> resource discovery, or can you also accomplish this with humans if
> they're in the loop? I'm just trying to wrap my head around "it's
> extremely important but implementations might not do it".
>
> This is more of a policy statement, a statement of expectation: If you
> want to be part of the CoRE ecosystem, do CoAP and do RFC 6690,
> because that will maximize interoperability. So this may be another
> SHOULD abuse. (But it does impact interoperability!)

This is very helpful. What I wasn't getting was whether there was any way other than CoRE Link Format to discover resources when there are no humans in the loop.

Again, as a COMMENT, I'm reading this response as "SHOULD support the CoRE Link Format of discoverable resources as described in [RFC6690] if there are no humans in the loop, to maximize interoperability". Am I getting that right?

And if this is a statement of expectation, I'm OK with SHOULD, if the working group thinks that's appropriate.

> ----------------------------------------------------------------------
> COMMENT:
> ----------------------------------------------------------------------
>
> I think this specification is well-written, it's important, and a lot of
> people will need to read it - that's why I'm being picky on comments.
>
> Martin already has a DISCUSS about some of the more transport-ish topics
> (support for UDP-lite, etc.). I'm sympathetic, but didn't restate them.
> If Martin is happy, I'll be happy.
>
> In this text:
> Constrained networks like
> 6LoWPAN support the expensive fragmentation of IPv6 packets into
> small link-layer frames.
>
> Is "support" the right word here? I'm not understanding "support the
> expensive fragmentation".
>
> 6LoWPAN has a mechanism for ("supports") sending IPv6 packets that are
> larger than the link layer packet size. This mechanism is expensive
> in the sense that it reduces performance similar to the way
> fragmentation often does.

So I should be reading this as something like "Constrained networks like 6LoWPAN support the fragmentation of IPv6 packets into small link-layer frames, but this mechanism is expensive in that it reduces performance"?

>
> In this text:
> Although CoAP could be used for
> compressing simple HTTP interfaces
>
> Is "compressing ... interfaces" the right way to say this?
>
> No. [1385]

Ack.

> I've seen other reviewers mention "short messages" in "CoAP is based on
> the exchange of short messages", but it may also be worth clearly
> distinguishing "short message" from "SMS" ("short message service") - as
> I understand it, the two phrases have nothing in common, but they are
> both used in the document (at the beginning of Section 3, and even in the
> same paragraph) without qualification.
>
> Oh. Good catch. [1373]

Ack.

> Response codes
> correspond to a small subset of HTTP response codes with a few CoAP
> specific codes added, as defined in Section 5.9.
>
> I get this, but I'm wondering if it's worth thinking about whether these
> similar but unrelated namespaces can semi-collide (if HTTP is extended to
> include a 328 response code, is it OK for CoAP to define a 3.28 response
> code that means nothing like what HTTP 328 means?) Given that 404 and
> 4.04 are similar, for example, I'd expect some implementers to guess what
> less common CoAP response codes are, based on HTTP response codes, rather
> than check carefully. That's an obscure comment, but I thought I should
> ask.
>
> We already deviate from a strict one-to-one correspondence with HTTP
> (e.g., we have a 2.05 where HTTP uses 200). So "correspond" may
> indeed be too strong. [1386]

Ack.

> In 6.4. Decomposing URIs into Options, is "fail this algorithm" clear?
> It might be a term of art for HTTP folk, but I'm not familiar with it.
>
> 4. If |url| has a component, then fail this algorithm.
>
> Indeed, this is hixiefied speak (right out of text in the versions of
> the websockets spec that were current when we wrote this, and still in
> HTML5). It might be shorter to just say "fail", but the intent is not
> for the node to blow up in smoke, but to specifically fail the
> algorithm defined in this section (as explained in the introduction to
> 6.4).

No, I think you're doing this right (thanks for the clue!).

> In 8.1. Messaging Layer
>
> When a server is aware that a request arrived via multicast, it MUST
> NOT return a RST in reply to NON. If it is not aware, it MAY return
> a RST in reply to NON as usual.
>
> Doesn't this tell me that the MUST NOT is not required for
> interoperability? I'm only quibbling about the use of 2119
> language.
>
> This hand-waving is a reaction on a specific restriction of the POSIX API
> that I don't wish on anyone. "Please avoid using RFC3542-challenged
> environments. But if you have to (.NET?)..."
>
> On a
> related point, if there was a sentence that started out "to keep Bad
> Thing X from happening, ..." that would be helpful.
>
> Good point. [1387]

Ack.

> There's similar language in 8.2. Request/Response Layer
>
> When a server is aware that a request arrived via multicast, the
> server MAY always ignore the request, in particular if it doesn't
> have anything useful to respond (e.g., if it only has an empty
> payload or an error response).
>
> but MAY is pretty weak anyway (maybe "can always ignore the request", to
> avoid the 2119 question?).
>
> This is trying to say that the peer has to be able to cope with the
> "MAY"-type behaviour described, so it does affect interoperability and
> I think 2119 language is appropriate here.

I understand why you're using 2119 language now. I'm not sure I understand how the requirement for the peer is different from either the request or response getting lost.

I'm reading the spec as saying that multicast requests are sent as non-confirmable at the messaging layer, so if there's no confirmation at the messaging layer and no response from the server at the request/response layer, does the peer see any difference between hearing nothing back because something was lost, and hearing nothing back because the server had nothing to say?

> In 11.3. Risk of amplification
>
> This is particularly a problem in nodes that enable NoSec access,
> that are accessible from an attacker and can access potential victims
> (e.g. on the general Internet), as the UDP protocol provides no way
> to verify the source address given in the request packet. An
> attacker need only place the IP address of the victim in the source
> address of a suitable request packet to generate a larger packet
> directed at the victim. Such large amplification factors SHOULD NOT
> be done in the response if the request is not authenticated.
>
> I don't understand what the SHOULD NOT means in practice. Is this saying
> the server shouldn't return large resources for NoSec requests (whatever
> "large" means), or ? If this is saying the same thing as the text on
> using "slicing/blocking mode" two paragraphs, down, it would be clearer
> to combine these points in a single paragraph.
>
> Well, it is leading into it, and you just have to read one more
> paragraph before it comes... (I'm still optimistic that at least some
> implementers read a whole section before writing code.)
> [ceterum censeo deploy BCP38...]

My apologies for not being clearer in my comment.

I'm looking at this text:

This is particularly a problem in nodes that enable NoSec access,
that are accessible from an attacker and can access potential victims
(e.g. on the general Internet), as the UDP protocol provides no way
to verify the source address given in the request packet. An
attacker need only place the IP address of the victim in the source
address of a suitable request packet to generate a larger packet
directed at the victim. Such large amplification factors SHOULD NOT
be done in the response if the request is not authenticated.

[annoyingly distracting paragraph deleted here]

A CoAP server can reduce the amount of amplification it provides to
an attacker by using slicing/blocking modes of CoAP
[I-D.ietf-core-block] and offering large resource representations
only in relatively small slices. E.g., for a 1000 byte resource, a
10-byte request might result in an 80-byte response (with a 64-byte
block) instead of a 1016-byte response, considerably reducing the
amplification provided.

and I'm not seeing

- the SHOULD NOT, which is conditional on whether the request is authenticated, and

- the subsequent suggestion to use slicing/blocking, which is not conditional on authentication, seamlessly hooked together.

Is the intention that the recommendation to use slicing/blocking be conditional on authentication, or should the server always use slicing/blocking whether the request is authenticated or not?

Is that clearer? ("writing text is hard" :-)

Spencer

Spencer Dawkins

[Ballot Position Update] Position for Spencer Dawkins has been changed to Yes from Discuss

Cindy Morgan

State changed to IESG Evaluation - Defer::Revised I-D Needed from IESG Evaluation - Defer

Benoit Claise

[Ballot comment]
I lacked some time to review the draft details. However, after a discussion with Joel Jaeggli, and with the OPS DIR review from Mehmet, I trust that the OPS aspects have been taken care of.

Benoit Claise

[Ballot Position Update] New position, No Objection, has been recorded for Benoit Claise

Jari Arkko

[Ballot comment]
Thank you for this important work and well written specification. While there are aspects that I would personally have done differently and some fine-tuning of the spec could continue, I believe the document is ready to move to an RFC. I also believe it that is a much-awaited spec and very useful to the Internet community in its current state.

I do agree with some of the points raised in other reviews, and those need to be addressed.

I did have one specific additional suggestion worth bringing up here. Dan Romascanu did a Gen-ART review and raised the issue that the parameter changes discussed in S4.8.1 are security sensitive, i.e., changes in the parameters may cause security/denial-of-service issues. This should be noted somewhere in the S11. I'd make a brief observation that it is security sensitive and should be addressed in any system that allows configuration of these parameters.

Here's what Dan wrote:

3. Section 4.8 defines a number of CoAP protocol parameters and derived parameters that according to 4.8.1 may be changed. Some of these parameters have limitations and their changes may affect the basic functionality of the nodes, the interaction between nodes or between nodes and servers, as well as the functioning in constrained environments. However there is no risk analysis in Section 11 (Security Considerations) about the threats related to mis-configuration of the modes and un-appropriate or malevolent changes in these parameters, and recommendations of security counter-measures on this respect.

Jari Arkko

Ballot comment text updated for Jari Arkko

Jari Arkko

[Ballot comment]
Thank you for this important work and well written specification. While there are aspects that I would personally have done differently, I believe the document is ready to move to an RFC. I also believe it that is a much-awaited spec and very useful to the Internet community.

I do agree with some of the points raised in other reviews, and those need to be addressed.

I did have one specific additional suggestion worth bringing up here. Dan Romascanu did a Gen-ART review and raised the issue that the parameter changes discussed in S4.8.1 are security sensitive, i.e., changes in the parameters may cause security/denial-of-service issues. This should be noted somewhere in the S11. I'd make a brief observation that it is security sensitive and should be addressed in any system that allows configuration of these parameters.

Here's what Dan wrote:

3. Section 4.8 defines a number of CoAP protocol parameters and derived parameters that according to 4.8.1 may be changed. Some of these parameters have limitations and their changes may affect the basic functionality of the nodes, the interaction between nodes or between nodes and servers, as well as the functioning in constrained environments. However there is no risk analysis in Section 11 (Security Considerations) about the threats related to mis-configuration of the modes and un-appropriate or malevolent changes in these parameters, and recommendations of security counter-measures on this respect.

Jari Arkko

[Ballot Position Update] New position, Yes, has been recorded for Jari Arkko

Gonzalo Camarillo

[Ballot Position Update] New position, No Objection, has been recorded for Gonzalo Camarillo

Sean Turner

[Ballot discuss]
Thanks for a clear draft. Makes things so much easier to review. Just want to discuss a couple of things before moving to yes (hopefully).

0) s9.1.3.2: Before I get in to the nitty-gritty of the specific concerns I have with DTLS use of Raw Public Keys, I have to ask whether use of the DTLS client_certificate_url extension was considered? If raw public keys is just about size then that'd work wouldn't it. If you're about dumping processing of paths, then that's another thing.

1) s9.1.3.2.1: What's really hung me up on this draft is the raw public key option. Primarily, the TLS draft is not quite done yet; I'm still in discussions with the authors. Two issues that affect your draft:

a) By draft-ietf-tls-oob-pubkey taking a pass on specifying all of the ways an identity can be bound to a public key, it leaves it up to the application to specify that mechanism. This binding is important because you can't get peer authentication without it; I'm really worried that if this mode gets widely deployed people will say they have "DTLS security" but few (if any) are actually do the work necessary to bind the identity to the key. So, you specify that binding in the provisioning section (good ;) but I want to make sure that it's clear who's doing what to whom:

i) s9.1.3.2.1: For machines it's perfect appropriate to generate the key and install it because we doubt it'll be able to do that well enough right (i.e., crummy entropy sources)? I want to make it clear that that's been done by the manufacturer.

In this mode the device has an asymmetric key pair but without an
X.509 certificate (called a raw public key).

to:

In this mode the device has an asymmetric key pair but without an
X.509 certificate (called a raw public key); the asymmetric key
paid is generated by the manufacturer and installed on the device.

ii) s9.1.3.2.1: This draft does that binding using Stephen's naming thing with hashes, but I want to make sure that it's clear who is identifier, it now says:

An identifier is calculated
from the public key as described in Section 2 of [RFC6920].

Is it the

An identifier is calculated by the endpoint from
from the public key as described in Section 2 of [RFC6920].

b) draft-ietf-tls-oob-pubkey is likely to take a pass on specifying a mechanism for revoking the public key and identity binding. Note that ocsp-/multi-ocsp staplingwon't work because there's no way to request information about a certificate that you don't have information about. I'm not trying to gold plate the security mechanism here but I think we need some words on how revocation for this mode will be handled. However, I suspect you'll want to use the ACLs....there's a mechanism for including ACLs during provisioning but is there a way to update them later? What happens if a new node gets installed or removed? Is there a requirement for ACLs to be supported; the text has a SHOULD but that seems to be about ACL provisioning support not ACL support.

2) s9.1.3.2: Another TLS-related issue:

When referring to TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 please include the MTI curve(s). Ever so glad that conservative curves are being used. In the following, I assumed you'd want the one must and the two mays but I can understand if you don't. I'd argue you do have algorithm agility with DTLS so you could get away with just the MUST ad not the MAYs.

Unrelated to you, but I thought I'd let you know about: the curve requirements will almost certainly be removed from the mcgrew draft at my direction because no other D/TLS EC cipher suite specifies an MTI curve. There's support for conservative curves, but not enough interest in starting to add MTI curves instead of the application picking them. Note the Zigbee folks also point to the mcgrew draft but it seems their drafts already include the curves so we ought to be good to go on both fronts.

I think we need to be clear that choosing this particular cipher suite that it means an implementation needs to support the extensions defined in RFC 4492 - or if it doesn't. I'm assuming you want it to so I'm going to propose some tweaking:

OLD:

Implementations in
RawPublicKey mode MUST support the mandatory to implement cipher
suite TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 as specified in
[I-D.mcgrew-tls-aes-ccm-ecc], [RFC5246], [RFC4492].

NEW:

Implementations in
RawPublicKey mode MUST support the mandatory to implement
cipher suite TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 as specified
in [I-D.mcgrew-tls-aes-ccm-ecc]. The key used MUST be
ECDSA-capable; the curve secp256r1 MUST
be supported, and the curves secp384r1 and secp521r1 MAY be
supported [RFC4492]; these curves are equivalent to the
NIST P-256, P-384, and P-521 curves. Implementations MUST
use/support (?) the Supported Elliptic Curves Extension and
Supported Point Format extensions [RFC4492]; the uncompressed
point format MUST be supported; [RFC6090] can be used as an
implementation method.

The mcgrew draft had the following instead of the last sentence so I'm open to whichever but I think something about the folllowing needs to be added:

o The uncompressed point format MUST be supported. Other point
formats MAY be used.
o The client SHOULD offer the elliptic_curves extension and the
server SHOULD expect to receive it.
o The client MAY offer the ec_point_formats extension, but the
server need not expect to receive it.
o [RFC6090] MAY be used as an implementation method.

And then, I think we need to specify how the MTI would look: namely by adding the following on to the end of the paragraph.

When the mandatory to implement DTLS cipher suite and curve and
used the SubjectPublicKeyInfo indicates an algorithm of
id-ecPublicKey with the namedCurves object identifier set to
secp256r1 [RFC5480]. If secp384r1 or secp521r1 are used the
those object identifiers [RFC5480] are included instead.

That way everybody knows what values go in the SPKI of the oob-pubkey draft. Note they tried to change that field recently and I had to remind them not to.

3) s9: I know we're all about be liberal in what you accept, but in this context that might be challengeing; this bit:

... all modes of DTLS may not be
applicable. Some DTLS cipher suites can add significant
implementation complexity as well as some initial
handshake overhead
needed when setting up the security association.

Made me wonder whether you considered which other DTLS extensions might be useful in addition to the EC ones and SNI as well as what extensions should be profiled out? For example, max_fragment_length looks pretty useful in this context as well as certificate_url. But does heartbeat make any sense?

4) s8: I think you need to make it pretty darn clear in s8 that multi-cast is an unsecured "mode" as specified in this document. It's kind of buried in s9.

5) s9.1.2: (worried about a DoS attack) Do you mean that responses to secured-CoAP messages returned unsecured are silently discarded/ignored or rejected and then that kicks off an error code response?

6) s9.1.3.1: Did you consider whether there should be an application profile for the psk_identity_hint (see Section 5 [RFC4279]) - i.e., is there a standard format for CoAP that should be defined?

7) s9.1.3.3: When you say "the Certificate must be validated" I'm just checking that you're think there's going to be a certificate chain? If there's no chain the validation rules in 5280 don't apply.

8) s9: If you're going to allow more than two entities to share the preshared keys I think it's worth pointing out you really can't get peer authentication with either CoAP or DTLS. The description in s9 and elsewhere seems to imply that more than one peer might share the same key.

9) Either in s9 or s11 we need to say something about devices with bad entropy sources not bothering to make keys because they won't be of any use. If they've got bad entropy sources the manufacturer or whoever should be making the keys.

Sean Turner

[Ballot comment]
0) s1.2: Is the "CoAP-to-CoAP proxy" definition missing? s5.7 refers to s1.2 for the definition but that term is not in s1.2.

1) s7.1: I think this is munged:

A server is discovered by a client by the client knowing or

2) s9: In the NoSec option is worth also pointing to the link layer security (IEEE 802.15.4)?

3) s9.1: Because there's no s9.2 (I assume that might have been an IPsec-secured CoAP section at one point) you can drop the header.

4) s9.1.3.3: The 1st paragraph is about certificates but it only indicates the TLS cipher suite needed to be supported. It should say what values go in the certificate to support the cipher suite. Basically, need to point to RFC 5480 and say include values X. I'd suggest:

OLD:

Implementations in Certificate Mode MUST support the mandatory to
implement cipher suite TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 as
specified in [RFC5246].

NEW (adding some more stuff + references):

Implementations in Certificate Mode MUST support the mandatory to
implement cipher suite TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 as
specified in [RFC5246]. Namely, the certificate includes a
SubjectPublicKeyInfo that indicates an algorithm of id-ecPublicKey
with namedCurves secp256r1, secp384r1, or secp521r1 [RFC5480];
the public key format is uncompressed [RFC5480]; if included
the key usage extension indicates digitalSignature.

5) s9.1.3.3: Going with the thought that there's a chain, we also need to say what algorithms can be used to sign the certificate. I assume we want the use same algorithm for both the TLS_ECDHE_PSK and TLS_ECDHE_ECDSA certificate so text is needed at the end of the paragraph to indicate that:

Certificates MUST be signed with ECDSA [RFC6090], and it MUST
use SHA-256, SHA-384, or SHA-512 [SHS]. It is RECOMMENDED that
the curve match the hash function's output matches the length of
the elliptic curve order.

On the fist bit: You could lock it down to just one curve if that's what you decide to do based on comment #5.

On the second bit: if the curve and the hash size line up then you can use RFC 6090 and we - really - want that. Not sure if the above is too cryptic ;)

6) s9.1.3.3: Maybe a typo MUST instead of must:

If there is no
SubjectAltName in the certificate, then the Authoritative Name must
match the CN found in the certificate using the matching rules
defined in [RFC2818] with the exception that certificates with
wildcards are not allowed.

7) s9.1.3.3: r/further work./further study.

Sean Turner

[Ballot Position Update] New position, Discuss, has been recorded for Sean Turner

Martin Stiemerling

[Ballot discuss]
A well-written document and I have a few points to discuss.

The congestion avoidance mechanisms look ok, but I assume we will get feedback from implementers and deployments on the parameters and mechanisms. It would be good to get this feedback documented at some point.

Here are the issues (based on my own review and input from Joe Touch and Michael Scharf):

1) IPv6 UDP checksum calculation
It is not clear if zero UDP checksums are permitted or not permitted with COAP.?
(UDP zero checksums:
https://datatracker.ietf.org/doc/draft-ietf-6man-udpzero/)
That should be specified.

2) Handling of UDP-lite
Can UDP-lite (RFC 3828) be used or cannot be used in conjunction with CoAP?

3) Fragmentation of messages
The recommendation in Section 4.6 about the path MTU is generally valid only for IPv6. For IPv4, 567 bytes is the safe area to work without fragmentation, though in today WANs 1280 work perfectly, but I am not so sure about the networks envisioned for CoAP. This 576 bytes for IPv4 are mentioned in the implementation note, but deserves text on the same level as for IPv6.

4) Ensuring no fragmentation with IPv4
The implementation note in Section 4.6 states that for IPv4 it is 'harder to ensure that there is no IP fragmentation'. This neglects the possibility of using the Don't Fragment (DF) flag in the IPv4 header and also that there is possibly feedback from a node enroute that the MTU is too big if the DF flag is set, i.e., by means of an ICMP error message.
Should there be any recommendation or protocol machinery to deal with path probing? E.g., referencing RFC 4821 (PMTUD).

5) Reaction to network errors that are signalled
I wonder why the draft is not discussing any reaction to network failures signalled through ICMP messages. This relates also to my DISCUSS issue no 4.

6) Idempotency
done.

7) Protocol reactions to reserved or prohibited values
Regarding reserved or prohibited values in the IANA section, it would be useful to be clear about what happens when those values are seen. I.e., should they be ignored, generate an error, etc.

8) Flow Control/Receiver Buffer
The protocol does not have any real means for the receiver to control the amount of data that is being sent to it. I can understand the attempt to provide a simple protocol, but adding a very basic flow control mechanism will not prohibitively increase the complexity of the protocol, while improving robustness.
According to Section 2.1, a node can always return a RST if the message cannot be process for whatever reason.
I propose to add an option to the RST message that allows the message receiver to state how much data it is willing to accept from a particular sender or in general (up to the implementation).

9) Handling a wrapping message IDs
According to Section 4.4.:
"The same Message ID MUST NOT be re-used (in communicating with the same endpoint) within the EXCHANGE_LIFETIME (Section 4.8.2)" with EXCHANGE_LIFETIME of 247s.
By now it is unrealistic that the message ID of 16 bits will wrap around in that time frame, but protocols live long and at some later time it can be possible.
However, the protocol doesn't have any means to detect wrapped message IDs.

Martin Stiemerling

Ballot discuss text updated for Martin Stiemerling

Spencer Dawkins

[Ballot comment]
I think this specification is well-written, it's important, and a lot of people will need to read it - that's why I'm being picky on comments.

Martin already has a DISCUSS about some of the more transport-ish topics (support for UDP-lite, etc.). I'm sympathetic, but didn't restate them. If Martin is happy, I'll be happy.

In this text:
Constrained networks like
6LoWPAN support the expensive fragmentation of IPv6 packets into
small link-layer frames.

Is "support" the right word here? I'm not understanding "support the expensive fragmentation".

In this text:
Although CoAP could be used for
compressing simple HTTP interfaces

Is "compressing ... interfaces" the right way to say this?

I've seen other reviewers mention "short messages" in "CoAP is based on the exchange of short messages", but it may also be worth clearly distinguishing "short message" from "SMS" ("short message service") - as I understand it, the two phrases have nothing in common, but they are both used in the document (at the beginning of Section 3, and even in the same paragraph) without qualification.

Response codes
correspond to a small subset of HTTP response codes with a few CoAP
specific codes added, as defined in Section 5.9.

I get this, but I'm wondering if it's worth thinking about whether these similar but unrelated namespaces can semi-collide (if HTTP is extended to include a 328 response code, is it OK for CoAP to define a 3.28 response code that means nothing like what HTTP 328 means?) Given that 404 and 4.04 are similar, for example, I'd expect some implementers to guess what less common CoAP response codes are, based on HTTP response codes, rather than check carefully. That's an obscure comment, but I thought I should ask.

In 6.4. Decomposing URIs into Options, is "fail this algorithm" clear? It might be a term of art for HTTP folk, but I'm not familiar with it.

4. If |url| has a component, then fail this algorithm.

In 8.1. Messaging Layer

When a server is aware that a request arrived via multicast, it MUST
NOT return a RST in reply to NON. If it is not aware, it MAY return
a RST in reply to NON as usual.

Doesn't this tell me that the MUST NOT is not required for interoperability? I'm only quibbling about the use of 2119 language. On a related point, if there was a sentence that started out "to keep Bad Thing X from happening, ..." that would be helpful.

There's similar language in 8.2. Request/Response Layer

When a server is aware that a request arrived via multicast, the
server MAY always ignore the request, in particular if it doesn't
have anything useful to respond (e.g., if it only has an empty
payload or an error response).

but MAY is pretty weak anyway (maybe "can always ignore the request", to avoid the 2119 question?).

In 11.3. Risk of amplification

This is particularly a problem in nodes that enable NoSec access,
that are accessible from an attacker and can access potential victims
(e.g. on the general Internet), as the UDP protocol provides no way
to verify the source address given in the request packet. An
attacker need only place the IP address of the victim in the source
address of a suitable request packet to generate a larger packet
directed at the victim. Such large amplification factors SHOULD NOT
be done in the response if the request is not authenticated.

I don't understand what the SHOULD NOT means in practice. Is this saying the server shouldn't return large resources for NoSec requests (whatever "large" means), or ? If this is saying the same thing as the text on using "slicing/blocking mode" two paragraphs, down, it would be clearer to combine these points in a single paragraph.

Spencer Dawkins

Ballot comment text updated for Spencer Dawkins

Spencer Dawkins

[Ballot discuss]
Note that I plan to ballot Yes, after we resolve these questions.

I have three points - the first one is the one I'm most curious about.

In 4.8.1. Changing The Parameters

It is recommended that an
application environment use consistent values for these parameters.

I'm thinking about this in an IOT/M2M context where it's somewhere between inconvenient and impossible to change parameters on all the deployed devices at once. I understand that configuring these parameters is out of scope for the doc, so assume changing the parameters is out of scope as well.

If you start deploying new devices into that environment with significantly different parameters, is it more likely that performance would suffer, or that something would break? (I don't care what the answer is, I'd just like for the reader to have one - do you HAVE to get the parameters right the first time, or do you WANT to get them right, but you can deploy new devices with different parameters and let the old devices be removed/replaced over time?)

This one is on the edge of being a Comment:

In 5.10.5. Max-Age

The value is intended to be current at the time of transmission.
Servers that provide resources with strict tolerances on the value of
Max-Age SHOULD update the value before each retransmission.

Will servers know that resources they serve have strict tolerances? The answer may be "yes", I'm just asking. If not, I'm wondering if this should be a MUST.

This one is on the edge of being a comment:

In 7.2. Resource Discovery

The discovery of resources offered by a CoAP endpoint is extremely
important in machine-to-machine applications where there are no
humans in the loop and static interfaces result in fragility. A CoAP
endpoint SHOULD support the CoRE Link Format of discoverable
resources as described in [RFC6690].

Is it obvious that this is a SHOULD? Is CoRE Link Format necessary for resource discovery, or can you also accomplish this with humans if they're in the loop? I'm just trying to wrap my head around "it's extremely important but implementations might not do it".

Spencer Dawkins

[Ballot comment]
I think this specification is well-written, it's important, and a lot of people will need to read it - that's why I'm being picky on comments.

Martin already has a DISCUSS about some of the more transport-ish topics (support for UDP-lite, etc.). I'm sympathetic, but didn't restate them. If Martin is happy, I'll be happy.

In this text:
Constrained networks like
6LoWPAN support the expensive fragmentation of IPv6 packets into
small link-layer frames.

Is "support" the right word here? I'm not understanding "support the expensive fragmentation".

In this text:
Although CoAP could be used for
compressing simple HTTP interfaces

Is "compressing ... interfaces" the right way to say this?

I've seen other reviewers mention "short messages" in "CoAP is based on the exchange of short messages", but it may also be worth clearly distinguishing "short message" from "SMS" ("short message service") - as I understand it, the two phrases have nothing in common, but they are both used in the document (at the beginning of Section 3, and even in the same paragraph) without qualification.

Response codes
correspond to a small subset of HTTP response codes with a few CoAP
specific codes added, as defined in Section 5.9.

I get this, but I'm wondering if it's worth thinking about whether these similar but unrelated namespaces can semi-collide (if HTTP is extended to include a 328 response code, is it OK for CoAP to define a 3.28 response code that means nothing like what HTTP 328 means?) Given that 404 and 4.04 are similar, for example, I'd expect some implementers to guess what less common CoAP response codes are, based on HTTP response codes, rather than check carefully. That's an obscure comment, but I thought I should ask.

In 6.4. Decomposing URIs into Options, is "fail this algorithm" clear? It might be a term of art for HTTP folk, but I'm not familiar with it.

4. If |url| has a component, then fail this algorithm.

In 8.1. Messaging Layer

When a server is aware that a request arrived via multicast, it MUST
NOT return a RST in reply to NON. If it is not aware, it MAY return
a RST in reply to NON as usual.

Doesn't this tell me that the MUST NOT is not required for interoperability? I'm only quibbling about the use of 2119 language. On a related point, if there was a sentence that started out "to keep Bad Thing X from happening, ..." that would be helpful.

There's similar language in 8.2. Request/Response Layer

When a server is aware that a request arrived via multicast, the
server MAY always ignore the request, in particular if it doesn't
have anything useful to respond (e.g., if it only has an empty
payload or an error response).

but MAY is pretty weak anyway (maybe "can always ignore the request", to avoid the 2119 question?).

In 11.3. Risk of amplification

This is particularly a problem in nodes that enable NoSec access,
that are accessible from an attacker and can access potential victims
(e.g. on the general Internet), as the UDP protocol provides no way
to verify the source address given in the request packet. An
attacker need only place the IP address of the victim in the source
address of a suitable request packet to generate a larger packet
directed at the victim. Such large amplification factors SHOULD NOT
be done in the response if the request is not authenticated.

I don't understand what the SHOULD NOT means in practice. Is this saying the server shouldn't return large resources for NoSec requests (whatever "large" means), or ? If this is saying the same thing as the text on using "slicing/blocking mode" two paragraphs, down, it would be clearer to combine these points in a single paragraph, or otherwise describe "large amplification factors SHOULD NOT be done".

Spencer Dawkins

[Ballot Position Update] New position, Discuss, has been recorded for Spencer Dawkins

Viewing the last 20 entries. Show full log.