RFC 4015
The Eifel Response Algorithm for TCP
The Eifel Response Algorithm for TCP π¦
okay bestie, this is RFC 4015 π It's a Standards Track doc from the Network Working Group, dated February 2005. The authors are R. Ludwig (Ericsson Research) and A. Gurtov (HIIT). The header doesn't list anything it obsoletes or updates, so no drama there π
Status of This Memo β¨
This doc specifies an Internet standards track protocol for the Internet community, and it's asking for discussion and suggestions for improvements π For the standardization state and status of this protocol, check the current edition of the "Internet Official Protocol Standards" (STD 1). Distribution of this memo is unlimited π
Copyright Notice πΈ
Copyright (C) The Internet Society (2005).
Abstract π¦
So here's the big idea π If a detection algorithm has spotted a spurious timeout, the Eifel response algorithm tells the TCP sender what to do about it. It adjusts the retransmission timer so the spurious timeouts stop happening, and depending on the detection algorithm, it can skip the go-back-N retransmits that would otherwise get sent for no reason π It also restores the congestion control state so that packet bursts get avoided. Iconic behaviour, honestly π
1. Introduction π§
The Eifel response algorithm leans on a detection algorithm, like the Eifel detection algorithm defined in [RFC3522]. That document has informative background and motivation that implementers might find useful, but you don't need to read [RFC3522] to implement the Eifel response algorithm π«Ά Also, alternative response algorithms have been proposed [BA02] that could rely on the Eifel detection algorithm too. Alternative detection algorithms have been proposed as well, [RFC3708] and [SK04], and they could work together with the Eifel response algorithm β¨
Okay, so this next part is basically the Abstract again, because it's the core vibe π Using an appropriate detection algorithm, the Eifel response algorithm gives a TCP sender a way to respond to a detected spurious timeout. It adapts the retransmission timer to avoid further spurious timeouts and (depending on the detection algorithm) can avoid the often unnecessary go-back-N retransmits that would otherwise be sent. It also restores the congestion control state so packet bursts are avoided π
Note: A previous version of the Eifel response algorithm also included a response to a detected spurious fast retransmit. But consensus wasn't reached on how to adapt the duplicate acknowledgement threshold in that case, so that part got removed for the time being π
1.1. Terminology π
The keywords MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, MAY, and OPTIONAL, when they show up in this document, get interpreted as described in [RFC2119] π
Here's the vocab π The first time an octet gets sent, we call that the 'original transmit'. Any later sending of that same octet is a 'retransmit'. Most of the time this also works for data segments. But when repacketization happens, one segment can contain both first-time octets and retransmitted octets. In that case the terminology only stays consistent if you apply it to octets. For the Eifel detection and response algorithms this doesn't matter, since they still work correctly when repacketization happens π
We use the term 'acceptable ACK' from [RFC793]. It's an ACK that acknowledges previously unacknowledged data β¨ The term 'bytes_acked' means the amount (in octets) of previously unacknowledged data acknowledged by the most recently received acceptable ACK. We also use the TCP sender state variables 'SND.UNA' and 'SND.NXT' from [RFC793]. SND.UNA holds the segment sequence number of the oldest outstanding segment, and SND.NXT holds the segment sequence number of the next segment the TCP sender will (re-)transmit. On top of that, we define 'SND.MAX' as the segment sequence number of the next original transmit to be sent. That's equivalent to 'snd_max' in [WS95], so nothing new here, just a fancy name π
Next up, the congestion vibes πΈ We use 'cwnd' (congestion window) and 'ssthresh' (slow-start threshold) and the term 'FlightSize', all from [RFC2581]. FlightSize is the amount (in octets) of outstanding data at a given point in time. The 'Initial Window' (IW) comes from [RFC3390], and it's the size of the sender's congestion window after the three-way handshake completes π¦ For 'SRTT' and 'RTTVAR' plus the terms 'RTO' and 'G', we're following [RFC2988]. G is the clock granularity of the retransmission timer. We also assume the TCP sender keeps the latest round-trip time (RTT) measurement in a local variable called 'RTT-SAMPLE' π
Last bit of vocab π«Ά We use the TCP sender state variable 'T_last', and the term 'tcpnow' as used in [RFC2861]. T_last holds the system time when the TCP sender sent its last data segment. tcpnow is the TCP sender's current system time. Simple, but important π₯
2. Appropriate Detection Algorithms π
If the Eifel response algorithm is implemented at the TCP sender, it MUST be implemented together with a detection algorithm that's specified in a standards track or experimental RFC. No freelancing, bestie π
Designers of detection algorithms who want their algorithms to work with the Eifel response algorithm should reuse the variable "SpuriousRecovery", using the semantics and defined values from [RFC3522] β¨ We also define the constant LATE_SPUR_TO (set equal to -1) as another possible value for SpuriousRecovery. Detection algorithms should set SpuriousRecovery to LATE_SPUR_TO when they detect a spurious retransmit based on the ACK for the retransmit, as opposed to an ACK for an original transmit. For example, this applies to detection algorithms based on the DSACK option [RFC3708] π§
3. The Eifel Response Algorithm π
The complete algorithm is specified in Section 3.1. Sections 3.2 - 3.6 walk through the different steps of the algorithm π
3.1. The Algorithm π¦
Given that a TCP sender has enabled a detection algorithm that complies with the requirements in Section 2, a TCP sender MAY use the Eifel response algorithm defined in this subsection π
If the Eifel response algorithm is used, the TCP sender MUST take the following steps, but only when a timeout-based loss recovery gets initiated. That's when the first timeout-based retransmit gets sent. The algorithm MUST NOT be reinitiated after a timeout-based loss recovery has already started but not completed. In particular, it may not be reinitiated upon subsequent timeouts for the same segment, or upon retransmitting segments other than the oldest outstanding segment π
Here are the steps, verbatim, because implementers rely on every single character π
(0) Before the variables cwnd and ssthresh get updated when
loss recovery is initiated, set a "pipe_prev" variable as
follows:
pipe_prev <- max (FlightSize, ssthresh)
Set a "SRTT_prev" variable and a "RTTVAR_prev" variable as
follows:
SRTT_prev <- SRTT + (2 * G)
RTTVAR_prev <- RTTVAR
(DET) This is a placeholder for a detection algorithm that must
be executed at this point, and that sets the variable
SpuriousRecovery as outlined in Section 2. If
[RFC3522] is used as the detection algorithm, steps (1) -
(6) of that algorithm go here.
(7) If SpuriousRecovery equals SPUR_TO, then
proceed to step (8);
else if SpuriousRecovery equals LATE_SPUR_TO, then
proceed to step (9);
else
proceed to step (DONE).
(8) Resume the transmission with previously unsent data:
Set
SND.NXT <- SND.MAX
(9) Reverse the congestion control state:
If the acceptable ACK has the ECN-Echo flag [RFC3168] set,
then
proceed to step (DONE);
else set
cwnd <- FlightSize + min (bytes_acked, IW)
ssthresh <- pipe_prev
Proceed to step (DONE).
(10) Interworking with Congestion Window Validation:
If congestion window validation is implemented according
to [RFC2861], then set
T_last <- tcpnow
(11) Adapt the conservativeness of the retransmission timer:
Upon the first RTT-SAMPLE taken from new data; i.e., the
first RTT-SAMPLE that can be derived from an acceptable
ACK for data that was previously unsent when the spurious
timeout occurred,
if the retransmission timer is implemented according
to [RFC2988], then set
SRTT <- max (SRTT_prev, RTT-SAMPLE)
RTTVAR <- max (RTTVAR_prev, RTT-SAMPLE/2)
RTO <- SRTT + max (G, 4*RTTVAR)
Run the bounds check on the RTO (rules (2.4) and
(2.5) in [RFC2988]), and restart the
retransmission timer;
else
appropriately adapt the conservativeness of the
retransmission timer that is implemented.
(DONE) No further processing.
3.2. Storing the Current Congestion Control State (Step 0) π§
Okay, so in step (0), the TCP sender stores in pipe_prev what counts as a safe slow-start threshold (ssthresh) before loss recovery starts. That means before the loss indication gets taken into account π
This is either the current FlightSize, if the TCP sender is in congestion avoidance, or the current ssthresh, if it's in slow-start. If the TCP sender later figures out it entered loss recovery unnecessarily, then step (9) uses pipe_prev to reverse the congestion control state. So until the loss recovery phase ends, pipe_prev remembers what the congestion control state looked like right before loss recovery kicked off π₯ A similar idea is proposed in [RFC2861], where this state gets stored in ssthresh directly after a TCP sender has gone idle or become application limited.
There were debates about whether pipe_prev should decay over time, like on subsequent timeouts for the same outstanding segment. We don't require decaying pipe_prev for the Eifel response algorithm, and we don't think such a conservative approach should be in place π Instead, we follow the idea of revalidating the congestion window through slow-start, as suggested in [RFC2861]. So in step (9), cwnd gets reset to a value that avoids large packet bursts, and ssthresh gets reset to the value of pipe_prev β¨ Also worth knowing: [RFC2581] and [RFC2861] don't require ssthresh to decay after it's been reset in response to a loss indication, or after a TCP sender has gone idle or application limited. So we're in good company π«Ά
3.3. Suppressing the Unnecessary go-back-N Retransmits (Step 8) π
okay so without the TCP timestamps option [RFC1323], the TCP sender is stuck with the retransmission ambiguity problem [Zh86], [KP87] π. so when the first acceptable ACK shows up after a spurious timeout, the TCP sender must assume that this ACK was sent for the retransmit when it was really sent for an original transmit. and then it has to further assume that every other segment still outstanding at that point got lost. it's giving "assume the worst" energy π
Note: Except for certain cases where original ACKs were lost, the first acceptable ACK cannot carry a DSACK option [RFC2883].
so once the sender updates its state after that first acceptable ACK, SND.NXT equals SND.UNA β¨. this is literally what causes the often unnecessary go-back-N retransmits. from then on, every acceptable ACK that answers an original transmit moves SND.NXT forward. but as long as SND.NXT is smaller than the value SND.MAX had when the timeout happened, those ACKs keep clocking out retransmits, whether or not the matching original transmits were actually lost. main character energy for the wrong reasons π₯²
in fact, during this phase the TCP sender breaks 'packet conservation' [Jac88] π . that's because the go-back-N retransmits get sent during slow-start. for every original transmit leaving the network, two retransmits go into the network as long as SND.NXT does not equal SND.MAX (see [LK00] for more detail) π« .
once a spurious timeout has been detected (when an ACK for an original transmit shows up), it's safe to let the TCP sender get back to sending previously unsent data π. so the Eifel response algorithm changes the TCP sender's state by setting SND.NXT to SND.MAX. but heads up, this step only runs if the variable SpuriousRecovery equals SPUR_TO. and that in turn needs a detection algorithm, like the Eifel detection algorithm [RFC3522] or the F-RTO algorithm [SK04], that spots a spurious retransmit by receiving an ACK for an original transmit (instead of the ACK for the retransmit [RFC3708]) π₯.
3.4. Reversing the Congestion Control State (Step 9) π¦
when a TCP sender enters loss recovery, it cuts cwnd and ssthresh π. but once it figures out the loss recovery was falsely triggered, that cut was totally unnecessary π. so we think it's safe to go back to the previous congestion control state, following the approach of revalidating the congestion window that's outlined below. this is unless the acceptable ACK signals congestion through the ECN-Echo flag [RFC3168]. in that case, the TCP sender MUST refrain from reversing congestion control state π«. no cap, that's the one non-negotiable here.
if the ECN-Echo flag is not set, cwnd gets reset to the sum of the current FlightSize and the minimum of bytes_acked and IW β¨. in some cases, the first few acceptable ACKs that arrive won't clock out any data segments, and that's expected. quick reminder that bytes_acked is the number of bytes acknowledged by the acceptable ACK. also, the value of cwnd must not be changed any further for that ACK, and the value of FlightSize at this point may be different from the value of FlightSize in step (0). the value of IW puts a limit on the size of the packet burst the TCP sender may send into the network after the Eifel response algorithm has terminated. the value of IW is considered an acceptable burst size, aka the amount of data a TCP sender may send into a yet "unprobed" network at the beginning of a connection πΈ.
then ssthresh is reset to the value of pipe_prev π§. as a result, the TCP sender either immediately resumes probing the network for more bandwidth in congestion avoidance, or it slow-starts to what's considered a safe operating point for the congestion window. either way, it's a glow-up π.
3.5. Interworking with the CWV Algorithm (Step 10) π«Ά
an implementation of the Congestion Window Validation (CWV) algorithm [RFC2861] could potentially misread a delay spike that caused a spurious timeout as a phase where the TCP sender had been idle π΅. so T_last gets reset to stop the CWV algorithm from kicking in here π.
Note: The term 'idle' implies that the TCP sender has no data outstanding; i.e., all data sent has been acknowledged [Jac88]. According to this definition, a TCP sender is not idle while it is waiting for an acceptable ACK after a timeout. Unfortunately, the pseudo-code in [RFC2861] does not include a check for the condition "idle" (SND.UNA == SND.MAX). We therefore had to add step (10) to the Eifel response algorithm.
3.6. Adapting the Retransmission Timer (Step 11) β°
there's currently only one retransmission timer standardized for TCP [RFC2988], so that's the only one we address directly π. future standards that might define alternatives to [RFC2988] should propose similar measures to adapt the conservativeness of the retransmission timer.
a spurious timeout often comes from a delay spike, which is a sudden increase of the RTT that usually can't be predicted π€. after a delay spike, the RTT may have changed permanently, e.g., because of a path change, or because the available bandwidth on a bandwidth-dominated path has dropped. this happens a lot with wide-area wireless access links π‘. in that case, the RTT estimators (SRTT and RTTVAR) should be reinitialized from the first RTT-SAMPLE taken from new data, according to rule (2.2) of [RFC2988]. that means the first RTT-SAMPLE that can be derived from an acceptable ACK for data that was previously unsent when the spurious timeout happened π.
but a delay spike might only be a transient phase, after which the RTT goes back to its previous range of values, or even to smaller ones π€οΈ. also, a spurious timeout can happen just because the TCP sender's RTT estimators were only inaccurate enough that the retransmission timer expires "a tad too early" π. we believe two times the clock granularity of the retransmission timer (2 * G) is a reasonable upper bound on "a tad too early". so when the new RTO gets calculated in step (11), we make sure it's at least (2 * G) greater (see also step (0)) than the RTO was before the spurious timeout occurred β¨.
note that other TCP sender processing will usually happen between steps (10) and (11) π. during this phase (i.e., before step (11) has been reached), the RTO is managed according to the rules of [RFC2988]. we believe this is sufficiently conservative, for a few reasons. first, the retransmission timer is restarted upon the acceptable ACK that was used to detect the spurious timeout. so the delay spike is already implicitly factored in for segments outstanding at that time. this is discussed in more detail in [EL04], where this effect is called the "RTO offset" π§ . second, if timestamps are enabled, a new and valid RTT-SAMPLE can be derived from that acceptable ACK. this RTT-SAMPLE has to be relatively large, since it includes the delay spike that caused the spurious timeout, so the RTT estimators get updated pretty conservatively π’. without timestamps, the RTO stays conservatively backed off due to Karn's algorithm [RFC2988] until the first RTT-SAMPLE can be derived from an acceptable ACK for data that was previously unsent when the spurious timeout happened π₯Ή.
for the new RTO to actually take effect, the retransmission timer has to be restarted π. this is consistent with [RFC2988], which recommends restarting the retransmission timer when an acceptable ACK arrives.
4. Advanced Loss Recovery is Crucial for the Eifel Response Algorithm π
we've studied environments where spurious timeouts and multiple losses from the same flight of packets often show up together [GL02], [GL03] π. in those situations, the oldest outstanding segment reaches the TCP receiver, but one or more packets from the rest of that outstanding flight get lost. in those environments, end-to-end performance suffers if the Eifel response algorithm runs without an advanced loss recovery scheme, like a SACK-based scheme [RFC3517] or NewReno [RFC3782] π. the reason is TCP-Reno's aggressiveness after a spurious timeout. even though TCP-Reno breaks 'packet conservation' (see Section 3.3) when it blindly retransmits all outstanding segments, it usually recovers every packet lost from that flight within a single round-trip time πββοΈ. on the flip side, the more conservative TCP-Reno-with-Eifel is often forced into another timeout π©. so we recommend that the Eifel response algorithm always be run in combination with [RFC3517] or [RFC3782]. extra robustness comes from the Limited Transmit and Early Retransmit algorithms [RFC3042], [AAAB04] πͺ.
Note: The SACK-based scheme we used for our simulations in [GL02] and [GL03] is different from the SACK-based scheme that later got standardized [RFC3517]. the key difference is that [RFC3517] is more robust to multiple losses from the same flight. it's less conservative in declaring that a packet has left the network, so it depends less on timeouts to recover genuine packet losses π.
if the NewReno algorithm [RFC3782] is used together with the Eifel response algorithm, step (1) of the NewReno algorithm SHOULD be modified as follows, but only if SpuriousRecovery equals SPUR_TO:
(1) Three duplicate ACKs:
When the third duplicate ACK is received and the sender is
not already in the Fast Recovery procedure, go to step 1A.
that's why the entire step 1B of the NewReno algorithm is obsolete π«‘. step (8) of the Eifel response algorithm avoids the case where three duplicate ACKs come from unnecessary go-back-N retransmits after a timeout. honestly, step (8) stops those unnecessary go-back-N retransmits from happening in the first place π. but remember, step (8) only runs if SpuriousRecovery equals SPUR_TO, and that in turn needs a detection algorithm, like the Eifel detection algorithm [RFC3522] or the F-RTO algorithm [SK04], that detects a spurious retransmit by receiving an ACK for an original transmit (as opposed to the ACK for the retransmit [RFC3708]) π.
5. Security Considerations π¨
okay this part is kinda serious, so pay attention π₯Ί. there's a risk that a detection algorithm gets fooled by spoofed ACKs that make genuine retransmits look like spurious retransmits to the TCP sender. when that kind of detection algorithm runs together with the Eifel response algorithm, this could effectively disable congestion control at the TCP sender π±. should this become a concern, the Eifel response algorithm SHOULD only be run together with detection algorithms that are known to be safe against such "ACK spoofing attacks" π‘οΈ.
for example, the safe variant of the Eifel detection algorithm [RFC3522] is a reliable way to protect against this risk π.
6. Acknowledgements π
huge thanks to Keith Sklower, Randy Katz, Michael Meyer, Stephan Baucke, Sally Floyd, Vern Paxson, Mark Allman, Ethan Blanton, Pasi Sarolahti, Alexey Kuznetsov, and Yogesh Swami for all the discussions that helped shape this work π«Άβ¨.
7. References π
7.1. Normative References π
okay bestie, these are the must-read-first ones, the stuff the spec totally leans on π«Ά
[RFC2581] Allman, M., Paxson, V., and W. Stevens, "TCP Congestion
Control", RFC 2581, April 1999.
[RFC3390] Allman, M., Floyd, S., and C. Partridge, "Increasing TCP's
Initial Window", RFC 3390, October 2002.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, March 1997.
[RFC3782] Floyd, S., Henderson, T., and A. Gurtov, "The NewReno
Modification to TCP's Fast Recovery Algorithm", RFC 3782,
April 2004.
[RFC2861] Handley, M., Padhye, J., and S. Floyd, "TCP Congestion
Window Validation", RFC 2861, June 2000.
[RFC3522] Ludwig, R. and M. Meyer, "The Eifel Detection Algorithm for
TCP", RFC 3522, April 2003.
[RFC2988] Paxson, V. and M. Allman, "Computing TCP's Retransmission
Timer", RFC 2988, November 2000.
[RFC793] Postel, J., "Transmission Control Protocol", STD 7, RFC
793, September 1981.
[RFC3168] Ramakrishnan, K., Floyd, S., and D. Black, "The Addition of
Explicit Congestion Notification (ECN) to IP", RFC 3168,
September 2001.
7.2. Informative References π§
these are the extra-juicy background reads, not required but so worth a peek π
[RFC3042] Allman, M., Balakrishnan, H., and S. Floyd, "Enhancing
TCP's Loss Recovery Using Limited Transmit", RFC 3042,
January 2001.
[AAAB04] Allman, M., Avrachenkov, K., Ayesta, U., and J. Blanton,
Early Retransmit for TCP and SCTP, Work in Progress, July
2004.
[BA02] Blanton, E. and M. Allman, On Making TCP More Robust to
Packet Reordering, ACM Computer Communication Review, Vol.
32, No. 1, January 2002.
[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,
February 2004.
[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.
[EL04] Ekstrom, H. and R. Ludwig, The Peak-Hopper: A New End-to-
End Retransmission Timer for Reliable Unicast Transport, In
Proceedings of IEEE INFOCOM 04, March 2004.
[RFC2883] Floyd, S., Mahdavi, J., Mathis, M., and M. Podolsky, "An
Extension to the Selective Acknowledgement (SACK) Option
for TCP", RFC 2883, July 2000.
[GL02] Gurtov, A. and R. Ludwig, Evaluating the Eifel Algorithm
for TCP in a GPRS Network, In Proceedings of the European
Wireless Conference, February 2002.
[GL03] Gurtov, A. and R. Ludwig, Responding to Spurious Timeouts
in TCP, In Proceedings of IEEE INFOCOM 03, April 2003.
[Jac88] Jacobson, V., Congestion Avoidance and Control, In
Proceedings of ACM SIGCOMM 88.
[RFC1323] Jacobson, V., Braden, R., and D. Borman, "TCP Extensions
for High Performance", RFC 1323, May 1992.
[KP87] Karn, P. and C. Partridge, Improving Round-Trip Time
Estimates in Reliable Transport Protocols, In Proceedings
of ACM SIGCOMM 87.
[LK00] Ludwig, R. and R. H. Katz, The Eifel Algorithm: Making TCP
Robust Against Spurious Retransmissions, ACM Computer
Communication Review, Vol. 30, No. 1, January 2000.
[SK04] Sarolahti, P. and M. Kojo, F-RTO: An Algorithm for
Detecting Spurious Retransmission Timeouts with TCP and
SCTP, Work in Progress, November 2004.
[WS95] Wright, G. R. and W. R. Stevens, TCP/IP Illustrated, Volume
2 (The Implementation), Addison Wesley, January 1995.
[Zh86] Zhang, L., Why TCP Timers Don't Work Well, In Proceedings
of ACM SIGCOMM 88.
Authors' Addresses π
meet the people who made this happen, the authors are literally the reason we have this spec π₯°
Reiner Ludwig
Ericsson Research (EDD)
Ericsson Allee 1
52134 Herzogenrath, Germany
EMail: Reiner.Ludwig@ericsson.com
Andrei Gurtov
Helsinki Institute for Information Technology (HIIT)
P.O. Box 9800, FIN-02015
HUT, Finland
EMail: andrei.gurtov@cs.helsinki.fi
Homepage: http://www.cs.helsinki.fi/u/gurtov
Full Copyright Statement π₯
the legal bit, but it's giving very important energy so read it verbatim π
Copyright (C) The Internet Society (2005).
This document is subject to the rights, licenses and restrictions
contained in BCP 78, and except as set forth therein, the authors
retain all their rights.
This document and the information contained herein are provided on an
"AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
Intellectual Property π
who owns what, and how to ask about it. the IETF is being super clear here, so I kept it exact π¦
The IETF takes no position regarding the validity or scope of any
Intellectual Property Rights or other rights that might be claimed to
pertain to the implementation or use of the technology described in
this document or the extent to which any license under such rights
might or might not be available; nor does it represent that it has
made any independent effort to identify any such rights. Information
on the IETF's procedures with respect to rights in IETF Documents can
be found in BCP 78 and BCP 79.
Copies of IPR disclosures made to the IETF Secretariat and any
assurances of licenses to be made available, or the result of an
attempt made to obtain a general license or permission for the use of
such proprietary rights by implementers or users of this
specification can be obtained from the IETF on-line IPR repository at
http://www.ietf.org/ipr.
The IETF invites any interested party to bring to its attention any
copyrights, patents or patent applications, or other proprietary
rights that may cover technology that may be required to implement
this standard. Please address the information to the IETF at ietf-
ipr@ietf.org.
Acknowledgement π«Ά
a quick shoutout at the end πΈ the RFC Editor function is currently funded by the Internet Society, so thank you to them for keeping the lights on β¨
π¦ where this page comes from
- ietf: rfc4015 2005-02
- π girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms