RFC 7765

TCP and Stream Control Transmission Protocol (SCTP) RTO Restart

๐Ÿ“… published February 2016, from ietf

RFC 7765: TCP and SCTP RTO Restart ๐ŸŽ€

Okay bestie, this one is a 2016 Experimental doc (RFC 7765, February 2016) from Petlund, Hurtig, Brunstrom, and Welzl ๐Ÿ’…. Four authors across Karlstad University, Simula Research Laboratory AS, and the University of Oslo. It isn't on the Standards Track, and the header doesn't list anything it obsoletes or updates. The whole vibe is "let's try this and see if it's safe" ๐Ÿงชโœจ ISSN is 2070-1721.


Abstract

okay so the big idea is a sender-side tweak to how TCP and SCTP handle their retransmission timers ๐Ÿฆ‹. The goal is faster loss recovery when there's only a little data in flight on a connection. It's called RTO Restart (RTOR), and it lets the transport restart the retransmission timer with a smaller timeout, so the effective RTO gets more aggressive in situations where fast retransmit can't be used ๐Ÿ”ฅ. That means quicker loss detection and recovery for connections that are short-lived or application-limited. Iconic for those flows ๐Ÿ’–

Status of This Memo

This doc is not an Internet Standards Track spec ๐Ÿ™…โ€โ™€๏ธ. It's published for examination, experimental implementation, and evaluation ๐Ÿง‘โ€๐Ÿ”ฌ. It defines an Experimental Protocol for the Internet community, and it's a product of the IETF. It represents IETF community consensus, got public review, and was approved for publication by the IESG. Not every IESG-approved doc is a candidate for an Internet Standard, though. See Section 2 of RFC 5741 for the details ๐Ÿ“š.

For the current status, errata, and how to send feedback, check http://www.rfc-editor.org/info/rfc7765 ๐ŸŒธ.

Copyright (c) 2016 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 in effect on the publication date. Read those carefully, bestie, because they spell out your rights and restrictions. Any Code Components pulled from this doc must include the Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions, and they come without warranty as described in that license ๐Ÿ“œ.

Table of Contents

   1.  Introduction  . . . . . . . . . . . . . . . . . . . . . . . .   3
   2.  Terminology . . . . . . . . . . . . . . . . . . . . . . . . .   4
   3.  RTO Overview and Rationale for RTOR . . . . . . . . . . . . .   4
   4.  RTOR Algorithm  . . . . . . . . . . . . . . . . . . . . . . .   6
   5.  Discussion  . . . . . . . . . . . . . . . . . . . . . . . . .   7
     5.1.  Applicability . . . . . . . . . . . . . . . . . . . . . .   7
     5.2.  Spurious Timeouts . . . . . . . . . . . . . . . . . . . .   7
     5.3.  Tracking Outstanding and Previously Unsent Segments . . .   8
   6.  Related Work  . . . . . . . . . . . . . . . . . . . . . . . .   9
   7.  SCTP Socket API Considerations  . . . . . . . . . . . . . . .  10
     7.1.  Data Types  . . . . . . . . . . . . . . . . . . . . . . .  10
     7.2.  Socket Option for Controlling the RTO Restart Support
           (SCTP_RTO_RESTART)  . . . . . . . . . . . . . . . . . . .  10
   8.  Security Considerations . . . . . . . . . . . . . . . . . . .  11
   9.  References  . . . . . . . . . . . . . . . . . . . . . . . . .  11
     9.1.  Normative References  . . . . . . . . . . . . . . . . . .  11
     9.2.  Informative References  . . . . . . . . . . . . . . . . .  13
   Acknowledgements  . . . . . . . . . . . . . . . . . . . . . . . .  14
   Authors' Addresses  . . . . . . . . . . . . . . . . . . . . . . .  15

1. Introduction โœจ

okay so TCP and SCTP both use two nearly identical mechanisms to detect and recover from data loss ๐Ÿ•ต๏ธโ€โ™€๏ธ. TCP's are in [RFC6298] and [RFC5681], and SCTP's is in [RFC4960]. First, if the data you sent isn't acknowledged within a certain amount of time, a retransmission timeout (RTO) fires and the data gets resent. The RTO is based on measured round-trip times (RTTs) between sender and receiver, but it has a conservative lower bound of 1 second so that delayed data doesn't get mistaken for lost data ๐Ÿข.

Second, when a sender gets duplicate acknowledgments, or similar info through selective acknowledgments, the fast retransmit algorithm suspects loss and can trigger a retransmission โšก. Duplicate (and selective) ACKs are generated when data arrives out of order ๐Ÿ”€. Here's the tea: both loss and reordering cause out-of-order arrival, so fast retransmit waits for three out-of-order notifications before it counts the data as lost ๐Ÿซ . But sometimes the amount of outstanding data isn't enough to trigger three ACKs, and the sender has to rely on those lengthy RTOs for recovery ๐Ÿ˜ญ.

The amount of outstanding data can be small for a few reasons:

(1) The connection is limited by congestion control when the path has a low total capacity (bandwidth-delay product) or the connection's share of that capacity is small. It's also limited by congestion control in the first few RTTs of a connection, or after an RTO when the available capacity is being probed using slow-start ๐Ÿšฆ.

(2) The connection is limited by the receiver's available buffer space ๐Ÿ“ฆ.

(3) The connection is limited by the application if the available capacity of the path isn't fully used (for example, interactive apps), or when the transfer is at its end ๐Ÿ.

These reasons are valid for any flow, but reason (3) is the most common for apps that send short flows or use a bursty transmission pattern ๐Ÿ’…. Web-based apps are a classic example of short flows. [RJ10] shows that 70% of all web objects on the top 500 sites are too small for fast retransmit to work ๐Ÿคฏ. [FDT13] shows that about 77% of all retransmissions sent by a major web service happen after an RTO expires ๐Ÿ’€.

Bursty apps often send data in response to actions or real-life events ๐ŸŽฎ. Stock-trading systems, remote computer operations, online games, and web apps using persistent connections all fit here. What makes this class special is that they're often time dependent, and extra latency can drag down the application service level [P09] ๐Ÿ“‰.

The RTO Restart (RTOR) mechanism in this doc makes the effective RTO slightly more aggressive when there's too little outstanding data for fast retransmit to work ๐Ÿƒโ€โ™€๏ธ. The goal is faster loss recovery while staying robust to reordering ๐Ÿง . RTOR still follows the requirement for when a segment can be retransmitted (specified in [RFC6298] for TCP and [RFC4960] for SCTP). But it could increase the risk of spurious timeouts ๐Ÿ‘€. To figure out whether this change is safe to deploy and enable by default, more experimentation is needed. Section 5 covers the experiments still required, including evaluations in environments where the risk of spurious retransmissions is higher, like mobile networks with highly varying RTTs ๐Ÿ“ฑ.

The rest of this doc describes RTOR and its implementation for TCP only, to keep things easy to read ๐Ÿ“–. The RTOR algorithm in Section 4 also applies to SCTP, though. And Section 7 details the SCTP socket API needed to control RTOR ๐ŸŽ›๏ธ.

2. Terminology ๐Ÿ“

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this doc are to be interpreted as described in RFC 2119 [RFC2119] ๐Ÿซถ.

This doc introduces the following variables:

  • The number of previously unsent segments (prevunsnt): the number of segments a sender has queued for transmission but hasn't sent yet ๐Ÿ“ฌ.
  • RTO Restart threshold (rrthresh): RTOR is enabled whenever the sum of the number of outstanding segments and previously unsent segments (prevunsnt) is below this threshold ๐Ÿšช.

3. RTO Overview and Rationale for RTOR ๐ŸŒˆ

Here's how the RTO management works in [RFC6298]. It recommends that the retransmission timer be restarted when an ACK that acknowledges new data arrives and there's still outstanding data ๐Ÿ”„. The restart guarantees that unacknowledged segments get retransmitted after approximately RTO seconds โฐ.

Figure 1 shows standard RTO timer management, where a TCP sender transmits three segments to a receiver ๐ŸŽฌ. When the first and second segments arrive, they trigger a delayed ACK (delACK) [RFC1122], which restarts the RTO timer at the sender. The RTO gets restarted approximately one RTT after the third segment was sent. So if the third segment is lost (as in Figure 1), the effective loss detection time becomes "RTO + RTT" seconds ๐Ÿ˜ฌ. Sometimes it gets even longer. Say only two segments are outstanding. If the second segment is lost, the time to expire the delACK timer gets added to the effective loss detection time too ๐Ÿซฃ.

            Sender                               Receiver
                          ...
            DATA [SEG 1] ----------------------> (ack delayed)
            DATA [SEG 2] ----------------------> (send ack)
            DATA [SEG 3] ----X         /-------- ACK
            (restart RTO)  <----------/
                          ...
            (RTO expiry)
            DATA [SEG 3] ---------------------->

                       Figure 1: RTO Restart Example

For bulk traffic, the current approach is actually beneficial ๐Ÿ›Ÿ. [EL04] describes it as a "safety margin" that compensates for some problems the authors identified with the standard RTO calculation ๐Ÿงฏ. The [EL04] authors also say that "this safety margin does not exist for highly interactive applications where often only a single packet is in flight." Lowkey a important catch ๐Ÿ‘€. In general though, as long as enough segments reach a receiver to enable fast retransmit, RTO-based loss recovery should be avoided ๐Ÿ™…โ€โ™€๏ธ. RTOs should only be a last resort, because they drastically lower the congestion window compared to fast retransmit ๐Ÿ“‰.

Fast retransmit is preferable, but there are situations where timeouts are appropriate or are the only choice ๐Ÿคทโ€โ™€๏ธ. For example, if the network is severely congested and no segments arrive, RTO-based recovery should be used. In that case the time to recover from the loss(es) won't be the performance bottleneck ๐ŸŒ. However, for connections that don't use enough capacity to enable fast retransmit, RTO-based loss detection is the only choice, and the time it takes can become a real performance bottleneck ๐Ÿ’”.


To be continued in part 2 ๐ŸŒธโœจ

4. RTOR Algorithm โœจ

Okay so, for connections that can't use fast retransmit, RTOR is the move ๐Ÿ’–. The whole trick is in the timer. You reset it to "RTO - T_earliest", where T_earliest is how long it's been since the earliest outstanding segment was sent. Then retransmissions always happen after exactly RTO seconds. Iconic ๐Ÿ‘‘

This is an OPTIONAL sender-only tweak to TCP and SCTP ๐ŸŽ€. It updates step 5.3 in Section 5 of [RFC6298], and there's a similar update in Section 6.3.2 of [RFC4960] for SCTP. A sender that uses this method MUST follow the algorithm below:

When an ACK is received that acknowledges new data:

(1)  Set T_earliest = 0.

(2)  If the sum of the number of outstanding and previously unsent
     segments (prevunsnt) is less than an RTOR threshold
     (rrthresh), set T_earliest to the time elapsed since the
     earliest outstanding segment was sent.

(3)  Restart the retransmission timer so that it will expire after
     (for the current value of RTO):

     (a)  RTO - T_earliest, if RTO - T_earliest > 0.

     (b)  RTO, otherwise.

The RECOMMENDED value of rrthresh is four, because that makes sure RTOR only kicks in when fast retransmit can't be triggered โœจ. With this update, TCP implementations MUST track the time since the earliest outstanding segment was transmitted (T_earliest). RTOR only runs when outstanding plus previously unsent data is under rrthresh segments, so TCP implementations also need to know whether that amount is more, equal, or less than rrthresh segments ๐Ÿงฉ. Some packet-based TCP stacks (like Linux TCP) already track transmission times for every segment and the outstanding count, but not all implementations do. Section 5.3 explains how to do segment tracking for a general TCP implementation. To use RTOR, the calculated expiration time MUST be positive (step 3(a) above). This is needed so RTOR doesn't cause retransmissions too early when previously retransmitted segments get acknowledged ๐Ÿ™ˆ


5. Discussion

Even though RTOR follows the requirement in [RFC6298] that segments must not be retransmitted earlier than RTO seconds after their original transmission, it makes the effective RTO more aggressive ๐Ÿ‘€. So let's talk about where it fits and what issues come with it ๐Ÿ’…

5.1. Applicability

The standardized algorithm has been shown to add at least one RTT to loss recovery in TCP [LS00] and SCTP [HB11] [PBP09] ๐Ÿ˜ฉ. For apps with strict timing needs (like interactive web) instead of throughput needs, RTOR could be a big win, since the RTT and the receivers' delACK timer are often huge parts of the effective loss recovery time ๐Ÿฆ‹. Measurements in [HB11] found that the total transfer time of a lost segment (original transmission plus loss recovery time) can drop by 35% with RTOR. Those results match [PGH06] and [PBP09], which show RTOR significantly reducing retransmission latency ๐Ÿš€

Not every traffic type benefits, though. Bulk transmission is one example. Those flows mostly have four or more segments outstanding, so loss recovery happens through fast retransmit. There's no harm in using RTOR for bulk traffic anyway, since the algorithm is only active when outstanding and unsent segments add up to less than rrthresh (default 4) ๐Ÿ™ˆ

Since RTOR is a mostly conservative algorithm, it's suitable for experimentation as a system-wide default for TCP traffic ๐ŸŒˆ

5.2. Spurious Timeouts

RTOR can, in some situations, shorten loss detection time and raise the risk of spurious timeouts ๐Ÿ˜ฌ. In theory, the retransmission timer has a lower bound of 1 second [RFC6298], which limits that risk. In practice, though, most implementations use a significantly lower value. Initial measurements show slight increases in the number of spurious timeouts when those lower values are used [RHB15]. Further experiments in different environments and with different types of traffic are encouraged to quantify those increases more reliably ๐Ÿ”ฌ

Does a slightly increased risk matter? Generally, spurious timeouts hurt the network because segments get transmitted needlessly. However, recent experiments don't show a significant increase in network load for a number of realistic scenarios [RHB15] ๐Ÿซง. Another problem with spurious retransmissions is their effect on TCP/SCTP performance, since the congestion window is reduced to one segment when timeouts occur [RFC5681]. That could be a real problem for apps sending multiple bursts of data within a single flow, like web-based HTTP/1.1 and HTTP/2.0 apps. Still, results from recent experiments involving persistent web traffic [RHB15] revealed a net gain using RTOR ๐ŸŽ‰. Other flows, like long-lived bulk flows, aren't affected, because the algorithm only applies when outstanding plus unsent segments is less than rrthresh. Short-lived and application-limited flows are typically not affected either, since they're too short to experience the effect of congestion control or have a transmission rate that's quickly attainable ๐Ÿ’–

While a slight increase in spurious timeouts has been observed with RTOR, it's not clear whether that increase needs any future algorithmic changes. This is especially true since most modern operating systems already include mechanisms to detect [RFC3522] [RFC3708] [RFC5682] and resolve [RFC4015] possible problems with spurious retransmissions โœจ. More experimentation is needed to figure this out and to move this specification from Experimental to the Standards Track ๐Ÿซถ. For instance, RTOR hasn't been evaluated in the context of mobile networks. Those networks often have highly variable RTTs (delay spikes) due to things like handovers, so they'd be a really useful scenario for more experimentation ๐Ÿ“ฑ

5.3. Tracking Outstanding and Previously Unsent Segments

How you track outstanding and previously unsent segments will probably differ depending on the TCP implementation ๐Ÿงฉ. For packet-based TCP implementations, tracking outstanding segments is often straightforward and can be done with a simple counter. For byte-based TCP stacks, it's a more complex task. Section 3.2 of [RFC5827] outlines a general method for tracking the number of outstanding segments, and the same method can be used for RTOR. The implementation has to track segment boundaries to figure out how many actual segments have been transmitted but not acknowledged. The sender can do this by tracking the boundaries of the rrthresh segments on the right side of the current window (which means tracking rrthresh + 1 sequence numbers in TCP). A circular list of the segment boundaries could do the job, for instance. Cumulative ACKs that don't fall within this region mean at least rrthresh segments are outstanding, so RTOR isn't enabled. Once the outstanding window gets small enough that RTOR can be invoked, you'll have a full understanding of the number of outstanding segments from the rrthresh + 1 sequence numbers you retained. (Note: the implicit sequence number consumed by the TCP FIN bit can also be included in the tracking of segment boundaries.)

Tracking previously unsent segments depends on the segmentation strategy the TCP implementation uses, not on whether it's packet based or byte based ๐Ÿ“. If segments are formed directly on socket writes, determining the number of previously unsent segments should be trivial. If unsent data can be segmented (or resegmented) for as long as it's still unsent, a straightforward strategy is to divide the amount of unsent data (in bytes) by the Sender Maximum Segment Size (SMSS) to get an estimate. Depending on the segmentation strategy, that estimate could be too simplistic. However, this estimation isn't critical to RTOR ๐Ÿ’…. Tracking prevunsnt is only there to optimize a corner case where RTOR was unnecessarily disabled. Implementations can use a simplified method: set prevunsnt to rrthresh whenever previously unsent data is available, and set it to zero when no new data is available. This disables RTOR in the presence of unsent data, and only uses the number of outstanding segments to enable or disable RTOR ๐Ÿซถ

okay so there are a few other proposals that tackle the problem of not getting enough ACKs for loss recovery ๐Ÿฅบ here's why RTOR is more of a teammate to them than a rival ๐Ÿ’–

The limited transmit mechanism [RFC3042] lets a TCP sender send a previously unsent segment for each of the first two duplicate acknowledgements (dupACKs) ๐Ÿ“จ by sending new segments, the sender tries to make extra dupACKs so fast retransmit can kick in ๐Ÿ”ฅ BUT limited transmit does nothing if there's no previously unsent data ready to go ๐Ÿ’€ that's where [RFC5827] comes in, with its early retransmit algorithm for fast loss recovery in those situations ๐Ÿฆ‹ it lowers the number of dupACKs needed for fast retransmit (dupthresh) based on how many segments are outstanding, so fewer dupACKs are needed to trigger a retransmission โœจ still, it's not always useful or might not work properly ๐Ÿ˜ญ first, if a single segment is outstanding and it's lost, early retransmit is impossible to use ๐Ÿ™ƒ second, if ACKs are lost, early retransmit can't help ๐Ÿ’” third, if the network path reorders segments, the algorithm might cause more spurious retransmissions than fast retransmit ๐ŸŒ€ the recommended value of RTOR's rrthresh variable is based on the dupthresh, but it's possible to adapt it so it plays nicer with other experimental algorithms like early retransmit ๐Ÿซถ

Tail Loss Probe [TLP] is a proposal that sends up to two "probe segments" when a timer fires that's set to a value smaller than the RTO ๐ŸŽ€ a "probe segment" is a new segment if new data is available, otherwise it's a retransmission ๐ŸŒธ the goal is to make up for sluggish RTO behavior when the RTO is way bigger than the RTT, which according to measurements reported in [TLP] is not uncommon ๐Ÿ™ˆ TLP also tries to dodge the congestion window reset to one segment by enabling fast recovery instead ๐Ÿ‘‘ the probe timeout (PTO) is normally two RTTs, and a spurious PTO is less risky than a spurious RTO because it doesn't have the same negative effects (clearing the scoreboard and restarting with slow-start) ๐Ÿ’… TLP is a more advanced mechanism than RTOR, requiring e.g., SACK to work, and it's often able to shave even more time off loss recovery โญ however, it also noticeably increases the amount of spurious retransmissions compared to RTOR [RHB15] ๐Ÿ˜ฌ

TLP is applicable in situations where RTOR doesn't apply, and it could overrule RTOR (giving a similar general behavior but with a lower timeout) when the number of outstanding segments is smaller than four and no new segments are available for transmission ๐Ÿงš the PTO has the same inherent problem of restarting the timer on an incoming ACK, and it could be combined with a strategy similar to RTOR's to get more consistent timeouts ๐Ÿ“


7. SCTP Socket API Considerations ๐Ÿงš

this section describes how the socket API for SCTP defined in [RFC6458] gets extended to control the usage of RTO restart for SCTP ๐ŸŽ€

btw, please note that this section is informational only ๐Ÿ’œ

7.1. Data Types

this section uses data types from [IEEE.9945]: uintN_t means an unsigned integer of exactly N bits (e.g., uint16_t) ๐Ÿค“ it's the same as in [RFC6458] ๐Ÿซถ

7.2. Socket Option for Controlling the RTO Restart Support (SCTP_RTO_RESTART)

this socket option lets you enable or disable RTO Restart for SCTP associations ๐Ÿ”ฅ

whether or not RTO restart is enabled by default is implementation specific ๐Ÿคทโ€โ™€๏ธ

this socket option uses IPPROTO_SCTP as its level and SCTP_RTO_RESTART as its name ๐Ÿ’– it can be used with getsockopt() and setsockopt() โœจ the socket option value uses the following structure defined in [RFC6458]:

struct sctp_assoc_value {
  sctp_assoc_t assoc_id;
  uint32_t assoc_value;
};

assoc_id: this parameter is ignored for one-to-one style sockets ๐Ÿ’… for one-to-many style sockets, it tells you which association you're acting on ๐Ÿ‘‘ the special sctp_assoc_t SCTP_{FUTURE|CURRENT|ALL}_ASSOC can also be used in assoc_id for setsockopt() ๐ŸŒˆ for getsockopt(), the special value SCTP_FUTURE_ASSOC can be used in assoc_id, but it's an error to use SCTP_{CURRENT|ALL}_ASSOC in there ๐Ÿ™…โ€โ™€๏ธ

