RFC 8257
Data Center TCP (DCTCP): TCP Congestion Control for Data Centers
๐ RFC 8257: Data Center TCP (DCTCP): TCP Congestion Control for Data Centers โจ
okay bestie, let's get into it ๐ This is an Informational RFC (so it's not a Standards Track thing), published in October 2017, and it was written by S. Bensley, D. Thaler, P. Balasubramanian (all from Microsoft), L. Eggert (from NetApp), and G. Judd (from Morgan Stanley). It's in the ISSN: 2070-1721 series, and it doesn't obsolete or update any other RFCs ๐ฆ
Here's the vibe: DCTCP is a TCP congestion control scheme built for data-center traffic ๐ธ It upgrades ECN processing so the sender estimates the fraction of bytes that hit congestion, instead of just noticing that some congestion happened, and then scales the congestion window off that estimate. The result is high-burst tolerance, low latency, and high throughput with shallow-buffered switches ๐ฅ The memo also talks about deployment issues when DCTCP and conventional TCP coexist, the missing negotiation mechanism between sender and receiver, and some possible mitigations ๐
Also, the big warning: DCTCP is for controlled environments like data centers, and it must not be deployed over the public Internet without additional measures ๐
Status of This Memo ๐
This document is not an Internet Standards Track specification; it is published for informational purposes.
This document is a product of the Internet Engineering Task Force (IETF). It represents the consensus of the IETF community. It has received public review and has been approved for publication by the Internet Engineering Steering Group (IESG). Not all documents approved by the IESG are a candidate for any level of Internet Standard; see Section 2 of RFC 7841.
Information about the current status of this document, any errata, and how to provide feedback on it may be obtained at https://www.rfc-editor.org/info/rfc8257.
Copyright Notice ๐
Copyright (c) 2017 IETF Trust and the persons identified as the document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.
1. Introduction โจ
okay so big data centers need tons of network switches to connect all their servers ๐ฅ๏ธ ๐ง Cheap switches save a ton of money, but they usually have small queues, which means they're way more likely to drop packets when things get congested ๐ญ
Data center traffic is a mix of short flows and long flows ๐ธ The short ones need low latency, and the long ones need high throughput. Data centers also get incast bursts, where a bunch of servers all send traffic to one server at the same time ๐ A super common example is MapReduce [MAPREDUCE]: the workers finish around the same time and all reply to the master node at once ๐
All of this creates some tension for the switch queue ๐ซถ
- The queue has to be short enough so it doesn't add excessive latency for short flows.
- The queue has to be long enough to hold enough data for long flows to fill the path capacity.
- The queue has to be long enough to soak up incast bursts without excessive packet loss.
Standard TCP congestion control [RFC5681] basically waits for packet loss to figure out there's congestion, and that just doesn't cut it here ๐ญ First, short flows start suffering unacceptable latency before any packets get dropped. Second, by the time TCP congestion control kicks in on the senders, most of the incast burst is already gone ๐
[RFC3168] describes a way to use Explicit Congestion Notification (ECN) from the switches to detect congestion ๐ฆ The catch is that it only tells you congestion exists, not how bad it is. With mild congestion, the TCP congestion window gets cut way too hard, and that unnecessarily slows down the long flows ๐
That's where DCTCP comes in โจ It changes traditional ECN processing by estimating the fraction of bytes that encounter congestion, rather than just detecting that some congestion happened. Then it scales the TCP congestion window based on that estimate ๐ฅ This gives high-burst tolerance, low latency, and high throughput with shallow-buffered switches ๐ DCTCP is a tweak to how a conventional TCP processes ECN, and it still requires standard TCP congestion control to handle packet loss ๐
DCTCP should only be deployed inside a single intra-data-center environment, where the endpoints and the switching fabric are all under one administrative domain. DCTCP MUST NOT be deployed over the public Internet without additional measures, as detailed in Section 5 ๐ซถ
The goal of this Informational RFC is to document DCTCP as a new approach (widely implemented and deployed already ๐) for TCP congestion control in data centers. The IETF TCPM Working Group reached consensus that a DCTCP standard would need more work. Precisely documenting running code lets follow-up Experimental or Standards Track RFCs come through the IETF stream ๐
This document describes DCTCP as implemented in Microsoft Windows Server 2012 [WINDOWS]. The Linux [LINUX] and FreeBSD [FREEBSD] operating systems have also implemented DCTCP support in a way that is believed to follow this document. Deployment experiences with DCTCP have been documented in [MORGANSTANLEY] ๐ง
2. Terminology ๐
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.
Normative language describes how necessary the various aspects of a DCTCP implementation are for interoperability ๐ But even compliant implementations without the measures in Sections 4-6 would still only be safe to deploy in controlled environments, i.e., not over the public Internet ๐
3. DCTCP Algorithm ๐ธ
There are three parts to the DCTCP algorithm ๐
- The switches (or other intermediate devices in the network) detect congestion and set the Congestion Encountered (CE) codepoint in the IP header.
- The receiver echoes the congestion information back to the sender, using the ECN-Echo (ECE) flag in the TCP header.
- The sender computes a congestion estimate and reacts by reducing the TCP congestion window (cwnd) accordingly.
3.1. Marking Congestion on the L3 Switches and Routers โญ
The Layer 3 (L3) switches and routers in a data-center fabric tell end nodes about congestion by setting the CE codepoint in the IP header, as specified in Section 5 of [RFC3168] ๐ฆ For example, the switches may be configured with a congestion threshold. When a packet arrives at a switch and its queue length is greater than that threshold, the switch sets the CE codepoint in the packet ๐ซถ For example, Section 3.4 of [DCTCP10] suggests threshold marking with a threshold of K > (RTT * C)/7, where C is the link rate in packets per second ๐ฅ In typical deployments, the marking threshold is set to a small value to keep the average queueing delay short ๐
However, the actual marking algorithm is an implementation detail of the switch and generally won't be known to the sender and receiver ๐ So the sender and receiver should not assume that a particular marking algorithm is implemented by the switching fabric ๐
3.2. Echoing Congestion Information on the Receiver ๐
okay so, according to Section 6.1.3 of [RFC3168], the receiver sets the ECE flag if any of the packets being acknowledged had the CE codepoint set. It then keeps setting ECE until it gets a packet with the Congestion Window Reduced (CWR) flag set. ๐
But DCTCP needs way more detailed info. The sender needs to be able to figure out how many bytes it sent that actually hit congestion, so the scheme in [RFC3168] just doesn't cut it ๐ญ
One possible fix is to ACK every single packet and set ECE in the ACK if and only if the CE codepoint was set on the packet being acknowledged. The problem is that this kills delayed ACKs, which are a huge performance win in data centers ๐ If the delayed ACK frequency is n, then an ACK gets generated every n packets.
The typical value of n is 2 ๐ธ, but ACK throttling or packet-coalescing tricks meant to boost performance could change it.
Instead, DCTCP introduces a new Boolean TCP state variable called DCTCP Congestion Encountered (DCTCP.CE). It starts out false and lives in the Transmission Control Block (TCB). When sending an ACK, the ECE flag MUST be set if and only if DCTCP.CE is true. When receiving packets, the CE codepoint MUST be processed as follows:
- If the CE codepoint is set and
DCTCP.CEis false, setDCTCP.CEto true and send an immediate ACK. - If the CE codepoint is not set and
DCTCP.CEis true, setDCTCP.CEto false and send an immediate ACK. - Otherwise, ignore the CE codepoint.
Since the immediate ACK reflects the new DCTCP.CE state, it may acknowledge any previously unacknowledged packets in the old state. That can lead to an incorrect rate computation at the sender, per Section 3.3. To avoid this, an implementation MAY choose to send two ACKs: one for previously unacknowledged packets and another acknowledging the most recently received packet. โจ
Receiver handling of the CWR bit is also per [RFC3168] (including [Err3639]). That means that when a segment shows up with both the CE and CWR bits set, CWR gets processed first and then CE gets processed. ๐ฆ
Send immediate
ACK with ECE=0
.-----. .--------------. .-----.
Send 1 ACK / v v | | \
for every | .------------. .------------. | Send 1 ACK
n packets | | DCTCP.CE=0 | | DCTCP.CE=1 | | for every
with ECE=0 | '------------' '------------' | n packets
\ | | ^ ^ / with ECE=1
'-----' '--------------' '-----'
Send immediate
ACK with ECE=1
Figure 1: ACK Generation State Machine
3.3. Processing Echoed Congestion Indications on the Sender ๐ฆ
The sender estimates the fraction of bytes sent that encountered congestion. The current estimate lives in a new TCP state variable, DCTCP.Alpha. It is initialized to 1 and SHOULD be updated as follows:
DCTCP.Alpha = DCTCP.Alpha * (1 - g) + g * M
where:
gis the estimation gain, a real number between 0 and 1. Pickinggis left up to the implementation. See Section 4 for further considerations. ๐Mis the fraction of bytes sent that encountered congestion during the previous observation window. The observation window is chosen to be approximately the Round-Trip Time (RTT). In particular, an observation window ends when all bytes in flight at the beginning of the window have been acknowledged.
To update DCTCP.Alpha, the TCP state variables defined in [RFC0793] get used, and three additional TCP state variables get introduced:
DCTCP.WindowEnd: the TCP sequence number threshold when one observation window ends and another is to begin; initialized toSND.UNA.DCTCP.BytesAcked: the number of sent bytes acknowledged during the current observation window; initialized to 0.DCTCP.BytesMarked: the number of bytes sent during the current observation window that encountered congestion; initialized to 0.
The congestion estimator on the sender MUST process acceptable ACKs as follows:
- Compute the bytes acknowledged (TCP Selective Acknowledgment (SACK) options [RFC2018] are ignored for this computation):
BytesAcked = SEG.ACK - SND.UNA - Update the bytes sent:
DCTCP.BytesAcked += BytesAcked - If the
ECEflag is set, update the bytes marked:DCTCP.BytesMarked += BytesAcked - If the acknowledgment number is less than or equal to
DCTCP.WindowEnd, stop processing. Otherwise, the end of the observation window has been reached, so proceed to update the congestion estimate as follows: - Compute the congestion level for the current observation window:
M = DCTCP.BytesMarked / DCTCP.BytesAcked - Update the congestion estimate:
DCTCP.Alpha = DCTCP.Alpha * (1 - g) + g * M - Determine the end of the next observation window:
DCTCP.WindowEnd = SND.NXT - Reset the byte counters:
DCTCP.BytesAcked = DCTCP.BytesMarked = 0 - Rather than always halving the congestion window as described in [RFC3168], the sender SHOULD update
cwndas follows:cwnd = cwnd * (1 - DCTCP.Alpha / 2)
Just like [RFC3168] says, DCTCP doesn't react to congestion indications more than once for every window of data. The setting of the CWR bit is also as per [RFC3168]. This is required for interoperation with classic ECN receivers due to potential misconfigurations. ๐ซถ
3.4. Handling of Congestion Window Growth ๐ธ
A DCTCP sender grows its congestion window the same way conventional TCP does. Slow start and congestion avoidance algorithms are handled as specified in [RFC5681].
3.5. Handling of Packet Loss ๐
A DCTCP sender MUST react to loss episodes the same way conventional TCP does, including the fast retransmit and fast recovery algorithms, as specified in [RFC5681]. For cases where the packet loss is inferred and not explicitly signaled by ECN, cwnd and other state variables like ssthresh MUST be changed the same way a conventional TCP would have changed them. As with ECN, a DCTCP sender will only reduce cwnd once per window of data across all loss signals. Just as specified in [RFC5681], upon a timeout, cwnd MUST be set to no more than the loss window (1 full-sized segment), regardless of previous cwnd reductions in a given window of data.
Loss handling is where the real drama is, bestie. The sender still has to follow conventional TCP here, so don't get creative with the reductions ๐
3.6. Handling of SYN, SYN-ACK, and RST Packets ๐ง
If SYN, SYN-ACK, and RST packets for DCTCP connections have the ECN-Capable Transport (ECT) codepoint set in the IP header, they get the same treatment as other DCTCP packets when a switching fabric forwards them under load. Lack of ECT in these packets can result in a higher drop rate, depending on how the switching fabric is configured. Hence, for DCTCP connections, the sender SHOULD set ECT for SYN, SYN-ACK, and RST packets. A DCTCP receiver ignores CE codepoints set on any SYN, SYN-ACK, or RST packets. ๐
4. Implementation Issues ๐ ๏ธ
4.1. Configuration of DCTCP ๐
An implementation needs to know when to use DCTCP. Data-center servers may need to talk to endpoints outside the data center, where DCTCP is unsuitable or unsupported. So a global configuration setting to enable DCTCP generally won't cut it. DCTCP provides no mechanism for negotiating its use. That means additional management and configuration functionality is needed to make sure DCTCP isn't used with non-DCTCP endpoints. ๐ โโ๏ธ
Known solutions rely on either configuration or heuristics. Heuristics need to let endpoints individually enable DCTCP, so a DCTCP sender is always paired with a DCTCP receiver. One approach is to enable DCTCP based on the IP address of the remote endpoint. Another approach is to detect connections that transmit within the bounds of a data center. For example, an implementation could support automatic selection of DCTCP if the estimated RTT is less than a threshold (like 10 msec) and ECN is successfully negotiated. The idea is that if the RTT is low, the two endpoints are likely in the same data-center network. ๐ฅ
[RFC3168] forbids the ECN-marking of pure ACK packets because TCP can't mitigate ACK-path congestion. RFC 3168 also forbids ECN-marking of retransmissions, window probes, and RSTs. However, dropping all these control packets (instead of ECN-marking them) has considerable performance disadvantages. It is RECOMMENDED that an implementation provide a configuration knob that causes ECT to be set on such control packets, which can be used in environments where those concerns don't apply. See [ECN-EXPERIMENTATION] for details. ๐
It's useful to implement DCTCP as an additional action on top of an existing congestion control algorithm like Reno [RFC5681]. The DCTCP implementation MAY also allow configuration of resetting the value of DCTCP.Alpha as part of processing any loss episodes.
4.2. Computation of DCTCP.Alpha ๐งฎ
As noted in Section 3.3, the implementation will need to choose a suitable estimation gain. [DCTCP10] provides a theoretical basis for selecting the gain. However, it may be more practical to use experimentation to select a suitable gain for a particular network and workload. A fixed estimation gain of 1/16 is used in some implementations. (It should be noted that values of 0 or 1 for g result in problematic behavior: g=0 fixes DCTCP.Alpha to its initial value, and g=1 sets it to M without any smoothing. ๐)
The DCTCP.Alpha computation, per the formula in Section 3.3, involves fractions. An efficient kernel implementation MAY scale the DCTCP.Alpha value for efficient computation using shift operations. For example, if the implementation chooses g as 1/16, multiplications of DCTCP.Alpha by g become right-shifts by 4. A scaling implementation SHOULD ensure that DCTCP.Alpha is able to reach 0 once it falls below the smallest shifted value (16 in the above example). At the other extreme, a scaled update needs to ensure DCTCP.Alpha does not exceed the scaling factor, which would be equivalent to greater than 100% congestion. So, DCTCP.Alpha MUST be clamped after an update. โจ
This results in the following computations replacing steps 5 and 6 in Section 3.3, where SCF is the chosen scaling factor (65536 in the example), and SHF is the shift factor (4 in the example):
- Compute the congestion level for the current observation window:
ScaledM = SCF * DCTCP.BytesMarked / DCTCP.BytesAcked
- Update the congestion estimate:
if (DCTCP.Alpha >> SHF) == 0, then DCTCP.Alpha = 0
DCTCP.Alpha += (ScaledM >> SHF) - (DCTCP.Alpha >> SHF)
if DCTCP.Alpha > SCF, then DCTCP.Alpha = SCF
5. Deployment Issues ๐
Okay so bestie, DCTCP and conventional TCP congestion control do NOT vibe together in the same network ๐ญ In typical DCTCP deployments, the marking threshold in the switching fabric is set to a very low value to reduce queueing delay, and a relatively small amount of congestion will exceed the marking threshold. During those moments, conventional TCP takes a massive L ๐ and drops packet loss and quickly and drastically reduces cwnd. DCTCP, on the other hand, is giving gradual: it uses the fraction of marked packets to reduce cwnd more smoothly ๐ฆ So the rate reduction in DCTCP is much slower than conventional TCP, and DCTCP traffic ends up gaining a larger share of the capacity compared to conventional TCP traffic on the same path. Lowkey unfair, ngl ๐ If the traffic in the data center is a mix of conventional TCP and DCTCP, it is RECOMMENDED that DCTCP traffic be segregated from conventional TCP traffic ๐ [MORGANSTANLEY] describes a deployment that uses the IP Differentiated Services Codepoint (DSCP) bits to segregate the network, so Active Queue Management (AQM) [RFC7567] is applied to DCTCP traffic while TCP traffic is managed via drop-tail queueing ๐ง
Deployments should also think about segregation of non-TCP traffic ๐ธ Today's commodity switches let you configure different marking/drop profiles for non-TCP and non-IP packets. Non-TCP and non-IP packets SHOULD be able to pass through such switches, unless they really run out of buffer space ๐
Since DCTCP relies on congestion marking by the switches, DCTCP's potential can only be realized in data centers where the entire network infrastructure supports ECN โจ The switches may also support configuration of the congestion threshold used for marking. The proposed parameterization can be configured with switches that implement Random Early Detection (RED) [RFC2309]. [DCTCP10] provides a theoretical basis for selecting the congestion threshold, but, just like with the estimation gain, it may be more practical to rely on experimentation or simply use the default configuration of the device ๐ DCTCP will revert to loss-based congestion control when packet loss is experienced (for example, when transiting a congested drop-tail link, or a link with an AQM drop behavior) ๐
DCTCP requires changes on both the sender and the receiver, so both endpoints MUST support DCTCP ๐ซถ Furthermore, DCTCP provides no mechanism for negotiating its use, so both endpoints MUST be configured through some out-of-band mechanism to use DCTCP ๐ A variant of DCTCP that can be deployed unilaterally and that only requires standard ECN behavior has been described in [ODCTCP] and [BSDCAN], but it requires additional experimental evaluation ๐ฅ
6. Known Issues ๐
DCTCP relies on the sender's ability to reconstruct the stream of CE codepoints received by the remote endpoint. To make that work, DCTCP avoids using a single ACK packet to acknowledge segments received both with and without the CE codepoint set. However, if one or more ACK packets are dropped, it's possible that a subsequent ACK will cumulatively acknowledge a mix of CE and non-CE segments ๐ญ This will, of course, result in a less-accurate congestion estimate. There are some potential considerations:
- Even with an inaccurate congestion estimate, DCTCP may still perform better than [RFC3168] โจ
- If the estimation gain is small relative to the packet loss rate, the estimate may not be too inaccurate ๐ฆ
- If ACK packet loss mostly occurs under heavy congestion, most drops will happen during an unbroken string of CE packets, and the estimate will be unaffected ๐
However, the effect of packet drops on DCTCP under real-world conditions has not been analyzed ๐
DCTCP provides no mechanism for negotiating its use. The effect of using DCTCP with a standard ECN endpoint has been analyzed in [ODCTCP] and [BSDCAN]. Furthermore, it is possible that other implementations may also modify behavior in the [RFC3168] style without negotiation, causing further interoperability issues ๐
Much like standard TCP, DCTCP is biased against flows with longer RTTs. A method for improving the RTT fairness of DCTCP has been proposed in [ADCTCP], but it requires additional experimental evaluation ๐ง
7. Security Considerations ๐
Okay, security time, and this part is SERIOUS bestie ๐ค DCTCP enhances ECN, so it inherits the general security considerations discussed in [RFC3168], although additional mitigation options exist due to the limited intra-data-center deployment of DCTCP ๐ก๏ธ
The processing changes introduced by DCTCP do not exacerbate the considerations in [RFC3168] or introduce new ones. In particular, with either algorithm, the network infrastructure or the remote endpoint can falsely report congestion and, thus, cause the sender to reduce cwnd. However, this is no worse than what can be achieved by simply dropping packets ๐
[RFC3168] requires that a compliant TCP MUST NOT set ECT on SYN or SYN-ACK packets. [RFC5562] proposes setting ECT on SYN-ACK packets but maintains the restriction of no ECT on SYN packets. Both of these RFCs prohibit ECT in SYN packets due to security concerns regarding malicious SYN packets with ECT set. However, these RFCs are intended for general Internet use; they do not directly apply to a controlled data-center environment ๐ข The security concerns addressed by both of these RFCs might not apply in controlled environments like data centers, and it might not be necessary to account for the presence of non-ECN servers โจ Beyond the security considerations related to virtual servers, additional security can be imposed in the physical servers to intercept and drop traffic resembling an attack ๐ก๏ธ๐
8. IANA Considerations ๐
This document does not require any IANA actions ๐ธ
9. References ๐
9.1. Normative References
- [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, RFC 793, DOI 10.17487/RFC0793, September 1981, <https://www.rfc-editor.org/info/rfc793>.
- [RFC2018] Mathis, M., Mahdavi, J., Floyd, S., and A. Romanow, "TCP Selective Acknowledgment Options", RFC 2018, DOI 10.17487/RFC2018, October 1996, <https://www.rfc-editor.org/info/rfc2018>.
- [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.
- [RFC3168] Ramakrishnan, K., Floyd, S., and D. Black, "The Addition of Explicit Congestion Notification (ECN) to IP", RFC 3168, DOI 10.17487/RFC3168, September 2001, <https://www.rfc-editor.org/info/rfc3168>.
- [RFC5562] Kuzmanovic, A., Mondal, A., Floyd, S., and K. Ramakrishnan, "Adding Explicit Congestion Notification (ECN) Capability to TCP's SYN/ACK Packets", RFC 5562, DOI 10.17487/RFC5562, June 2009, <https://www.rfc-editor.org/info/rfc5562>.
- [RFC5681] Allman, M., Paxson, V., and E. Blanton, "TCP Congestion Control", RFC 5681, DOI 10.17487/RFC5681, September 2009, <https://www.rfc-editor.org/info/rfc5681>.
- [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.
9.2. Informative References
- [ADCTCP] Alizadeh, M., Javanmard, A., and B. Prabhakar, "Analysis of DCTCP: Stability, Convergence, and Fairness", DOI 10.1145/1993744.1993753, Proceedings of the ACM SIGMETRICS Joint International Conference on Measurement and Modeling of Computer Systems, June 2011, <https://dl.acm.org/citation.cfm?id=1993753>.
- [BSDCAN] Kato, M., Eggert, L., Zimmermann, A., van Meter, R., and H. Tokuda, "Extensions to FreeBSD Datacenter TCP for Incremental Deployment Support", BSDCan 2015, June 2015, <https://www.bsdcan.org/2015/schedule/events/559.en.html>.
- [DCTCP10] Alizadeh, M., Greenberg, A., Maltz, D., Padhye, J., Patel, P., Prabhakar, B., Sengupta, S., and M. Sridharan, "Data Center TCP (DCTCP)", DOI 10.1145/1851182.1851192, Proceedings of the ACM SIGCOMM 2010 Conference, August 2010, <http://dl.acm.org/citation.cfm?doid=1851182.1851192>.
- [ECN-EXPERIMENTATION] Black, D., "Explicit Congestion Notification (ECN) Experimentation", Work in Progress, draft-ietf-tsvwg-ecn-experimentation-06, September 2017.
- [Err3639] RFC Errata, Erratum ID 3639, RFC 3168, <https://www.rfc-editor.org/errata/eid3639>.
- [FREEBSD] Kato, M. and H. Panchasara, "DCTCP (Data Center TCP) implementation", January 2015, <https://github.com/freebsd/freebsd/commit/8ad879445281027858a7fa706d13e458095b595f>.
- [LINUX] Borkmann, D., Westphal, F., and Glenn. Judd, "net: tcp: add DCTCP congestion control algorithm", LINUX DCTCP Patch, September 2014, <https://git.kernel.org/cgit/linux/kernel/git/davem/net-next.git/commit/?id=e3118e8359bb7c59555aca60c725106e6d78c5ce>.
- [MAPREDUCE] Dean, J. and S. Ghemawat, "MapReduce: Simplified Data Processing on Large Clusters", Proceedings of the 6th ACM/USENIX Symposium on Operating Systems Design and Implementation, October 2004, <https://www.usenix.org/legacy/publications/library/proceedings/osdi04/tech/dean.html>.
- [MORGANSTANLEY] Judd, G., "Attaining the Promise and Avoiding the Pitfalls of TCP in the Datacenter", Proceedings of the 12th USENIX Symposium on Networked Systems Design and Implementation, May 2015, <https://www.usenix.org/conference/nsdi15/technical-sessions/presentation/judd>.
- [ODCTCP] Kato, M., "Improving Transmission Performance with One-Sided Datacenter TCP", M.S. Thesis, Keio University, 2013, <http://eggert.org/students/kato-thesis.pdf>.
- [RFC2309] Braden, B., Clark, D., Crowcroft, J., Davie, B., Deering, S., Estrin, D., Floyd, S., Jacobson, V., Minshall, G., Partridge, C., Peterson, L., Ramakrishnan, K., Shenker, S., Wroclawski, J., and L. Zhang, "Recommendations on Queue Management and Congestion Avoidance in the Internet", RFC 2309, DOI 10.17487/RFC2309, April 1998, <https://www.rfc-editor.org/info/rfc2309>.
- [RFC7567] Baker, F., Ed. and G. Fairhurst, Ed., "IETF Recommendations Regarding Active Queue Management", BCP 197, RFC 7567, DOI 10.17487/RFC7567, July 2015, <https://www.rfc-editor.org/info/rfc7567>.
- [WINDOWS] Microsoft, "Data Center Transmission Control Protocol (DCTCP)", May 2012, <https://technet.microsoft.com/en-us/library/hh997028(v=ws.11).aspx>.
Acknowledgments โจ
The DCTCP algorithm was first proposed and analyzed in [DCTCP10] ๐ by Mohammad Alizadeh, Albert Greenberg, Dave Maltz, Jitu Padhye, Parveen Patel, Balaji Prabhakar, Sudipta Sengupta, and Murari Sridharan. Iconic team, no notes ๐
We'd also love to thank Andrew Shewmaker ๐ซถ for spotting the problem with clamping DCTCP.Alpha and coming up with a fix for it. Main character energy for real ๐
Lars Eggert received funding from the European Union's Horizon 2020 research and innovation program 2014-2018 under grant agreement No. 644866 ("SSICLOPS"). ๐ธ Quick but important bit: this document only reflects the authors' views, and the European Commission is not responsible for any use that may be made of the information it contains. Okay, that's the boring legal part, I promise we're done ๐
Authors' Addresses ๐ฆ
Here's where you can find the authors. Stephen Bensley is at Microsoft, and Dave Thaler and Praveen Balasubramanian are at Microsoft too, so it's a whole Microsoft squad ๐
Stephen Bensley
Microsoft
One Microsoft Way
Redmond, WA 98052
United States of America
Phone: +1 425 703 5570
Email: sbens@microsoft.com
Dave Thaler
Microsoft
Phone: +1 425 703 8835
Email: dthaler@microsoft.com
Praveen Balasubramanian
Microsoft
Phone: +1 425 538 2782
Email: pravb@microsoft.com
Lars Eggert
NetApp
Sonnenallee 1
Kirchheim 85551
Germany
Phone: +49 151 120 55791
Email: lars@netapp.com
URI: http://eggert.org/
Glenn Judd
Morgan Stanley
Phone: +1 973 979 6481
Email: glenn.judd@morganstanley.com
That's the whole RFC, bestie! ๐โจ Thanks for reading all the way to the end ๐
๐ฆ where this page comes from
- ietf: rfc8257 2017-10
- ๐ girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms