QUIC Stream Resets with Partial Delivery
draft-ietf-quic-reliable-stream-reset-11
Yes
Gorry Fairhurst
No Objection
Andy Newton
Charles Eckel
Gunter Van de Velde
Jim Guichard
Tommy Jensen
Note: This ballot was opened for revision 10 and is now closed.
Gorry Fairhurst
Yes
Mike Bishop
Yes
Comment
(2026-08-28 for -10)
Sent
# IESG review of draft-ietf-quic-reliable-stream-reset-10 CC @MikeBishop ## Comments ### Section 4, paragraph 8 ``` Reliable Size: A variable-length integer indicating the amount of data that needs to be delivered to the application even though the stream is reset. ``` I would suggest "minimum amount". An implementation could reasonably deliver more if the packets have arrived, as you note in Section 5. ### Section 4, paragraph 11 We've all assumed the normal QUIC extension convention, but nothing here actually *says* you MUST NOT send this frame unless the peer set the corresponding transport parameter. Worth being explicit. ### Section 5, paragraph 1 ``` A sender that wants to reset a stream but also deliver some bytes to ``` "Deliver some bytes" doesn't feel like it captures why this matters. Perhaps "...stream while retaining reliable delivery of certain data"? ### Section 5.2, paragraph 1 ``` When reducing the Reliable Size, the sender MUST retransmit the RESET_STREAM_AT frame carrying the smallest Reliable Size as well as ``` RFC 9000 is very deliberate that frames are not retransmitted; their information is (Section 13.3, para 1). Suggest rephrasing to say that the Reliable Size can only decrease, and acknowledgement of a frame carrying one size does not acknowledge a later, smaller size. The Reliable Size must be retransmitted until the current value has been acknowledged. ## Nits All comments below are about very minor potential issues that you may choose to address in some way - or ignore - as you see fit. Some were flagged by automated tools (via https://github.com/larseggert/ietf-reviewtool), so there will likely be some false positives. There is no need to let me know what you did with these suggestions. ### Section 5, paragraph 2 Context; suppressed or withheld from the application by an implementation. ### Section 5.2, paragraph 0 "the stream data" => "that stream data" to be clear it's only the data "up to that size" ## Notes This review is in the ["IETF Comments" Markdown format][ICMF]. You can use the [`ietf-comments` tool][ICT] to automatically convert this review into individual GitHub issues. Review generated by the [`ietf-reviewtool`][IRT]. [ICMF]: https://github.com/mnot/ietf-comments/blob/main/format.md [ICT]: https://github.com/mnot/ietf-comments [IRT]: https://github.com/larseggert/ietf-reviewtool
Andy Newton
No Objection
Charles Eckel
No Objection
Christopher Inacio
No Objection
Comment
(2026-09-02 for -10)
Not sent
Thanks to Ionuț for the SECDIR review.
Deb Cooley
No Objection
Comment
(2026-08-28 for -10)
Not sent
Thanks to Ionut Mihalcea for their secdir review!
Éric Vyncke
No Objection
Comment
(2026-08-24 for -10)
Sent
Thanks for the work done in this document. While QUIC is not within my area of expertise, I have only two non-blocking COMMENT, but addressing them will probably help implementers. ### Section 4 Please add a normative reference for the syntax/notation used in Figure 1. ### Section 5.4 Why not a "MUST" in `endpoints SHOULD send a RESET_STREAM frame` ? The use of BCP14 terms is specific for interoperability, so, add guidance to implementers when the "SHOULD" can be bypassed if this is not a "MUST" Regards, -éric
Gunter Van de Velde
No Objection
Jim Guichard
No Objection
Ketan Talaulikar
No Objection
Comment
(2026-08-25 for -10)
Sent
Thanks to the authors and the WG for their work on this document. Please take this as someone that is not an expert in this area and, therefore, feel free to just tell me that I am wrong and/or oversimplifying :-) Please find below a couple of comments on this document inline in the idnits output of v10. Lookout for the <EoRv10> tag at the end to ensure you are seeing the full review. 1) Mix up of things that perhaps needs clarification 265 Reordering of packets might lead to a RESET_STREAM_AT frame with a 266 higher Reliable Size being received after a RESET_STREAM_AT frame 267 with a lower Reliable Size. The receiver MUST ignore any 268 RESET_STREAM_AT frame that increases the Reliable Size. 270 When sending another RESET_STREAM_AT, RESET_STREAM or STREAM frame 271 carrying a FIN bit for the same stream, the initiator MUST NOT change 272 the Application Error Code or the Final Size. If the receiver 273 detects a change in those fields, it MUST close the connection with a 274 connection error of type STREAM_STATE_ERROR or FINAL_SIZE_ERROR, 275 respectively. <major> Two closely related points in this text would benefit from one clarification. First, “ignore any RESET_STREAM_AT frame” can be read as ignoring the whole frame, which would conflict with the following requirement to detect changes in its other fields. I think the intent is only to ignore the attempted increase in Reliable Size. Second, the following sentence grammatically applies Application Error Code consistency to a STREAM frame carrying FIN, even though (I believe) a STREAM frame has no Application Error Code; only Final Size applies to that frame type. How about the following? SUGGEST Reordering of packets might lead to a RESET_STREAM_AT frame with a higher Reliable Size being received after a RESET_STREAM_AT frame with a lower Reliable Size. The receiver MUST ignore the increase in Reliable Size and continue to use the smallest Reliable Size received. The other fields of the RESET_STREAM_AT frame remain subject to the consistency requirements below. When sending another RESET_STREAM_AT or RESET_STREAM frame for the same stream, the initiator MUST NOT change the Application Error Code or the Final Size. When sending a STREAM frame carrying the FIN bit for the same stream, the initiator MUST NOT change the Final Size. If the receiver detects a change in the Application Error Code, it MUST close the connection with a connection error of type STREAM_STATE_ERROR. If the receiver detects a change in the Final Size, it MUST close the connection with a connection error of type FINAL_SIZE_ERROR. 2) Is that a SHOULD or indeed a MUST ? 212 When using a RESET_STREAM_AT frame, the initiator MUST guarantee 213 reliable delivery of stream data of at least Reliable Size bytes. If 214 STREAM frames containing data up to that byte offset are lost, the 215 initiator MUST retransmit this data, as described in Section 13.3 of 216 [RFC9000]. Data sent beyond that byte offset SHOULD NOT be 217 retransmitted. The above reliable-delivery requirement needs to reconcile with the the text below: 317 An endpoint that receives a STOP_SENDING frame is required to send a 318 RESET_STREAM frame in some stream states, as described in Section 3.5 319 of [RFC9000]. While it is permissible to send a RESET_STREAM_AT 320 frame in this case, endpoints SHOULD send a RESET_STREAM frame, since 321 the peer has already indicated that it does not intend to process any 322 further data. <major> I support Éric Vyncke’s comment asking why the SHOULD in Section 5.4 is not a MUST. RFC 9000 Section 3.5 says that after STOP_SENDING, STREAM frames “can be discarded upon receipt”, while Section 5 of this draft requires a sender using RESET_STREAM_AT to guarantee delivery through the Reliable Size. A positive Reliable Size after STOP_SENDING therefore appears to create a case where the draft requires delivery of data that RFC 9000 permits the receiver to discard. Please correct me if I am missing a QUIC rule that reconciles these requirements. Suggestion: change the Section 5.4 SHOULD to a MUST, as Éric suggests. There may be other ways (perhaps restricting Reliable Size to 0) to reconcile with RFC 9000? <EoRv10>
Mahesh Jethanandani
No Objection
Comment
(2026-08-27 for -10)
Sent
Section 5.4: 317 > An endpoint that receives a STOP_SENDING frame is required to send a 318 > RESET_STREAM frame in some stream states, as described in Section 3.5 319 > of [RFC9000]. While it is permissible to send a RESET_STREAM_AT 320 > frame in this case, endpoints SHOULD send a RESET_STREAM frame, since 321 > the peer has already indicated that it does not intend to process any 322 > further data. I support Ketan's and Éric's COMMENTs on the SHOULD here. There's a concrete answer available that the text doesn't spell out: Section 5.2 already gives implementers a graceful way to walk back a commitment made before STOP_SENDING arrived. 248 > The initiator MAY send multiple RESET_STREAM_AT frames for the same 249 > stream in order to reduce the Reliable Size. It MAY also send a 250 > RESET_STREAM frame, which for purposes of data delivery is equivalent 251 > to sending a RESET_STREAM_AT frame with a Reliable Size of zero. If an endpoint already sent a RESET_STREAM_AT with a positive Reliable Size before STOP_SENDING arrived, it isn't stuck honoring that commitment -- it can follow up with a RESET_STREAM (or a RESET_STREAM_AT with Reliable Size zero) to reduce the commitment to nothing, per Section 5.2's "MUST NOT increase" rule, which only constrains increases. That's presumably why SHOULD rather than MUST is sufficient here: there's always a path back to the RESET_STREAM-equivalent behavior Ketan and Éric are asking about. Making that connection explicit in 5.4 -- even just a cross-reference to 5.2 -- would resolve the tension both of them flagged without changing the normative language. --- Section 4: 158 > RESET_STREAM_AT Frame { 159 > Type (i) = 0x24, 160 > Stream ID (i), 161 > Application Protocol Error Code (i), 162 > Final Size (i), 163 > Reliable Size (i), 164 > } On the list, Martin Thomson pushed back on Éric's ask for a normative reference here, on the grounds that the notation is illustrative and RFC 9000 is already a normative reference. That's true as far as it goes, but RFC 9000 Section 1.3 is where this "custom format" is actually defined -- it isn't defined anywhere else, and the draft never says so. Éric's simplest fix from the thread (a sentence like "using the notation of Section 1.3 of RFC 9000") costs nothing and points the reader at the right place without adding a new reference. ---------------------------------------------------------------------- NIT ---------------------------------------------------------------------- All comments below are about very minor potential issues that you may choose to address in some way - or ignore - as you see fit. Some were flagged by automated tools (via https://github.com/larseggert/ietf-reviewtool), so there will likely be some false positives. There is no need to let me know what you did with these suggestions. Section 5: 208 > A sender that wants to reset a stream but also deliver some bytes to 209 > the receiver sends a RESET_STREAM_AT frame with the Reliable Size 210 > field specifying the amount of data to be delivered. 212 > When using a RESET_STREAM_AT frame, the initiator MUST guarantee 213 > reliable delivery of stream data of at least Reliable Size bytes. Section 5 opens by calling the party that sends RESET_STREAM_AT the "sender," then switches to "initiator" for the normative MUST two sentences later, and Section 5.2 uses "initiator" throughout. Section 4 and the frame field description use "sender." Picking one term and using it consistently would help implementors grep the document for the relevant role.
Mohamed Boucadair
No Objection
Comment
(2026-08-27 for -10)
Not sent
Thank you for the effort put in this well-written spec.
Roman Danyliw
No Objection
Comment
(2026-08-27 for -10)
Not sent
Thank you to Christer Holmberg for the GENART review.
Tommy Jensen
No Objection