assoc_value: a non-zero value enables RTO restart, whereas a value of 0 disables it ๐Ÿฆ‹

sctp_opt_info() needs to be extended to support SCTP_RTO_RESTART ๐Ÿ› ๏ธ


8. Security Considerations ๐Ÿ”

okay this one is serious bestie ๐Ÿ˜ญ this document specifies an experimental sender-only modification to TCP and SCTP ๐Ÿงช the modification changes how the retransmission timer's value gets set when it's restarted ๐Ÿšจ so the security considerations found in [RFC6298] apply to this document ๐Ÿ“œ no additional security problems have been identified with RTO Restart at this time ๐Ÿซก


9. References ๐Ÿ“š

9.1. Normative References

[RFC1122]  Braden, R., Ed., "Requirements for Internet Hosts -
           Communication Layers", STD 3, RFC 1122,
           DOI 10.17487/RFC1122, October 1989,
           <http://www.rfc-editor.org/info/rfc1122>.

[RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
           Requirement Levels", BCP 14, RFC 2119,
           DOI 10.17487/RFC2119, March 1997,
           <http://www.rfc-editor.org/info/rfc2119>.

[RFC3042]  Allman, M., Balakrishnan, H., and S. Floyd, "Enhancing
           TCP's Loss Recovery Using Limited Transmit", RFC 3042,
           DOI 10.17487/RFC3042, January 2001,
           <http://www.rfc-editor.org/info/rfc3042>.

[RFC3522]  Ludwig, R. and M. Meyer, "The Eifel Detection Algorithm
           for TCP", RFC 3522, DOI 10.17487/RFC3522, April 2003,
           <http://www.rfc-editor.org/info/rfc3522>.

[RFC3708]  Blanton, E. and M. Allman, "Using TCP Duplicate Selective
           Acknowledgement (DSACKs) and Stream Control Transmission
           Protocol (SCTP) Duplicate Transmission Sequence Numbers
           (TSNs) to Detect Spurious Retransmissions", RFC 3708,
           DOI 10.17487/RFC3708, February 2004,
           <http://www.rfc-editor.org/info/rfc3708>.

[RFC4015]  Ludwig, R. and A. Gurtov, "The Eifel Response Algorithm
           for TCP", RFC 4015, DOI 10.17487/RFC4015, February 2005,
           <http://www.rfc-editor.org/info/rfc4015>.

[RFC4960]  Stewart, R., Ed., "Stream Control Transmission Protocol",
           RFC 4960, DOI 10.17487/RFC4960, September 2007,
           <http://www.rfc-editor.org/info/rfc4960>.

[RFC5681]  Allman, M., Paxson, V., and E. Blanton, "TCP Congestion
           Control", RFC 5681, DOI 10.17487/RFC5681, September 2009,
           <http://www.rfc-editor.org/info/rfc5681>.

[RFC5682]  Sarolahti, P., Kojo, M., Yamamoto, K., and M. Hata,
           "Forward RTO-Recovery (F-RTO): An Algorithm for Detecting
           Spurious Retransmission Timeouts with TCP", RFC 5682,
           DOI 10.17487/RFC5682, September 2009,
           <http://www.rfc-editor.org/info/rfc5682>.

[RFC5827]  Allman, M., Avrachenkov, K., Ayesta, U., Blanton, J., and
           P. Hurtig, "Early Retransmit for TCP and Stream Control
           Transmission Protocol (SCTP)", RFC 5827,
           DOI 10.17487/RFC5827, May 2010,
           <http://www.rfc-editor.org/info/rfc5827>.

[RFC6298]  Paxson, V., Allman, M., Chu, J., and M. Sargent,
           "Computing TCP's Retransmission Timer", RFC 6298,
           DOI 10.17487/RFC6298, June 2011,
           <http://www.rfc-editor.org/info/rfc6298>.

9.2. Informative References

[EL04]     Ekstroem, H. and R. Ludwig, "The Peak-Hopper: A New End-
           to-End Retransmission Timer for Reliable Unicast
           Transport", IEEE INFOCOM 2004,
           DOI 10.1109/INFCOM.2004.1354671, March 2004.

[FDT13]    Flach, T., Dukkipati, N., Terzis, A., Raghavan, B.,
           Cardwell, N., Cheng, Y., Jain, A., Hao, S., Katz-Bassett,
           E., and R. Govindan, "Reducing Web Latency: the Virtue of
           Gentle Aggression", Proc. ACM SIGCOMM Conf.,
           DOI 10.1145/2486001.2486014, August 2013.

[HB11]     Hurtig, P. and A. Brunstrom, "SCTP: designed for timely
           message delivery?", Springer Telecommunication Systems 47
           (3-4), DOI 10.1007/s11235-010-9321-3, August 2011.

[IEEE.9945]
           IEEE/ISO/IEC, "International Standard - Information
           technology Portable Operating System Interface (POSIX)
           Base Specifications, Issue 7", IEEE 9945-2009,
           <http://standards.ieee.org/findstds/
           standard/9945-2009.html>.

[LS00]     Ludwig, R. and K. Sklower, "The Eifel retransmission
           timer", ACM SIGCOMM Comput. Commun. Rev., 30(3),
           DOI 10.1145/382179.383014, July 2000.

[P09]      Petlund, A., "Improving latency for interactive, thin-
           stream applications over reliable transport", Unipub PhD
           Thesis, Oct 2009.

[PBP09]    Petlund, A., Beskow, P., Pedersen, J., Paaby, E., Griwodz,
           C., and P. Halvorsen, "Improving SCTP retransmission
           delays for time-dependent thin streams", Springer
           Multimedia Tools and Applications, 45(1-3),
           DOI 10.1007/s11042-009-0286-8, October 2009.

[PGH06]    Pedersen, J., Griwodz, C., and P. Halvorsen,
           "Considerations of SCTP Retransmission Delays for Thin
           Streams", IEEE LCN 2006, DOI 10.1109/LCN.2006.322082,
           November 2006.

[RFC6458]  Stewart, R., Tuexen, M., Poon, K., Lei, P., and V.
           Yasevich, "Sockets API Extensions for the Stream Control
           Transmission Protocol (SCTP)", RFC 6458,
           DOI 10.17487/RFC6458, December 2011,
           <http://www.rfc-editor.org/info/rfc6458>.

[RHB15]    Rajiullah, M., Hurtig, P., Brunstrom, A., Petlund, A., and
           M. Welzl, "An Evaluation of Tail Loss Recovery Mechanisms
           for TCP", ACM SIGCOMM CCR 45 (1),
           DOI 10.1145/2717646.2717648, January 2015.

[RJ10]     Ramachandran, S., "Web metrics: Size and number of
           resources", May 2010, <https://goo.gl/0a6Q9A>.

[TLP]      Dukkipati, N., Cardwell, N., Cheng, Y., and M. Mathis,
           "Tail Loss Probe (TLP): An Algorithm for Fast Recovery of
           Tail Losses", Work in Progress, draft-dukkipati-tcpm-tcp-
           loss-probe-01, February 2013.

Acknowledgements ๐Ÿซถ

the authors want to thank Michael Tuexen for contributing the SCTP Socket API considerations ๐Ÿ’ and Godred Fairhurst, Yuchung Cheng, Mark Allman, Anantha Ramaiah, Richard Scheffenegger, Nicolas Kuhn, Alexander Zimmermann, and Michael Scharf for commenting on the document and the ideas behind it ๐ŸŒท

all the authors are supported by RITE (http://riteproject.eu/), a research project (ICT-317700) funded by the European Community under its Seventh Framework Program โœจ the views expressed here are those of the author(s) only ๐Ÿ’… the European Commission is not liable for any use that may be made of the information in this document ๐Ÿ™

Authors' Addresses โœจ

okay the squad behind this doc, the people you'd DM about it ๐Ÿซถ๐Ÿ’…

Per Hurtig
Karlstad University
Universitetsgatan 2
Karlstad  651 88
Sweden

Phone: +46 54 700 23 35
Email: per.hurtig@kau.se
Anna Brunstrom
Karlstad University
Universitetsgatan 2
Karlstad  651 88
Sweden

Phone: +46 54 700 17 95
Email: anna.brunstrom@kau.se
Andreas Petlund
Simula Research Laboratory AS
P.O. Box 134
Lysaker  1325
Norway

Phone: +47 67 82 82 00
Email: apetlund@simula.no
Michael Welzl
University of Oslo
PO Box 1080 Blindern
Oslo  N-0316
Norway

Phone: +47 22 85 24 20
Email: michawe@ifi.uio.no
๐Ÿ“ฆ where this page comes from