Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Specify MaxAckDelay for TLP and RTO #991

Merged
merged 13 commits into from
Dec 5, 2017
Merged

Specify MaxAckDelay for TLP and RTO #991

merged 13 commits into from
Dec 5, 2017

Conversation

ianswett
Copy link
Contributor

@ianswett ianswett commented Dec 5, 2017

Closes #981

Copy link
Contributor

@janaiyengar janaiyengar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for writing this up. A few comments.


(TODO: Add negotiability of delayed ack timeout.)
MaxAckDelay is the maximum ack delay supplied in an incoming ack frame.
Ack delays that are aren't used for an RTT sample or reference ack-only packets
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: It's not clear what it means to say Ack delays that reference ack-only packets... I would leave this at "aren't used for an RTT sample.", and remove "or reference ack-only packets"

was sent, and a bytes field indicating the packet's size. sent_packets is
ordered by packet number, and packets remain in sent_packets until
acknowledged or lost.
was sent, a boolean indicating whether the packet is ack only, and a bytes
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/ack only/ackable. I think this constraint needs to be more than just ack only packets.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As discussed, in a future PR.

@@ -569,6 +573,7 @@ Pseudocode for OnPacketSent follows:
largest_sent_packet = packet_number
sent_packets[packet_number].packet_number = packet_number
sent_packets[packet_number].time = now
sent_packets[packet_number].ack_only = is_ack_only
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: is_ackable

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ack

@@ -602,6 +607,10 @@ Pseudocode for OnAckReceived and UpdateRtt follow:
// Adjust for ack delay if it's plausible.
if (latest_rtt - min_rtt > ack_delay):
latest_rtt -= ack_delay
// Only save into max ack delay if it's used
// for rtt calculation and is not ack only.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ditto

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ack

Copy link
Contributor

@janaiyengar janaiyengar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, let's leave the ackable discussion to later; I'm fine with ack only. There's one nit I'll leave you to address.

Copy link
Contributor

@janaiyengar janaiyengar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for adding more explanatory text. A few comments.

exactly 1*SRTT may generate spurious probes, and 2*SRTT is simply the next
integral value of RTT.
QUIC diverges from TCP by calculating MaxAckDelay dynamically, instead of
assuming a constant value for all connections. It includes this in all probe
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TCP doesn't assume a constant value for all connections. I would say something like "instead of implicitly including it in the SRTT and RTTVAR estimates".

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I state that below, but I updated this text to be a bit more specific.

The values of 2 and 1.5 are based on
{{?LOSS-PROBE=I-D.dukkipati-tcpm-tcp-loss-probe}}, but implementations MAY
experiment with other constants.
A PTO value of at least 1.5*SRTT ensures that the ACK is overdue. The of 1.5
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

missing word: "The value of".

@@ -372,10 +366,17 @@ one significantly increases resilience to packet drop in both directions, thus
reducing the probability of consecutive RTO events.

QUIC's RTO algorithm differs from TCP in that the firing of an RTO alarm is not
considered a strong enough signal of packet loss. An RTO alarm fires only when
considered a strong enough signal of packet loss, so does not result in an
immediate change to CWND or recovery state. An RTO alarm fires only when
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is CWND defined by here? or should it be "congestion window"? I'd prefer spelling it out in any case.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

there's a prolonged period of network silence, which could be caused by a change
in the underlying network RTT.

QUIC also diverges from TCP by including MaxAckDelay in the RTO period. QUIC is
able to explicitly model the ack delay via the ack delay field in the ack frame.
Because QUIC is subtracting this delay from both SRTT and it is expected to
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/is subtracting/subtracts/
It doesn't subtract this delay from SRTT... also this sentence is a bit of a run-on. Suggestion: "Since QUIC ignores this delay in its SRTT and RTTVAR computations, it is necessary to add this delay explicitly in the RTO computation.".

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, fixed.

Copy link
Contributor Author

@ianswett ianswett left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One comment I didn't fully address, but PTAL

exactly 1*SRTT may generate spurious probes, and 2*SRTT is simply the next
integral value of RTT.
QUIC diverges from TCP by calculating MaxAckDelay dynamically, instead of
assuming a constant value for all connections. It includes this in all probe
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I state that below, but I updated this text to be a bit more specific.

@@ -372,10 +366,17 @@ one significantly increases resilience to packet drop in both directions, thus
reducing the probability of consecutive RTO events.

QUIC's RTO algorithm differs from TCP in that the firing of an RTO alarm is not
considered a strong enough signal of packet loss. An RTO alarm fires only when
considered a strong enough signal of packet loss, so does not result in an
immediate change to CWND or recovery state. An RTO alarm fires only when
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

there's a prolonged period of network silence, which could be caused by a change
in the underlying network RTT.

QUIC also diverges from TCP by including MaxAckDelay in the RTO period. QUIC is
able to explicitly model the ack delay via the ack delay field in the ack frame.
Because QUIC is subtracting this delay from both SRTT and it is expected to
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, fixed.

was sent, and a bytes field indicating the packet's size. sent_packets is
ordered by packet number, and packets remain in sent_packets until
acknowledged or lost.
was sent, a boolean indicating whether the packet is ack only, and a bytes
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As discussed, in a future PR.

@@ -569,6 +573,7 @@ Pseudocode for OnPacketSent follows:
largest_sent_packet = packet_number
sent_packets[packet_number].packet_number = packet_number
sent_packets[packet_number].time = now
sent_packets[packet_number].ack_only = is_ack_only
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ack

@@ -602,6 +607,10 @@ Pseudocode for OnAckReceived and UpdateRtt follow:
// Adjust for ack delay if it's plausible.
if (latest_rtt - min_rtt > ack_delay):
latest_rtt -= ack_delay
// Only save into max ack delay if it's used
// for rtt calculation and is not ack only.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ack

@ianswett
Copy link
Contributor Author

ianswett commented Dec 5, 2017

Also fixes #912

Copy link
Contributor

@janaiyengar janaiyengar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

one nit, but lgtm

integral value of RTT.
QUIC diverges from TCP by calculating MaxAckDelay dynamically, instead of
assuming a constant value for all connections. It includes this in all probe
timeouts, because it assume the ack delay may come into play, regardless of
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/assume/assumes

change in the underlying network RTT.

QUIC also diverges from TCP by including MaxAckDelay in the RTO period. QUIC is
able to explicitly model the ack delay via the ack delay field in the ack frame.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/model the ack delay/model delay at the receiver/
s/ack frame/ACK frame/

@ianswett ianswett merged commit e29b203 into master Dec 5, 2017
@martinthomson martinthomson deleted the ianswett-maxackdelay branch December 6, 2017 19:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants