From 5fc8ca14c7097e4fff2b8092d1be11cf18785b37 Mon Sep 17 00:00:00 2001 From: ianswett Date: Mon, 6 Mar 2017 16:11:35 -0500 Subject: [PATCH 1/5] Remove STOP_WAITING frame --- draft-ietf-quic-transport.md | 52 ++++++------------------------------ 1 file changed, 8 insertions(+), 44 deletions(-) diff --git a/draft-ietf-quic-transport.md b/draft-ietf-quic-transport.md index 0c6eecd414..2dc559a4b0 100644 --- a/draft-ietf-quic-transport.md +++ b/draft-ietf-quic-transport.md @@ -586,7 +586,6 @@ document. | 0x03 | GOAWAY | {{frame-goaway}} | | 0x04 | WINDOW_UPDATE | {{frame-window-update}} | | 0x05 | BLOCKED | {{frame-blocked}} | -| 0x06 | STOP_WAITING | {{frame-stop-waiting}} | | 0x07 | PING | {{frame-ping}} | | 0x40 - 0x7f | ACK | {{frame-ack}} | | 0x80 - 0xff | STREAM | {{frame-stream}} | @@ -1233,13 +1232,11 @@ well as which packets are considered missing. The ACK frame contains between 1 and 256 ACK blocks. ACK blocks are ranges of acknowledged packets. To limit the ACK blocks to the ones that haven't yet been received by the -sender, the sender periodically sends STOP_WAITING frames that signal the -receiver to stop acknowledging packets below a specified sequence number, -raising the Least Unacked packet number at the receiver. A sender of an ACK -frame thus reports only those ACK blocks between the received Least Unacked and -the reported Largest Acknowledged packet numbers. The endpoint SHOULD raise the -Least Unacked communicated via future STOP_WAITING frames to the most recently -received Largest Acknowledged. +sender, the sender periodically tracks the packets in acks which have been +acked and no longer includes them in the ACK. In order to handle cases where +the receiver is not sending data, and hence does not expect it's acks to be +acked, it may bundle a PING frame with an ack approximately once per RTT to +gain confirmation of it's ACKs being delivered. Unlike TCP SACKs, QUIC ACK blocks are cumulative and therefore irrevocable. Once a packet has been acknowledged, even if it does not appear in a future ACK @@ -1436,36 +1433,6 @@ actual exponent is one-less than the explicit exponent, and the value represents to 0xFFFF. -## STOP_WAITING Frame {#frame-stop-waiting} - -The STOP_WAITING frame (type=0x06) is sent to inform the peer that it should not -continue to wait for packets with packet numbers lower than a specified value. -The packet number is encoded in 1, 2, 4 or 6 bytes, using the same coding length -as is specified for the packet number for the enclosing packet's header -(specified in the QUIC Frame packet's Flags field.) The frame is as follows: - -~~~ - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -| Least Unacked Delta (8/16/32/48) ... -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -~~~ -{: #stop-waiting-format title="STOP_WAITING Frame Format"} - -The STOP_WAITING frame contains a single field: - -Least Unacked Delta: - -: A variable-length packet number delta with the same length as the packet - header's packet number. Subtract it from the complete packet number of the - enclosing packet to determine the least unacked packet number. The resulting - least unacked packet number is the earliest packet for which the sender is - still awaiting an ACK. If the receiver is missing any packets earlier than - this packet, the receiver SHOULD consider those packets to be irrecoverably - lost and MUST NOT report those packets as missing in subsequent ACKs. - - ## WINDOW_UPDATE Frame {#frame-window-update} The WINDOW_UPDATE frame (type=0x04) informs the peer of an increase in an @@ -1728,9 +1695,9 @@ When a packet is detected as lost, the sender re-sends any frames as necessary: since subsequent data on this stream is expected to not be delivered by the receiver. -* ACK, STOP_WAITING, and PADDING frames MUST NOT be retransmitted. ACK and - STOP_WAITING frames are cumulative, so new frames containing updated - information will be sent as described in {{frame-ack}}. +* ACK and PADDING frames MUST NOT be retransmitted. ACK frames are cumulative, + so new frames containing updated information will be sent as described in + {{frame-ack}}. * All other frames MUST be retransmitted. @@ -2338,9 +2305,6 @@ QUIC_INVALID_WINDOW_UPDATE_DATA (0x80000039): QUIC_INVALID_BLOCKED_DATA (0x8000003A): : BLOCKED frame data is malformed. -QUIC_INVALID_STOP_WAITING_DATA (0x8000003C): -: STOP_WAITING frame data is malformed. - QUIC_INVALID_PATH_CLOSE_DATA (0x8000004E): : PATH_CLOSE frame data is malformed. From a3cae53ea55d7db74cdecd0622447c5ba229f2ec Mon Sep 17 00:00:00 2001 From: ianswett Date: Mon, 6 Mar 2017 16:18:35 -0500 Subject: [PATCH 2/5] Update draft-ietf-quic-transport.md --- draft-ietf-quic-transport.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/draft-ietf-quic-transport.md b/draft-ietf-quic-transport.md index 2dc559a4b0..174cca4a9b 100644 --- a/draft-ietf-quic-transport.md +++ b/draft-ietf-quic-transport.md @@ -1232,11 +1232,13 @@ well as which packets are considered missing. The ACK frame contains between 1 and 256 ACK blocks. ACK blocks are ranges of acknowledged packets. To limit the ACK blocks to the ones that haven't yet been received by the -sender, the sender periodically tracks the packets in acks which have been +sender, the sender SHOULD track the ack ranges in acks that have been acked and no longer includes them in the ACK. In order to handle cases where the receiver is not sending data, and hence does not expect it's acks to be acked, it may bundle a PING frame with an ack approximately once per RTT to -gain confirmation of it's ACKs being delivered. +gain confirmation of it's ACKs being delivered. The receiver SHOULD track no +more than 255 ack ranges because they are not expressible on the wire, and +MAY limit the number of ack ranges to a smaller value. Unlike TCP SACKs, QUIC ACK blocks are cumulative and therefore irrevocable. Once a packet has been acknowledged, even if it does not appear in a future ACK From e9186cc0994f86d482fbba8e7d144c950242f014 Mon Sep 17 00:00:00 2001 From: ianswett Date: Mon, 6 Mar 2017 16:19:25 -0500 Subject: [PATCH 3/5] Update draft-ietf-quic-transport.md --- draft-ietf-quic-transport.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/draft-ietf-quic-transport.md b/draft-ietf-quic-transport.md index 174cca4a9b..60fffaeba6 100644 --- a/draft-ietf-quic-transport.md +++ b/draft-ietf-quic-transport.md @@ -1233,9 +1233,9 @@ and 256 ACK blocks. ACK blocks are ranges of acknowledged packets. To limit the ACK blocks to the ones that haven't yet been received by the sender, the sender SHOULD track the ack ranges in acks that have been -acked and no longer includes them in the ACK. In order to handle cases where -the receiver is not sending data, and hence does not expect it's acks to be -acked, it may bundle a PING frame with an ack approximately once per RTT to +acked and no longer include them in future ACKs. In order to handle cases +where the receiver is not sending data, and hence does not expect it's acks to +be acked, it may bundle a PING frame with an ack approximately once per RTT to gain confirmation of it's ACKs being delivered. The receiver SHOULD track no more than 255 ack ranges because they are not expressible on the wire, and MAY limit the number of ack ranges to a smaller value. From d27fbd4cc84e1412b3796aa46da9d64029e29b9a Mon Sep 17 00:00:00 2001 From: ianswett Date: Tue, 7 Mar 2017 11:37:44 -0500 Subject: [PATCH 4/5] Martin's comments. --- draft-ietf-quic-transport.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/draft-ietf-quic-transport.md b/draft-ietf-quic-transport.md index 60fffaeba6..52b84eaf1b 100644 --- a/draft-ietf-quic-transport.md +++ b/draft-ietf-quic-transport.md @@ -1231,14 +1231,16 @@ Receivers send ACK frames to inform senders which packets they have received, as well as which packets are considered missing. The ACK frame contains between 1 and 256 ACK blocks. ACK blocks are ranges of acknowledged packets. -To limit the ACK blocks to the ones that haven't yet been received by the -sender, the sender SHOULD track the ack ranges in acks that have been -acked and no longer include them in future ACKs. In order to handle cases -where the receiver is not sending data, and hence does not expect it's acks to -be acked, it may bundle a PING frame with an ack approximately once per RTT to -gain confirmation of it's ACKs being delivered. The receiver SHOULD track no -more than 255 ack ranges because they are not expressible on the wire, and -MAY limit the number of ack ranges to a smaller value. +To limit ACK blocks to those that haven't yet been received by the sender, +the receiver SHOULD track which ACK frames have been acknowledged by its peer. +Once an ACK frame has been acknowledged, the packets it acknowledges SHOULD not +be acknowledged again. In order to handle cases where the receiver is not +sending retransmittable data, and hence does not expect to receive acks, it +MAY bundle a PING frame with an ack at most once per RTT to gain confirmation +of ACKs being delivered. In order to limit receiver state or the size of ACK +frames, a receiver MAY limit the number of ack ranges and stop acknowledging +packets without getting an ACK acked, with the knowledge this may slightly +increase spurious retransmits. Unlike TCP SACKs, QUIC ACK blocks are cumulative and therefore irrevocable. Once a packet has been acknowledged, even if it does not appear in a future ACK From a6b17b0b83edfd3c412a22bc0027d0a00bf999d2 Mon Sep 17 00:00:00 2001 From: Martin Thomson Date: Wed, 8 Mar 2017 14:45:12 +1100 Subject: [PATCH 5/5] Reword ACK acking text, integrate Jana's comments --- draft-ietf-quic-transport.md | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/draft-ietf-quic-transport.md b/draft-ietf-quic-transport.md index 52b84eaf1b..c7eca7d828 100644 --- a/draft-ietf-quic-transport.md +++ b/draft-ietf-quic-transport.md @@ -1231,16 +1231,17 @@ Receivers send ACK frames to inform senders which packets they have received, as well as which packets are considered missing. The ACK frame contains between 1 and 256 ACK blocks. ACK blocks are ranges of acknowledged packets. -To limit ACK blocks to those that haven't yet been received by the sender, -the receiver SHOULD track which ACK frames have been acknowledged by its peer. -Once an ACK frame has been acknowledged, the packets it acknowledges SHOULD not -be acknowledged again. In order to handle cases where the receiver is not -sending retransmittable data, and hence does not expect to receive acks, it -MAY bundle a PING frame with an ack at most once per RTT to gain confirmation -of ACKs being delivered. In order to limit receiver state or the size of ACK -frames, a receiver MAY limit the number of ack ranges and stop acknowledging -packets without getting an ACK acked, with the knowledge this may slightly -increase spurious retransmits. +To limit ACK blocks to those that have not yet been received by the sender, the +receiver SHOULD track which ACK frames have been acknowledged by its peer. Once +an ACK frame has been acknowledged, the packets it acknowledges SHOULD not be +acknowledged again. To handle cases where the receiver is only sending ACK +frames, and hence will not receive acknowledgments for its packets, it MAY send +a PING frame at most once per RTT to explicitly request acknowledgment. + +To limit receiver state or the size of ACK frames, a receiver MAY limit the +number of ACK blocks it sends. A receiver can do this even without receiving +acknowledgment of its ACK frames, with the knowledge this could cause the sender +to unnecessarily retransmit some data. Unlike TCP SACKs, QUIC ACK blocks are cumulative and therefore irrevocable. Once a packet has been acknowledged, even if it does not appear in a future ACK