RFC 5827

Early Retransmit for TCP and Stream Control Transmission Protocol (SCTP)

πŸ“… published April 2010, from ietf

Early Retransmit for TCP and Stream Control Transmission Protocol (SCTP) πŸŽ€

Part 1 of 3 🌸

okay so this RFC is RFC 5827 πŸ’–, and it's an Experimental doc, not a Standards Track one (more on that in the Status section, it's a whole thing). It was published in April 2010 πŸ¦‹ and it's from the IETF. The authors are M. Allman (ICSI), K. Avrachenkov (INRIA), U. Ayesta (BCAM-IKERBASQUE and LAAS-CNRS), J. Blanton (Ohio University), and P. Hurtig (Karlstad University) πŸ‘‘. The title block doesn't list anything it obsoletes or updates, so it's standing alone! The ISSN is 2070-1721 ✨.

Abstract ✨

this doc proposes a brand new mechanism for TCP and SCTP πŸ”₯ that can recover lost segments when a connection's congestion window is small. The "Early Retransmit" mechanism lets the transport, in certain special circumstances, lower the number of duplicate acknowledgments it needs before it triggers a fast retransmission. So instead of waiting around for a super slow retransmission timeout, the transport can use fast retransmit to fix losses that would otherwise be a whole lengthy ordeal 😭🫢

Status of This Memo 🌈

this document is not an Internet Standards Track specification πŸ’…. It's published for examination, experimental implementation, and evaluation.

It defines an Experimental Protocol for the Internet community 🧚. It's a product of the Internet Engineering Task Force (IETF) and represents the consensus of the IETF community. It got public review and was approved for publication by the Internet Engineering Steering Group (IESG). Not every doc the IESG approves is a candidate for any level of Internet Standard, so see Section 2 of RFC 5741 for that πŸ’œ.

If you want the current status of this doc, any errata, or a way to send feedback, check out http://www.rfc-editor.org/info/rfc5827 πŸ“

Copyright (c) 2010 IETF Trust and the persons identified as the document authors. All rights reserved 🌸

This doc is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) as they're in effect on the date of publication. Please actually read these, bestie, because they describe your rights and restrictions for this doc πŸ™ˆ. Code Components pulled out of this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions, and they come with no warranty, as described in the Simplified BSD License.

This doc may contain material from IETF Documents or IETF Contributions published or made publicly available before November 10, 2008 πŸ“œ. The people controlling the copyright in some of that material may not have given the IETF Trust permission to allow modifications outside the IETF Standards Process. So unless you get an adequate license from those copyright holders, this doc may not be modified outside the IETF Standards Process, and derivative works of it may not be created outside the IETF Standards Process. The exceptions are formatting it for publication as an RFC or translating it into languages other than English 🌈

1. Introduction πŸ¦‹

lots of researchers have studied the problems with TCP's loss recovery [RFC793, RFC5681] when the congestion window is small πŸ”. They've also outlined possible mechanisms to mitigate those problems [Mor97, BPS+98, Bal98, LK98, RFC3150, AA02] πŸ’–. SCTP's [RFC4960] loss recovery and congestion control mechanisms are based on TCP, so the same problems hit SCTP connections too 😩. When the transport detects a missing segment, the connection enters a loss recovery phase. There are several variants of that phase depending on the TCP implementation. TCP can use slow-start-based recovery or fast recovery [RFC5681], NewReno [RFC3782], and loss recovery based on selective acknowledgments (SACKs) [RFC2018, FF96, RFC3517] πŸ‘‘. SCTP's loss recovery isn't as varied because it has selective acknowledgments built in ✨

okay so there are two main ways loss recovery gets kicked off πŸ’…. First, if an acknowledgment (ACK) for a given segment doesn't show up within a certain amount of time, a retransmission timer fires and the segment gets resent [RFC2988, RFC4960]. Second, the "fast retransmit" algorithm resends a segment when three duplicate ACKs arrive at the sender [Jac88, RFC5681] πŸ”₯. Duplicate ACKs get triggered by out-of-order arrivals at the receiver. But here's the tea β˜•: duplicate ACKs can come from segment loss or segment reordering in the network path. So the sender waits for three duplicate ACKs to tell loss apart from reordering πŸ™ƒ. When the congestion window is small, it may not be possible to generate the required number of duplicate ACKs to trigger fast retransmit when a loss actually happens. Iconic, not iconic πŸ’€

Small congestion windows can show up in a few situations, like:

(1) The connection is constrained by end-to-end congestion control when the connection's share of the path is small, the path has a small bandwidth-delay product, or the transport is figuring out the available bandwidth in the first few round-trip times of slow start 🌸.

(2) The connection is "application limited" and only has a limited amount of data to send πŸ“. This can happen any time the application doesn't produce enough data to fill the congestion window. A particular case is when all connections become application limited, which happens as the connection ends 🧚.

(3) The connection is limited by the receiver's advertised window 🫢.

The transport's retransmission timeout (RTO) is based on measured round-trip times (RTT) between the sender and receiver, as specified in [RFC2988] (for TCP) and [RFC4960] (for SCTP) πŸ’œ. To keep from spuriously retransmitting segments that are only delayed and not actually lost, the minimum RTO is conservatively set to 1 second ⏱️. So it's on TCP senders to detect and recover from as many losses as possible without taking a long timeout that leaves the connection sitting idle 😀. But if not enough duplicate ACKs arrive from the receiver, fast retransmit never gets triggered. That happens when the congestion window is small, when a large number of segments in a window are lost, or at the end of a transfer as data drains from the network πŸ₯Ί

Here's an example: say the congestion window is three segments' worth of data 🍰. If one segment gets dropped by the network, at most two duplicate ACKs will arrive at the sender. Since three duplicate ACKs are required to trigger fast retransmit, a timeout will be needed to resend the dropped segment. And note that delayed ACKs [RFC5681] can reduce the number of duplicate ACKs a receiver sends even more 😡. However, we assume that receivers send immediate ACKs when there's a gap in the received sequence space, per [RFC5681] πŸ’…

[BPS+98] shows that roughly 56% of retransmissions sent by a busy Web server are sent after the RTO timer expires, while only 44% are handled by fast retransmit πŸ“‰. On top of that, only 4% of the RTO timer-based retransmissions could have been avoided with SACK, which still has to keep disambiguating reordering from genuine loss πŸ™ˆ. [All00] also shows that for one particular Web server, the median number of bytes carried by a connection is less than four segments. That means more than half of the connections will be forced to rely on the RTO timer to recover from any losses that occur 😭. So loss recovery that doesn't rely on the conservative RTO is likely to be beneficial for short TCP transfers 🫢

The limited transmit mechanism introduced in [RFC3042] and currently codified in [RFC5681] lets a TCP sender transmit previously unsent data when it receives each of the two duplicate ACKs that come before a fast retransmit πŸ¦‹. SCTP [RFC4960] uses SACK information to calculate the number of outstanding segments in the network. So when the first two duplicate ACKs arrive at the sender, they indicate that data has left the network, and they allow the sender to transmit new data (if there's any), kind of like TCP's limited transmit algorithm 🌈. For the rest of this doc, "limited transmit" covers both the TCP and SCTP mechanisms for sending in response to the first two duplicate ACKs πŸ’œ. By sending those two new segments, the sender is trying to induce additional duplicate ACKs (if appropriate), so fast retransmit gets triggered before the retransmission timeout expires πŸƒβ€β™€οΈ. The sender-side "Early Retransmit" mechanism outlined in this doc covers the case when previously unsent data isn't available to transmit (case (2) above), or can't be sent because of an advertised window limitation (case (3) above) πŸŽ€

Note: this doc is being published as an experimental RFC, as part of the process for the TCPM working group and the IETF to assess whether the proposed change is useful and safe in heterogeneous environments πŸ”¬. That includes figuring out which variants of the mechanism are the most effective. In the future, this specification may be updated and put on the standards track if its safeness and efficacy can be demonstrated 🌟

2. Terminology 🧚

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 [RFC2119] πŸ’…

The reader is expected to be familiar with the definitions given in [RFC5681]. so brush up on that first, bestie πŸ“š

3. Early Retransmit Algorithm πŸ”₯

okay the Early Retransmit algorithm lowers the threshold for triggering fast retransmit when the amount of outstanding data is small and no previously unsent data can be transmitted (so limited transmit could be used) πŸ’–. Duplicate ACKs get triggered by each arriving out-of-order segment. So fast retransmit won't be invoked when there are fewer than four outstanding segments (assuming only one segment loss in the window) πŸ™ƒ. But TCP and SCTP aren't required to track the number of outstanding segments. They track the number of outstanding bytes or messages instead πŸ“. (Note that SCTP's message boundaries don't necessarily line up with segment boundaries.) So applying the intuitive idea of a transport with fewer than four segments outstanding is way more complicated than it first looks πŸ˜΅β€πŸ’«

Here's the plan πŸ“‹. In Section 3.1, we describe a "byte-based" variant of Early Retransmit that roughly maps the number of outstanding bytes to a number of outstanding segments, and then uses that when deciding whether to trigger Early Retransmit 🌸. In Section 3.2, we describe a "segment-based" variant, which is a more precise algorithm for triggering Early Retransmit. That precision comes at the cost of requiring additional state to be kept by the TCP sender 🧠. In both cases, we describe SACK-based and non-SACK-based versions of the scheme (of course, the non-SACK version won't apply to SCTP) 🫢. This doc explicitly does not prefer one variant over the other, and leaves the choice to the implementer πŸ’œ

3.1. Byte-Based Early Retransmit πŸŽ€

A TCP or SCTP sender MAY use byte-based Early Retransmit πŸ’–

Okay so when an ACK shows up, a sender using byte-based Early Retransmit MUST check these two conditions to figure out when to send an Early Retransmit ✨

(2.a) The amount of outstanding data (ownd) -- data sent but not yet acknowledged -- is less than 4*SMSS bytes (as defined in [RFC5681]). πŸ¦‹

Quick note bestie: in the byte-based version, ownd is equivalent to FlightSize (defined in [RFC5681]). We use a different name because ownd doesn't match FlightSize everywhere in this document πŸ™ˆ

Also in SCTP, messages have to be converted to bytes for this variant to work 🧚

(2.b) There is either no unsent data ready for transmission at the sender, or the advertised receive window does not permit new segments to be transmitted. 🌸

When both of those conditions hold and a TCP connection does not support SACK, the duplicate ACK threshold used to trigger a retransmission MUST be lowered to this πŸ‘‘

             ER_thresh = ceiling (ownd/SMSS) - 1                 (1)

duplicate ACKs, where ownd is expressed in bytes. We call this lowered ACK threshold enabling "Early Retransmission" πŸ’…

When conditions (2.a) and (2.b) hold and a TCP connection DOES support SACK, or SCTP is in use, Early Retransmit MUST be used only when "ownd - SMSS" bytes have been SACKed. (Keeping the requirement wording exactly as the spec has it, no cap.) 🫢

If either condition (2.a) and/or (2.b) doesn't hold, the transport MUST NOT use Early Retransmit, and should instead go with the standard stuff, including fast retransmit and limited transmit 🌈

Now the drawback of this byte-based version is precision [HB08] 😭 Here are two examples that show what I mean:

  • Imagine a non-SACK TCP sender with an SMSS of 1460 bytes that transmits three segments, each carrying 400 bytes of payload. This is a case where Early Retransmit could help with loss recovery if one segment is lost. But here ER_thresh ends up at zero, per Equation (1), because the number of outstanding bytes is a poor estimate of the number of outstanding segments. A similar problem happens for senders using SACK, since the expression "ownd - SMSS" goes negative. πŸ’€
  • Next up, a non-SACK TCP sender with an SMSS of 1460 bytes that transmits 10 segments, each with 400 bytes of payload. In this case ER_thresh is 2 per Equation (1). So even though there are enough segments outstanding to trigger fast retransmit with the standard duplicate ACK threshold, Early Retransmit gets triggered anyway. That could cause or make worse performance problems caused by segment reordering in the network 😭πŸ”₯

3.2. Segment-Based Early Retransmit πŸ“

A TCP or SCTP sender MAY use segment-based Early Retransmit πŸ’œ

Same energy as before: when an ACK arrives, a sender using segment-based Early Retransmit MUST use the following two conditions to decide when an Early Retransmit is sent πŸ‘€

(3.a) The number of outstanding segments (oseg) -- segments sent but not yet acknowledged -- is less than four. ✨

(3.b) There is either no unsent data ready for transmission at the sender, or the advertised receive window does not permit new segments to be transmitted. 🌸

When both of those hold and a TCP connection does not support SACK, the duplicate ACK threshold used to trigger a retransmission MUST be lowered to this πŸ’–

                  ER_thresh = oseg - 1                              (2)

duplicate ACKs, where oseg is the number of outstanding segments. (We'll talk about tracking outstanding segments in a sec 🧚) We call this lowered ACK threshold enabling "Early Retransmission" πŸ¦‹

When conditions (3.a) and (3.b) hold and a TCP connection DOES support SACK, or SCTP is in use, Early Retransmit MUST be used only when "oseg - 1" segments have been SACKed. A segment counts as SACKed when all of its data bytes (TCP) or data chunks (SCTP) have been indicated as arrived by the receiver 🫢

If either condition (3.a) and/or (3.b) doesn't hold, the transport MUST NOT use Early Retransmit, and should prefer the standard mechanisms, including fast retransmit and limited transmit 🌈

Okay this is the version that fixes the precision problems from the last section πŸ™Œ The catch is that the implementation has to track segment boundaries so it knows how many actual segments were sent but not acknowledged. One way to do that is for the sender to track the boundaries of the three segments on the right side of the current window (which means tracking four sequence numbers in TCP). You could keep a circular list of the segment boundaries, for example πŸ“ Cumulative ACKs that don't fall within this region mean at least four segments are outstanding, so Early Retransmit MUST NOT be used. Once the outstanding window gets small enough for Early Retransmit to be invoked, the four sequence numbers you're keeping give you a full picture of how many segments are outstanding πŸ’… (Side note: the implicit sequence number consumed by the TCP FIN bit can also be included in the tracking of segment boundaries πŸ‘‘)


4. Discussion πŸ’¬

In this section we talk through a bunch of issues around the Early Retransmit algorithm πŸŽ€

4.1. SACK vs. Non-SACK 🧠

The SACK version of the Early Retransmit algorithm is preferred over the non-SACK version in TCP. Why? Two reasons, bestie πŸ‘‘ First, it's more robust when ACKs get lost, since SACKs are sent redundantly. Second, it plays nicer with the delayed ACK timer. (SCTP doesn't have a non-SACK mode, so it naturally supports SACK-based Early Retransmit 🧚) Let's look at a flight of three segments, S1...S3, where S2 gets dropped by the network. When S1 arrives it's in order, so the receiver may or may not delay the ACK, which gives two scenarios:

  • (A) The ACK for S1 is delayed: Here the arrival of S3 triggers an ACK that covers S1 (which was previously unacknowledged). Early Retransmit without SACK won't prevent an RTO in this case, because no duplicate ACKs will arrive 😭 But with SACK, the ACK for S1 also includes SACK information showing that S3 arrived at the receiver. The sender can then invoke Early Retransmit on this ACK, because only one segment remains outstanding ✨
  • (B) The ACK for S1 is not delayed: Here the arrival of S1 triggers an ACK of previously unacknowledged data. The arrival of S3 triggers a duplicate ACK (because it's out of order). Both ACKs cover the same segment (S1). So regardless of whether SACK is used, Early Retransmit can be performed by the sender (assuming no ACK loss) πŸ™Œ

4.2. Segment Reordering πŸŒ€

Early Retransmit is less robust against reordered segments than the standard fast retransmit threshold is 😬 Research shows that lowering the number of duplicate ACKs needed to trigger fast retransmit to two (instead of three) cuts the ratio of good to bad retransmits by a factor of three [Pax97]. BUT this analysis didn't include the extra condition that ownd was smaller than four segments AND no new data was available for transmission πŸ™ˆ

A bunch of studies have shown that network reordering isn't rare on some network paths. Various measurement studies have shown that reordering is negligible along most paths, but quite prevalent along certain paths [Pax97, BPS99, BS02, Pir05]. Evaluating Early Retransmit against real segment reordering is part of the experiment we hope to kick off with this document πŸ§ͺ

4.3. Worst Case πŸ’€

Next, here are two "worst case" scenarios for Early Retransmit 😱

  • (1) Persistent reordering of segments combined with an application that doesn't constantly send data can lead to lots of needless retransmissions when using Early Retransmit. For example, imagine an application that sends data two segments at a time, followed by an idle period when no data is queued for delivery. If the network consistently reorders the two segments, the sender will needlessly retransmit one out of every two unique segments transmitted when using the above algorithm (which means one-third of all segments sent are needless retransmissions). However, this would only be a problem for long-lived connections from applications that transmit in spurts 🌧️
  • (2) Similar to the above, consider flows that consist of two segments each and always experience reordering. Just like in (1), one out of every two unique data segments gets retransmitted needlessly, so one-third of the traffic is spurious 😩

Right now, this document doesn't suggest how to mitigate these problems. BUT the worst cases are likely pathological 🀞 Part of the experiments this document hopes to trigger would involve figuring out whether these theoretical worst-case scenarios are actually prevalent in the network. In general, it'd also explore the trade-off between spurious fast retransmits and the delay imposed by the RTO. Appendix A does offer a survey of possible mitigations that call for curtailing the use of Early Retransmit when it's making poor retransmission decisions πŸŽ€


There are a number of similar proposals in the literature that try to fix the same problem Early Retransmit addresses πŸ¦‹

Deployment of Explicit Congestion Notification (ECN) [Flo94, RFC3168] may benefit connections with small congestion window sizes [RFC2884]. ECN gives the end-host a way to learn about congestion without dropping segments. Some segment drops may still happen, but ECN may let a transport perform better with small congestion windows, because the sender will be required to detect less segment loss [RFC2884] πŸ’œ

[Bal98] outlines another solution to the problem of having no new segments to transmit into the network when the first two duplicate ACKs arrive. In response to those duplicate ACKs, a TCP sender transmits zero-byte segments to induce additional duplicate ACKs. This keeps the robustness of the standard fast retransmit algorithm, BUT it injects segments into the network that don't deliver any data, so they're potentially wasting network resources (at a time when those resources may well be scarce) 😬

[RFC4653] also defines an orthogonal method for changing the duplicate ACK threshold. The mechanisms proposed in this document lower the duplicate ACK threshold when a small amount of data is outstanding. Meanwhile, the mechanisms in [RFC4653] raise the duplicate ACK threshold (above the standard of 3) when the congestion window is large, to increase robustness to segment reordering 🌈

6. Security Considerations πŸ”

The security considerations found in [RFC5681] apply to this document. No additional security problems have been identified with Early Retransmit at this time. Stay safe out there, bestie 🫢

7. Acknowledgments ✨

Huge thanks to Sally Floyd 🫢 for her feedback in discussions about Early Retransmit. The idea of Early Retransmit was first sketched out in an Internet-Draft co-authored by Sally Floyd and Hari Balakrishnan. Armando Caro, Joe Touch, Alexander Zimmermann, and many members of the TSVWG and TCPM working groups also had great discussions that helped shape this doc. Our thanks to all! πŸ’–


8. References πŸ“š

8.1. Normative References

[RFC793]    Postel, J., "Transmission Control Protocol", STD 7,
            RFC 793, September 1981.

[RFC2018]   Mathis, M., Mahdavi, J., Floyd, S., and A. Romanow, "TCP
            Selective Acknowledgment Options", RFC 2018,
            October 1996.

[RFC2119]   Bradner, S., "Key words for use in RFCs to Indicate
            Requirement Levels", BCP 14, RFC 2119, March 1997.

[RFC2883]   Floyd, S., Mahdavi, J., Mathis, M., and M. Podolsky, "An
            Extension to the Selective Acknowledgement (SACK) Option
            for TCP", RFC 2883, July 2000.

[RFC2988]   Paxson, V. and M. Allman, "Computing TCP's Retransmission
            Timer", RFC 2988, November 2000.

[RFC3042]   Allman, M., Balakrishnan, H., and S. Floyd, "Enhancing
            TCP's Loss Recovery Using Limited Transmit", RFC 3042,
            January 2001.

[RFC4960]   Stewart, R., Ed., "Stream Control Transmission Protocol",
            RFC 4960, September 2007.

[RFC5681]   Allman, M., Paxson, V., and E. Blanton, "TCP Congestion
            Control", RFC 5681, September 2009.

8.2. Informative References

[AA02]      Urtzi Ayesta, Konstantin Avrachenkov, "The Effect of the
            Initial Window Size and Limited Transmit Algorithm on the
            Transient Behavior of TCP Transfers", In Proc. of the
            15th ITC Internet Specialist Seminar, Wurzburg,
            July 2002.

[All00]     Mark Allman.  A Web Server's View of the Transport Layer.
            ACM Computer Communication Review, October 2000.

[Bal98]     Hari Balakrishnan.  Challenges to Reliable Data Transport
            over Heterogeneous Wireless Networks.  Ph.D. Thesis,
            University of California at Berkeley, August 1998.

[BPS+98]    Hari Balakrishnan, Venkata Padmanabhan,
            Srinivasan Seshan, Mark Stemm, and Randy Katz.  TCP
            Behavior of a Busy Web Server: Analysis and Improvements.
            Proc. IEEE INFOCOM Conf., San Francisco, CA, March 1998.

[BPS99]     Jon Bennett, Craig Partridge, Nicholas Shectman.  Packet
            Reordering is Not Pathological Network Behavior.
            IEEE/ACM Transactions on Networking, December 1999.

[BS02]      John Bellardo, Stefan Savage.  Measuring Packet
            Reordering, ACM/USENIX Internet Measurement Workshop,
            November 2002.

[FF96]      Kevin Fall, Sally Floyd.  Simulation-based Comparisons of
            Tahoe, Reno, and SACK TCP.  ACM Computer Communication
            Review, July 1996.

[Flo94]     Sally Floyd.  TCP and Explicit Congestion Notification.
            ACM Computer Communication Review, October 1994.

[HB08]      Per Hurtig, Anna Brunstrom.  Enhancing SCTP Loss
            Recovery: An Experimental Evaluation of Early Retransmit.
            Elsevier Computer Communications, Vol. 31(16),
            October 2008, pp. 3778-3788.

[Jac88]     Van Jacobson.  Congestion Avoidance and Control.  ACM
            SIGCOMM 1988.

[LK98]      Dong Lin, H.T. Kung.  TCP Fast Recovery Strategies:
            Analysis and Improvements.  Proc. IEEE INFOCOM Conf.,
            San Francisco, CA, March 1998.

[Mor97]     Robert Morris.  TCP Behavior with Many Flows.  Proc.
            Fifth IEEE International Conference on Network Protocols,
            October 1997.

[Pax97]     Vern Paxson.  End-to-End Internet Packet Dynamics.  ACM
            SIGCOMM, September 1997.

[Pir05]     N. M. Piratla, "A Theoretical Foundation, Metrics and
            Modeling of Packet Reordering and Methodology of Delay
            Modeling using Inter-packet Gaps," Ph.D. Dissertation,
            Department of Electrical and Computer Engineering,
            Colorado State University, Fort Collins, CO, Fall 2005.

[RFC2884]   Hadi Salim, J. and U. Ahmed, "Performance Evaluation of
            Explicit Congestion Notification (ECN) in IP Networks",
            RFC 2884, July 2000.

[RFC3150]   Dawkins, S., Montenegro, G., Kojo, M., and V. Magret,
            "End-to-end Performance Implications of Slow Links",
            BCP 48, RFC 3150, July 2001.

[RFC3168]   Ramakrishnan, K., Floyd, S., and D. Black, "The Addition
            of Explicit Congestion Notification (ECN) to IP",
            RFC 3168, September 2001.

[RFC3517]   Blanton, E., Allman, M., Fall, K., and L. Wang, "A
            Conservative Selective Acknowledgment (SACK)-based Loss
            Recovery Algorithm for TCP", RFC 3517, April 2003.

[RFC3522]   Ludwig, R. and M. Meyer, "The Eifel Detection Algorithm
            for TCP", RFC 3522, April 2003.

[RFC3782]   Floyd, S., Henderson, T., and A. Gurtov, "The NewReno
            Modification to TCP's Fast Recovery Algorithm", RFC 3782,
            April 2004.

[RFC4653]   Bhandarkar, S., Reddy, A., Allman, M., and E. Blanton,
            "Improving the Robustness of TCP to Non-Congestion
            Events", RFC 4653, August 2006.

Appendix A. Research Issues in Adjusting the Duplicate ACK Threshold πŸ”¬

Okay so, bestie, lowering how many duplicate ACKs you need before fast retransmit kicks in (like Section 3 suggests) comes with a catch πŸ™ˆ. It makes fast retransmit less robust when the network reorders things a little. Section 4 has two egregious examples of reordering causing trouble. This appendix runs through a few schemes that have been suggested to soften the problems Early Retransmit causes when segments get reordered. None of them are ready for general use yet, since they still need more research πŸ’…. Current consensus is that the cases where Early Retransmit ends up needlessly retransmitting a big pile of data are pathological, so these mitigations are not generally required. Main character behavior from the network, honestly 😭.

MITIGATION A.1: Track Spurious Early Retransmits πŸ•΅οΈβ€β™€οΈ

This one lets a connection keep using Early Retransmit as long as it isn't flooding the network with "too much" spurious data. Using the info from TCP's D-SACK option [RFC2883] or SCTP's Duplicate Transmission Sequence Number (Duplicate-TSN) notification, a sender can spot when segments sent via Early Retransmit were needless. Eifel [RFC3522] can also help the sender detect spurious Early Retransmits. Once spurious Early Retransmits show up, the sender can either turn off Early Retransmit completely, or limit it so that only an acceptably small fraction of the connection's transmissions are spurious. For example, a connection could stop using Early Retransmit after the first spurious retransmit is detected. Quick, decisive, iconic πŸ‘‘.

MITIGATION A.2: Just Limit It 🚦

If a sender can't reliably tell whether an Early-Retransmitted segment is spurious, it could simply cap how many Early Retransmits happen. That cap could be a fixed number per connection (for example, Early Retransmit is allowed only once per connection), or a small percentage of the total traffic being sent. Simple and low-drama πŸ“.

MITIGATION A.3: Add a Little Wait ⏳

This one lets a connection trigger Early Retransmit using the criteria from Section 3, plus a "small" timeout [Pax97]. For instance, a sender might have to see two duplicate ACKs and then wait T msec before Early Retransmit is invoked. That extra time gives reordered acknowledgments a chance to reach the sender, which can avoid a needless retransmit 🧚. Figuring out how to pick a good timeout is part of the research this scheme would still need, so it's a work in progress ✨.


Authors' Addresses πŸ’Œ

Mark Allman
International Computer Science Institute
1947 Center Street, Suite 600
Berkeley, CA 94704-1198
USA
Phone: 440-235-1792
EMail: mallman@icir.org
http://www.icir.org/mallman/


Konstantin Avrachenkov
INRIA
2004 route des Lucioles, B.P.93
06902, Sophia Antipolis
France
Phone: 00 33 492 38 7751
EMail: k.avrachenkov@sophia.inria.fr
http://www-sop.inria.fr/members/Konstantin.Avratchenkov/me.html


Urtzi Ayesta
BCAM-IKERBASQUE                         LAAS-CNRS
Bizkaia Technology Park, Building 500   7 Avenue Colonel Roche
48160 Derio                             31077, Toulouse
Spain                                   France
                                        EMail: urtzi@laas.fr
                                        http://www.laas.fr/~urtzi


Josh Blanton
Ohio University
301 Stocker Center
Athens, OH  45701
USA
EMail: jblanton@irg.cs.ohiou.edu


Per Hurtig
Karlstad University
Department of Computer Science
Universitetsgatan 2 651 88
Karlstad
Sweden
EMail: per.hurtig@kau.se

That's the whole spec, bestie! πŸŒˆπŸŽ€

πŸ“¦ where this page comes from